|
|
//+---------------------------------------------------------------------------
//
// 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"); } }
|