//**************************************************************************** // // Module: ULS.DLL // File: ulsapp.cpp // Content: This file contains the Application object. // History: // Wed 17-Apr-1996 11:13:54 -by- Viroon Touranachun [viroont] // // Copyright (c) Microsoft Corporation 1996-1997 // //**************************************************************************** #include "ulsp.h" #include "ulsapp.h" #include "ulsprot.h" #include "attribs.h" #include "callback.h" //**************************************************************************** // Event Notifiers //**************************************************************************** // //**************************************************************************** // HRESULT // OnNotifyGetProtocolResult (IUnknown *pUnk, void *pv) // // History: // Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** HRESULT OnNotifyGetProtocolResult (IUnknown *pUnk, void *pv) { POBJRINFO pobjri = (POBJRINFO)pv; ((IULSApplicationNotify*)pUnk)->GetProtocolResult(pobjri->uReqID, (IULSAppProtocol *)pobjri->pv, pobjri->hResult); return S_OK; } //**************************************************************************** // HRESULT // OnNotifyEnumProtocolsResult (IUnknown *pUnk, void *pv) // // History: // Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** HRESULT OnNotifyEnumProtocolsResult (IUnknown *pUnk, void *pv) { CEnumNames *penum = NULL; PENUMRINFO peri = (PENUMRINFO)pv; HRESULT hr = peri->hResult; if (SUCCEEDED(hr)) { // Create a Application enumerator // penum = new CEnumNames; if (penum != NULL) { hr = penum->Init((LPTSTR)peri->pv, peri->cItems); if (SUCCEEDED(hr)) { penum->AddRef(); } else { delete penum; penum = NULL; }; } else { hr = ULS_E_MEMORY; }; }; // Notify the sink object // ((IULSApplicationNotify*)pUnk)->EnumProtocolsResult(peri->uReqID, penum != NULL ? (IEnumULSNames *)penum : NULL, hr); if (penum != NULL) { penum->Release(); }; return hr; } //**************************************************************************** // Class Implementation //**************************************************************************** // //**************************************************************************** // CUlsApp::CUlsApp (void) // // History: // Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** CUlsApp::CUlsApp (void) { cRef = 0; szServer = NULL; szUser = NULL; guid = GUID_NULL; szName = NULL; szMimeType = NULL; pAttrs = NULL; pConnPt = NULL; return; } //**************************************************************************** // CUlsApp::~CUlsApp (void) // // History: // Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** CUlsApp::~CUlsApp (void) { if (szServer != NULL) FreeLPTSTR(szServer); if (szUser != NULL) FreeLPTSTR(szUser); if (szName != NULL) FreeLPTSTR(szName); if (szMimeType != NULL) FreeLPTSTR(szMimeType); // Release attribute object // if (pAttrs != NULL) { pAttrs->Release(); }; // Release the connection point // if (pConnPt != NULL) { pConnPt->ContainerReleased(); ((IConnectionPoint*)pConnPt)->Release(); }; return; } //**************************************************************************** // STDMETHODIMP // CUlsApp::Init (LPTSTR szServerName, LPTSTR szUserName, PLDAP_APPINFO pai) // // History: // Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP CUlsApp::Init (LPTSTR szServerName, LPTSTR szUserName, PLDAP_APPINFO pai) { HRESULT hr; // Validate parameter // if ((pai->uSize != sizeof(*pai)) || // (pai->guid == GUID_NULL) || // Allow null GUID for http register (pai->uOffsetName == 0) || (pai->uOffsetMimeType == 0)) { return ULS_E_PARAMETER; }; if ((pai->cAttributes != 0) && (pai->uOffsetAttributes == 0)) { return ULS_E_PARAMETER; }; // Remember application GUID // guid = pai->guid; // Remember the server name // hr = SetLPTSTR(&szServer, szServerName); if (SUCCEEDED(hr)) { hr = SetLPTSTR(&szUser, szUserName); if (SUCCEEDED(hr)) { hr = SetLPTSTR(&szName, (LPCTSTR)(((PBYTE)pai)+pai->uOffsetName)); if (SUCCEEDED(hr)) { hr = SetLPTSTR(&szMimeType, (LPCTSTR)(((PBYTE)pai)+pai->uOffsetMimeType)); if (SUCCEEDED(hr)) { CAttributes *pNewAttrs; // Build the attribute object // pNewAttrs = new CAttributes (ULS_ATTRACCESS_NAME_VALUE); if (pNewAttrs != NULL) { if (pai->cAttributes != 0) { hr = pNewAttrs->SetAttributePairs((LPTSTR)(((PBYTE)pai)+pai->uOffsetAttributes), pai->cAttributes); }; if (SUCCEEDED(hr)) { pAttrs = pNewAttrs; pNewAttrs->AddRef(); } else { delete pNewAttrs; }; } else { hr = ULS_E_MEMORY; }; }; }; }; }; if (SUCCEEDED(hr)) { // Make the connection point // pConnPt = new CConnectionPoint (&IID_IULSApplicationNotify, (IConnectionPointContainer *)this); if (pConnPt != NULL) { ((IConnectionPoint*)pConnPt)->AddRef(); hr = NOERROR; } else { hr = ULS_E_MEMORY; }; }; return hr; } //**************************************************************************** // STDMETHODIMP // CUlsApp::QueryInterface (REFIID riid, void **ppv) // // History: // Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP CUlsApp::QueryInterface (REFIID riid, void **ppv) { *ppv = NULL; if (riid == IID_IULSApplication || riid == IID_IUnknown) { *ppv = (IULSUser *) this; } else { if (riid == IID_IConnectionPointContainer) { *ppv = (IConnectionPointContainer *) this; }; }; if (*ppv != NULL) { ((LPUNKNOWN)*ppv)->AddRef(); return S_OK; } else { return ULS_E_NO_INTERFACE; }; } //**************************************************************************** // STDMETHODIMP_(ULONG) // CUlsApp::AddRef (void) // // History: // Wed 17-Apr-1996 11:14:17 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP_(ULONG) CUlsApp::AddRef (void) { cRef++; return cRef; } //**************************************************************************** // STDMETHODIMP_(ULONG) // CUlsApp::Release (void) // // History: // Wed 17-Apr-1996 11:14:26 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP_(ULONG) CUlsApp::Release (void) { cRef--; if (cRef == 0) { delete this; return 0; } else { return cRef; }; } //**************************************************************************** // STDMETHODIMP // CUlsApp::NotifySink (void *pv, CONN_NOTIFYPROC pfn) // // History: // Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP CUlsApp::NotifySink (void *pv, CONN_NOTIFYPROC pfn) { HRESULT hr = S_OK; if (pConnPt != NULL) { hr = pConnPt->Notify(pv, pfn); }; return hr; } //**************************************************************************** // STDMETHODIMP // CUlsApp::GetID (GUID *pGUID) // // History: // Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP CUlsApp::GetID (GUID *pGUID) { // Validate parameter // if (pGUID == NULL) { return ULS_E_POINTER; }; *pGUID = guid; return NOERROR; } //**************************************************************************** // STDMETHODIMP // CUlsApp::GetName (BSTR *pbstrAppName) // // History: // Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP CUlsApp::GetName (BSTR *pbstrAppName) { // Validate parameter // if (pbstrAppName == NULL) { return ULS_E_POINTER; }; return LPTSTR_to_BSTR(pbstrAppName, szName); } //**************************************************************************** // STDMETHODIMP // CUlsApp::GetMimeType (BSTR *pbstrMimeType) // // History: // Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP CUlsApp::GetMimeType (BSTR *pbstrMimeType) { // Validate parameter // if (pbstrMimeType == NULL) { return ULS_E_POINTER; }; return LPTSTR_to_BSTR(pbstrMimeType, szMimeType); } //**************************************************************************** // STDMETHODIMP // CUlsApp::GetAttributes (IULSAttributes **ppAttributes) // // History: // Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP CUlsApp::GetAttributes (IULSAttributes **ppAttributes) { // Validate parameter // if (ppAttributes == NULL) { return ULS_E_POINTER; }; *ppAttributes = pAttrs; pAttrs->AddRef(); return NOERROR; } //**************************************************************************** // STDMETHODIMP // CUlsApp::GetProtocol (BSTR bstrProtocolID, ULONG *puReqID) // // History: // Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP CUlsApp::GetProtocol (BSTR bstrProtocolID, IULSAttributes *pAttributes, ULONG *puReqID) { LDAP_ASYNCINFO ldai; LPTSTR pszID; HRESULT hr; // Validate parameter // if (bstrProtocolID == NULL || puReqID == NULL) return ULS_E_POINTER; // Convert protocol name // hr = BSTR_to_LPTSTR(&pszID, bstrProtocolID); if (hr != S_OK) return hr; // Get arbitrary attribute name list if any // ULONG cAttrNames = 0; ULONG cbNames = 0; TCHAR *pszAttrNameList = NULL; if (pAttributes != NULL) { hr = ((CAttributes *) pAttributes)->GetAttributeList (&pszAttrNameList, &cAttrNames, &cbNames); if (hr != S_OK) return hr; } hr = ::UlsLdap_ResolveProtocol (szServer, szUser, szName, pszID, pszAttrNameList, cAttrNames, &ldai); if (hr != S_OK) goto MyExit; // If updating server was successfully requested, wait for the response // REQUESTINFO ri; ZeroMemory (&ri, sizeof (ri)); ri.uReqType = WM_ULS_RESOLVE_PROTOCOL; ri.uMsgID = ldai.uMsgID; ri.pv = (PVOID) this; ri.lParam = NULL; // Remember this request // hr = g_pReqMgr->NewRequest(&ri); if (SUCCEEDED(hr)) { // Make sure the objects do not disappear before we get the response // this->AddRef(); // Return the request ID // *puReqID = ri.uReqID; }; MyExit: if (pszAttrNameList != NULL) FreeLPTSTR (pszAttrNameList); if (pszID != NULL) FreeLPTSTR(pszID); return hr; } //**************************************************************************** // STDMETHODIMP // CUlsApp::GetProtocolResult (ULONG uReqID, PLDAP_PROTINFO_RES ppir) // // History: // Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP CUlsApp::GetProtocolResult (ULONG uReqID, PLDAP_PROTINFO_RES ppir) { CUlsProt *pp; OBJRINFO objri; // Default to the server's result // objri.hResult = ppir->hResult; if (SUCCEEDED(objri.hResult)) { // The server returns PROTINFO, create a Application object // pp = new CUlsProt; if (pp != NULL) { objri.hResult = pp->Init(szServer, szUser, szName, &ppir->lpi); if (SUCCEEDED(objri.hResult)) { pp->AddRef(); } else { delete pp; pp = NULL; }; } else { objri.hResult = ULS_E_MEMORY; }; } else { pp = NULL; }; // Package the notification info // objri.uReqID = uReqID; objri.pv = (void *)(pp == NULL ? NULL : (IULSAppProtocol *)pp); NotifySink((void *)&objri, OnNotifyGetProtocolResult); if (pp != NULL) { pp->Release(); }; return NOERROR; } //**************************************************************************** // STDMETHODIMP // CUlsApp::EnumProtocols (ULONG *puReqID) // // History: // Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP CUlsApp::EnumProtocols (ULONG *puReqID) { LDAP_ASYNCINFO ldai; HRESULT hr; // Validate parameter // if (puReqID == NULL) { return ULS_E_POINTER; }; hr = ::UlsLdap_EnumProtocols(szServer, szUser, szName, &ldai); if (SUCCEEDED(hr)) { REQUESTINFO ri; // If updating server was successfully requested, wait for the response // ri.uReqType = WM_ULS_ENUM_PROTOCOLS; ri.uMsgID = ldai.uMsgID; ri.pv = (PVOID)this; ri.lParam = (LPARAM)NULL; hr = g_pReqMgr->NewRequest(&ri); if (SUCCEEDED(hr)) { // Make sure the objects do not disappear before we get the response // this->AddRef(); // Return the request ID // *puReqID = ri.uReqID; }; }; return hr; } //**************************************************************************** // STDMETHODIMP // CUlsApp::EnumProtocolsResult (ULONG uReqID, PLDAP_ENUM ple) // // History: // Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP CUlsApp::EnumProtocolsResult (ULONG uReqID, PLDAP_ENUM ple) { ENUMRINFO eri; // Package the notification info // eri.uReqID = uReqID; eri.hResult = ple->hResult; eri.cItems = ple->cItems; eri.pv = (void *)(((PBYTE)ple)+ple->uOffsetItems); NotifySink((void *)&eri, OnNotifyEnumProtocolsResult); return NOERROR; } //**************************************************************************** // STDMETHODIMP // CUlsApp::EnumConnectionPoints(IEnumConnectionPoints **ppEnum) // // History: // Wed 17-Apr-1996 11:15:02 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP CUlsApp::EnumConnectionPoints(IEnumConnectionPoints **ppEnum) { CEnumConnectionPoints *pecp; HRESULT hr; // Validate parameters // if (ppEnum == NULL) { return ULS_E_POINTER; }; // Assume failure // *ppEnum = NULL; // Create an enumerator // pecp = new CEnumConnectionPoints; if (pecp == NULL) return ULS_E_MEMORY; // Initialize the enumerator // hr = pecp->Init((IConnectionPoint *)pConnPt); if (FAILED(hr)) { delete pecp; return hr; }; // Give it back to the caller // pecp->AddRef(); *ppEnum = pecp; return S_OK; } //**************************************************************************** // STDMETHODIMP // CUlsApp::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp) // // History: // Wed 17-Apr-1996 11:15:09 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** STDMETHODIMP CUlsApp::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp) { IID siid; HRESULT hr; // Validate parameters // if (ppcp == NULL) { return ULS_E_POINTER; }; // Assume failure // *ppcp = NULL; if (pConnPt != NULL) { hr = pConnPt->GetConnectionInterface(&siid); if (SUCCEEDED(hr)) { if (riid == siid) { *ppcp = (IConnectionPoint *)pConnPt; (*ppcp)->AddRef(); hr = S_OK; } else { hr = ULS_E_NO_INTERFACE; }; }; } else { hr = ULS_E_NO_INTERFACE; }; return hr; }