📄 submit.cpp
字号:
EnterCriticalSection(&g_csListEventSource);
pes = PesVerifyEventSource(pes);
if (!pes)
{
hr = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
goto cleanup;
}
// <U:propertyset xmlns:U="upnp">
if (!strEvent.assign(c_wszPropertySetBegin))
goto cleanup;
// Add modified/all evented state variables
for (iProp = 0; iProp < pes->cProps; iProp++)
{
UPNP_PROPERTY * pProp = &pes->rgesProps[iProp];
if ((!(pes->rgesProps[iProp].dwFlags & UPF_NON_EVENTED)) &&
((pSub->rgesModified[iProp] || fAllProps)))
{
if(!EncodeForXML(pProp->szValue, &strEncodedValue))
goto cleanup;
// <U:property>
if(!strEvent.append(c_wszPropertyBegin))
goto cleanup;
// <foo>
if(!strEvent.append(L" <"))
goto cleanup;
if(!strEvent.append(pProp->szName))
goto cleanup;
if(!strEvent.append(L">"))
goto cleanup;
// goodbye
if(!strEvent.append(strEncodedValue))
goto cleanup;
// </foo>
if(!strEvent.append(L"</"))
goto cleanup;
if(!strEvent.append(pProp->szName))
goto cleanup;
if(!strEvent.append(L">\r\n"))
goto cleanup;
// </U:property>
if(!strEvent.append(c_wszPropertyEnd))
goto cleanup;
}
}
// </U:propertyset>
if (!strEvent.append(c_wszPropertySetEnd))
goto cleanup;
// convert event body to UTF8
int cb;
UINT cp = CP_UTF8;
cb = WideCharToMultiByte(cp, 0, strEvent, -1, NULL, 0, 0, 0);
if(!cb)
if(cb = WideCharToMultiByte(CP_ACP, 0, strEvent, -1, NULL, 0, 0, 0))
cp = CP_ACP;
if(*pszOut = (LPSTR)malloc(cb))
WideCharToMultiByte(cp, 0, strEvent, -1, *pszOut, cb, 0, 0);
else
goto cleanup;
// Mark all properties as not modified for this subscriber
for (iProp = 0; iProp < pes->cProps; iProp++)
{
pSub->rgesModified[iProp] = false;
}
hr = S_OK;
cleanup:
LeaveCriticalSection(&g_csListEventSource);
TraceError("HrComposeXmlBodyFromEventSource", hr);
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: HrSubmitEventToSubscriber
//
// Purpose: Submits a raw event to a specific subscriber
//
// Arguments:
// dwFlags [in] Currently unused
// szHeaders [in] null-term string of headers for the event,
// separated by CRLF
// szEventBody [in] null-term string containing event body
// szDestUrl [in] Destination URL of subscriber
//
// Returns: S_OK if success, E_OUTOFMEMORY if no memory or other
// INTERNET_* errors
//
// Author: danielwe 12 Oct 1999
//
// Notes:
//
HRESULT HrSubmitEventToSubscriber(DWORD dwFlags, DWORD dwTimeout,
LPCSTR szSid, DWORD iSeq, LPCSTR szEventBody,
LPCSTR szDestUrl)
{
assert(dwTimeout >= MINIMAL_EVENT_TIMEOUT && dwTimeout <= DEFAULT_EVENT_TIMEOUT);
HttpRequest request(dwTimeout * 1000);
char pszSeq[10];
sprintf(pszSeq, "%d", iSeq);
// prepare NOTIFY request
if(!request.Open("NOTIFY", szDestUrl, "HTTP/1.1"))
return request.GetHresult();
// add SID header
request.AddHeader("NT", "upnp:event");
request.AddHeader("NTS", "upnp:propchange");
request.AddHeader("SID", szSid);
request.AddHeader("SEQ", pszSeq);
request.AddHeader("CONTENT-TYPE", "text/xml; charset=\"utf-8\"");
request.AddHeader("CONTENT-LENGTH", strlen(szEventBody));
// write request body
request.Write(szEventBody);
TraceTag(ttidEvents, "Sending event to subscriber %s ", szDestUrl);
TraceTag(ttidEvents, "-------------------------------------------");
TraceTag(ttidEvents, "SEQ: %d\n%s", iSeq, szEventBody);
TraceTag(ttidEvents, "-------------------------------------------");
// send request
if(!request.Send())
{
TraceTag(ttidEvents, "Failed with error: 0x%08x", request.GetHresult());
TraceTag(ttidEvents, "-------------------------------------------");
return request.GetHresult();
}
if(request.GetStatus() != HTTP_STATUS_OK)
{
TraceTag(ttidEvents, "Subscriber returned status %d", request.GetStatus());
TraceTag(ttidEvents, "-------------------------------------------");
}
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Function: SubmitUpnpPropertyEvent
//
// Purpose: Public API to submit a property change event to all subscribers.
//
// Arguments:
// szEventSourceUri [in] URI identifying the event source
// dwFlags [in] Currently unused
// cProps [in] Number of properties that have changed
// rgProps [in] Properties that have changed
//
// Returns: S_OK if success, E_OUTOFMEMORY if no memory or other
// INTERNET_* errors
//
// Author: danielwe 12 Oct 1999
//
// Notes:
//
BOOL WINAPI SubmitUpnpPropertyEvent(
/* [string][in] */ LPCSTR szEventSourceUri,
/* [in] */ DWORD dwFlags,
/* [in] */ DWORD cProps,
/* [in] */ UPNP_PROPERTY __RPC_FAR *rgProps)
{
DWORD dwError = NO_ERROR;
UPNP_EVENT_SOURCE * pes;
HRESULT hr = S_OK;
BOOL fRet;
if (InterlockedExchange(&cInitialized, cInitialized) == 0)
{
SetLastError(ERROR_NOT_READY);
return FALSE;
}
// Validate params
//
if (!cProps || !rgProps || !szEventSourceUri || !*szEventSourceUri)
{
TraceTag(ttidError, "_SubmitUpnpPropertyEventRpc: error %ld.",
HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER));
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
EnterCriticalSection(&g_csListEventSource);
// Get the event source that the URI refers to. If we don't find it,
// return an error.
//
pes = PesFindEventSource(szEventSourceUri);
if (!pes)
{
TraceTag(ttidError, "_SubmitUpnpPropertyEventRpc: error %ld.",
HRESULT_FROM_WIN32(ERROR_INTERNET_ITEM_NOT_FOUND));
LeaveCriticalSection(&g_csListEventSource);
SetLastError( ERROR_INTERNET_ITEM_NOT_FOUND);
return FALSE;
}
//EnterCriticalSection(&pes->cs);
// Take the props passed in and update the event source's cache of these
// prop values. Mark each value that changed as modified.
//
if (fRet = FUpdateEventSourceWithProps(pes, dwFlags, cProps, rgProps))
{
SetEvent(g_hEvtEventSource);
}
else
{
TraceTag(ttidError, "_SubmitUpnpPropertyEventRpc:"
"UpdateEventSourceWithPropserror %ld.",
HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER));
SetLastError( ERROR_INVALID_PARAMETER);
fRet = FALSE;
}
//LeaveCriticalSection(&pes->cs);
LeaveCriticalSection(&g_csListEventSource);
return fRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -