windows-nt/Source/XPSP1/NT/enduser/netmeeting/ulsldap/localprt.cpp
2020-09-26 16:20:57 +08:00

677 lines
16 KiB
C++

//****************************************************************************
//
// Module: ULS.DLL
// File: localprt.cpp
// Content: This file contains the LocalProtocol object.
// History:
// Wed 17-Apr-1996 11:13:54 -by- Viroon Touranachun [viroont]
//
// Copyright (c) Microsoft Corporation 1996-1997
//
//****************************************************************************
#include "ulsp.h"
#include "localprt.h"
#include "attribs.h"
#include "callback.h"
#include "culs.h"
//****************************************************************************
// Event Notifiers
//****************************************************************************
//
//****************************************************************************
// Class Implementation
//****************************************************************************
//
//****************************************************************************
// CLocalProt::CLocalProt (void)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CLocalProt::CLocalProt (void)
:m_cRef (0),
m_fReadonly (FALSE),
m_hProt (NULL),
m_szName (NULL),
m_uPort (0),
m_szMimeType (NULL),
m_pAttrs (NULL),
m_pConnPt (NULL),
m_pIlsServer (NULL),
m_pszUser (NULL),
m_pszApp (NULL)
{
}
//****************************************************************************
// CLocalProt::~CLocalProt (void)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CLocalProt::~CLocalProt (void)
{
// Release the connection point
//
if (m_pConnPt != NULL)
{
m_pConnPt->ContainerReleased();
((IConnectionPoint*)m_pConnPt)->Release();
};
// Release the attributes object
//
if (m_pAttrs != NULL)
{
m_pAttrs->Release();
};
// Release the buffer resources
//
::MemFree (m_szName);
::MemFree (m_szMimeType);
::MemFree (m_pszUser);
::MemFree (m_pszApp);
if (m_pIlsServer != NULL)
m_pIlsServer->Release ();
if (m_hProt != NULL)
::UlsLdap_VirtualUnRegisterProtocol(m_hProt);
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::Init (BSTR bstrName, ULONG uPort, BSTR bstrMimeType)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CLocalProt::Init (BSTR bstrName, ULONG uPort, BSTR bstrMimeType)
{
HRESULT hr;
// Set the port number
//
this->m_uPort = uPort;
hr = BSTR_to_LPTSTR(&m_szName, bstrName);
if (SUCCEEDED(hr))
{
hr = BSTR_to_LPTSTR(&m_szMimeType, bstrMimeType);
if (SUCCEEDED(hr))
{
#ifdef LATER
// Initialize the attributes list
//
m_pAttrs = new CAttributes;
if (m_pAttrs != NULL)
m_pAttrs->SetAccessType (ILS_ATTRTYPE_NAME_VALUE);
#endif //LATER
// Make the connection point
//
m_pConnPt = new CConnectionPoint (&IID_IIlsProtocolNotify,
(IConnectionPointContainer *)this);
if (m_pConnPt != NULL)
{
((IConnectionPoint*)m_pConnPt)->AddRef();
hr = NOERROR;
}
else
{
hr = ILS_E_MEMORY;
};
};
};
// Make this as read/write access
//
ASSERT (! m_fReadonly);
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsProt::Init (LPTSTR szServerName, LPTSTR szUserName,
// LPTSTR szAppName, PLDAP_PROTINFO ppi)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CLocalProt::Init (CIlsServer *pIlsServer, LPTSTR szUserName,
LPTSTR szAppName, PLDAP_PROTINFO ppi)
{
HRESULT hr;
// Validate parameter
//
if (ppi == NULL)
return ILS_E_POINTER;
if (ppi->uSize != sizeof(*ppi))
return ILS_E_PARAMETER;
// Make this a readonly guy
//
m_fReadonly = TRUE;
// Remember port name
//
m_uPort = ppi->uPortNumber;
// Remember the server name
//
m_pIlsServer = pIlsServer;
pIlsServer->AddRef ();
hr = SetLPTSTR(&m_pszUser, szUserName);
if (SUCCEEDED(hr))
{
hr = SetLPTSTR(&m_pszApp, szAppName);
if (SUCCEEDED(hr))
{
hr = SetLPTSTR(&m_szName,
(LPCTSTR)(((PBYTE)ppi)+ppi->uOffsetName));
if (SUCCEEDED(hr))
{
hr = SetLPTSTR(&m_szMimeType,
(LPCTSTR)(((PBYTE)ppi)+ppi->uOffsetMimeType));
};
};
};
// cleanup is done in destructor
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::QueryInterface (REFIID riid, void **ppv)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CLocalProt::QueryInterface (REFIID riid, void **ppv)
{
*ppv = NULL;
if (riid == IID_IIlsProtocol || riid == IID_IUnknown)
{
*ppv = (IIlsMain *) this;
}
else
{
if (riid == IID_IConnectionPointContainer)
{
*ppv = (IConnectionPointContainer *) this;
};
};
if (*ppv != NULL)
{
((LPUNKNOWN)*ppv)->AddRef();
return S_OK;
}
else
{
return ILS_E_NO_INTERFACE;
};
}
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CLocalProt::AddRef (void)
//
// History:
// Wed 17-Apr-1996 11:14:17 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG)
CLocalProt::AddRef (void)
{
DllLock();
MyDebugMsg ((DM_REFCOUNT, "CLocalProt::AddRef: ref=%ld\r\n", m_cRef));
::InterlockedIncrement (&m_cRef);
return (ULONG) m_cRef;
}
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CLocalProt::Release (void)
//
// History:
// Wed 17-Apr-1996 11:14:26 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG)
CLocalProt::Release (void)
{
DllRelease();
ASSERT (m_cRef > 0);
MyDebugMsg ((DM_REFCOUNT, "CLocalProt::Release: ref=%ld\r\n", m_cRef));
if (::InterlockedDecrement (&m_cRef) == 0)
{
delete this;
return 0;
}
return (ULONG) m_cRef;
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::IsWritable (BOOL *pfWriteable)
//
//****************************************************************************
STDMETHODIMP
CLocalProt::IsWritable(BOOL *pfWriteable)
{
HRESULT hr;
if (pfWriteable)
{
*pfWriteable = !m_fReadonly;
hr = S_OK;
}
else
{
hr = ILS_E_POINTER;
}
return (hr);
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::GetStandardAttribute (ILS_STD_ATTR_NAME stdAttr, BSTR *pbstrStdAttr)
//
// History:
// 1-16-97 Shishir Pardikar
// Created.
//****************************************************************************
STDMETHODIMP
CLocalProt::GetStandardAttribute(
ILS_STD_ATTR_NAME stdAttr,
BSTR *pbstrStdAttr
)
{
LPTSTR lpszAttr = NULL;
BOOL fValid = TRUE;
HRESULT hr;
TCHAR sz[16];
if (pbstrStdAttr == NULL) {
return ILS_E_POINTER;
}
switch(stdAttr) {
case ILS_STDATTR_PROTOCOL_PORT:
lpszAttr = &sz[0];
wsprintf (&sz[0], TEXT ("%lu"), m_uPort);
break;
case ILS_STDATTR_PROTOCOL_NAME:
lpszAttr = m_szName;
break;
case ILS_STDATTR_PROTOCOL_MIME_TYPE:
lpszAttr = m_szMimeType;
break;
default:
fValid = FALSE;
break;
}
if (fValid) {
if (lpszAttr){
hr = LPTSTR_to_BSTR(pbstrStdAttr, lpszAttr);
}
else {
*pbstrStdAttr = NULL;
hr = NOERROR;
}
}
else {
hr = ILS_E_PARAMETER;
}
return (hr);
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::SetStandardAttribute (ILS_STD_ATTR_NAME stdAttr, BSTR bstrStdAttr)
//
// History:
// 1-16-97 Shishir Pardikar
// Created.
//****************************************************************************
STDMETHODIMP
CLocalProt::SetStandardAttribute(
ILS_STD_ATTR_NAME stdAttr,
BSTR bstrStdAttr
)
{
return (ILS_E_FAIL);
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::Update(BSTR bstrServerName, ULONG *pulReqId)
//
// History:
// 1-16-97 Shishir Pardikar
// Created.
//****************************************************************************
STDMETHODIMP CLocalProt::
Update ( ULONG *pulReqID )
{
return (ILS_E_FAIL);
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::IsSameAs (CLocalProt *pProtocol)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CLocalProt::IsSameAs (CLocalProt *pProtocol)
{
return (!lstrcmp(pProtocol->m_szName, this->m_szName) ?
NOERROR : S_FALSE);
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::GetProtocolInfo (PLDAP_PROTINFO *ppProtInfo)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CLocalProt::GetProtocolInfo (PLDAP_PROTINFO *ppProtInfo)
{
PLDAP_PROTINFO ppi;
ULONG cName, cMime;
HRESULT hr;
// Assume failure
//
*ppProtInfo = NULL;
// Calculate the buffer size
//
cName = lstrlen(m_szName)+1;
cMime = lstrlen(m_szMimeType)+1;
// Allocate the buffer
//
ULONG cbTotalSize = sizeof (LDAP_PROTINFO) + (cName + cMime) * sizeof (TCHAR);
ppi = (PLDAP_PROTINFO) ::MemAlloc (cbTotalSize);
if (ppi == NULL)
{
hr = ILS_E_MEMORY;
}
else
{
// Fill the structure content
//
ppi->uSize = cbTotalSize;
ppi->uOffsetName = sizeof(*ppi);
ppi->uPortNumber = m_uPort;
ppi->uOffsetMimeType = ppi->uOffsetName + (cName*sizeof(TCHAR));
// Copy the user information
//
lstrcpy((LPTSTR)(((PBYTE)ppi)+ppi->uOffsetName), m_szName);
lstrcpy((LPTSTR)(((PBYTE)ppi)+ppi->uOffsetMimeType), m_szMimeType);
// Return the structure
//
*ppProtInfo = ppi;
};
return NOERROR;
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::NotifySink (void *pv, CONN_NOTIFYPROC pfn)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CLocalProt::NotifySink (void *pv, CONN_NOTIFYPROC pfn)
{
HRESULT hr = S_OK;
if (m_pConnPt != NULL)
{
hr = m_pConnPt->Notify(pv, pfn);
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::GetID (BSTR *pbstrID)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CLocalProt::GetPortNumber (ULONG *pulPort)
{
// Validate parameter
//
if (pulPort == NULL)
{
return ILS_E_POINTER;
};
*pulPort = m_uPort;
return (NOERROR);
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::SetAttributes (IIlsAttributes *pAttributes, ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalProt::
SetExtendedAttribute ( BSTR bstrName, BSTR bstrValue )
{
return ILS_E_NOT_IMPL;
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::RemoveAttributes (IIlsAttributes *pAttributes, ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalProt::
RemoveExtendedAttribute ( BSTR bstrName )
{
return ILS_E_NOT_IMPL;
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::GetAttributes (IIlsAttributes **pAttributes)
//
//****************************************************************************
STDMETHODIMP CLocalProt::
GetExtendedAttribute ( BSTR bstrName, BSTR *pbstrValue )
{
return ILS_E_NOT_IMPL;
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::GetAllExtendedAttributes (IIlsAttributes **pAttributes)
//
//****************************************************************************
STDMETHODIMP CLocalProt::
GetAllExtendedAttributes ( IIlsAttributes **ppAttributes )
{
return ILS_E_NOT_IMPL;
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::EnumConnectionPoints(IEnumConnectionPoints **ppEnum)
//
// History:
// Wed 17-Apr-1996 11:15:02 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CLocalProt::EnumConnectionPoints(IEnumConnectionPoints **ppEnum)
{
CEnumConnectionPoints *pecp;
HRESULT hr;
// Validate parameters
//
if (ppEnum == NULL)
{
return ILS_E_POINTER;
};
// Assume failure
//
*ppEnum = NULL;
// Create an enumerator
//
pecp = new CEnumConnectionPoints;
if (pecp == NULL)
return ILS_E_MEMORY;
// Initialize the enumerator
//
hr = pecp->Init((IConnectionPoint *)m_pConnPt);
if (FAILED(hr))
{
delete pecp;
return hr;
};
// Give it back to the caller
//
pecp->AddRef();
*ppEnum = pecp;
return S_OK;
}
//****************************************************************************
// STDMETHODIMP
// CLocalProt::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp)
//
// History:
// Wed 17-Apr-1996 11:15:09 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CLocalProt::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp)
{
IID siid;
HRESULT hr;
// Validate parameters
//
if (ppcp == NULL)
{
return ILS_E_POINTER;
};
// Assume failure
//
*ppcp = NULL;
if (m_pConnPt != NULL)
{
hr = m_pConnPt->GetConnectionInterface(&siid);
if (SUCCEEDED(hr))
{
if (riid == siid)
{
*ppcp = (IConnectionPoint *)m_pConnPt;
(*ppcp)->AddRef();
hr = S_OK;
}
else
{
hr = ILS_E_NO_INTERFACE;
};
};
}
else
{
hr = ILS_E_NO_INTERFACE;
};
return hr;
}