///////////////////////////////////////////////////////////////////////////// // FILE : CoverPage.cpp // // // // DESCRIPTION : Implementation of the cover page result node. // // // // AUTHOR : yossg // // // // HISTORY : // // Feb 9 2000 yossg Create // // Oct 17 2000 yossg // // // // Copyright (C) 2000 Microsoft Corporation All Rights Reserved // ///////////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include "snapin.h" #include "CoverPage.h" #include "CoverPages.h" #include "FaxServer.h" #include "FaxServerNode.h" #include "FaxMMCPropertyChange.h" #include "oaidl.h" #include "urlmon.h" #include "mshtmhst.h" #include "exdisp.h" #include #include #include ///////////////////////////////////////////////////////////////////////////// // {D0F52487-3C98-4d1a-AF15-4033900DCCDC} static const GUID CFaxCoverPageNodeGUID_NODETYPE = { 0xd0f52487, 0x3c98, 0x4d1a, { 0xaf, 0x15, 0x40, 0x33, 0x90, 0xd, 0xcc, 0xdc } }; const GUID* CFaxCoverPageNode::m_NODETYPE = &CFaxCoverPageNodeGUID_NODETYPE; const OLECHAR* CFaxCoverPageNode::m_SZNODETYPE = OLESTR("D0F52487-3C98-4d1a-AF15-4033900DCCDC"); //const OLECHAR* CnotImplemented::m_SZDISPLAY_NAME = OLESTR("Cover Pages"); const CLSID* CFaxCoverPageNode::m_SNAPIN_CLASSID = &CLSID_Snapin; /* - CFaxCoverPageNode::Init - * Purpose: * Init all members icon etc. * * Arguments: * [in] pRuleConfig - PFAX_OUTBOUND_ROUTING_RULE * * Return: * OLE error code */ HRESULT CFaxCoverPageNode::Init(WIN32_FIND_DATA * pCoverPageData) { DEBUG_FUNCTION_NAME( _T("CFaxCoverPageNode::Init")); DWORD ec = ERROR_SUCCESS; _FILETIME FileTime; SYSTEMTIME SystemTime; TCHAR szLastModifiedTimeStr[MAX_PATH+1]; TCHAR szDateBuf[MAX_PATH+1]; ULARGE_INTEGER uliFileSize; CHAR szFileSize[MAX_PATH+1]; CComBSTR bstrDate; CComBSTR bstrTime; ATLASSERT(pCoverPageData); m_bstrDisplayName = pCoverPageData->cFileName; if (!m_bstrDisplayName) { ec = ERROR_NOT_ENOUGH_MEMORY; DebugPrintEx( DEBUG_ERR, _T("Null m_bstrDisplayName - out of memory.")); goto Error; } // // Last Modified // if (!FileTimeToLocalFileTime( &pCoverPageData->ftLastWriteTime, &FileTime ) ) { ec = GetLastError(); DebugPrintEx( DEBUG_ERR, _T("Fail to convert LocalTimeToFileTime. (ec: %ld)"), ec); goto Error; } if (!FileTimeToSystemTime( &FileTime, &SystemTime) ) { ec = GetLastError(); DebugPrintEx( DEBUG_ERR, _T("Fail to convert FileTimeToSystemTime. (ec: %ld)"), ec); goto Error; } // // a. Create a string specifying the date // if (!GetY2KCompliantDate (LOCALE_USER_DEFAULT, // Get user's locale DATE_SHORTDATE, // Short date format &SystemTime, // Source date/time szDateBuf, // Output buffer sizeof(szDateBuf)/ sizeof(szDateBuf[0]) // MAX_PATH Output buffer size )) { ec = GetLastError(); DebugPrintEx( DEBUG_ERR, _T("Fail to GetY2KCompliantDate. (ec: %ld)"), ec); goto Error; } else { bstrDate = szDateBuf; if (!bstrDate) { ec = ERROR_NOT_ENOUGH_MEMORY; DebugPrintEx( DEBUG_ERR, _T("empty m_bstrTimeFormated - out of memory.")); goto Error; } } // // b. Create a string specifying the time // if (!FaxTimeFormat( LOCALE_USER_DEFAULT, //Locale TIME_NOSECONDS, //dwFlags options &SystemTime, //CONST SYSTEMTIME time NULL, //LPCTSTR lpFormat time format string szLastModifiedTimeStr, //formatted string buffer sizeof(szLastModifiedTimeStr)/ sizeof(szLastModifiedTimeStr[0])// MAX_PATH// size of string buffer ) ) { ec = GetLastError(); DebugPrintEx( DEBUG_ERR, _T("Fail to FaxTimeFormat. (ec: %ld)"), ec); goto Error; } else { bstrTime = szLastModifiedTimeStr; if (!bstrTime) { ec = ERROR_NOT_ENOUGH_MEMORY; DebugPrintEx( DEBUG_ERR, _T("empty m_bstrTimeFormated - out of memory.")); goto Error; } } m_bstrTimeFormatted = bstrDate; m_bstrTimeFormatted += L" "; m_bstrTimeFormatted += bstrTime; // // Size // uliFileSize.LowPart = pCoverPageData->nFileSizeLow; uliFileSize.HighPart = pCoverPageData->nFileSizeHigh; if (!StrFormatByteSize64A( (LONGLONG) uliFileSize.QuadPart, szFileSize, sizeof(szFileSize)/ sizeof(szFileSize[0]) ) ) { ec = GetLastError(); DebugPrintEx( DEBUG_ERR, _T("Fail to convert FileTimeToSystemTime. (ec: %ld)"), ec); goto Error; } else { m_bstrFileSize = szFileSize; } // // Icon // m_resultDataItem.nImage = IMAGE_SRV_COVERPAGE; ATLASSERT(ERROR_SUCCESS == ec); goto Exit; Error: ATLASSERT(ERROR_SUCCESS != ec); DebugPrintEx( DEBUG_ERR, _T("Failed to init members")); ATLASSERT(NULL != m_pParentNode); if (NULL != m_pParentNode) { m_pParentNode->NodeMsgBox(IDS_FAIL2INIT_COVERPAGE_DATA); } return HRESULT_FROM_WIN32(ec); Exit: return S_OK; } /* - CFaxCoverPageNode::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 CFaxCoverPageNode::GetResultPaneColInfo(int nCol) { DEBUG_FUNCTION_NAME( _T("CFaxCoverPageNode::GetResultPaneColInfo")); HRESULT hRc = S_OK; switch (nCol) { case 0: // // Cover page file Name // if (!m_bstrDisplayName) { DebugPrintEx( DEBUG_ERR, TEXT("Null memeber BSTR - m_bstrDisplayName.")); goto Error; } else { return (m_bstrDisplayName); } case 1: // // Cover page Last Modified // if (!m_bstrTimeFormatted) { DebugPrintEx( DEBUG_ERR, TEXT("Null memeber BSTR - m_bstrTimeFormatted.")); goto Error; } else { return (m_bstrTimeFormatted); } case 2: // // Cover page file size // if (!m_bstrFileSize) { DebugPrintEx( DEBUG_ERR, _T("Null memeber BSTR - m_bstrFileSize.")); goto Error; } else { return (m_bstrFileSize); } default: ATLASSERT(0); // "this number of column is not supported " return(L""); } // endswitch (nCol) Error: return(L"???"); } /* - CFaxCoverPageNode::SetVerbs - * Purpose: * What verbs to enable/disable when this object is selected * * Arguments: * [in] pConsoleVerb - MMC ConsoleVerb interface * * Return: * OLE Error code */ HRESULT CFaxCoverPageNode::SetVerbs(IConsoleVerb *pConsoleVerb) { HRESULT hRc = S_OK; // // Display verbs that we support: // 1. Delete // hRc = pConsoleVerb->SetVerbState(MMC_VERB_DELETE, ENABLED, TRUE); // // No default verb // hRc = pConsoleVerb->SetDefaultVerb(MMC_VERB_NONE); return hRc; } HRESULT CFaxCoverPageNode::OnDoubleClick( LPARAM arg , LPARAM param , IComponentData * pComponentData , IComponent * pComponent , DATA_OBJECT_TYPES type ) { UNREFERENCED_PARAMETER (arg); UNREFERENCED_PARAMETER (param); UNREFERENCED_PARAMETER (pComponentData); UNREFERENCED_PARAMETER (pComponent); UNREFERENCED_PARAMETER (type); DEBUG_FUNCTION_NAME( _T("CFaxCoverPageNode::::OnDoubleClick -->> Edit CoverPage ")); HRESULT hRc = S_OK; bool bTemp = true; //UNREFERENCED_PARAMETER CSnapInObjectRootBase * pRootTemp = NULL; //UNREFERENCED_PARAMETER hRc = OnEditCoverPage(bTemp, pRootTemp); if ( S_OK != hRc ) { DebugPrintEx( DEBUG_ERR, _T("Fail to call OnEditCoverPage(). (hRc : %08X)"), hRc); //msgbox by called func. } // Maguire wrote in his code: // "Through speaking with Eugene Baucom, I discovered that if you return S_FALSE // here, the default verb action will occur when the user double clicks on a node. // For the most part we have Properties as default verb, so a double click // will cause property sheet on a node to pop up." // // Hence we return S_OK in any case for now return S_OK; } /* - CFaxCoverPageNode::OnDelete - * Purpose: * Called when deleting this node * * Arguments: * * Return: * OLE error code */ HRESULT CFaxCoverPageNode::OnDelete( LPARAM arg, LPARAM param, IComponentData *pComponentData, IComponent *pComponent, DATA_OBJECT_TYPES type, BOOL fSilent/* = FALSE*/ ) { DEBUG_FUNCTION_NAME( _T("CFaxCoverPageNode::OnDelete")); UNREFERENCED_PARAMETER (arg); UNREFERENCED_PARAMETER (param); UNREFERENCED_PARAMETER (pComponentData); UNREFERENCED_PARAMETER (pComponent); UNREFERENCED_PARAMETER (type); HRESULT hRc = S_OK; DWORD ec = ERROR_SUCCESS; WCHAR pszCovDir[MAX_PATH+1]; CComBSTR bstrFullPath; CComBSTR bstrServerName; // // Are you sure? // if (! fSilent) { // // 1. Use pConsole as owner of the message box // int res; NodeMsgBox(IDS_CONFIRM, MB_YESNO | MB_ICONWARNING, &res); if (IDNO == res) { goto Exit; } } // // Prepere the file name to delete // bstrServerName = ((CFaxServerNode *)GetRootNode())->GetServerName(); if (!bstrServerName) { DebugPrintEx(DEBUG_ERR, TEXT("Out of memory. Failed to get server name.")); hRc = E_OUTOFMEMORY; goto Error; } if(!GetServerCpDir(bstrServerName, pszCovDir, sizeof(pszCovDir)/sizeof(pszCovDir[0]))) { ec = GetLastError(); DebugPrintEx( DEBUG_ERR, _T("Failed to get Server Cover-Page Dir. (ec : %ld)"), ec); hRc = HRESULT_FROM_WIN32(ec); goto Error; } bstrFullPath = pszCovDir; if (!bstrFullPath) { hRc = E_OUTOFMEMORY; DebugPrintEx( DEBUG_ERR, _T("Failed to allocate string - out of memory")); goto Error; } bstrFullPath += FAX_PATH_SEPARATOR_STR; bstrFullPath += m_bstrDisplayName; // // Delete - done by parent node // hRc = m_pParentNode->DeleteCoverPage(bstrFullPath, this); if ( FAILED(hRc) ) { DebugPrintEx( DEBUG_ERR, _T("Failed to delete cover page")); goto Error; } ATLASSERT(S_OK == hRc); goto Exit; Error: ATLASSERT(S_OK != hRc); NodeMsgBox(IDS_FAIL2DELETE_COV); Exit: return hRc; } /* - CFaxCoverPageNode::OnEditCoverPage - * Purpose: * * * Arguments: * [out] bHandled - Do we handle it? * [in] pRoot - The root node * * Return: * OLE Error code */ HRESULT CFaxCoverPageNode::OnEditCoverPage(bool &bHandled, CSnapInObjectRootBase *pRoot) { DEBUG_FUNCTION_NAME( _T("CFaxCoverPageNode::OnEditCoverPage")); UNREFERENCED_PARAMETER (pRoot); UNREFERENCED_PARAMETER (bHandled); DWORD ec = ERROR_SUCCESS; TCHAR tszServerCPDir[MAX_PATH * 4]; TCHAR tszQuotedFullCPFilePath[MAX_PATH * 4]; if(!IsFaxComponentInstalled(FAX_COMPONENT_CPE)) { return S_OK; } ATLASSERT(m_pParentNode); // // Prepare the filename of the cover page // Step1: Get full path // CComBSTR bstrServerName = ((CFaxServerNode *)GetRootNode())->GetServerName(); if (!bstrServerName) { DebugPrintEx(DEBUG_ERR, TEXT("Out of memory. Failed to get server name.")); NodeMsgBox(IDS_MEMORY); return E_OUTOFMEMORY; } if (!GetServerCpDir (bstrServerName, tszServerCPDir, ARR_SIZE (tszServerCPDir))) { ec = GetLastError (); DebugPrintEx(DEBUG_ERR, _T("Error %ld when calling GetServerCpDir"), ec); NodeMsgBox(IDS_MEMORY); return HRESULT_FROM_WIN32(ec); } // // To avoid problems with space included file names like: "My Cover Page.cov" // if (0 >= wnsprintf (tszQuotedFullCPFilePath, ARR_SIZE (tszQuotedFullCPFilePath), TEXT("\"%s\\%s\""), tszServerCPDir, m_bstrDisplayName)) { ec = ERROR_BUFFER_OVERFLOW; DebugPrintEx(DEBUG_ERR, _T("Error %ld when calling wnsprintf"), ec); NodeMsgBox(IDS_MEMORY); return HRESULT_FROM_WIN32(ec); } // // Open cover page editor // ec = m_pParentNode->OpenCoverPageEditor(CComBSTR(tszQuotedFullCPFilePath)); if (ERROR_SUCCESS != ec) { DebugPrintEx( DEBUG_ERR, _T("Fail to OpenCoverPageEditor. (ec : %ld)"), ec); return HRESULT_FROM_WIN32( ec ); } return S_OK; } /* + + CFaxCoverPageNode::OnShowContextHelp * * Purpose: * Overrides CSnapinNode::OnShowContextHelp. * * Arguments: * * Return: - OLE error code - */ HRESULT CFaxCoverPageNode::OnShowContextHelp( IDisplayHelp* pDisplayHelp, LPOLESTR helpFile) { return DisplayContextHelp(pDisplayHelp, helpFile, HLP_COVER_PAGES); } /* - CFaxCoverPageNode::UpdateMenuState - * Purpose: * Overrides the ATL CSnapInItemImpl::UpdateMenuState * which only have one line inside it "return;" * This function implements the grayed\ungrayed view for the * the Enable and the Disable menus. * * Arguments: * [in] id - unsigned int with the menu IDM value * [out] pBuf - string * [out] flags - pointer to flags state combination unsigned int * * Return: * no return value - void function */ void CFaxCoverPageNode::UpdateMenuState(UINT id, LPTSTR pBuf, UINT *flags) { DEBUG_FUNCTION_NAME( _T("CFaxCoverPageNode::UpdateMenuState")); UNREFERENCED_PARAMETER (pBuf); switch (id) { case IDM_EDIT_COVERPAGE: *flags = IsFaxComponentInstalled(FAX_COMPONENT_CPE) ? MF_ENABLED : MF_GRAYED; break; default: break; } return; }