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.
|
|
/* ----------------------------------------------------------------------
Module: ULS.DLL (Service Provider) File: splprot.cpp Content: This file contains the local protocol object. History: 10/15/96 Chu, Lon-Chan [lonchanc] Created.
Copyright (c) Microsoft Corporation 1996-1997
---------------------------------------------------------------------- */
#include "ulsp.h"
#include "spinc.h"
const TCHAR *c_apszProtStdAttrNames[COUNT_ENUM_PROTATTR] = { TEXT ("sprotid"), TEXT ("sprotmimetype"), TEXT ("sport"), };
/* ---------- public methods ----------- */
SP_CProtocol:: SP_CProtocol ( SP_CClient *pClient ) : m_cRefs (0), // Reference count
m_uSignature (PROTOBJ_SIGNATURE) // Protocol object's signature
{ MyAssert (pClient != NULL); m_pClient = pClient;
// Clean up the scratch buffer for caching pointers to attribute values
//
::ZeroMemory (&m_ProtInfo, sizeof (m_ProtInfo));
// Indicate this protocol is not registered yet
//
SetRegNone (); }
SP_CProtocol:: ~SP_CProtocol ( VOID ) { // Invalidate the client object's signature
//
m_uSignature = (ULONG) -1;
// Free cached strings
//
MemFree (m_ProtInfo.apszStdAttrValues[ENUM_PROTATTR_NAME]); MemFree (m_ProtInfo.apszStdAttrValues[ENUM_PROTATTR_MIME_TYPE]); }
ULONG SP_CProtocol:: AddRef ( VOID ) { ::InterlockedIncrement (&m_cRefs); return m_cRefs; }
ULONG SP_CProtocol:: Release ( VOID ) { MyAssert (m_cRefs != 0); ::InterlockedDecrement (&m_cRefs);
ULONG cRefs = m_cRefs; if (cRefs == 0) delete this;
return cRefs; }
HRESULT SP_CProtocol:: Register ( ULONG uRespID, LDAP_PROTINFO *pInfo ) { MyAssert (pInfo != NULL);
// Cache protocol info
//
CacheProtInfo (pInfo);
// Get protocol name
//
TCHAR *pszProtName = m_ProtInfo.apszStdAttrValues[ENUM_PROTATTR_NAME]; if (! MyIsGoodString (pszProtName)) { MyAssert (FALSE); return ILS_E_PARAMETER; }
// Add the protocol object
//
return m_pClient->AddProtocol (WM_ILS_REGISTER_PROTOCOL, uRespID, this); }
HRESULT SP_CProtocol:: UnRegister ( ULONG uRespID ) { // If it is not registered on the server,
// the simply report success
//
if (! IsRegRemotely ()) { SetRegNone (); PostMessage (g_hWndNotify, WM_ILS_UNREGISTER_PROTOCOL, uRespID, S_OK); return S_OK; }
// Indicate that we are not registered at all
//
SetRegNone ();
// remove the protocol object
//
return m_pClient->RemoveProtocol (WM_ILS_UNREGISTER_PROTOCOL, uRespID, this); }
HRESULT SP_CProtocol:: SetAttributes ( ULONG uRespID, LDAP_PROTINFO *pInfo ) { MyAssert (pInfo != NULL);
// Cache protocol info
//
CacheProtInfo (pInfo);
// remove the protocol object
//
return m_pClient->UpdateProtocols (WM_ILS_SET_PROTOCOL_INFO, uRespID, this); }
/* ---------- protected methods ----------- */
/* ---------- private methods ----------- */
VOID SP_CProtocol:: CacheProtInfo ( LDAP_PROTINFO *pInfo ) { MyAssert (pInfo != NULL);
// Free previous allocations
//
MemFree (m_ProtInfo.apszStdAttrValues[ENUM_PROTATTR_NAME]); MemFree (m_ProtInfo.apszStdAttrValues[ENUM_PROTATTR_MIME_TYPE]);
// Clean up the buffer
//
ZeroMemory (&m_ProtInfo, sizeof (m_ProtInfo));
// Start to cache protocol standard attributes
//
if (pInfo->uOffsetName != INVALID_OFFSET) { m_ProtInfo.apszStdAttrValues[ENUM_PROTATTR_NAME] = My_strdup ((TCHAR *) (((BYTE *) pInfo) + pInfo->uOffsetName)); m_ProtInfo.dwFlags |= PROTOBJ_F_NAME; }
if (pInfo->uPortNumber != INVALID_OFFSET) { m_ProtInfo.apszStdAttrValues[ENUM_PROTATTR_PORT_NUMBER] = &m_ProtInfo.szPortNumber[0]; ::GetLongString (pInfo->uPortNumber, &m_ProtInfo.szPortNumber[0]); m_ProtInfo.dwFlags |= PROTOBJ_F_PORT_NUMBER; }
if (pInfo->uOffsetMimeType != INVALID_OFFSET) { m_ProtInfo.apszStdAttrValues[ENUM_PROTATTR_MIME_TYPE] = My_strdup ((TCHAR *) (((BYTE *) pInfo) + pInfo->uOffsetMimeType)); m_ProtInfo.dwFlags |= PROTOBJ_F_MIME_TYPE; } }
|