|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: U C P . C P P
//
// Contents: Functions dealing with UPnP User Control Points
//
// Notes:
//
// Author: danielwe 28 Oct 1999
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "ncbase.h"
#include "updiagp.h"
BOOL DoNewUcp(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs) { Assert(g_ctx.ectx == CTX_ROOT);
if (cArgs == 2) { if (g_params.cUcp < MAX_UCP) { UPNPUCP * pucp = new UPNPUCP;
ZeroMemory(pucp, sizeof(UPNPUCP)); lstrcpy(pucp->szName, rgArgs[1]);
g_params.rgUcp[g_params.cUcp++] = pucp; g_ctx.pucpCur = pucp; g_ctx.ectx = CTX_UCP; } else { _tprintf(TEXT("Exceeded number of UCPs allowed!\n\n")); } } else { Usage(iCmd); }
return FALSE; }
BOOL DoDelUcp(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs) { Assert(g_ctx.ectx == CTX_ROOT);
if (cArgs == 2) { DWORD iucp; UPNPUCP * pucp;
iucp = _tcstoul(rgArgs[1], NULL, 10);
pucp = g_params.rgUcp[iucp - 1];
if (iucp && iucp <= g_params.cUcp && pucp) { _tprintf(TEXT("Deleted control point %s.\n"), pucp->szName);
// Move last item into gap and decrement the count
g_params.rgUcp[iucp - 1] = g_params.rgUcp[g_params.cUcp - 1]; CleanupUcp(pucp); g_params.cUcp--; } else { _tprintf(TEXT("%d is not a valid UCP index!\n"), iucp); } } else { Usage(iCmd); }
return FALSE; }
BOOL DoSwitchUcp(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs) { Assert(g_ctx.ectx == CTX_ROOT);
if (cArgs == 2) { DWORD iucp;
iucp = _tcstoul(rgArgs[1], NULL, 10); if (iucp && iucp <= g_params.cUcp && g_params.rgUcp[iucp - 1]) { g_ctx.pucpCur = g_params.rgUcp[iucp - 1]; g_ctx.ectx = CTX_UCP; } else { _tprintf(TEXT("%d is not a valid UCP index!\n"), iucp); } } else { Usage(iCmd); }
return FALSE; }
VOID CleanupUcp(UPNPUCP *pucp) { DWORD i;
for (i = 0; i < pucp->cResults; i++) { CleanupResult(pucp->rgResults[i]); }
delete pucp; }
BOOL DoListUcp(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs) { if (g_ctx.ectx == CTX_ROOT) { DWORD iucp;
_tprintf(TEXT("Listing all Control Points\n")); _tprintf(TEXT("------------------------------\n")); for (iucp = 0; iucp < g_params.cUcp; iucp++) { _tprintf(TEXT("%d) %s\n"), iucp + 1, g_params.rgUcp[iucp]->szName); }
_tprintf(TEXT("------------------------------\n\n")); }
return FALSE; }
BOOL DoSubscribe(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs) { HANDLE hSubs;
Assert(g_ctx.ectx & (CTX_UCP | CTX_DEVICE));
if (g_ctx.pucpCur->cResults >= MAX_RESULT) { _tprintf(TEXT("Exceeded maximum number of subscriptions!\n")); return FALSE; }
if (cArgs == 2) { UPNPRESULT * psubs;
psubs = new UPNPRESULT; ZeroMemory(psubs, sizeof(UPNPRESULT)); lstrcpy(psubs->szType, rgArgs[1]); psubs->resType = RES_SUBS;
if (g_ctx.ectx == CTX_UCP) { Assert(rgArgs[1]); LPSTR pszType = SzFromTsz(rgArgs[1]); if (pszType) { psubs->hResult = RegisterNotification(NOTIFY_PROP_CHANGE, NULL, pszType, NotifyCallback, (LPVOID) psubs); if (psubs->hResult && psubs->hResult != INVALID_HANDLE_VALUE) { g_ctx.pucpCur->rgResults[g_ctx.pucpCur->cResults++] = psubs; _tprintf(TEXT("Subscribed to event URL : %s\n"), rgArgs[1]); } else { _tprintf(TEXT("RegisterNotification failed with error %d.\n"), GetLastError()); delete psubs; }
delete [] pszType; } else { _tprintf(TEXT("DoSubscribe: SzFromTsz failed\n")); } } } else { Usage(iCmd); }
return FALSE; }
BOOL DoUnsubscribe(DWORD iCmd, DWORD cArgs, LPTSTR *rgArgs) { Assert(g_ctx.ectx == CTX_UCP);
if (cArgs == 2) { DWORD isrch;
isrch = _tcstoul(rgArgs[1], NULL, 10); if (isrch <= g_ctx.pucpCur->cResults && g_ctx.pucpCur->rgResults[isrch - 1]) { UPNPRESULT * psubs = g_ctx.pucpCur->rgResults[isrch - 1];
_tprintf(TEXT("Deleted subscription %s.\n"), psubs->szType); // Move last item into gap and decrement the count
g_ctx.pucpCur->rgResults[isrch - 1] = g_ctx.pucpCur->rgResults[g_ctx.pucpCur->cResults - 1]; CleanupResult(psubs); g_ctx.pucpCur->cResults--; } else { _tprintf(TEXT("%d is not a valid subscription index!\n"), isrch); } } else { Usage(iCmd); }
return FALSE; }
|