WindowsXP-SP1/enduser/netmeeting/ulsldap/splprot.cpp

195 lines
4.0 KiB
C++

/* ----------------------------------------------------------------------
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;
}
}