Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

141 lines
4.2 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: N O T I F Y . H
//
// Contents: SSDP client notification support
//
// Notes:
//
// Author: mbend 12 Nov 2000
//
//----------------------------------------------------------------------------
#pragma once
#include "ulist.h"
#include "upsync.h"
#include "ustring.h"
#include "timer.h"
#include "ssdptypes.h"
class CSsdpPendingNotification
{
public:
CSsdpPendingNotification();
~CSsdpPendingNotification();
HRESULT HrInitialize(const SSDP_REQUEST * pRequest);
HRESULT HrGetRequest(SSDP_REQUEST * pRequest);
private:
CSsdpPendingNotification(const CSsdpPendingNotification &);
CSsdpPendingNotification & operator=(const CSsdpPendingNotification &);
SSDP_REQUEST m_ssdpRequest;
};
class CSsdpNotifyRequest
{
public:
CSsdpNotifyRequest();
~CSsdpNotifyRequest();
// RPC rundown support
static void OnRundown(CSsdpNotifyRequest * pNotify);
// Timer callback methods
void TimerFired();
BOOL TimerTryToLock();
void TimerUnlock();
HRESULT HrRestartClientResubscribeTimer(
DWORD dwSecTimeout);
HRESULT HrInitializeAlive(
const char * szNT,
HANDLE hNotifySemaphore);
HRESULT HrInitializePropChange(
const char * szUrl,
HANDLE hNotifySemaphore);
HRESULT HrSendPropChangeSubscription(SSDP_REGISTER_INFO ** ppRegisterInfo);
HRESULT HrShutdown();
BOOL FIsMatchBySemaphore(HANDLE hNotifySemaphore);
BOOL FIsMatchingEvent(const SSDP_REQUEST * pRequest);
BOOL FIsMatchingAliveOrByebye(const SSDP_REQUEST * pRequest);
HRESULT HrQueuePendingNotification(const SSDP_REQUEST * pRequest);
BOOL FIsPendingNotification();
HRESULT HrRetreivePendingNotification(MessageList ** ppSvcList);
private:
CSsdpNotifyRequest(const CSsdpNotifyRequest &);
CSsdpNotifyRequest & operator=(const CSsdpNotifyRequest &);
typedef CUList<CSsdpPendingNotification> PendingNotificationList;
NOTIFY_TYPE m_nt;
CUCriticalSection m_critSec;
CUString m_strNT;
CUString m_strUrl;
DWORD m_dwSecTimeout;
CUString m_strSid;
CTimer<CSsdpNotifyRequest> m_timer;
HANDLE m_hNotifySemaphore;
PendingNotificationList m_pendingNotificationList;
};
class CSsdpNotifyRequestManager
{
public:
~CSsdpNotifyRequestManager();
static CSsdpNotifyRequestManager & Instance();
void OnRundown(CSsdpNotifyRequest * pNotify);
HRESULT HrCreateAliveNotifyRequest(
PCONTEXT_HANDLE_TYPE * ppContextHandle,
const char * szNT,
HANDLE hNotifySemaphore);
HRESULT HrCreatePropChangeNotifyRequest(
PCONTEXT_HANDLE_TYPE * ppContextHandle,
const char * szUrl,
HANDLE hNotifySemaphore,
SSDP_REGISTER_INFO ** ppRegisterInfo);
HRESULT HrRemoveNotifyRequest(
HANDLE hNotifySemaphore);
HRESULT HrRemoveNotifyRequestByPointer(
CSsdpNotifyRequest * pRequest);
HRESULT HrCheckListNotifyForEvent(const SSDP_REQUEST * pRequest);
HRESULT HrCheckListNotifyForAliveOrByebye(const SSDP_REQUEST * pRequest);
BOOL FIsAliveOrByebyeInListNotify(const SSDP_REQUEST * pRequest);
HRESULT HrRetreivePendingNotification(
HANDLE hNotifySemaphore,
MessageList ** ppSvcList);
HRESULT HrRestartClientResubscribeTimer(
CSsdpNotifyRequest * pRequest,
DWORD dwSecTimeout);
private:
CSsdpNotifyRequestManager();
CSsdpNotifyRequestManager(const CSsdpNotifyRequestManager &);
CSsdpNotifyRequestManager & operator=(const CSsdpNotifyRequestManager &);
HRESULT HrRemoveInternal(BOOL bRundown, HANDLE hNotifySemaphore, CSsdpNotifyRequest * pRequest);
static CSsdpNotifyRequestManager s_instance;
typedef CUList<CSsdpNotifyRequest> NotifyRequestList;
typedef CUList<__int64> TimestampList;
CUCriticalSection m_critSecAliveList;
NotifyRequestList m_aliveList;
CUCriticalSection m_critSecPropChangeList;
NotifyRequestList m_propChangeList;
CUCriticalSection m_critSecTimestampList;
TimestampList m_timestampList;
__int64 m_unTimestamp;
HANDLE m_hEventTimestamp;
};