241 lines
5.5 KiB
C++
241 lines
5.5 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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;
|
|
}
|
|
|