Windows-Server-2003/printscan/faxsrv/admin/mmc/coverpage.cpp

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;
}