summaryrefslogtreecommitdiff
path: root/Common/ComponentHolder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Common/ComponentHolder.cpp')
-rw-r--r--Common/ComponentHolder.cpp386
1 files changed, 386 insertions, 0 deletions
diff --git a/Common/ComponentHolder.cpp b/Common/ComponentHolder.cpp
new file mode 100644
index 0000000..474809b
--- /dev/null
+++ b/Common/ComponentHolder.cpp
@@ -0,0 +1,386 @@
+// ComponentHolder.cpp: implementation of the CComponentHolder class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "stdafx.h"
+#include "ComponentHolder.h"
+
+#ifdef _DEBUG
+#undef THIS_FILE
+static char THIS_FILE[]=__FILE__;
+#define new DEBUG_NEW
+#endif
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+CComponentHolder::CComponentHolder()
+{
+ // Both pointers are null for an uninited object
+ m_pComponentDOS = NULL;
+ m_pComponentWin = NULL;
+}
+
+CComponentHolder::~CComponentHolder()
+{
+ // Just in case owner forgot
+ Release();
+}
+
+//////////////////////////////////////////////////////////////////
+// Returns the component type (DOS or Windows)
+
+UINT CComponentHolder::GetType()
+{
+ // Needs to be Initialzed
+ ASSERT(!(m_pComponentDOS == NULL && m_pComponentWin == NULL));
+
+
+ // Return Type
+ if(m_pComponentWin != NULL)
+ return COMPONENT_WIN;
+ else
+ return COMPONENT_DOS;
+
+}
+
+//////////////////////////////////////////////////////////////////
+// Returns a IUnknown to the current component
+
+IUnknown* CComponentHolder::GetUnknown()
+{
+ // Needs to be Initialzed
+ ASSERT(!(m_pComponentDOS == NULL && m_pComponentWin == NULL));
+
+ // When copying out a Pointer make sure to AddRef
+ if(m_pComponentWin != NULL)
+ {
+ m_pComponentWin->AddRef();
+ return m_pComponentWin;
+ }
+ else
+ {
+ m_pComponentDOS->AddRef();
+ return m_pComponentDOS;
+ }
+
+}
+
+//////////////////////////////////////////////////////////////////
+// Accepts a String ID, converts it and then calls the real
+// Initialize
+
+HRESULT CComponentHolder::Initialize(const string& sID, const string& sRegKey)
+{
+ ASSERT(!sRegKey.empty());
+
+ USES_CONVERSION;
+ HRESULT hr;
+ CLSID clsid;
+
+ // Get the CLSID
+ hr = CLSIDFromString(T2OLE(sID), &clsid);
+
+ if(FAILED(hr))
+ return hr;
+
+ // And then call the real version
+ return Initialize(clsid, sRegKey);
+
+}
+
+//////////////////////////////////////////////////////////////////
+// Loads and Initializes the Component
+
+HRESULT CComponentHolder::Initialize(const CLSID & clsid, const string& sRegKey)
+{
+ ASSERT(!sRegKey.empty());
+ USES_CONVERSION;
+
+ // If we're already Initialized then Release all the
+ // and start again interfaces
+ if(IsInitialized())
+ Release();
+
+
+ // Intitialize the Data Component
+ m_Data.Initialize(sRegKey);
+
+
+
+ // Get an IUnknown to the Component First
+ // Since we don't know what it supports
+ // (CComPtr) calls Release for this one
+ HRESULT hr;
+ CComPtr<IUnknown> pUnk;
+ hr = CoCreateInstance(clsid, NULL, /*CLSCTX_ALL*/CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER , IID_IUnknown, (void**) &pUnk);
+
+ if(FAILED(hr))
+ return hr;
+
+
+ // Check if it Supports IID_ISecureShutdownWin
+ hr = pUnk->QueryInterface(IID_ISecureShutdownWin, (void**) &m_pComponentWin);
+ if(FAILED(hr)) m_pComponentWin = NULL;
+
+
+ // Check if it Supports IID_ISecureShutdownDOS
+ hr = pUnk->QueryInterface(IID_ISecureShutdownDOS, (void**) &m_pComponentDOS);
+ if(FAILED(hr)) m_pComponentDOS = NULL;
+
+
+ // Did we catch something?
+ if(!IsInitialized())
+ return hr;
+
+ switch(GetType())
+ {
+ case COMPONENT_WIN:
+ // Give the Component it's Data Pointer
+ hr = m_pComponentWin->SetData(m_Data.GetUnknown());
+ if(FAILED(hr)) return hr;
+ break;
+ case COMPONENT_DOS:
+ // Give the Component it's Data Pointer
+ hr = m_pComponentDOS->SetData(m_Data.GetUnknown());
+ if(FAILED(hr)) return hr;
+ break;
+ }
+
+ // Get Name
+ m_sName = GetInfoStr(nsName, _T("(No Name)"));
+
+ return S_OK;
+
+}
+
+//////////////////////////////////////////////////////////////////
+// Helper Function
+
+bool CComponentHolder::IsInitialized()
+{
+ // Either one has to be initialized
+ return !((m_pComponentDOS == NULL) && (m_pComponentWin == NULL));
+}
+
+/*#ifndef NS_NO_PROPPAGE
+//////////////////////////////////////////////////////////////////
+// Returns a pointer to the Property page for current component
+// or error if none
+
+
+HRESULT CComponentHolder::GetPropPage(CPropPageHolder** pPropPage)
+{
+ // If we already have a Prop Page then just get pointer
+ if(m_PropPage.IsInitialized())
+ {
+ *pPropPage = &m_PropPage;
+ return S_OK;
+ }
+
+
+ // Otherwise Create one
+ HRESULT hr;
+
+
+ // Get a IUnkown to the current Component
+ CComPtr<IUnknown> pUnk; // Releases Pointer
+ GetIUnknown(&pUnk);
+
+
+ // See if it likes us
+ hr = m_PropPage.Initialize(pUnk);
+ if(FAILED(hr)) return hr;
+
+
+ // Return Pointer
+ *pPropPage = &m_PropPage;
+
+
+ return S_OK;
+}
+
+
+bool CComponentHolder::HasPropPage()
+{
+ CPropPageHolder* pPropPage;
+ return SUCCEEDED(GetPropPage(&pPropPage));
+}
+
+#endif // NS_NO_PROPPAGE
+*/
+//////////////////////////////////////////////////////////////////
+// Completely removes the component from Memory
+
+HRESULT CComponentHolder::Release()
+{
+/*
+ // Check if we've got PropPage
+ // If so then get rid of it
+ if(m_PropPage.IsInitialized())
+ m_PropPage.Destroy();
+*/
+
+ // Save the Data to the DataObject
+ // m_Data.Save();
+
+
+ // Only Update if Initialized
+ if(IsInitialized()){
+
+ switch(GetType()){
+
+ case COMPONENT_WIN:
+
+ // Get Component to Release Data Pointer
+ m_pComponentWin->SetData(NULL);
+
+ // Release Component
+ m_pComponentWin->Release();
+
+ break;
+
+ case COMPONENT_DOS:
+
+ // Get Component to Release Data Pointer
+ m_pComponentDOS->SetData(NULL);
+
+ // Release Component
+ m_pComponentDOS->Release();
+
+ break;
+
+ }
+
+ // Set to NULL as a flag
+ m_pComponentWin = NULL;
+ m_pComponentDOS = NULL;
+
+ m_sName = _T("");
+ }
+
+ return S_OK;
+}
+
+//////////////////////////////////////////////////////////////////
+// Invokes actual shutdown (Windows Components Only)
+
+HRESULT CComponentHolder::DoShutdown(DWORD dwMode, HWND hwndParent)
+{
+ // Needs to be Initialized First
+ ASSERT(!(m_pComponentDOS == NULL && m_pComponentWin == NULL));
+
+
+ switch(GetType()){
+ case COMPONENT_WIN:
+
+ // Call Shutdown. Only Windows
+ return m_pComponentWin->DoShutdown((long)hwndParent, (long)dwMode);
+
+ break;
+
+ case COMPONENT_DOS:
+
+ // Call Shutdown. DOS don't support
+ ASSERT(false);
+ return E_FAIL;
+
+ break;
+ }
+
+ return E_FAIL;
+
+}
+
+//////////////////////////////////////////////////////////////////
+// Retrieves Text for Batch File (DOS Components Only)
+
+HRESULT CComponentHolder::GetBatchText(string& sBatchText)
+{
+ USES_CONVERSION;
+ BSTR bstrBatchText;
+ HRESULT hr;
+
+ switch(GetType())
+ {
+ case COMPONENT_WIN:
+
+ // Not Supported in Windows
+ return E_FAIL;
+
+ break;
+
+ case COMPONENT_DOS:
+
+ // Get Batch Text.
+ hr = m_pComponentDOS->GetBatchText(&bstrBatchText);
+
+ // Transfer to CString
+ if(SUCCEEDED(hr))
+ sBatchText = OLE2T(bstrBatchText);
+
+ return hr;
+
+ break;
+
+ }
+
+ return E_FAIL;
+
+
+}
+
+
+CComVariant CComponentHolder::GetInfo(NightSecInfo nsItem)
+{
+ USES_CONVERSION;
+ CComVariant vInfo;
+ vInfo.vt = VT_EMPTY;
+ HRESULT hr;
+
+ switch(GetType()){
+
+ case COMPONENT_WIN:
+ hr = m_pComponentWin->get_Info(nsItem, &vInfo);
+ break;
+ case COMPONENT_DOS:
+ hr = m_pComponentDOS->get_Info(nsItem, &vInfo);
+ break;
+
+ }
+
+ if(FAILED(hr))
+ vInfo.vt = VT_NULL;
+
+ return vInfo;
+}
+
+string CComponentHolder::GetInfoStr(NightSecInfo nsItem, const string& sDefault)
+{
+ USES_CONVERSION;
+
+ // Get Name
+ CComVariant vInfo = GetInfo(nsItem);
+
+ if(vInfo.vt == VT_BSTR)
+ return OLE2T(vInfo.bstrVal);
+
+ return sDefault;
+
+}
+
+int CComponentHolder::GetInfoInt(NightSecInfo nsItem, int nDefault)
+{
+ // Get Name
+ CComVariant vInfo = GetInfo(nsItem);
+
+ if(vInfo.vt == VT_NULL || vInfo.vt == VT_EMPTY)
+ return nDefault;
+
+ if(SUCCEEDED(vInfo.ChangeType(VT_I4)))
+ return vInfo.lVal;
+
+ return nDefault;
+
+}