///////////////////////////////////////////////////////////////////////////// // FILE : Provider.cpp // // // // DESCRIPTION : Header file for the Provider snapin node class. // // // // AUTHOR : yossg // // // // HISTORY : // // Sep 29 1999 yossg Create // // Jan 31 2000 yossg add the functionality // // // // Copyright (C) 1999 - 2000 Microsoft Corporation All Rights Reserved // ///////////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include "snapin.h" #include "Provider.h" #include "Providers.h" #include "ppFaxProviderGeneral.h" #include "oaidl.h" #include "Icons.h" #include "faxmmc.h" ///////////////////////////////////////////////////////////////////////////// static const GUID CFaxProviderNodeGUID_NODETYPE = FAXSRV_DEVICE_PROVIDER_NODETYPE_GUID; const GUID* CFaxProviderNode::m_NODETYPE = &CFaxProviderNodeGUID_NODETYPE; const OLECHAR* CFaxProviderNode::m_SZNODETYPE = FAXSRV_DEVICE_PROVIDER_NODETYPE_GUID_STR; const CLSID* CFaxProviderNode::m_SNAPIN_CLASSID = &CLSID_Snapin; CLIPFORMAT CFaxProviderNode::m_CFFspGuid = (CLIPFORMAT)RegisterClipboardFormat(CF_MSFAXSRV_FSP_GUID); CLIPFORMAT CFaxProviderNode::m_CFServerName = (CLIPFORMAT)RegisterClipboardFormat(CF_MSFAXSRV_SERVER_NAME); /* - CFaxProviderNode::Init - * Purpose: * Init all members icon etc. * * Arguments: * [in] pProviderConfig - PFAX_DEVICE_PROVIDER_INFO * * Return: * OLE error code */ HRESULT CFaxProviderNode::Init(PFAX_DEVICE_PROVIDER_INFO pProviderConfig) { DEBUG_FUNCTION_NAME( _T("CFaxProviderNode::Init")); HRESULT hRc = S_OK; ATLASSERT(pProviderConfig); hRc = InitMembers( pProviderConfig ); if (FAILED(hRc)) { DebugPrintEx( DEBUG_ERR, _T("Failed to InitMembers")); //NodeMsgBox done by called func. goto Exit; } ATLASSERT(SUCCEEDED(hRc)); // // Icon // InitIcons(); Exit: return hRc; } /* - CFaxProviderNode::InitIcons - * Purpose: * Private method that initiate icons * due to the status member state. * * Arguments: * No. * * Return: * No. */ void CFaxProviderNode::InitIcons () { DEBUG_FUNCTION_NAME( _T("CFaxProviderNode::InitIcons")); switch (m_enumStatus) { case FAX_PROVIDER_STATUS_SUCCESS: m_resultDataItem.nImage = IMAGE_FSP; break; case FAX_PROVIDER_STATUS_SERVER_ERROR: case FAX_PROVIDER_STATUS_BAD_GUID: case FAX_PROVIDER_STATUS_BAD_VERSION: case FAX_PROVIDER_STATUS_CANT_LOAD: case FAX_PROVIDER_STATUS_CANT_LINK: case FAX_PROVIDER_STATUS_CANT_INIT: m_resultDataItem.nImage = IMAGE_FSP_ERROR; break; default: ATLASSERT(0); // "this enumStatus is not supported " break; //currently 999 } // endswitch (enumStatus) return; } /* - CFaxProviderNode::InitMembers - * Purpose: * Private method to initiate members * Must be called after init of m_pParentNode * * Arguments: * [in] pProviderConfig - PFAX_DEVICE_PROVIDER_INFO structure * * Return: * OLE error code */ HRESULT CFaxProviderNode::InitMembers(PFAX_DEVICE_PROVIDER_INFO pProviderConfig) { DEBUG_FUNCTION_NAME( _T("CFaxProviderNode::InitMembers")); HRESULT hRc = S_OK; int iCount; UINT idsStatus; CComBSTR bstrChk; WCHAR lpwszBuff [4*FXS_DWORD_LEN+3/*points*/+1/*NULL*/]; ATLASSERT(pProviderConfig); // // status // m_enumStatus = pProviderConfig->Status; // // status string // idsStatus = GetStatusIDS(m_enumStatus); if ( FXS_IDS_STATUS_ERROR == idsStatus) { DebugPrintEx( DEBUG_ERR, TEXT("Invalid Status value.")); goto Error; } else { if (!m_bstrStatus.LoadString(idsStatus)) { hRc = E_OUTOFMEMORY; DebugPrintEx( DEBUG_ERR, TEXT("Out of memory. Failed to load status string.")); goto Error; } } // // Provider name // m_bstrProviderName = pProviderConfig->lpctstrFriendlyName; if ( !m_bstrProviderName ) { hRc = E_OUTOFMEMORY; goto Error; } // // Provider GUID // m_bstrProviderGUID = pProviderConfig->lpctstrGUID; if (!m_bstrProviderGUID) { hRc = E_OUTOFMEMORY; goto Error; } // // Version // m_verProviderVersion = pProviderConfig->Version; // // Version string // //m_bstrVersion = L"5.0.813.0 (Chk)" or L"5.0.813.0" iCount = swprintf( lpwszBuff, L"%ld.%ld.%ld.%ld", m_verProviderVersion.wMajorVersion, m_verProviderVersion.wMinorVersion, m_verProviderVersion.wMajorBuildNumber, m_verProviderVersion.wMinorBuildNumber ); if( iCount <= 0 ) { DebugPrintEx( DEBUG_ERR, TEXT("Fail to read m_verProviderVersion.")); goto Error; } m_bstrVersion = lpwszBuff; if (!m_bstrVersion) { DebugPrintEx( DEBUG_ERR, TEXT("Null memeber BSTR - m_bstrVersion.")); goto Error; } if (m_verProviderVersion.dwFlags & FAX_VER_FLAG_CHECKED) { if (!bstrChk.LoadString(IDS_CHK)) { hRc = E_OUTOFMEMORY; DebugPrintEx( DEBUG_ERR, TEXT("Out of memory. Failed to load string.")); goto Error; } m_bstrVersion += bstrChk; //L" (Chk)"; } // // Path // m_bstrImageName = pProviderConfig->lpctstrImageName; if ( !m_bstrImageName ) { hRc = E_OUTOFMEMORY; goto Error; } ATLASSERT(S_OK == hRc); goto Exit; Error: ATLASSERT(S_OK != hRc); DebugPrintEx( DEBUG_ERR, _T("Failed to allocate string - out of memory")); ATLASSERT(NULL != m_pParentNode); if (NULL != m_pParentNode) { m_pParentNode->NodeMsgBox(IDS_MEMORY); } Exit: return (hRc); } /* - CFaxProviderNode::GetResultPaneColInfo - * Purpose: * Return the text for specific column * Called for each column in the result pane * * Arguments: * [in] nCol - column number * * Return: * String to be displayed in the specific column */ LPOLESTR CFaxProviderNode::GetResultPaneColInfo(int nCol) { DEBUG_FUNCTION_NAME( _T("CFaxProviderNode::GetResultPaneColInfo")); HRESULT hRc = S_OK; switch (nCol) { case 0: // // Provider Name // if (!m_bstrProviderName) { DebugPrintEx( DEBUG_ERR, TEXT("Null memeber BSTR - m_bstrProviderName.")); goto Error; } else { return (m_bstrProviderName); } case 1: // // Status // if (!m_bstrStatus) { DebugPrintEx( DEBUG_ERR, TEXT("Null memeber BSTR - m_bstrStatus.")); goto Error; } else { return (m_bstrStatus); } case 2: // // Version // if (!m_bstrVersion) { DebugPrintEx( DEBUG_ERR, TEXT("Null memeber BSTR - m_bstrVersion.")); goto Error; } else { return (m_bstrVersion); } case 3: // // Path // if (!m_bstrImageName) { DebugPrintEx( DEBUG_ERR, TEXT("Null memeber BSTR - m_bstrImageName.")); goto Error; } else { return (m_bstrImageName); } default: ATLASSERT(0); // "this number of column is not supported " return(L""); } // endswitch (nCol) Error: return(L"???"); } /* - CFaxProviderNode::CreatePropertyPages - * Purpose: * Called when creating a property page of the object * * Arguments: * [in] lpProvider - The property sheet * [in] handle - Handle for routing notification * [in] pUnk - Pointer to the data object * [in] type - CCT_* (SCOPE, RESULT, ...) * * Return: * OLE error code */ HRESULT CFaxProviderNode::CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider, long handle, IUnknown *pUnk, DATA_OBJECT_TYPES type) { DEBUG_FUNCTION_NAME( _T("CFaxProviderNode::CreatePropertyPages")); HRESULT hRc = S_OK; HPROPSHEETPAGE hPage; CppFaxProvider * pPropPageProviderGeneral = NULL; ATLASSERT(lpProvider); ATLASSERT(type == CCT_RESULT || type == CCT_SCOPE); // // General tab // pPropPageProviderGeneral = new CppFaxProvider( handle, this, TRUE, _Module.GetResourceInstance()); if (!pPropPageProviderGeneral) { hRc = E_OUTOFMEMORY; NodeMsgBox(IDS_MEMORY_FAIL_TO_OPEN_PP); goto Error; } hRc = pPropPageProviderGeneral->Init( m_bstrProviderName, m_bstrStatus, m_bstrVersion, m_bstrImageName); if (FAILED(hRc)) { NodeMsgBox(IDS_MEMORY_FAIL_TO_OPEN_PP); goto Error; } hPage = pPropPageProviderGeneral->Create(); if ((!hPage)) { hRc = HRESULT_FROM_WIN32(GetLastError()); DebugPrintEx( DEBUG_ERR, TEXT("Fail to Create() property page. (hRc: %08X)"), hRc); NodeMsgBox(IDS_FAIL_TO_OPEN_PROP_PAGE); goto Error; } hRc = lpProvider->AddPage(hPage); if (FAILED(hRc)) { DebugPrintEx( DEBUG_ERR, TEXT("Fail to add property page for General tab. (hRc: %08X)"), hRc); NodeMsgBox(IDS_FAIL_TO_OPEN_PROP_PAGE); goto Error; } ATLASSERT(S_OK == hRc); goto Exit; Error: ATLASSERT(S_OK != hRc); if ( NULL != pPropPageProviderGeneral ) { delete pPropPageProviderGeneral; pPropPageProviderGeneral = NULL; } Exit: return hRc; } /* - CFaxProviderNode::SetVerbs - * Purpose: * What verbs to enable/disable when this object is selected * * Arguments: * [in] pConsoleVerb - MMC ConsoleVerb interface * * Return: * OLE Error code */ HRESULT CFaxProviderNode::SetVerbs(IConsoleVerb *pConsoleVerb) { HRESULT hRc = S_OK; // // Display verbs that we support: // 1. Properties // hRc = pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, ENABLED, TRUE); // // We want the default verb to be Properties // hRc = pConsoleVerb->SetDefaultVerb(MMC_VERB_PROPERTIES); return hRc; } /* - CFaxProviderNode::GetStatusIDS - * Purpose: * Transslate Status to IDS. * * Arguments: * * [in] enumStatus - unsigned int with the menu IDM value * * Return: * IDS of related status message */ UINT CFaxProviderNode::GetStatusIDS(FAX_ENUM_PROVIDER_STATUS enumStatus) { DEBUG_FUNCTION_NAME( _T("CFaxProviderNode::GetStatusIDS")); UINT uiIds; switch (enumStatus) { case FAX_PROVIDER_STATUS_SUCCESS: // Provider was successfully loaded uiIds = IDS_STATUS_PROVIDER_SUCCESS; break; case FAX_PROVIDER_STATUS_SERVER_ERROR: // An error occured on the server while loading FSP. uiIds = IDS_STATUS_PROVIDER_SERVER_ERROR; break; case FAX_PROVIDER_STATUS_BAD_GUID: // Provider's GUID is invalid uiIds = IDS_STATUS_PROVIDER_BAD_GUID; break; case FAX_PROVIDER_STATUS_BAD_VERSION: // Provider's API version is invalid uiIds = IDS_STATUS_PROVIDER_BAD_VERSION; break; case FAX_PROVIDER_STATUS_CANT_LOAD: // Can't load provider's DLL uiIds = IDS_STATUS_PROVIDER_CANT_LOAD; break; case FAX_PROVIDER_STATUS_CANT_LINK: // Can't find required exported function(s) in provider's DLL uiIds = IDS_STATUS_PROVIDER_CANT_LINK; break; case FAX_PROVIDER_STATUS_CANT_INIT: // Failed while initializing provider uiIds = IDS_STATUS_PROVIDER_CANT_INIT; break; default: ATLASSERT(0); // "this enumStatus is not supported " uiIds = FXS_IDS_STATUS_ERROR; //currently 999 break; } // endswitch (enumStatus) return uiIds; } /* + + CFaxProviderNode::OnShowContextHelp * * Purpose: * Overrides CSnapinNode::OnShowContextHelp. * * Arguments: * * Return: - OLE error code - */ HRESULT CFaxProviderNode::OnShowContextHelp( IDisplayHelp* pDisplayHelp, LPOLESTR helpFile) { return DisplayContextHelp(pDisplayHelp, helpFile, HLP_DEVICES); } /* + + * * CFaxDeviceNode::FillData * * * Override CSnapInItem::FillData for private cliboard formats * * * Parameters * * Return Values * - - */ HRESULT CFaxProviderNode::FillData(CLIPFORMAT cf, LPSTREAM pStream) { DEBUG_FUNCTION_NAME( _T("CFaxProviderNode::FillData")); HRESULT hr = DV_E_CLIPFORMAT; ULONG uWritten; if (cf == m_CFFspGuid) { hr = pStream->Write((VOID *)(LPWSTR)m_bstrProviderGUID, sizeof(WCHAR)*(m_bstrProviderGUID.Length()+1), &uWritten); return hr; } if (cf == m_CFServerName) { ATLASSERT(GetRootNode()); CComBSTR bstrServerName = ((CFaxServerNode *)GetRootNode())->GetServerName(); if (!bstrServerName) { DebugPrintEx(DEBUG_ERR, TEXT("Out of memory. Failed to load string.")); return E_OUTOFMEMORY; } hr = pStream->Write((VOID *)(LPWSTR)bstrServerName, sizeof(WCHAR)*(bstrServerName.Length()+1), &uWritten); return hr; } return CSnapInItemImpl::FillData(cf, pStream); }