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