You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1882 lines
47 KiB
1882 lines
47 KiB
/////////////////////////////////////////////////////////////////////////////
|
|
// FILE : FaxServerNode.cpp //
|
|
// //
|
|
// DESCRIPTION : Fax Server MMC node creation. //
|
|
// //
|
|
// AUTHOR : yossg //
|
|
// //
|
|
// HISTORY : //
|
|
// Sep 22 1999 yossg Init . //
|
|
// Nov 24 1999 yossg Rename file from FaxCfg //
|
|
// Dec 9 1999 yossg Call InitDisplayName from parent //
|
|
// Feb 7 2000 yossg Add Call to CreateSecurityPage //
|
|
// Mar 16 2000 yossg Add service start-stop //
|
|
// Jun 25 2000 yossg Add stream and command line primary snapin //
|
|
// machine targeting. //
|
|
// Oct 17 2000 yossg //
|
|
// Dec 10 2000 yossg Update Windows XP //
|
|
// //
|
|
// Copyright (C) 1999 - 2000 Microsoft Corporation All Rights Reserved //
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "FaxServerNode.h"
|
|
//
|
|
//Child Nodes H files
|
|
//
|
|
#include "DevicesAndProviders.h"
|
|
#include "OutboundRouting.h"
|
|
#include "InboundRouting.h"
|
|
#include "CoverPages.h"
|
|
|
|
#include "SecurityInfo.h" //which includes also <aclui.h>
|
|
|
|
#include "WzConnectToServer.h"
|
|
|
|
|
|
#include <faxreg.h>
|
|
#include "Icons.h"
|
|
|
|
#include "oaidl.h"
|
|
|
|
|
|
//
|
|
//CFaxServerNode Class
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// {7A4A6347-A42A-4d36-8538-6634CD3C3B15}
|
|
static const GUID CFaxServerNodeGUID_NODETYPE =
|
|
{ 0x7a4a6347, 0xa42a, 0x4d36, { 0x85, 0x38, 0x66, 0x34, 0xcd, 0x3c, 0x3b, 0x15 } };
|
|
|
|
const GUID* CFaxServerNode::m_NODETYPE = &CFaxServerNodeGUID_NODETYPE;
|
|
const OLECHAR* CFaxServerNode::m_SZNODETYPE = OLESTR("7A4A6347-A42A-4d36-8538-6634CD3C3B15");
|
|
const CLSID* CFaxServerNode::m_SNAPIN_CLASSID = &CLSID_Snapin;
|
|
|
|
CColumnsInfo CFaxServerNode::m_ColsInfo;
|
|
|
|
/*
|
|
- CFaxServerNode::InsertColumns
|
|
-
|
|
* Purpose:
|
|
* Adds columns to the default result pane.
|
|
*
|
|
* Arguments:
|
|
* [in] pHeaderCtrl - IHeaderCtrl in the console-provided default result view pane
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT
|
|
CFaxServerNode::InsertColumns(IHeaderCtrl *pHeaderCtrl)
|
|
{
|
|
HRESULT hRc;
|
|
|
|
DEBUG_FUNCTION_NAME( _T("CFaxServerNode::InsertColumns"));
|
|
|
|
static ColumnsInfoInitData ColumnsInitData[] =
|
|
{
|
|
{IDS_FAX_COL_HEAD, FXS_LARGE_COLUMN_WIDTH},
|
|
{LAST_IDS, 0}
|
|
};
|
|
|
|
hRc = m_ColsInfo.InsertColumnsIntoMMC(pHeaderCtrl,
|
|
_Module.GetResourceInstance(),
|
|
ColumnsInitData);
|
|
if (hRc != S_OK)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Failed to InsertColumnsIntoMMC. hRc: %08X "),
|
|
hRc);
|
|
goto Cleanup;
|
|
}
|
|
|
|
Cleanup:
|
|
return(hRc);
|
|
}
|
|
|
|
/*
|
|
- CFaxServerNode::PopulateScopeChildrenList
|
|
-
|
|
* Purpose:
|
|
* Create all the Fax nodes
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT CFaxServerNode::PopulateScopeChildrenList()
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CFaxServerNode::PopulateScopeChildrenList"));
|
|
|
|
HRESULT hRc = S_OK;
|
|
|
|
CFaxDevicesAndProvidersNode * pDevicesAndProviders = NULL;
|
|
CFaxInboundRoutingNode * pIn = NULL;
|
|
CFaxOutboundRoutingNode * pOut = NULL;
|
|
CFaxCoverPagesNode * pCoverPages = NULL;
|
|
|
|
CFaxServer * pFaxServer = NULL;
|
|
|
|
//
|
|
// Prepare IConsoleNameSpace for case of failure
|
|
//
|
|
ATLASSERT(m_pComponentData);
|
|
ATLASSERT( ((CSnapin*)m_pComponentData)->m_spConsole );
|
|
CComQIPtr<IConsoleNameSpace, &IID_IConsoleNameSpace> spConsoleNameSpace( ((CSnapin*)m_pComponentData)->m_spConsole );
|
|
ATLASSERT( spConsoleNameSpace );
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if (m_IsPrimaryModeSnapin)
|
|
{
|
|
if (m_IsLaunchedFromSavedMscFile)
|
|
{
|
|
hRc = ForceRedrawNode();
|
|
if ( S_OK != hRc )
|
|
{
|
|
//msgbox and dbgerr by called func.
|
|
return hRc;
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Preliminary connection-test
|
|
//
|
|
pFaxServer = GetFaxServer();
|
|
ATLASSERT(pFaxServer);
|
|
|
|
if (!pFaxServer->GetFaxServerHandle())
|
|
{
|
|
DWORD ec= GetLastError();
|
|
DebugPrintEx(DEBUG_ERR, _T("Failed to check connection to server. (ec: %ld)"), ec);
|
|
|
|
pFaxServer->Disconnect();
|
|
|
|
if(pFaxServer->GetServerAPIVersion() > CURRENT_FAX_API_VERSION)
|
|
{
|
|
//
|
|
// Cannot manage later version of fax
|
|
//
|
|
NodeMsgBox(IDS_ERR_API_NEW_VERSION, MB_OK | MB_ICONSTOP);
|
|
hRc = HRESULT_FROM_WIN32(ERROR_RMODE_APP);
|
|
}
|
|
else if(pFaxServer->IsDesktopSKUConnection())
|
|
{
|
|
//
|
|
// Cannot manage WinXP desktop SKU fax
|
|
//
|
|
NodeMsgBox(IDS_ERR_DESKTOP_SKU_CONNECTION, MB_OK | MB_ICONSTOP);
|
|
hRc = HRESULT_FROM_WIN32(ERROR_RMODE_APP);
|
|
}
|
|
else
|
|
{
|
|
NodeMsgBox(IDS_NETWORK_PROBLEMS, MB_OK | MB_ICONSTOP);
|
|
hRc = HRESULT_FROM_WIN32(ec);
|
|
}
|
|
return hRc;
|
|
}
|
|
|
|
//
|
|
//Devices And Providers
|
|
//
|
|
pDevicesAndProviders = new CFaxDevicesAndProvidersNode(this, m_pComponentData);
|
|
if (!pDevicesAndProviders)
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
NodeMsgBox(IDS_MEMORY);
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Out of memory"));
|
|
goto Error;
|
|
}
|
|
else
|
|
{
|
|
pDevicesAndProviders->InitParentNode(this);
|
|
|
|
hRc = pDevicesAndProviders->InitDisplayName();
|
|
if ( FAILED(hRc) )
|
|
{
|
|
DebugPrintEx(DEBUG_ERR,_T("Failed to display node name. (hRc: %08X)"), hRc);
|
|
NodeMsgBox(IDS_FAILTOADD_AllDEVICES);
|
|
goto Error;
|
|
}
|
|
|
|
pDevicesAndProviders->SetIcons(IMAGE_FOLDER_CLOSE, IMAGE_FOLDER_OPEN);
|
|
|
|
hRc = AddChild(pDevicesAndProviders, &pDevicesAndProviders->m_scopeDataItem);
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to add devices and providers node. (hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAILTOADD_AllDEVICES);
|
|
goto Error;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Fax Inbound Routing
|
|
//
|
|
pIn = new CFaxInboundRoutingNode(this, m_pComponentData);
|
|
if (!pIn)
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
NodeMsgBox(IDS_MEMORY);
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Out of memory"));
|
|
goto Error;
|
|
}
|
|
else
|
|
{
|
|
pIn->InitParentNode(this);
|
|
|
|
pIn->SetIcons(IMAGE_FOLDER_CLOSE, IMAGE_FOLDER_OPEN);
|
|
|
|
hRc = pIn->InitDisplayName();
|
|
if ( FAILED(hRc) )
|
|
{
|
|
DebugPrintEx(DEBUG_ERR,_T("Failed to display node name. (hRc: %08X)"), hRc);
|
|
NodeMsgBox(IDS_FAILTOADD_INBOUNDROUTING);
|
|
goto Error;
|
|
}
|
|
|
|
hRc = AddChild(pIn, &pIn->m_scopeDataItem);
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to add inbound routing node. (hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAILTOADD_INBOUNDROUTING);
|
|
goto Error;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Fax Outbound Routing
|
|
//
|
|
pOut = new CFaxOutboundRoutingNode(this, m_pComponentData);
|
|
if (!pOut)
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
NodeMsgBox(IDS_MEMORY);
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Out of memory"));
|
|
goto Error;
|
|
}
|
|
else
|
|
{
|
|
pOut->InitParentNode(this);
|
|
|
|
pOut->SetIcons(IMAGE_FOLDER_CLOSE, IMAGE_FOLDER_OPEN);
|
|
|
|
hRc = pOut->InitDisplayName();
|
|
if ( FAILED(hRc) )
|
|
{
|
|
DebugPrintEx(DEBUG_ERR,_T("Failed to display node name. (hRc: %08X)"), hRc);
|
|
NodeMsgBox(IDS_FAILTOADD_OUTBOUNDROUTING);
|
|
goto Error;
|
|
}
|
|
|
|
hRc = AddChild(pOut, &pOut->m_scopeDataItem);
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to add outbound routing node. (hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAILTOADD_OUTBOUNDROUTING);
|
|
goto Error;
|
|
}
|
|
}
|
|
|
|
//
|
|
// CoverPages
|
|
//
|
|
pCoverPages = new CFaxCoverPagesNode(this, m_pComponentData);
|
|
if (!pCoverPages)
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
NodeMsgBox(IDS_MEMORY);
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Out of memory"));
|
|
goto Error;
|
|
}
|
|
else
|
|
{
|
|
pCoverPages->InitParentNode(this);
|
|
|
|
hRc = pCoverPages->Init();
|
|
if ( FAILED(hRc) )
|
|
{
|
|
if(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hRc)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR, //Dbg Warning only !!!
|
|
_T("Cover pages folder was not found. (hRc: %08X)"), hRc);
|
|
|
|
NodeMsgBox(IDS_COVERPAGES_PATH_NOT_FOUND);
|
|
}
|
|
else
|
|
{
|
|
DebugPrintEx(DEBUG_ERR,_T("Failed to Init cover pages class. (hRc: %08X)"), hRc);
|
|
NodeMsgBox(IDS_FAILTOADD_COVERPAGES);
|
|
}
|
|
goto Error;
|
|
|
|
}
|
|
|
|
hRc = pCoverPages->InitDisplayName();
|
|
if ( FAILED(hRc) )
|
|
{
|
|
DebugPrintEx(DEBUG_ERR,_T("Failed to display node name. (hRc: %08X)"), hRc);
|
|
NodeMsgBox(IDS_FAILTOADD_COVERPAGES);
|
|
goto Error;
|
|
}
|
|
|
|
pCoverPages->SetIcons(IMAGE_FAX_COVERPAGES, IMAGE_FAX_COVERPAGES);
|
|
|
|
hRc = AddChild(pCoverPages, &pCoverPages->m_scopeDataItem);
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to add reports node. (hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAILTOADD_COVERPAGES);
|
|
goto Error;
|
|
}
|
|
}
|
|
|
|
ATLASSERT(S_OK == hRc);
|
|
goto Exit;
|
|
|
|
Error:
|
|
ATLASSERT(S_OK != hRc);
|
|
if ( NULL != pDevicesAndProviders )
|
|
{
|
|
if (0 != pDevicesAndProviders->m_scopeDataItem.ID )
|
|
{
|
|
hr = spConsoleNameSpace->DeleteItem(pDevicesAndProviders->m_scopeDataItem.ID, TRUE);
|
|
if (hr != S_OK) // can be only E_UNEXPECTED [MSDN]
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("spConsoleNameSpace->DeleteItem() Failed - Unexpected error. (hRc: %08X)"),
|
|
hr);
|
|
ATLASSERT(FALSE);
|
|
}
|
|
}
|
|
delete pDevicesAndProviders;
|
|
pDevicesAndProviders = NULL;
|
|
}
|
|
|
|
if ( NULL != pIn )
|
|
{
|
|
if (0 != pIn->m_scopeDataItem.ID )
|
|
{
|
|
hr = spConsoleNameSpace->DeleteItem(pIn->m_scopeDataItem.ID, TRUE);
|
|
if (hr != S_OK) // can be only E_UNEXPECTED [MSDN]
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("spConsoleNameSpace->DeleteItem() Failed - Unexpected error. (hRc: %08X)"),
|
|
hr);
|
|
ATLASSERT(FALSE);
|
|
}
|
|
}
|
|
delete pIn;
|
|
pIn = NULL;
|
|
}
|
|
|
|
if ( NULL != pOut )
|
|
{
|
|
if (0 != pOut->m_scopeDataItem.ID )
|
|
{
|
|
hr = spConsoleNameSpace->DeleteItem(pOut->m_scopeDataItem.ID, TRUE);
|
|
if (hr != S_OK) // can be only E_UNEXPECTED [MSDN]
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("spConsoleNameSpace->DeleteItem() Failed - Unexpected error. (hRc: %08X)"),
|
|
hr);
|
|
ATLASSERT(FALSE);
|
|
}
|
|
}
|
|
delete pOut;
|
|
pOut = NULL;
|
|
}
|
|
if ( NULL != pCoverPages )
|
|
{
|
|
if (0 != pCoverPages->m_scopeDataItem.ID )
|
|
{
|
|
hr = spConsoleNameSpace->DeleteItem(pCoverPages->m_scopeDataItem.ID, TRUE);
|
|
if (hr != S_OK) // can be only E_UNEXPECTED [MSDN]
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("spConsoleNameSpace->DeleteItem() Failed - Unexpected error. (hRc: %08X)"),
|
|
hr);
|
|
ATLASSERT(FALSE);
|
|
}
|
|
}
|
|
delete pCoverPages;
|
|
pCoverPages = NULL;
|
|
}
|
|
|
|
// Empty the list
|
|
m_ScopeChildrenList.RemoveAll();
|
|
|
|
m_bScopeChildrenListPopulated = FALSE;
|
|
|
|
Exit:
|
|
return hRc;
|
|
}
|
|
|
|
|
|
/*
|
|
- CFaxServerNode::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
|
|
* Out of memory error or last error occured
|
|
*/
|
|
HRESULT
|
|
CFaxServerNode::CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider,
|
|
LONG_PTR handle,
|
|
IUnknown *pUnk,
|
|
DATA_OBJECT_TYPES type)
|
|
{
|
|
HRESULT hRc = S_OK;
|
|
DWORD ec = ERROR_SUCCESS;
|
|
|
|
DEBUG_FUNCTION_NAME( _T("CFaxServerNode::CreatePropertyPages"));
|
|
|
|
ATLASSERT(lpProvider);
|
|
|
|
if( type == CCT_SNAPIN_MANAGER ) //invokes wizard
|
|
{
|
|
return CreateSnapinManagerPages(lpProvider, handle);
|
|
}
|
|
|
|
ATLASSERT(type == CCT_RESULT || type == CCT_SCOPE);
|
|
|
|
m_pFaxServerGeneral = NULL;
|
|
m_pFaxServerEmail = NULL;
|
|
m_pFaxServerEvents = NULL;
|
|
m_pFaxServerLogging = NULL;
|
|
m_pFaxServerOutbox = NULL;
|
|
m_pFaxServerInbox = NULL;
|
|
m_pFaxServerSentItems = NULL;
|
|
|
|
PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL;
|
|
CFaxSecurityInformation * pSecurityInfo = NULL;
|
|
CFaxServer * pFaxServer = NULL;
|
|
|
|
HPROPSHEETPAGE hPage;
|
|
|
|
BOOL fIsLocalServer = TRUE;
|
|
|
|
//
|
|
// Preliminary Access Check
|
|
//
|
|
pFaxServer = ((CFaxServerNode *)GetRootNode())->GetFaxServer();
|
|
ATLASSERT(pFaxServer);
|
|
|
|
if (!pFaxServer->GetFaxServerHandle())
|
|
{
|
|
ec= GetLastError();
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Failed to GetFaxServerHandle. (ec: %ld)"),
|
|
ec);
|
|
|
|
NodeMsgBox(GetFaxServerErrorMsg(ec));
|
|
|
|
hRc = HRESULT_FROM_WIN32(ec);
|
|
goto Error;
|
|
}
|
|
|
|
|
|
if (!FaxAccessCheckEx(pFaxServer->GetFaxServerHandle(),
|
|
FAX_ACCESS_QUERY_CONFIG,
|
|
NULL))
|
|
{
|
|
ec = GetLastError();
|
|
if (ERROR_SUCCESS == ec)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_MSG,
|
|
_T("FaxAccessCheckEx returns ACCESS DENIED for FAX_ACCESS_QUERY_CONFIG."));
|
|
|
|
goto Security;
|
|
}
|
|
else
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Fail check access for FAX_ACCESS_QUERY_CONFIG."));
|
|
|
|
NodeMsgBox(GetFaxServerErrorMsg(ec));
|
|
|
|
hRc = HRESULT_FROM_WIN32(ec);
|
|
goto Error;
|
|
}
|
|
}
|
|
|
|
|
|
if ( 0 != (pFaxServer->GetServerName()).Length() )
|
|
{
|
|
fIsLocalServer = FALSE;
|
|
}
|
|
|
|
//
|
|
// General
|
|
//
|
|
m_pFaxServerGeneral = new CppFaxServerGeneral(
|
|
handle,
|
|
this,
|
|
TRUE,
|
|
_Module.GetResourceInstance());
|
|
|
|
if (!m_pFaxServerGeneral)
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
NodeMsgBox(IDS_MEMORY_FAIL_TO_OPEN_PP);
|
|
goto Error;
|
|
}
|
|
|
|
hRc = m_pFaxServerGeneral->InitRPC();
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to call RPC to init property page for General Tab. (hRc: %08X)"),
|
|
hRc);
|
|
|
|
goto Error;
|
|
}
|
|
|
|
|
|
hPage = NULL;
|
|
hPage = m_pFaxServerGeneral->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;
|
|
}
|
|
|
|
//
|
|
// Receipts - Notification delivery
|
|
//
|
|
m_pFaxServerEmail = new CppFaxServerReceipts(
|
|
handle,
|
|
this,
|
|
TRUE,
|
|
_Module.GetResourceInstance());
|
|
|
|
if (!m_pFaxServerEmail)
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
NodeMsgBox(IDS_MEMORY_FAIL_TO_OPEN_PP);
|
|
goto Error;
|
|
}
|
|
|
|
hRc = m_pFaxServerEmail->InitRPC();
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to call RPC to init property page for mail Tab.(hRc: %08X)"),
|
|
hRc);
|
|
goto Error;
|
|
}
|
|
|
|
|
|
hPage = NULL;
|
|
hPage = m_pFaxServerEmail->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 Email Tab.(hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAIL_TO_OPEN_PROP_PAGE);
|
|
goto Error;
|
|
}
|
|
|
|
//
|
|
// Event Reports ("Logging Categories")
|
|
//
|
|
m_pFaxServerEvents = new CppFaxServerEvents(
|
|
handle,
|
|
this,
|
|
TRUE,
|
|
_Module.GetResourceInstance());
|
|
|
|
if (!m_pFaxServerEvents)
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
NodeMsgBox(IDS_MEMORY_FAIL_TO_OPEN_PP);
|
|
goto Error;
|
|
}
|
|
|
|
hRc = m_pFaxServerEvents->InitRPC();
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to call RPC to init property page for event reports Tab. (hRc: %08X)"),
|
|
hRc);
|
|
goto Error;
|
|
}
|
|
|
|
|
|
hPage = NULL;
|
|
hPage = m_pFaxServerEvents->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 Events Tab.(hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAIL_TO_OPEN_PROP_PAGE);
|
|
goto Error;
|
|
}
|
|
|
|
//
|
|
// Logging
|
|
//
|
|
m_pFaxServerLogging = new CppFaxServerLogging(
|
|
handle,
|
|
this,
|
|
fIsLocalServer,
|
|
_Module.GetResourceInstance());
|
|
|
|
if (!m_pFaxServerLogging)
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
NodeMsgBox(IDS_MEMORY_FAIL_TO_OPEN_PP);
|
|
goto Error;
|
|
}
|
|
|
|
hRc = m_pFaxServerLogging->InitRPC();
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to call RPC to init property page for Logging tab.(hRc: %08X)"),
|
|
hRc);
|
|
goto Error;
|
|
}
|
|
|
|
|
|
hPage = NULL;
|
|
hPage = m_pFaxServerLogging->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 Logging Tab.(hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAIL_TO_OPEN_PROP_PAGE);
|
|
goto Error;
|
|
}
|
|
|
|
//
|
|
// Outbox
|
|
//
|
|
m_pFaxServerOutbox = new CppFaxServerOutbox(
|
|
handle,
|
|
this,
|
|
TRUE,
|
|
_Module.GetResourceInstance());
|
|
|
|
if (!m_pFaxServerOutbox)
|
|
{
|
|
hRc= E_OUTOFMEMORY;
|
|
NodeMsgBox(IDS_FAIL_TO_OPEN_PROP_PAGE);
|
|
goto Error;
|
|
}
|
|
|
|
hRc = m_pFaxServerOutbox->InitRPC();
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to call RPC to init property page for Outbox tab. (hRc: %08X)"),
|
|
hRc);
|
|
goto Error;
|
|
}
|
|
|
|
|
|
hPage = NULL;
|
|
hPage = m_pFaxServerOutbox->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 Outbox Tab.(hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAIL_TO_OPEN_PROP_PAGE);
|
|
goto Error;
|
|
}
|
|
|
|
//
|
|
// Inbox Archive
|
|
//
|
|
m_pFaxServerInbox = new CppFaxServerInbox(
|
|
handle,
|
|
this,
|
|
fIsLocalServer,
|
|
_Module.GetResourceInstance());
|
|
|
|
|
|
if (!m_pFaxServerInbox)
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
NodeMsgBox(IDS_MEMORY_FAIL_TO_OPEN_PP);
|
|
goto Error;
|
|
}
|
|
|
|
hRc = m_pFaxServerInbox->InitRPC();
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to call RPC to init property page for Inbox Tab.(hRc: %08X)"),
|
|
hRc);
|
|
goto Error;
|
|
}
|
|
|
|
|
|
|
|
hPage = NULL;
|
|
hPage = m_pFaxServerInbox->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 Inbox Tab. (hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAIL_TO_OPEN_PROP_PAGE);
|
|
goto Error;
|
|
}
|
|
|
|
//
|
|
// Sent Items Archive
|
|
//
|
|
|
|
|
|
|
|
|
|
m_pFaxServerSentItems = new CppFaxServerSentItems(
|
|
handle,
|
|
this,
|
|
fIsLocalServer,
|
|
_Module.GetResourceInstance());
|
|
if (!m_pFaxServerSentItems)
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
NodeMsgBox(IDS_MEMORY_FAIL_TO_OPEN_PP);
|
|
goto Error;
|
|
}
|
|
|
|
hRc = m_pFaxServerSentItems->InitRPC();
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to call RPC to init property page for Sent items tab. (hRc: %08X)"),
|
|
hRc);
|
|
goto Error;
|
|
}
|
|
|
|
|
|
hPage = NULL;
|
|
hPage = m_pFaxServerSentItems->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 SentItems Tab. (hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAIL_TO_OPEN_PROP_PAGE);
|
|
goto Error;
|
|
}
|
|
|
|
Security: //Must be last tab!!!
|
|
|
|
//
|
|
// Security
|
|
//
|
|
pSecurityInfo = new CComObject<CFaxSecurityInformation>;
|
|
if (!pSecurityInfo)
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
goto Error;
|
|
}
|
|
pSecurityInfo->Init(this);
|
|
|
|
hPage = NULL;
|
|
hPage = CreateSecurityPage( pSecurityInfo );
|
|
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 Inbox 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 != m_pFaxServerGeneral )
|
|
{
|
|
delete m_pFaxServerGeneral;
|
|
m_pFaxServerGeneral = NULL;
|
|
}
|
|
if ( NULL != m_pFaxServerEmail )
|
|
{
|
|
delete m_pFaxServerEmail;
|
|
m_pFaxServerEmail = NULL;
|
|
}
|
|
if ( NULL != m_pFaxServerEvents )
|
|
{
|
|
delete m_pFaxServerEvents;
|
|
m_pFaxServerEvents = NULL;
|
|
}
|
|
if ( NULL != m_pFaxServerLogging )
|
|
{
|
|
delete m_pFaxServerLogging;
|
|
m_pFaxServerLogging = NULL;
|
|
}
|
|
if ( NULL != m_pFaxServerOutbox )
|
|
{
|
|
delete m_pFaxServerOutbox;
|
|
m_pFaxServerOutbox = NULL;
|
|
}
|
|
if ( NULL != m_pFaxServerInbox )
|
|
{
|
|
delete m_pFaxServerInbox;
|
|
m_pFaxServerInbox = NULL;
|
|
}
|
|
if ( NULL != m_pFaxServerSentItems )
|
|
{
|
|
delete m_pFaxServerSentItems;
|
|
m_pFaxServerSentItems = NULL;
|
|
}
|
|
if ( NULL != pSecurityInfo )
|
|
{
|
|
delete pSecurityInfo;
|
|
pSecurityInfo = NULL;
|
|
}
|
|
|
|
Exit:
|
|
if (NULL != pSecurityDescriptor )
|
|
{
|
|
FaxFreeBuffer( (PVOID)pSecurityDescriptor );
|
|
}
|
|
|
|
return hRc;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
- CFaxServerNode::CreateSnapinManagerPages
|
|
-
|
|
* Purpose:
|
|
* Called to create wizard by snapin manager
|
|
* CreatePropertyPages with ( type == CCT_SNAPIN_MANAGER )
|
|
*
|
|
*
|
|
* Arguments:
|
|
* [in] lpProvider - The property sheet
|
|
* [in] handle - Handle for routing notification
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT CFaxServerNode::CreateSnapinManagerPages(
|
|
LPPROPERTYSHEETCALLBACK lpProvider,
|
|
LONG_PTR handle)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CFaxServerNode::CreateSnapinManagerPages"));
|
|
|
|
// This page will take care of deleting itself when it
|
|
// receives the PSPCB_RELEASE message.
|
|
|
|
CWzConnectToServer * pWzPageConnect = new CWzConnectToServer(this);
|
|
|
|
HPROPSHEETPAGE hPage = NULL;
|
|
HRESULT hRc = S_OK;
|
|
hPage = pWzPageConnect->Create();
|
|
if ((!hPage))
|
|
{
|
|
hRc = HRESULT_FROM_WIN32(GetLastError());
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to Create() property page. (hRc: %08X)"),
|
|
hRc);
|
|
|
|
PageErrorEx(IDS_FAX_CONNECT, IDS_FAIL_TO_OPEN_TARGETING_WIZARD, NULL);
|
|
|
|
return hRc;
|
|
}
|
|
|
|
hRc = lpProvider->AddPage(hPage);
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to add the connect to server property page to wizard. (hRc: %08X)"),
|
|
hRc);
|
|
PageErrorEx(IDS_FAX_CONNECT, IDS_FAIL_TO_OPEN_TARGETING_WIZARD, NULL);
|
|
|
|
return hRc;
|
|
}
|
|
|
|
return hRc;
|
|
}
|
|
|
|
/*
|
|
- CFaxServerNode::SetVerbs
|
|
-
|
|
* Purpose:
|
|
* What verbs to enable/disable when this object is selected
|
|
*
|
|
* Arguments:
|
|
* [in] pConsoleVerb - MMC ConsoleVerb interface
|
|
*
|
|
* Return:
|
|
* OLE Error code
|
|
*/
|
|
HRESULT CFaxServerNode::SetVerbs(IConsoleVerb *pConsoleVerb)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
CFaxServer* pFaxServer = NULL;
|
|
|
|
pFaxServer = GetFaxServer();
|
|
ATLASSERT(pFaxServer);
|
|
|
|
if(!pFaxServer->IsServerRunningFaxService())
|
|
{
|
|
hr = pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, HIDDEN, TRUE);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// Init server API version information
|
|
//
|
|
pFaxServer->GetFaxServerHandle();
|
|
|
|
if(pFaxServer->GetServerAPIVersion() > CURRENT_FAX_API_VERSION ||
|
|
pFaxServer->IsDesktopSKUConnection())
|
|
{
|
|
//
|
|
// Cannot manage later version of fax or WinXP desktop SKU fax
|
|
//
|
|
hr = pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, HIDDEN, TRUE);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// Display verbs that we support:
|
|
// 1. Properties
|
|
//
|
|
|
|
hr = pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, ENABLED, TRUE);
|
|
|
|
//
|
|
// We want the default verb to be Properties
|
|
//
|
|
hr = pConsoleVerb->SetDefaultVerb(MMC_VERB_PROPERTIES);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/*
|
|
- CFaxServerNode::OnRefresh
|
|
-
|
|
* Purpose:
|
|
* Called when refreshing the object.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT
|
|
CFaxServerNode::OnRefresh(LPARAM arg,
|
|
LPARAM param,
|
|
IComponentData *pComponentData,
|
|
IComponent * pComponent,
|
|
DATA_OBJECT_TYPES type)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*
|
|
- CFaxServerNode::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 CFaxServerNode::UpdateMenuState(UINT id, LPTSTR pBuf, UINT *flags)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CFaxServerNode::UpdateMenuState"));
|
|
|
|
UNREFERENCED_PARAMETER (pBuf);
|
|
|
|
BOOL fIsRunning = FALSE;
|
|
|
|
ATLASSERT(GetFaxServer());
|
|
fIsRunning = GetFaxServer()->IsServerRunningFaxService();
|
|
|
|
switch (id)
|
|
{
|
|
case IDM_SRV_START:
|
|
*flags = (fIsRunning ? MF_GRAYED : MF_ENABLED );
|
|
break;
|
|
|
|
case IDM_SRV_STOP:
|
|
|
|
*flags = (!fIsRunning ? MF_GRAYED : MF_ENABLED );
|
|
break;
|
|
|
|
case IDM_LAUNCH_CONSOLE:
|
|
|
|
*flags = IsFaxComponentInstalled(FAX_COMPONENT_CONSOLE) ? MF_ENABLED : MF_GRAYED;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
- CFaxServerNode::UpdateToolbarButton
|
|
-
|
|
* Purpose:
|
|
* Overrides the ATL CSnapInItemImpl::UpdateToolbarButton
|
|
* This function aloow us to decide if to the activate\grayed a toolbar button
|
|
* It treating only the Enable state.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* [in] id - unsigned int for the toolbar button ID
|
|
* [in] fsState - state to be cosidered ENABLE ?HIDDEN etc.
|
|
*
|
|
* Return:
|
|
* BOOL TRUE to activate state FALSE to disabled the state for this button
|
|
*/
|
|
BOOL CFaxServerNode::UpdateToolbarButton(UINT id, BYTE fsState)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CFaxServerNode::UpdateToolbarButton"));
|
|
BOOL bRet = FALSE;
|
|
|
|
BOOL fIsRunning = FALSE;
|
|
|
|
ATLASSERT(GetFaxServer());
|
|
fIsRunning = GetFaxServer()->IsServerRunningFaxService();
|
|
|
|
|
|
// Set whether the buttons should be enabled.
|
|
if (fsState == ENABLED)
|
|
{
|
|
|
|
switch ( id )
|
|
{
|
|
case ID_START_BUTTON:
|
|
|
|
bRet = ( fIsRunning ? FALSE : TRUE );
|
|
break;
|
|
|
|
case ID_STOP_BUTTON:
|
|
|
|
bRet = ( fIsRunning ? TRUE : FALSE );
|
|
break;
|
|
|
|
case ID_CLIENTCONSOLE_BUTTON:
|
|
|
|
bRet = IsFaxComponentInstalled(FAX_COMPONENT_CONSOLE);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// For all other possible button ID's and states,
|
|
// the correct answer here is FALSE.
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
- CFaxServerNode::OnServiceStartCommand
|
|
-
|
|
* Purpose:
|
|
* To start Fax Server Service
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT CFaxServerNode::OnServiceStartCommand(bool &bHandled, CSnapInObjectRootBase *pRoot)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CFaxServerNode::OnServiceStartCommand"));
|
|
BOOL bRet = FALSE;
|
|
|
|
HRESULT hRc = S_OK;
|
|
SCOPEDATAITEM* pScopeData;
|
|
CComPtr<IConsole> spConsole;
|
|
|
|
|
|
//
|
|
// 0) Service status check
|
|
//
|
|
ATLASSERT(GetFaxServer());
|
|
if (GetFaxServer()->IsServerRunningFaxService())
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_MSG,
|
|
_T("Service is already running. (ec: %ld)"));
|
|
NodeMsgBox(IDS_SRV_ALREADY_START);
|
|
|
|
bRet = TRUE; //to allow toolbar refresh to correct state
|
|
}
|
|
else
|
|
{
|
|
|
|
//
|
|
// 1) Start the service
|
|
//
|
|
// ATLASSERT(GetFaxServer()); was called above
|
|
bRet = EnsureFaxServiceIsStarted (GetFaxServer()->GetServerName());
|
|
if (!bRet)
|
|
{
|
|
NodeMsgBox(IDS_FAIL2START_SRV);
|
|
}
|
|
}
|
|
|
|
//
|
|
// 2) Update the toolbar.
|
|
//
|
|
if (bRet)
|
|
{
|
|
//
|
|
// Get the updated SCOPEDATAITEM
|
|
//
|
|
hRc = GetScopeData( &pScopeData );
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to get pScopeData. (hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAIL2UPDATE_SRVSTATUS_TOOLBAR);
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// This will force MMC to redraw the scope node
|
|
//
|
|
spConsole = m_pComponentData->m_spConsole;
|
|
ATLASSERT(spConsole);
|
|
|
|
hRc = spConsole->SelectScopeItem( pScopeData->ID );
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to select scope Item. (hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAIL2UPDATE_SRVSTATUS_TOOLBAR);
|
|
}
|
|
}
|
|
}
|
|
|
|
return (bRet ? S_OK : E_FAIL);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
- CFaxServerNode::OnServiceStopCommand
|
|
-
|
|
* Purpose:
|
|
* To stop Fax Server Service
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT CFaxServerNode::OnServiceStopCommand(bool &bHandled, CSnapInObjectRootBase *pRoot)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CFaxServerNode::OnServiceStopCommand"));
|
|
|
|
BOOL bRet = FALSE;
|
|
|
|
HRESULT hRc = S_OK;
|
|
CFaxServer * pFaxServer = NULL;
|
|
|
|
//
|
|
// 0) Service status check
|
|
//
|
|
pFaxServer = GetFaxServer();
|
|
ATLASSERT(pFaxServer);
|
|
|
|
if (pFaxServer->IsServerFaxServiceStopped())
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_MSG,
|
|
_T("Do not have to stop - Fax server service is not started. (ec: %ld)"));
|
|
NodeMsgBox(IDS_SRV_ALREADY_STOP);
|
|
|
|
bRet = TRUE; //to allow toolbar refresh to correct state
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// 1) Stop the service
|
|
//
|
|
bRet = StopService(pFaxServer->GetServerName(), FAX_SERVICE_NAME, TRUE);
|
|
if (!bRet)
|
|
{
|
|
NodeMsgBox(IDS_FAIL2STOP_SRV);
|
|
}
|
|
}
|
|
|
|
//
|
|
// 2) Update the toolbar.
|
|
//
|
|
if (bRet)
|
|
{
|
|
pFaxServer->Disconnect();
|
|
|
|
SCOPEDATAITEM* pScopeData;
|
|
CComPtr<IConsole> spConsole;
|
|
|
|
//
|
|
// Get the updated SCOPEDATAITEM
|
|
//
|
|
hRc = GetScopeData( &pScopeData );
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to get pScopeData. (hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAIL2UPDATE_SRVSTATUS_TOOLBAR);
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// This will force MMC to redraw the scope node
|
|
//
|
|
spConsole = m_pComponentData->m_spConsole;
|
|
ATLASSERT(spConsole);
|
|
|
|
hRc = spConsole->SelectScopeItem( pScopeData->ID );
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to select scope Item. (hRc: %08X)"),
|
|
hRc);
|
|
NodeMsgBox(IDS_FAIL2UPDATE_SRVSTATUS_TOOLBAR);
|
|
}
|
|
}
|
|
}
|
|
|
|
return (bRet ? S_OK : E_FAIL);
|
|
}
|
|
|
|
|
|
/*
|
|
- CFaxServerNode::OnLaunchClientConsole
|
|
-
|
|
* Purpose:
|
|
* To launch client console.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT CFaxServerNode::OnLaunchClientConsole(bool &bHandled, CSnapInObjectRootBase *pRoot)
|
|
{
|
|
DEBUG_FUNCTION_NAME(_T("CFaxServerNode::OnLaunchClientConsole"));
|
|
DWORD dwRes = ERROR_SUCCESS;
|
|
HINSTANCE hClientConsole;
|
|
UINT idsRet;
|
|
//
|
|
// (-1) GetServerName
|
|
//
|
|
CComBSTR bstrServerName = L"";
|
|
|
|
bstrServerName = GetServerName();
|
|
if (!bstrServerName)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Launch client console failed due to failure during GetServerName."));
|
|
|
|
NodeMsgBox(IDS_MEMORY);
|
|
|
|
bstrServerName = L"";
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
//
|
|
// start cover page editor
|
|
//
|
|
hClientConsole = ShellExecute( NULL,
|
|
TEXT("open"), // Command
|
|
FAX_CLIENT_CONSOLE_IMAGE_NAME,
|
|
bstrServerName,
|
|
NULL,
|
|
SW_RESTORE
|
|
);
|
|
if( (DWORD_PTR)hClientConsole <= 32 )
|
|
{
|
|
// ShellExecute fail
|
|
dwRes = PtrToUlong(hClientConsole);
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Failed to run ShellExecute. (ec : %ld)"), dwRes);
|
|
|
|
ATLASSERT(dwRes >= 0);
|
|
|
|
//
|
|
// Select message to user
|
|
//
|
|
switch (dwRes)
|
|
{
|
|
case 0: //The operating system is out of memory or resources.
|
|
case SE_ERR_OOM: //There was not enough memory to complete the operation.
|
|
idsRet = IDS_MEMORY;
|
|
break;
|
|
|
|
case ERROR_FILE_NOT_FOUND: //The specified file was not found.
|
|
case ERROR_PATH_NOT_FOUND: //The specified path was not found.
|
|
case ERROR_BAD_FORMAT: //The .exe file is invalid (non-Win32® .exe or error in .exe image).
|
|
//case SE_ERR_PNF: value '3' already used //The specified path was not found.
|
|
//case SE_ERR_FNF: value '2' already used //The specified file was not found.
|
|
case SE_ERR_ASSOCINCOMPLETE: //The file name association is incomplete or invalid.
|
|
idsRet = IDS_FAXCONSOLE_NOTFOUND;
|
|
break;
|
|
|
|
case SE_ERR_ACCESSDENIED: //The operating system denied access to the specified file.
|
|
idsRet = IDS_FAXCONSOLE_ACCESSDENIED;
|
|
break;
|
|
|
|
case SE_ERR_DLLNOTFOUND: //The specified dynamic-link library was not found.
|
|
case SE_ERR_SHARE: //A sharing violation occurred.
|
|
default:
|
|
idsRet = IDS_FAIL2LAUNCH_FAXCONSOLE_GEN;
|
|
break;
|
|
}
|
|
NodeMsgBox(idsRet);
|
|
|
|
goto Exit;
|
|
}
|
|
|
|
ATLASSERT( ERROR_SUCCESS == dwRes);
|
|
|
|
Exit:
|
|
return HRESULT_FROM_WIN32( dwRes );
|
|
}
|
|
|
|
|
|
/*
|
|
- CFaxServerNode::InitDisplayName
|
|
-
|
|
* Purpose:
|
|
* To load the node's Displaed-Name string.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT CFaxServerNode::InitDisplayName()
|
|
{
|
|
DEBUG_FUNCTION_NAME(_T("CFaxServerNode::InitDisplayName"));
|
|
|
|
HRESULT hRc = S_OK;
|
|
|
|
if (!m_bstrDisplayName.LoadString(_Module.GetResourceInstance(),
|
|
IDS_DISPLAY_STR_FAXSERVERNODE))
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
goto Error;
|
|
}
|
|
|
|
ATLASSERT( S_OK == hRc);
|
|
goto Exit;
|
|
|
|
Error:
|
|
ATLASSERT( S_OK != hRc);
|
|
|
|
m_bstrDisplayName = L"";
|
|
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to Load server name string."));
|
|
NodeMsgBox(IDS_MEMORY);
|
|
|
|
Exit:
|
|
return hRc;
|
|
}
|
|
|
|
/*
|
|
- CFaxServerNode::SetServerNameOnSnapinAddition()
|
|
-
|
|
* Purpose:
|
|
* Set server name and init the related node's Displaed-Name string.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT CFaxServerNode::SetServerNameOnSnapinAddition(BSTR bstrServerName, BOOL fAllowOverrideServerName)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CFaxServerNode::SetServerNameOnSnapinAddition"));
|
|
HRESULT hRc = S_OK;
|
|
|
|
hRc = UpdateServerName(bstrServerName);
|
|
if (S_OK != hRc)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Failed to UpdateServerName - out of memory"));
|
|
|
|
goto Exit;
|
|
}
|
|
|
|
hRc = InitDetailedDisplayName();
|
|
if ( S_OK != hRc)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Failed to InitDetailedDisplayName. (hRc: %08X)"),
|
|
hRc);
|
|
|
|
goto Exit;
|
|
}
|
|
ATLASSERT (S_OK == hRc);
|
|
|
|
//
|
|
// Update override status
|
|
//
|
|
m_fAllowOverrideServerName = fAllowOverrideServerName;
|
|
|
|
Exit:
|
|
return hRc;
|
|
}
|
|
|
|
|
|
/*
|
|
- CFaxServerNode::ForceRedrawNode
|
|
-
|
|
* Purpose:
|
|
* To show the new node's Displaed-Name string.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT CFaxServerNode::ForceRedrawNode()
|
|
{
|
|
DEBUG_FUNCTION_NAME(_T("CFaxServerNode::ForceRedrawNode"));
|
|
|
|
|
|
HRESULT hRc = S_OK;
|
|
|
|
//
|
|
// Get IConsoleNameSpace
|
|
//
|
|
ATLASSERT( m_pComponentData != NULL );
|
|
ATLASSERT( m_pComponentData->m_spConsole != NULL );
|
|
|
|
CComPtr<IConsole> spConsole;
|
|
spConsole = m_pComponentData->m_spConsole;
|
|
CComQIPtr<IConsoleNameSpace,&IID_IConsoleNameSpace> spNamespace( spConsole );
|
|
|
|
//
|
|
// Get the updated SCOPEDATAITEM
|
|
//
|
|
SCOPEDATAITEM* pScopeData;
|
|
|
|
hRc = GetScopeData( &pScopeData );
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to get pScopeData. (hRc: %08X)"),
|
|
hRc);
|
|
goto Error;
|
|
}
|
|
|
|
//
|
|
// Update (*pScopeData).displayname
|
|
//
|
|
(*pScopeData).displayname = m_bstrDisplayName;
|
|
|
|
//
|
|
// Force MMC to redraw the scope node
|
|
//
|
|
hRc = spNamespace->SetItem( pScopeData );
|
|
if (FAILED(hRc))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to set Item pScopeData. (hRc: %08X)"),
|
|
hRc);
|
|
goto Error;
|
|
}
|
|
|
|
ATLASSERT(S_OK == hRc);
|
|
goto Exit;
|
|
|
|
|
|
Error:
|
|
|
|
NodeMsgBox(IDS_FAIL2RENAME_NODE);
|
|
|
|
Exit:
|
|
return hRc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
- CFaxServerNode::UpdateServerName
|
|
-
|
|
* Purpose:
|
|
* Update the server name for fax Server node and CFaxServer.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT CFaxServerNode::UpdateServerName(BSTR bstrServerName)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CFaxServerNode::UpdateServerName"));
|
|
HRESULT hRc = S_OK;
|
|
|
|
ATLASSERT(GetFaxServer());
|
|
hRc = GetFaxServer()->SetServerName(bstrServerName);
|
|
if ( S_OK != hRc)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Failed Update FaxServer with the server name. (hRc: %08X)"),
|
|
hRc);
|
|
|
|
NodeMsgBox(IDS_MEMORY);
|
|
|
|
}
|
|
|
|
return hRc;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
- CFaxServerNode::InitDetailedDisplayName()
|
|
-
|
|
* Purpose:
|
|
* Load the node's Displaed-Name string with the server name.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT CFaxServerNode::InitDetailedDisplayName()
|
|
{
|
|
DEBUG_FUNCTION_NAME(_T("CFaxServerNode::InitDetailedDisplayName"));
|
|
|
|
HRESULT hRc = S_OK;
|
|
|
|
CComBSTR bstrServerName;
|
|
CComBSTR bstrLeftBracket;
|
|
CComBSTR bstrRightBracket;
|
|
CComBSTR bstrLocal;
|
|
|
|
|
|
if (!m_bstrDisplayName.LoadString(_Module.GetResourceInstance(),
|
|
IDS_DISPLAY_STR_FAXSERVERNODE))
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
goto Error;
|
|
}
|
|
|
|
//
|
|
// Retreive the server name
|
|
//
|
|
bstrServerName = GetServerName();
|
|
if (!bstrServerName)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Fail to get the server name."));
|
|
|
|
NodeMsgBox(IDS_MEMORY);
|
|
|
|
bstrServerName = L"";
|
|
|
|
hRc = E_OUTOFMEMORY;
|
|
goto Error;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Appends the sever name
|
|
//
|
|
|
|
if (!bstrLeftBracket.LoadString(_Module.GetResourceInstance(),
|
|
IDS_LEFTBRACKET_PLUSSPACE))
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
goto Error;
|
|
}
|
|
|
|
if (!bstrRightBracket.LoadString(_Module.GetResourceInstance(),
|
|
IDS_RIGHTBRACKET))
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
goto Error;
|
|
}
|
|
|
|
if (!bstrLocal.LoadString(_Module.GetResourceInstance(),
|
|
IDS_LOCAL_PLUSBRACKET_PLUSSPACE))
|
|
{
|
|
hRc = E_OUTOFMEMORY;
|
|
goto Error;
|
|
}
|
|
|
|
|
|
|
|
if ( 0 == bstrServerName.Length() ) //if equals L""
|
|
{
|
|
m_bstrDisplayName += bstrLocal;
|
|
}
|
|
else
|
|
{
|
|
m_bstrDisplayName += bstrLeftBracket;
|
|
m_bstrDisplayName += bstrServerName;
|
|
m_bstrDisplayName += bstrRightBracket;
|
|
}
|
|
|
|
ATLASSERT( S_OK == hRc);
|
|
|
|
//
|
|
// Setting this flag to allow pre connection check
|
|
// during first FaxServerNode expand.
|
|
//
|
|
m_IsPrimaryModeSnapin = TRUE;
|
|
|
|
|
|
goto Exit;
|
|
|
|
Error:
|
|
ATLASSERT( S_OK != hRc);
|
|
|
|
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Fail to Load server name string."));
|
|
NodeMsgBox(IDS_MEMORY);
|
|
|
|
Exit:
|
|
return hRc;
|
|
}
|
|
|
|
const CComBSTR& CFaxServerNode::GetServerName()
|
|
{
|
|
DEBUG_FUNCTION_NAME(_T("CFaxServerNode::GetServerName"));
|
|
|
|
ATLASSERT(GetFaxServer());
|
|
return GetFaxServer()->GetServerName();
|
|
}
|
|
|
|
|
|
/*
|
|
+
|
|
+ CFaxServerNode::OnShowContextHelp
|
|
*
|
|
* Purpose:
|
|
* Overrides CSnapinNode::OnShowContextHelp.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
- OLE error code
|
|
-
|
|
*/
|
|
HRESULT CFaxServerNode::OnShowContextHelp(
|
|
IDisplayHelp* pDisplayHelp, LPOLESTR helpFile)
|
|
{
|
|
return DisplayContextHelp(pDisplayHelp, helpFile, HLP_INTRO);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|