windows-nt/Source/XPSP1/NT/net/upnp/tools/updiag/eventsrc.cpp
2020-09-26 16:20:57 +08:00

300 lines
8.2 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: E V E N T S R C . C P P
//
// Contents: Functions dealing with UPnP event sources.
//
// Notes:
//
// Author: danielwe 28 Oct 1999
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include <oleauto.h>
#include "ncbase.h"
#include "updiagp.h"
#include "ncinet.h"
BOOL DoListEventSources(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs)
{
DWORD ies;
Assert(g_ctx.ectx == CTX_CD);
_tprintf(TEXT("Listing all Event Sources\n"));
_tprintf(TEXT("------------------------------\n"));
for (ies = 0; ies < PDevCur()->cSvcs; ies++)
{
_tprintf(TEXT("%d) %s\n"), ies + 1,
PDevCur()->rgSvcs[ies]->szEvtUrl);
}
_tprintf(TEXT("------------------------------\n\n"));
return FALSE;
}
BOOL DoSwitchEs(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs)
{
Assert(g_ctx.ectx == CTX_CD);
if (cArgs == 2)
{
DWORD idev;
idev = _tcstoul(rgArgs[1], NULL, 10);
if (idev <= PDevCur()->cSvcs && PDevCur()->rgSvcs[idev - 1])
{
g_ctx.psvcCur = PDevCur()->rgSvcs[idev - 1];
g_ctx.ectx = CTX_EVTSRC;
}
else
{
_tprintf(TEXT("%d is not a valid event source index!\n"), idev);
}
}
else
{
Usage(iCmd);
}
return FALSE;
}
BOOL DoSubmitEvent(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs)
{
DWORD iArg;
DWORD iProp;
UPNPSVC * psvc = g_ctx.psvcCur;
UPNP_PROPERTY * rgProps;
DWORD cProps = cArgs - 1;
Assert(g_ctx.ectx == CTX_EVTSRC);
if (cArgs < 2)
{
Usage(iCmd);
return FALSE;
}
rgProps = new UPNP_PROPERTY[cProps];
Assert(rgProps);
::ZeroMemory(rgProps, sizeof(UPNP_PROPERTY) * cProps);
for (iArg = 1; iArg < cArgs; iArg++)
{
LPTSTR szProp;
LPTSTR szValue;
szProp = _tcstok(rgArgs[iArg], TEXT(":"));
if (szProp)
{
iProp = _tcstoul(szProp, NULL, 10);
if (iProp > 0)
{
iProp--; // make it 0-based
szValue = _tcstok(NULL, TEXT(":"));
if (szValue)
{
rgProps[iArg - 1].szName = SzFromTsz(psvc->sst.rgRows[iProp].szPropName);
rgProps[iArg - 1].szValue = SzFromTsz(szValue);
}
else
{
_tprintf(TEXT("'%s' is not a valid property!\n\n"), szProp);
goto cleanup;
}
}
else
{
_tprintf(TEXT("'%s' is not a valid property!\n\n"), szProp);
goto cleanup;
}
}
else
{
_tprintf(TEXT("'%s' is not a valid property!\n\n"), rgArgs[iArg]);
goto cleanup;
}
}
CHAR szUri[INTERNET_MAX_URL_LENGTH];
LPSTR pszEvtUrl;
HRESULT hr;
pszEvtUrl = SzFromTsz(psvc->szEvtUrl);
if (pszEvtUrl)
{
hr = HrGetRequestUriA(pszEvtUrl, INTERNET_MAX_URL_LENGTH, szUri);
if (SUCCEEDED(hr))
{
if (SubmitUpnpPropertyEvent(szUri, 0, cProps, rgProps))
{
TraceTag(ttidUpdiag, "Successfully submitted event to %s.", psvc->szEvtUrl);
}
else
{
TraceTag(ttidUpdiag, "Failed to submit event to %s! Error %d.",
psvc->szEvtUrl, GetLastError());
}
}
else
{
TraceTag(ttidUpdiag, "Failed to crack URL %s! Error %d.",
psvc->szEvtUrl, GetLastError());
}
delete [] pszEvtUrl;
}
else
{
TraceTag(ttidUpdiag, "DoSubmitEvent: SzFromTsz failed");
}
cleanup:
iProp = 0;
for ( ; iProp < cProps; ++iProp)
{
if (rgProps[iProp].szName)
{
delete [] rgProps[iProp].szName;
}
if (rgProps[iProp].szValue)
{
delete [] rgProps[iProp].szValue;
}
}
delete [] rgProps;
return FALSE;
}
BOOL DoListProps(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs)
{
DWORD iProp;
UPNPSVC * psvc = g_ctx.psvcCur;
Assert(g_ctx.ectx == CTX_EVTSRC);
_tprintf(TEXT("Listing properties for event source %s...\n"),
g_ctx.psvcCur->szEvtUrl);
_tprintf(TEXT("----------------------------------------------------\n"));
for (iProp = 0; iProp < psvc->sst.cRows; iProp++)
{
VARIANT varDest;
VariantClear(&varDest);
VariantChangeType(&varDest, &psvc->sst.rgRows[iProp].varValue, 0, VT_BSTR);
_tprintf(TEXT("%d) %s = %S\n"), iProp + 1,
psvc->sst.rgRows[iProp].szPropName, varDest.bstrVal);
}
_tprintf(TEXT("----------------------------------------------------\n\n"));
return FALSE;
}
DWORD CsecDiffFileTime(FILETIME * pft1, FILETIME *pft2)
{
ULONGLONG qwResult1;
ULONGLONG qwResult2;
LONG lDiff;
// Copy the time into a quadword.
qwResult1 = (((ULONGLONG) pft1->dwHighDateTime) << 32) + pft1->dwLowDateTime;
qwResult2 = (((ULONGLONG) pft2->dwHighDateTime) << 32) + pft2->dwLowDateTime;
lDiff = (LONG) (((LONGLONG)(qwResult2 - qwResult1)) / _SECOND);
lDiff = max(0, lDiff);
return lDiff;
}
VOID DoEvtSrcInfo()
{
UPNPSVC * psvc = g_ctx.psvcCur;
CHAR szUri[INTERNET_MAX_URL_LENGTH];
HRESULT hr;
EVTSRC_INFO info = {0};
EVTSRC_INFO * pinfo = &info;
LPSTR pszEvtUrl;
pszEvtUrl = SzFromTsz(psvc->szEvtUrl);
if (pszEvtUrl)
{
hr = HrGetRequestUriA(pszEvtUrl, INTERNET_MAX_URL_LENGTH, szUri);
if (SUCCEEDED(hr))
{
if (GetEventSourceInfo(szUri, &pinfo))
{
DWORD iSub;
_tprintf(TEXT("Listing information for event source %s:\n"),
psvc->szEvtUrl);
_tprintf(TEXT("------------------------------------------------------\n"));
for (iSub = 0; iSub < pinfo->cSubs; iSub++)
{
SYSTEMTIME st;
FILETIME ftCur;
TCHAR szLocalDate[255];
TCHAR szLocalTime[255];
_tprintf(TEXT("Notify to : %s\n"), pinfo->rgSubs[iSub].szDestUrl);
_tprintf(TEXT("Seq # : %d\n"), pinfo->rgSubs[iSub].iSeq);
FileTimeToSystemTime(&pinfo->rgSubs[iSub].ftTimeout, &st);
GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL,
szLocalDate, 255);
GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL,
szLocalTime, 255);
GetSystemTimeAsFileTime(&ftCur);
FileTimeToLocalFileTime(&ftCur, &ftCur);
_tprintf(TEXT("Expires : %s %s (in %d seconds)\n"),
szLocalDate, szLocalTime,
CsecDiffFileTime(&ftCur,
&pinfo->rgSubs[iSub].ftTimeout));
_tprintf(TEXT("Timeout : %d\n"), pinfo->rgSubs[iSub].csecTimeout);
_tprintf(TEXT("SID : %s\n\n"), pinfo->rgSubs[iSub].szSid);
free(pinfo->rgSubs[iSub].szDestUrl);
free(pinfo->rgSubs[iSub].szSid);
}
free(pinfo->rgSubs);
_tprintf(TEXT("------------------------------------------------------\n\n"));
}
else
{
TraceTag(ttidUpdiag, "Failed to get event source info for %s! Error %d.",
psvc->szEvtUrl, GetLastError());
}
}
else
{
TraceTag(ttidUpdiag, "Failed to crack URL %s! Error %d.",
psvc->szEvtUrl, GetLastError());
}
delete [] pszEvtUrl;
}
else
{
TraceTag(ttidUpdiag, "DoEvtSrcInfo: SzFromTsz failed");
}
}