652 lines
16 KiB
C++
652 lines
16 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// 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 <windows.h>
|
|
#include <shlwapi.h>
|
|
#include <faxreg.h>
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// {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;
|
|
}
|