//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: S E R V I C E . C P P // // Contents: Functions dealing with UPnP services. // // Notes: // // Author: danielwe 28 Oct 1999 // //---------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "oleauto.h" #include "ncbase.h" #include "updiagp.h" #include "ncinet.h" BOOL DoListServices(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs) { if (g_ctx.ectx == CTX_CD) { DWORD isvc; _tprintf(TEXT("Listing all Services within %s\n"), PDevCur()->szFriendlyName); _tprintf(TEXT("------------------------------\n")); for (isvc = 0; isvc < PDevCur()->cSvcs; isvc++) { _tprintf(TEXT("%d) %s\n"), isvc + 1, PDevCur()->rgSvcs[isvc]->szServiceType); } _tprintf(TEXT("------------------------------\n\n")); } return FALSE; } BOOL DoSwitchSvc(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs) { if (g_ctx.ectx == CTX_CD) { if (cArgs == 2) { DWORD isvc; isvc = _tcstoul(rgArgs[1], NULL, 10); if (isvc && isvc <= PDevCur()->cSvcs && PDevCur()->rgSvcs[isvc - 1]) { g_ctx.psvcCur = PDevCur()->rgSvcs[isvc - 1]; g_ctx.ectx = CTX_CD_SVC; } else { _tprintf(TEXT("%d is not a valid Service index!\n"), isvc); } } else { Usage(iCmd); } } return FALSE; } VOID CleanupService(UPNPSVC *psvc) { if (psvc->hSvc) { if (DeregisterService(psvc->hSvc, TRUE)) { TraceTag(ttidUpdiag, "Successfully deregistered %s as a service.", psvc->szServiceType); } else { TraceTag(ttidUpdiag, "Error %d deregistering %s as a service.", GetLastError(), psvc->szServiceType); } CHAR szEvtUrl[INTERNET_MAX_URL_LENGTH]; HRESULT hr; LPSTR pszEvtUrl = SzFromTsz(psvc->szEvtUrl); if (pszEvtUrl) { hr = HrGetRequestUriA(pszEvtUrl, INTERNET_MAX_URL_LENGTH, szEvtUrl); if (SUCCEEDED(hr)) { if (DeregisterUpnpEventSource(szEvtUrl)) { TraceTag(ttidUpdiag, "Successfully deregistered %s as an event source.", psvc->szEvtUrl); } else { TraceTag(ttidUpdiag, "Error %d deregistering %s as an event source.\n", GetLastError(), psvc->szEvtUrl); } } TraceError("CleanupService: HrGetRequestUri", hr); delete [] pszEvtUrl; } else { TraceTag(ttidUpdiag, "CleanupService: TszToSz failed"); } } delete psvc; } // print current service state table values BOOL DoPrintSST(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs) { HRESULT hr; Assert(g_ctx.ectx == CTX_CD_SVC); UPNPSVC * psvc = g_ctx.psvcCur; _tprintf(TEXT("Service State Table: \n")); _tprintf(TEXT("----------------------------------------------------\n")); for (DWORD iRow = 0; iRow < psvc->sst.cRows; iRow++) { SST_ROW * pRow = &psvc->sst.rgRows[iRow]; VARIANT varDest; VariantInit(&varDest); hr = VariantChangeType(&varDest, &(pRow->varValue), 0, VT_BSTR); if (SUCCEEDED(hr)) { _tprintf(TEXT("%d) %s = %S "), iRow + 1, psvc->sst.rgRows[iRow].szPropName, varDest.bstrVal); VariantClear(&varDest); if (*pRow->mszAllowedValueList) { _tprintf(TEXT(", Allowed Value List: ")); TCHAR * pNextString = pRow->mszAllowedValueList; while (*pNextString) { _tprintf(TEXT("%s"), pNextString); pNextString += lstrlen(pNextString); pNextString ++; if (*pNextString) _tprintf(TEXT(",")); } } else if (*pRow->szMin) { _tprintf(TEXT(", Min: %s, Max: %s, Step: %s"), pRow->szMin, pRow->szMax, pRow->szStep); } } _tprintf(TEXT("\n")); } _tprintf(TEXT("----------------------------------------------------\n\n")); return FALSE; } // print current service state table values BOOL DoPrintActionSet(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs) { Assert(g_ctx.ectx == CTX_CD_SVC); UPNPSVC * psvc = g_ctx.psvcCur; _tprintf(TEXT("Service Action Set: \n")); _tprintf(TEXT("----------------------------------------------------\n")); for (DWORD iAct = 0; iAct < psvc->action_set.cActions; iAct++) { _tprintf(TEXT("%d) %s:\n"), iAct+1, psvc->action_set.rgActions[iAct].szActionName); for (DWORD iOpt =0; iOptaction_set.rgActions[iAct].cOperations; iOpt++) { OPERATION_DATA * pOptData = &psvc->action_set.rgActions[iAct].rgOperations[iOpt]; _tprintf(TEXT("Name = %s, Variable = %s"), pOptData->szOpName, pOptData->szVariableName); TCHAR * szConst = pOptData->mszConstantList; if (*szConst) { _tprintf(TEXT(", Constants = ")); while (*szConst) { _tprintf(TEXT("%s"), szConst); szConst += lstrlen(szConst); szConst++; if (*szConst) _tprintf(TEXT(", ")); } } _tprintf(TEXT("\n")); } _tprintf(TEXT("\n")); } _tprintf(TEXT("----------------------------------------------------\n\n")); return FALSE; }