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.
1747 lines
51 KiB
1747 lines
51 KiB
/********************************************************************
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
incident.cpp
|
|
|
|
Abstract:
|
|
Incident object
|
|
|
|
Revision History:
|
|
DerekM created 07/21/99
|
|
|
|
Kalyani Narlanka (KalyaniN) 03/15/01
|
|
Moved Incident Object from HelpService to HelpCtr to improve Perf.
|
|
Impersonation code removed while loading an incident XML file as this no longer
|
|
lives in a service.
|
|
|
|
********************************************************************/
|
|
|
|
#include "stdafx.h"
|
|
#include "msxml.h"
|
|
|
|
#include <HCP_trace.h>
|
|
|
|
|
|
const DWORD c_dwidDone = 0;
|
|
const DWORD c_dwidMisc = 1;
|
|
const DWORD c_dwidSnap = 2;
|
|
const DWORD c_dwidHist = 3;
|
|
const DWORD c_dwidTrace = 4;
|
|
const DWORD c_dwidType = 5;
|
|
const DWORD c_dwidUser = 6;
|
|
const DWORD c_dwidProb = 7;
|
|
const DWORD c_dwidID = 8;
|
|
const DWORD c_dwidName = 9;
|
|
const DWORD c_dwidXSL = 10;
|
|
const DWORD c_dwidRCReq = 11;
|
|
const DWORD c_dwidRCEnc = 12;
|
|
const DWORD c_dwidRCTkt = 13;
|
|
const DWORD c_dwidStartPg = 14;
|
|
|
|
#define TEXT_TAG_UPLOADINFO L"UPLOADINFO"
|
|
#define TEXT_TAG_UPLOADDATA L"UPLOADDATA"
|
|
#define TEXT_TAG_SNAPSHOT L"//SNAPSHOT"
|
|
#define TEXT_TAG_HISTORY L"//HISTORY"
|
|
#define TEXT_TAG_HELPSESSION L"//HELPSESSIONCOLLECTION"
|
|
#define TEXT_ATTR_INC_TYPE L"TYPE"
|
|
#define TEXT_UT_BUG L"Bug"
|
|
#define TEXT_TRUE L"1"
|
|
#define TEXT_FALSE L"0"
|
|
|
|
static CComBSTR l_bstrXmlSkeleton( L"<?xml version=\"1.0\" encoding=\"Unicode\" ?><ROOTNODE ATTRIB=\"VALUE\"><CHILDNODE/></ROOTNODE>" );
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// utility functions
|
|
|
|
static HRESULT WriteData( IStream* pstmDest, DWORD dw )
|
|
{
|
|
__HCP_FUNC_ENTRY( "WriteData(DWORD)" );
|
|
|
|
HRESULT hr;
|
|
DWORD cbWritten;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(pstmDest);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pstmDest->Write( &dw, sizeof(dw), &cbWritten ));
|
|
_ASSERT(cbWritten == sizeof(dw));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
static HRESULT WriteData( IStream* pstmDest, LPCWSTR wszSrc, BOOL fWriteSize = FALSE )
|
|
{
|
|
__HCP_FUNC_ENTRY( "WriteData(WCHAR)" );
|
|
|
|
HRESULT hr;
|
|
DWORD cbWritten;
|
|
DWORD cbToWrite;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(pstmDest);
|
|
// __MPC_PARAMCHECK_NOTNULL(wszSrc);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
SANITIZEWSTR(wszSrc);
|
|
cbToWrite = wcslen(wszSrc) * sizeof(WCHAR);
|
|
|
|
if(fWriteSize)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pstmDest, cbToWrite ));
|
|
}
|
|
|
|
if(cbToWrite)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pstmDest->Write( wszSrc, cbToWrite, &cbWritten ));
|
|
|
|
_ASSERT(cbWritten == cbToWrite);
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
static HRESULT WriteXMLAttribute( IStream* pStm, LPCWSTR wszName, LPCWSTR wszValue, IXMLDOMDocument* pDoc )
|
|
{
|
|
__HCP_FUNC_ENTRY( "WriteXMLAttribute" );
|
|
|
|
HRESULT hr;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(pStm);
|
|
__MPC_PARAMCHECK_NOTNULL(wszName);
|
|
__MPC_PARAMCHECK_NOTNULL(pDoc);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
if(wszValue)
|
|
{
|
|
CComPtr<IXMLDOMAttribute> pAttrib;
|
|
CComBSTR bstrXML;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pDoc->createAttribute ( CComBSTR ( wszName ), &pAttrib ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pAttrib->put_nodeValue( CComVariant( wszValue ) ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pAttrib->get_xml( &bstrXML ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, bstrXML ));
|
|
}
|
|
else
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, wszName ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, L"=\"\"" ));
|
|
}
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, L" " ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
static HRESULT WriteData( IStream* pstmDest, SHelpSessionItem &hsi, IXMLDOMDocument* pDoc = NULL )
|
|
{
|
|
__HCP_FUNC_ENTRY( "WriteData(SHelpSessionItem)" );
|
|
|
|
HRESULT hr;
|
|
DWORD cbWritten;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(pstmDest);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
// write out the URL
|
|
if(pDoc)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData ( pstmDest, L"<HELPSESSIONITEM " ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pstmDest, L"URL", hsi.bstrURL, pDoc ));
|
|
}
|
|
else
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pstmDest, hsi.bstrURL, TRUE ));
|
|
}
|
|
|
|
// write out the title
|
|
if(pDoc)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pstmDest, L"TITLE", hsi.bstrTitle, pDoc ));
|
|
}
|
|
else
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pstmDest, hsi.bstrTitle, TRUE ));
|
|
}
|
|
|
|
// write out the last visited date
|
|
if(pDoc)
|
|
{
|
|
MPC::wstring strDate;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::ConvertDateToString( hsi.dtLastVisited, strDate, /*fGMT*/false, /*fCIM*/false, -1 )); // Always use US locale.
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pstmDest, L"LASTVISITED", strDate.c_str(), pDoc ));
|
|
}
|
|
else
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pstmDest->Write( &(hsi.dtLastVisited), sizeof(hsi.dtLastVisited), &cbWritten ));
|
|
|
|
_ASSERT(cbWritten == sizeof(hsi.dtLastVisited));
|
|
}
|
|
|
|
// write out the last visited date
|
|
if(pDoc)
|
|
{
|
|
MPC::wstring strDate;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::ConvertDateToString( hsi.dtDuration, strDate, /*fGMT*/false, /*fCIM*/false, -1 )); // Always use US locale.
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pstmDest, L"DURATION", strDate.c_str(), pDoc ));
|
|
}
|
|
else
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pstmDest->Write( &(hsi.dtDuration), sizeof(hsi.dtDuration), &cbWritten ));
|
|
|
|
_ASSERT(cbWritten == sizeof(hsi.dtDuration));
|
|
}
|
|
|
|
// write out the # of hits
|
|
if(pDoc)
|
|
{
|
|
CComVariant var;
|
|
|
|
var = hsi.cHits;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, var.ChangeType( VT_BSTR ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pstmDest, L"HITS", V_BSTR(&var), pDoc ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pstmDest, L"/>" ));
|
|
}
|
|
else
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pstmDest->Write( &(hsi.cHits), sizeof(hsi.cHits), &cbWritten ));
|
|
|
|
_ASSERT(cbWritten == sizeof(hsi.cHits));
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
// **************************************************************************
|
|
// **************************************************************************
|
|
// **************************************************************************
|
|
|
|
static HRESULT ReadData( IStream* pstmSrc, DWORD *pdw )
|
|
{
|
|
__HCP_FUNC_ENTRY( "ReadData(DWORD)" );
|
|
|
|
HRESULT hr;
|
|
DWORD cbRead;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(pstmSrc);
|
|
__MPC_PARAMCHECK_NOTNULL(pdw);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pstmSrc->Read( pdw, sizeof(DWORD), &cbRead ));
|
|
_ASSERT(cbRead == sizeof(DWORD));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
static HRESULT ReadData( IStream* pstmSrc, BSTR *pbstr )
|
|
{
|
|
__HCP_FUNC_ENTRY( "ReadData(BSTR)" );
|
|
|
|
HRESULT hr;
|
|
DWORD cbRead;
|
|
DWORD cbToRead;
|
|
CComBSTR bstr;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(pstmSrc);
|
|
__MPC_PARAMCHECK_POINTER_AND_SET(pbstr,NULL);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pstmSrc, &cbToRead ));
|
|
|
|
// return S_FALSE to indicate we didn't successfully didn't read anything
|
|
if(cbToRead == 0)
|
|
{
|
|
__MPC_SET_ERROR_AND_EXIT(hr, S_FALSE);
|
|
}
|
|
|
|
bstr.Attach( ::SysAllocStringByteLen(NULL, cbToRead) );
|
|
if(bstr.m_str == NULL)
|
|
{
|
|
__MPC_SET_ERROR_AND_EXIT(hr, E_OUTOFMEMORY);
|
|
}
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pstmSrc->Read( bstr, cbToRead, &cbRead ));
|
|
|
|
*pbstr = bstr.Detach();
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
static HRESULT ReadData( IStream* pstmSrc, LPVOID *ppv, DWORD *pcb)
|
|
{
|
|
__HCP_FUNC_ENTRY( "ReadData(LPVOID)" );
|
|
|
|
HRESULT hr;
|
|
BYTE* pv = NULL;
|
|
DWORD cb;
|
|
DWORD cbRead;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(pstmSrc);
|
|
__MPC_PARAMCHECK_POINTER_AND_SET(ppv,NULL);
|
|
__MPC_PARAMCHECK_POINTER_AND_SET(pcb,0);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pstmSrc, &cb ));
|
|
|
|
*pcb = cb;
|
|
|
|
// return S_FALSE to indicate we didn't successfully didn't read anything
|
|
if(cb == 0)
|
|
{
|
|
__MPC_SET_ERROR_AND_EXIT(hr, S_FALSE);
|
|
}
|
|
|
|
__MPC_EXIT_IF_ALLOC_FAILS(hr, pv, new BYTE[ cb ]);
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pstmSrc->Read( pv, cb, &cbRead ));
|
|
|
|
_ASSERT(cb == cbRead);
|
|
|
|
*ppv = pv; pv = NULL;
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
if(pv) delete [] pv;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
static HRESULT ReadData( IStream* pstmSrc, SHelpSessionItem &hsi )
|
|
{
|
|
__HCP_FUNC_ENTRY( "ReadData(SHelpSessionItem)" );
|
|
|
|
HRESULT hr;
|
|
DWORD cbRead;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(pstmSrc);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
// read the URL
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ReadData(pstmSrc, &hsi.bstrURL ));
|
|
|
|
// read the Title
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ReadData(pstmSrc, &hsi.bstrTitle ));
|
|
|
|
// read the last visited date
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pstmSrc->Read( &(hsi.dtLastVisited), sizeof(hsi.dtLastVisited), &cbRead ));
|
|
_ASSERT(cbRead == sizeof(hsi.dtLastVisited));
|
|
|
|
// read the duration
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pstmSrc->Read( &(hsi.dtDuration), sizeof(hsi.dtDuration), &cbRead ));
|
|
_ASSERT(cbRead == sizeof(hsi.dtDuration));
|
|
|
|
// read the # of hits
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pstmSrc->Read( &(hsi.cHits), sizeof(hsi.cHits), &cbRead ));
|
|
_ASSERT(cbRead == sizeof(hsi.cHits));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
static HRESULT SetStream( /*[in/out]*/ CComBSTR& bstrXML, /*[in]*/ IUnknown *punkStm )
|
|
{
|
|
__HCP_FUNC_ENTRY( "SetStream" );
|
|
|
|
HRESULT hr;
|
|
CComPtr<IXMLDOMDocument> xddDoc;
|
|
CComPtr<IXMLDOMElement> xdeRoot;
|
|
CComVariant vStream = punkStm;
|
|
VARIANT_BOOL fSuccess;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ::CoCreateInstance( CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&xddDoc ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xddDoc->load( vStream, &fSuccess ));
|
|
if(fSuccess != VARIANT_TRUE)
|
|
{
|
|
__MPC_SET_ERROR_AND_EXIT(hr, E_INVALIDARG);
|
|
}
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xddDoc->get_documentElement( &xdeRoot ));
|
|
|
|
bstrXML.Empty(); __MPC_EXIT_IF_METHOD_FAILS(hr, xdeRoot->get_xml( &bstrXML ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// construction / destruction
|
|
|
|
// **************************************************************************
|
|
CSAFIncident::CSAFIncident()
|
|
{
|
|
m_rghsi = NULL;
|
|
m_chsi = 0;
|
|
m_eut = eutEscalated;
|
|
|
|
// By default RCRequested is False and RCTicketEncrypted is False.
|
|
m_fRCRequested = VARIANT_FALSE;
|
|
m_fRCTicketEncrypted = VARIANT_FALSE;
|
|
// MPC::Impersonation m_imp;
|
|
}
|
|
|
|
// **************************************************************************
|
|
CSAFIncident::~CSAFIncident()
|
|
{
|
|
Cleanup();
|
|
}
|
|
|
|
// **************************************************************************
|
|
void CSAFIncident::Cleanup()
|
|
{
|
|
m_pDict .Release();
|
|
m_bstrUser .Empty ();
|
|
m_bstrID .Empty ();
|
|
m_bstrName .Empty ();
|
|
m_bstrProb .Empty ();
|
|
m_bstrSnapshot.Empty ();
|
|
m_bstrHistory .Empty ();
|
|
m_bstrXSL .Empty ();
|
|
m_bstrRCTicket.Empty ();
|
|
m_bstrStartPg .Empty ();
|
|
|
|
delete [] m_rghsi; m_rghsi = NULL;
|
|
|
|
m_chsi = 0;
|
|
m_eut = eutEscalated;
|
|
}
|
|
|
|
////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSAFIncident properties
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::get_IncidentXSL(BSTR *pbstrUser)
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::GetBSTR( m_bstrXSL, pbstrUser );
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::put_IncidentXSL(BSTR bstrUser)
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::PutBSTR( m_bstrXSL, bstrUser );
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::get_UserName(BSTR *pbstrUser)
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::GetBSTR( m_bstrUser, pbstrUser );
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::put_UserName(BSTR bstrUser)
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::PutBSTR( m_bstrUser, bstrUser );
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::get_ProductID(BSTR *pbstrID)
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::GetBSTR( m_bstrID, pbstrID );
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::put_ProductID(BSTR bstrID)
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::PutBSTR( m_bstrID, bstrID );
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::get_ProductName(BSTR *pbstrName)
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::GetBSTR( m_bstrName, pbstrName );
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::put_ProductName(BSTR bstrName)
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::PutBSTR( m_bstrName, bstrName );
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::get_ProblemDescription(BSTR *pbstrProb)
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::GetBSTR( m_bstrProb, pbstrProb );
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::put_ProblemDescription(BSTR bstrProb)
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::PutBSTR( m_bstrProb, bstrProb );
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::put_MachineSnapshot(IUnknown *punkStm)
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return SetStream( m_bstrSnapshot, punkStm );
|
|
}
|
|
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::put_MachineHistory(IUnknown *punkStm)
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return SetStream( m_bstrHistory, punkStm );
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::put_SelfHelpTrace( IUnknown* punkStm )
|
|
{
|
|
__HCP_FUNC_ENTRY("CSAFIncident::put_SelfHelpTrace");
|
|
|
|
HRESULT hr;
|
|
CComPtr<IPCHCollection> pClct;
|
|
int i;
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(punkStm);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, punkStm->QueryInterface( IID_IPCHCollection, (LPVOID *)&pClct ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pClct->get_Count( &m_chsi ));
|
|
|
|
delete [] m_rghsi; __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rghsi, new SHelpSessionItem[m_chsi]);
|
|
|
|
for(i = 0; i < m_chsi; i++)
|
|
{
|
|
SHelpSessionItem& rghsi = m_rghsi[i];
|
|
CComPtr<IPCHHelpSessionItem> pItem;
|
|
CComVariant var;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pClct->get_Item( i+1, &var ));
|
|
_ASSERT(V_VT(&var) == VT_DISPATCH || V_VT(&var) == VT_UNKNOWN);
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, V_UNKNOWN(&var)->QueryInterface( IID_IPCHHelpSessionItem, (LPVOID *)&pItem ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pItem->get_URL ( &rghsi.bstrURL ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pItem->get_Title ( &rghsi.bstrTitle ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pItem->get_LastVisited( &rghsi.dtLastVisited ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pItem->get_Duration ( &rghsi.dtDuration ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pItem->get_NumOfHits ( &rghsi.cHits ));
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
HRESULT CSAFIncident::InitDictionary()
|
|
{
|
|
if(m_pDict) return S_OK;
|
|
|
|
return ::CoCreateInstance( CLSID_Dictionary, NULL, CLSCTX_INPROC_SERVER, IID_IDictionary, (LPVOID *)&m_pDict );
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncident::get_Misc( IDispatch* *ppdispDict )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET("SAFIncident::get_Misc",hr,ppdispDict);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, InitDictionary());
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, m_pDict.QueryInterface( ppdispDict ));
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::put_UploadType( EUploadType eut )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_PUT("SAFIncident::put_UploadType",hr);
|
|
|
|
|
|
// As the valid upload types are 0,1,2 if the value of UploadType is
|
|
// outside this range we should not set it and also flag an error.
|
|
switch(eut)
|
|
{
|
|
case eutBug:
|
|
case eutEscalated:
|
|
case eutNonEscalated:
|
|
m_eut = eut;
|
|
break;
|
|
|
|
default:
|
|
__MPC_SET_ERROR_AND_EXIT(hr, E_INVALIDARG);
|
|
}
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::get_UploadType( EUploadType *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET2("CSAFIncident::get_UploadType",hr,pVal,m_eut);
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
|
|
// RC Additions
|
|
// **************************************************************************
|
|
|
|
STDMETHODIMP CSAFIncident::get_RCRequested(VARIANT_BOOL *pVal)
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET2("CSAFIncident::get_RCRequested",hr,pVal,m_fRCRequested);
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
STDMETHODIMP CSAFIncident::put_RCRequested(VARIANT_BOOL Val)
|
|
{
|
|
|
|
__HCP_BEGIN_PROPERTY_PUT("CSAFIncident::put_RCRequested",hr);
|
|
|
|
m_fRCRequested = Val;
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
STDMETHODIMP CSAFIncident::get_RCTicketEncrypted( VARIANT_BOOL *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET2("CSAFIncident::get_RCTicketEncrypted",hr,pVal,m_fRCTicketEncrypted);
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
STDMETHODIMP CSAFIncident::put_RCTicketEncrypted( VARIANT_BOOL newVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_PUT("CSAFIncident::put_RCTicketEncrypted",hr);
|
|
|
|
m_fRCTicketEncrypted = newVal;
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
STDMETHODIMP CSAFIncident::get_RCTicket( BSTR *pVal )
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::GetBSTR( m_bstrRCTicket, pVal, true );
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
STDMETHODIMP CSAFIncident::put_RCTicket( BSTR bstrVal )
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::PutBSTR( m_bstrRCTicket, bstrVal, true );
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
STDMETHODIMP CSAFIncident::get_StartPage( BSTR *pVal )
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::GetBSTR( m_bstrStartPg, pVal );
|
|
}
|
|
|
|
// **************************************************************************
|
|
STDMETHODIMP CSAFIncident::put_StartPage( BSTR newVal)
|
|
{
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
return MPC::PutBSTR( m_bstrStartPg, newVal );
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSAFIncident methods
|
|
|
|
STDMETHODIMP CSAFIncident::GetXML( BSTR bstrFileName )
|
|
{
|
|
__HCP_FUNC_ENTRY("CSAFIncident::GetXML");
|
|
|
|
HRESULT hr;
|
|
CComPtr<MPC::FileStream> pfs;
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrFileName);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pfs ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pfs->InitForWrite( bstrFileName ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, DoXML( pfs ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
STDMETHODIMP CSAFIncident::GetXMLAsStream( IUnknown* *ppunkStm )
|
|
{
|
|
__HCP_FUNC_ENTRY("CSAFIncident::GetXMLAsStream");
|
|
|
|
HRESULT hr;
|
|
CComPtr<MPC::FileStream> pfs;
|
|
MPC::wstring szTempFile;
|
|
LARGE_INTEGER liFilePos = { 0, 0 };
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_POINTER_AND_SET(ppunkStm,NULL);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pfs ));
|
|
|
|
//
|
|
// create a temporary file to hold the stream. We want to use a file cuz
|
|
// otherwise, we're going to be using boatloads of memory for all the CIM
|
|
// stuff...
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetTemporaryFileName( szTempFile ));
|
|
|
|
// Adding GENERIC_READ
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pfs->InitForReadWrite( szTempFile.c_str() ));
|
|
|
|
// Call release on delete similar to close on delete.
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pfs->DeleteOnRelease());
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, DoXML( pfs ));
|
|
|
|
// Rewind the stream pointer.
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pfs->Seek( liFilePos, STREAM_SEEK_SET, NULL ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pfs->QueryInterface( IID_IUnknown, (LPVOID *)ppunkStm ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
HRESULT CSAFIncident::DoXML( IStream* pStm )
|
|
{
|
|
__HCP_FUNC_ENTRY("CSAFIncident::DoXML");
|
|
|
|
HRESULT hr;
|
|
CComPtr<IXMLDOMDocument> pDoc;
|
|
ULARGE_INTEGER uli = { 0, 0 };
|
|
VARIANT_BOOL varf;
|
|
DWORD cbWritten;
|
|
WCHAR wch = 0xfeff;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(pStm);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ::CoCreateInstance( CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (LPVOID *)&pDoc ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pDoc->loadXML( l_bstrXmlSkeleton, &varf ));
|
|
|
|
if(FAILED(hr = pStm->SetSize( uli )) && hr != E_NOTIMPL)
|
|
{
|
|
__MPC_FUNC_LEAVE;
|
|
}
|
|
|
|
// need to write out the character that marks the file as unicode
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pStm->Write( &wch, sizeof(wch), &cbWritten ));
|
|
_ASSERT(cbWritten == sizeof(wch));
|
|
|
|
// write out the header crap
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, L"<?xml version=\"1.0\" encoding=\"Unicode\" ?>" ));
|
|
|
|
// write out the XSL node if we have any
|
|
if(m_bstrXSL.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_bstrXSL.m_str ));
|
|
}
|
|
|
|
// write out the root node
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, L"<UPLOADINFO" ));
|
|
|
|
switch(m_eut)
|
|
{
|
|
case eutBug : __MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, L" TYPE=\"Bug\">" )); break;
|
|
case eutEscalated : __MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, L" TYPE=\"Escalated\">" )); break;
|
|
case eutNonEscalated: __MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, L" TYPE=\"NonEscalated\">" )); break;
|
|
default : __MPC_SET_ERROR_AND_EXIT(hr, E_FAIL);
|
|
}
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, L"<UPLOADDATA " ));
|
|
|
|
if(m_bstrUser.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pStm, L"USERNAME", m_bstrUser.m_str, pDoc ));
|
|
}
|
|
|
|
if(m_bstrID.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pStm, L"PRODUCTID", m_bstrID.m_str, pDoc ));
|
|
}
|
|
|
|
if(m_bstrName.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pStm, L"PRODUCTNAME", m_bstrName.m_str, pDoc ));
|
|
}
|
|
|
|
if(m_bstrProb.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pStm, L"PROBLEMDESCRIPTION", m_bstrProb.m_str, pDoc ));
|
|
}
|
|
|
|
if(m_bstrRCTicket.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pStm, L"RCTICKET", m_bstrRCTicket.m_str, pDoc ));
|
|
}
|
|
|
|
#if 0 // This is no longer used.
|
|
if(m_fRCRequested == VARIANT_TRUE)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pStm, L"RCREQUESTED", TEXT_TRUE, pDoc ));
|
|
}
|
|
else
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pStm, L"RCREQUESTED", TEXT_FALSE, pDoc ));
|
|
}
|
|
#endif
|
|
|
|
if(m_fRCTicketEncrypted == VARIANT_TRUE)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pStm, L"RCTICKETENCRYPTED", TEXT_TRUE, pDoc ));
|
|
}
|
|
else
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pStm, L"RCTICKETENCRYPTED", TEXT_FALSE, pDoc ));
|
|
}
|
|
|
|
if(m_bstrStartPg.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pStm, L"STARTPAGE", m_bstrStartPg.m_str, pDoc ));
|
|
}
|
|
|
|
|
|
// write out the contents of the dictionary object here...
|
|
if(m_pDict)
|
|
{
|
|
CComPtr<IUnknown> punkEnum;
|
|
CComPtr<IEnumVARIANT> pEnum;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, m_pDict->_NewEnum( &punkEnum ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, punkEnum.QueryInterface( &pEnum ));
|
|
|
|
for(;;)
|
|
{
|
|
CComVariant varKey;
|
|
CComVariant varValue;
|
|
ULONG cFetched;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pEnum->Next( 1, &varKey, &cFetched ));
|
|
|
|
// we're done enuming
|
|
if(hr == S_FALSE || cFetched != 1) break;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, m_pDict->get_Item( &varKey, &varValue ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, varKey .ChangeType( VT_BSTR ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, varValue.ChangeType( VT_BSTR ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteXMLAttribute( pStm, V_BSTR(&varKey), V_BSTR(&varValue), pDoc ));
|
|
}
|
|
}
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, L"/>" ));
|
|
|
|
// write out the CIM data streams
|
|
if(m_bstrSnapshot.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_bstrSnapshot ));
|
|
}
|
|
|
|
// write out the CIM data streams
|
|
if(m_bstrHistory.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_bstrHistory ));
|
|
}
|
|
|
|
// write out the trace stuff
|
|
if(m_rghsi && m_chsi > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, L"<HELPSESSIONCOLLECTION>" ));
|
|
|
|
for(int i = 0; i < m_chsi; i++)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_rghsi[i], pDoc ));
|
|
}
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, L"</HELPSESSIONCOLLECTION>" ));
|
|
}
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, L"</UPLOADINFO>" ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
STDMETHODIMP CSAFIncident::Save( BSTR bstrFileName )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CSAFIncident::Save" );
|
|
|
|
HRESULT hr;
|
|
CComPtr<MPC::FileStream> pfs;
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrFileName);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pfs ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pfs->InitForWrite( bstrFileName ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, DoSave( pfs ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncident::SaveToStream( IUnknown* *ppunkStm )
|
|
{
|
|
__HCP_FUNC_ENTRY("CSAFIncident::SaveToStream");
|
|
|
|
HRESULT hr;
|
|
CComPtr<MPC::FileStream> pfs;
|
|
TCHAR szTempPath[MAX_PATH];
|
|
TCHAR szTempFile[MAX_PATH];
|
|
LARGE_INTEGER liFilePos = { 0, 0 };
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_POINTER_AND_SET(ppunkStm,NULL);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pfs ));
|
|
|
|
// create a temporary file to hold the stream. We want to use a file cuz
|
|
// otherwise, we're going to be using boatloads of memory for all the CIM
|
|
// stuff...
|
|
__MPC_EXIT_IF_CALL_RETURNS_ZERO(hr, ::GetTempPath ( MAX_PATH, szTempPath ));
|
|
__MPC_EXIT_IF_CALL_RETURNS_ZERO(hr, ::GetTempFileName( szTempPath, _T("PCH"), 0, szTempFile ));
|
|
|
|
// To fix Bug 115618 open the file with read and write attributes.
|
|
// hr = pfs->InitForReadWrite(bstrFileName, hFile);
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pfs->InitForReadWrite( CComBSTR( szTempFile ) ));
|
|
|
|
// Mark the file for deletion
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pfs->DeleteOnRelease());
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, DoSave( pfs ));
|
|
|
|
// Rewind the stream after writing to it.
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pfs->Seek( liFilePos, STREAM_SEEK_SET, NULL ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pfs->QueryInterface( IID_IUnknown, (LPVOID *)ppunkStm ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
HRESULT CSAFIncident::DoSave( IStream* pStm )
|
|
{
|
|
__HCP_FUNC_ENTRY("CSAFIncident::DoSave");
|
|
|
|
HRESULT hr;
|
|
ULARGE_INTEGER uli = { 0, 0 };
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(pStm);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
if(FAILED(hr = pStm->SetSize( uli )) && hr != E_NOTIMPL)
|
|
{
|
|
__MPC_FUNC_LEAVE;
|
|
}
|
|
|
|
// write out upload type
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidType ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, (DWORD)m_eut ));
|
|
|
|
|
|
// write out username
|
|
if(m_bstrUser.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidUser ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_bstrUser.m_str, TRUE ));
|
|
}
|
|
|
|
|
|
// write out product ID
|
|
if(m_bstrID.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidID ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_bstrID.m_str, TRUE ));
|
|
}
|
|
|
|
|
|
// write out product name
|
|
if(m_bstrName.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidName ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_bstrName.m_str, TRUE ));
|
|
}
|
|
|
|
|
|
// write out problem description
|
|
if(m_bstrProb.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidProb ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_bstrProb.m_str, TRUE ));
|
|
}
|
|
|
|
|
|
// write out XSL stream
|
|
if(m_bstrXSL.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidXSL ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_bstrXSL.m_str, TRUE ));
|
|
}
|
|
|
|
// write out RC Ticket
|
|
if(m_bstrRCTicket.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidRCTkt ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_bstrRCTicket.m_str, TRUE ));
|
|
}
|
|
|
|
// write out RCRequested Flag
|
|
if(m_fRCRequested == VARIANT_TRUE)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidRCReq ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, TEXT_TRUE, TRUE ));
|
|
}
|
|
else
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidRCReq ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, TEXT_FALSE, TRUE ));
|
|
}
|
|
|
|
// write out RCTicketEncrypted Flag
|
|
if(m_fRCTicketEncrypted == VARIANT_TRUE)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidRCEnc ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, TEXT_TRUE, TRUE ));
|
|
}
|
|
else
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidRCEnc ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, TEXT_FALSE, TRUE ));
|
|
}
|
|
|
|
// write out Start Page
|
|
if(m_bstrStartPg.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidStartPg ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_bstrStartPg.m_str, TRUE ));
|
|
}
|
|
|
|
// write out snapshot stream
|
|
if(m_bstrSnapshot.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidSnap ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_bstrSnapshot, TRUE ));
|
|
}
|
|
|
|
|
|
// write out history stream
|
|
if(m_bstrHistory.Length() > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidHist ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_bstrHistory, TRUE ));
|
|
}
|
|
|
|
// write out the trace list
|
|
if(m_rghsi && m_chsi > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidTrace ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_chsi ));
|
|
|
|
for(int i = 0; i < m_chsi; i++)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, m_rghsi[i] ));
|
|
}
|
|
}
|
|
|
|
// write out the property list
|
|
if(m_pDict)
|
|
{
|
|
CComPtr<IUnknown> punkEnum;
|
|
CComPtr<IEnumVARIANT> pEnum;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidMisc ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, m_pDict->_NewEnum( &punkEnum ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, punkEnum.QueryInterface( &pEnum ));
|
|
|
|
for(;;)
|
|
{
|
|
CComVariant varKey;
|
|
CComVariant varValue;
|
|
ULONG cFetched;
|
|
DWORD cb;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pEnum->Next( 1, &varKey, &cFetched ));
|
|
|
|
// we're done enuming
|
|
if(hr == S_FALSE || cFetched != 1) break;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, m_pDict->get_Item( &varKey, &varValue ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, varKey .ChangeType( VT_BSTR ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, varValue.ChangeType( VT_BSTR ));
|
|
|
|
if(::SysStringLen( V_BSTR(&varValue) ) > 0)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, V_BSTR(&varKey ), TRUE ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, V_BSTR(&varValue), TRUE ));
|
|
}
|
|
}
|
|
|
|
//
|
|
// Emit end of dictionary (DWORD == 0).
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, (DWORD)0 ));
|
|
}
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, WriteData( pStm, c_dwidDone ));
|
|
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
STDMETHODIMP CSAFIncident::Load( BSTR bstrFileName )
|
|
{
|
|
__HCP_FUNC_ENTRY("CSAFIncident::Load");
|
|
|
|
HRESULT hr;
|
|
CComPtr<MPC::FileStream> pfs;
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrFileName);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pfs ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pfs->InitForRead( bstrFileName ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, LoadFromStream( pfs ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncident::LoadFromStream( IUnknown* punkStm )
|
|
{
|
|
__HCP_FUNC_ENTRY("CSAFIncident::LoadFromStream");
|
|
|
|
HRESULT hr;
|
|
CComPtr<IStream> pStm;
|
|
DWORD i;
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_NOTNULL(punkStm);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
Cleanup();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, punkStm->QueryInterface( IID_IStream, (LPVOID *)&pStm ));
|
|
|
|
for(;;)
|
|
{
|
|
CComVariant varName;
|
|
CComVariant varVal;
|
|
DWORD dwid;
|
|
CComBSTR bstrRCReq;
|
|
CComBSTR bstrRCEnc;
|
|
|
|
// figure out which dwid we're processing
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &dwid ));
|
|
if(dwid == c_dwidDone) break;
|
|
|
|
switch(dwid)
|
|
{
|
|
case c_dwidUser: m_bstrUser .Empty(); __MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &m_bstrUser )); break;
|
|
case c_dwidProb: m_bstrProb .Empty(); __MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &m_bstrProb )); break;
|
|
case c_dwidID : m_bstrID .Empty(); __MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &m_bstrID )); break;
|
|
case c_dwidName: m_bstrName .Empty(); __MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &m_bstrName )); break;
|
|
case c_dwidXSL: m_bstrXSL .Empty(); __MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &m_bstrXSL )); break;
|
|
case c_dwidRCTkt: m_bstrRCTicket.Empty(); __MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &m_bstrRCTicket)); break;
|
|
case c_dwidStartPg:m_bstrStartPg .Empty(); __MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &m_bstrStartPg)); break;
|
|
|
|
case c_dwidRCReq:
|
|
m_fRCRequested=VARIANT_FALSE;
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &bstrRCReq ));
|
|
if(MPC::StrICmp( bstrRCReq, TEXT_TRUE ) == 0)
|
|
{
|
|
m_fRCRequested = VARIANT_TRUE;
|
|
}
|
|
break;
|
|
|
|
case c_dwidRCEnc:
|
|
m_fRCTicketEncrypted=VARIANT_FALSE;
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &bstrRCEnc ));
|
|
if(MPC::StrICmp( bstrRCEnc, TEXT_TRUE ) == 0)
|
|
{
|
|
m_fRCTicketEncrypted = VARIANT_TRUE;
|
|
}
|
|
break;
|
|
|
|
case c_dwidSnap: m_bstrSnapshot.Empty(); __MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &m_bstrSnapshot )); break;
|
|
case c_dwidHist: m_bstrHistory .Empty(); __MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &m_bstrHistory )); break;
|
|
|
|
|
|
case c_dwidType: __MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, (DWORD *)&m_eut )); break;
|
|
|
|
case c_dwidTrace:
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ReadData(pStm, (DWORD *)&m_chsi ));
|
|
|
|
delete [] m_rghsi; __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rghsi, new SHelpSessionItem[m_chsi]);
|
|
|
|
for(i = 0; i < m_chsi; i++)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, m_rghsi[i] ));
|
|
}
|
|
break;
|
|
|
|
case c_dwidMisc:
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, InitDictionary());
|
|
|
|
for(;;)
|
|
{
|
|
CComBSTR bstrVal;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &bstrVal ));
|
|
if(hr == S_FALSE) break;
|
|
|
|
varName = bstrVal; bstrVal.Empty();
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ReadData( pStm, &bstrVal ));
|
|
|
|
if(hr == S_FALSE) varVal = "";
|
|
else varVal = bstrVal;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, m_pDict->put_Item( &varName, &varVal ));
|
|
}
|
|
break;
|
|
|
|
default:
|
|
__MPC_SET_ERROR_AND_EXIT(hr, E_FAIL);
|
|
}
|
|
}
|
|
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
//
|
|
// Given a XML Stream, this method initializes the Incident Object with its contents.
|
|
//
|
|
HRESULT CSAFIncident::LoadFromXMLObject( /*[in]*/ MPC::XmlUtil& xmldocIncident )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CSAFIncident::LoadFromXMLObject" );
|
|
|
|
HRESULT hr;
|
|
|
|
|
|
Cleanup();
|
|
|
|
|
|
//
|
|
// Initialize the XSL value.
|
|
//
|
|
|
|
//
|
|
// Initialize the Upload Type. ------------------------------------------------------------------------------
|
|
//
|
|
{
|
|
CComBSTR bstrValue;
|
|
bool fFound;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xmldocIncident.GetAttribute( NULL, TEXT_ATTR_INC_TYPE, bstrValue, fFound, NULL ));
|
|
if(fFound == false)
|
|
{
|
|
__MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_BAD_FORMAT);
|
|
}
|
|
|
|
if(bstrValue == L"Bug")
|
|
{
|
|
m_eut = eutBug;
|
|
}
|
|
else if(bstrValue == L"Escalated")
|
|
{
|
|
m_eut = eutEscalated;
|
|
}
|
|
else if(bstrValue == L"NonEscalated")
|
|
{
|
|
m_eut = eutNonEscalated;
|
|
}
|
|
else
|
|
{
|
|
__MPC_SET_ERROR_AND_EXIT(hr, E_INVALIDARG);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Get the Upload Data Attributes--------------------------------------------------------------------------------
|
|
//
|
|
{
|
|
CComPtr<IXMLDOMNode> xdnNode;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xmldocIncident.GetNode( TEXT_TAG_UPLOADDATA, &xdnNode ));
|
|
if(xdnNode)
|
|
{
|
|
CComPtr<IXMLDOMNamedNodeMap> xdnnmAttributes;
|
|
long nAttribLen;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xdnNode ->get_attributes( &xdnnmAttributes ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xdnnmAttributes->get_length ( &nAttribLen ));
|
|
|
|
// Add the miscellaneous properties to the Dictionary object a property of the Incident object.
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, InitDictionary());
|
|
|
|
for(long i=0; i<nAttribLen; i++)
|
|
{
|
|
CComPtr<IXMLDOMNode> xdnAttribItem;
|
|
CComBSTR bstrAttribName;
|
|
CComVariant vAttribValue;
|
|
|
|
|
|
// Get the attribute Name and Value.
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xdnnmAttributes->get_item( i, &xdnAttribItem ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xdnAttribItem->get_nodeName ( &bstrAttribName ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xdnAttribItem->get_nodeValue( &vAttribValue ));
|
|
|
|
if(vAttribValue.vt == VT_BSTR)
|
|
{
|
|
// Initialize the well known attributes.
|
|
if(bstrAttribName == L"PRODUCTID")
|
|
{
|
|
// Initialize the Product ID varaible.
|
|
m_bstrID = vAttribValue.bstrVal;
|
|
continue;
|
|
}
|
|
|
|
if(bstrAttribName == L"PRODUCTNAME")
|
|
{
|
|
// Initialize the Product Name varaible.
|
|
m_bstrName = vAttribValue.bstrVal;
|
|
continue;
|
|
|
|
}
|
|
|
|
if(bstrAttribName == L"PROBLEMDESCRIPTION")
|
|
{
|
|
// Initialize the Problem Description varaible.
|
|
m_bstrProb = vAttribValue.bstrVal;
|
|
continue;
|
|
}
|
|
|
|
if(bstrAttribName == L"USERNAME")
|
|
{
|
|
// Initialize the UserName varaible.
|
|
m_bstrUser = vAttribValue.bstrVal;
|
|
continue;
|
|
}
|
|
|
|
if(bstrAttribName == L"RCTICKET")
|
|
{
|
|
// Initialize the RCTICKET varaible.
|
|
m_bstrRCTicket = vAttribValue.bstrVal;
|
|
continue;
|
|
}
|
|
|
|
if(bstrAttribName == L"RCREQUESTED")
|
|
{
|
|
// Initialize the RCREQUESTED varaible.
|
|
if(MPC::StrICmp( vAttribValue.bstrVal, TEXT_TRUE ) == 0)
|
|
{
|
|
m_fRCRequested = VARIANT_TRUE;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
if(bstrAttribName == L"RCTICKETENCRYPTED")
|
|
{
|
|
// Initialize the RCTICKETENCRYPTED varaible.
|
|
m_fRCTicketEncrypted = (MPC::StrICmp( vAttribValue.bstrVal, TEXT_TRUE ) == 0) ? VARIANT_TRUE : VARIANT_FALSE;
|
|
continue;
|
|
}
|
|
|
|
if(bstrAttribName == L"STARTPAGE")
|
|
{
|
|
// Initialize the Start Page varaible.
|
|
m_bstrStartPg = vAttribValue.bstrVal;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
// This is a miscellaneous property.
|
|
// Initialize the Dictionary Object Property varaible.
|
|
{
|
|
CComVariant v( bstrAttribName );
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, m_pDict->put_Item( &v, &vAttribValue ));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Get the SnapShot Data--------------------------------------------------------------------------------------------------
|
|
//
|
|
{
|
|
CComPtr<IXMLDOMNode> xdnNode;
|
|
|
|
if(SUCCEEDED(hr = xmldocIncident.GetNode( TEXT_TAG_SNAPSHOT, &xdnNode )) && xdnNode)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xdnNode->get_xml( &m_bstrSnapshot ));
|
|
}
|
|
}
|
|
|
|
//
|
|
// Get the History Data---------------------------------------------------------------------------------------------------
|
|
//
|
|
{
|
|
CComPtr<IXMLDOMNode> xdnNode;
|
|
|
|
if(SUCCEEDED(hr = xmldocIncident.GetNode( TEXT_TAG_HISTORY, &xdnNode )) && xdnNode)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xdnNode->get_xml( &m_bstrHistory ));
|
|
}
|
|
}
|
|
|
|
//
|
|
// Get the trace stuff HELPSESSIONCOLLECTION-------------------------------------------------------------------------------
|
|
//
|
|
{
|
|
CComPtr<IXMLDOMNode> xdnNode;
|
|
|
|
if(SUCCEEDED(hr = xmldocIncident.GetNode( TEXT_TAG_HELPSESSION, &xdnNode )) && xdnNode)
|
|
{
|
|
// __MPC_EXIT_IF_METHOD_FAILS(hr, xdnNodeHistory->get_xml(&m_bstrHistory));
|
|
}
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncident::LoadFromXMLStream( /*[in]*/ IUnknown* punkStm )
|
|
{
|
|
__HCP_FUNC_ENTRY("CSAFIncident::LoadFromXMLStream");
|
|
|
|
HRESULT hr;
|
|
MPC::XmlUtil xmldocIncident;
|
|
bool fLoaded;
|
|
bool fFound;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xmldocIncident.LoadAsStream( punkStm, TEXT_TAG_UPLOADINFO, fLoaded, &fFound ));
|
|
if(fLoaded == false ||
|
|
fFound == false )
|
|
{
|
|
__MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_OPEN_FAILED);
|
|
}
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, LoadFromXMLObject( xmldocIncident ));
|
|
|
|
|
|
hr = S_OK;
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
// Given a XML File this method initializes the Incident Object with its contents.
|
|
|
|
STDMETHODIMP CSAFIncident::LoadFromXMLFile( BSTR bstrFileName )
|
|
{
|
|
__HCP_FUNC_ENTRY("CSAFIncident::LoadFromXMLFile");
|
|
|
|
HRESULT hr;
|
|
MPC::XmlUtil xmldocIncident;
|
|
bool fLoaded;
|
|
bool fFound;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xmldocIncident.Load( bstrFileName, TEXT_TAG_UPLOADINFO, fLoaded, &fFound ));
|
|
|
|
if(fLoaded == false ||
|
|
fFound == false )
|
|
{
|
|
__MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_OPEN_FAILED);
|
|
}
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, LoadFromXMLObject( xmldocIncident ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// **************************************************************************
|
|
|
|
// Given a XML String this method initializes the Incident Object with its contents.
|
|
|
|
STDMETHODIMP CSAFIncident::LoadFromXMLString( BSTR bstrXMLBlob )
|
|
{
|
|
__HCP_FUNC_ENTRY("CSAFIncident::LoadFromXMLString");
|
|
|
|
HRESULT hr;
|
|
MPC::XmlUtil xmldocIncident;
|
|
bool fLoaded;
|
|
bool fFound;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, xmldocIncident.LoadAsString( bstrXMLBlob, TEXT_TAG_UPLOADINFO, fLoaded, &fFound ));
|
|
if(fLoaded == false ||
|
|
fFound == false )
|
|
{
|
|
__MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_OPEN_FAILED);
|
|
}
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, LoadFromXMLObject( xmldocIncident ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
// *************************************************************************
|
|
|
|
// If this object contains a valid SALEM session id, then we should close that session.
|
|
STDMETHODIMP CSAFIncident::CloseRemoteAssistanceIncident()
|
|
{
|
|
__HCP_FUNC_ENTRY("CSAFIncident::CloseRemoteAssistanceIncident");
|
|
|
|
HRESULT hr;
|
|
REMOTE_DESKTOP_SHARING_CLASS sharingClass = VIEWDESKTOP_PERMISSION_NOT_REQUIRE;
|
|
|
|
CComBSTR pRcTicket;
|
|
CComBSTR pNull;
|
|
CComPtr<ISAFRemoteDesktopSession> pSession;
|
|
CComPtr<IClassFactory> fact;
|
|
CComQIPtr<IPCHUtility> disp;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, get_RCTicket(&pRcTicket));
|
|
|
|
if (pRcTicket.Length() == 0)
|
|
{
|
|
__MPC_SET_ERROR_AND_EXIT(hr, E_INVALIDARG);
|
|
}
|
|
|
|
//
|
|
// This is handled in a special way.
|
|
//
|
|
// We QI the PCHSVC broker and then forward the call to it.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ::CoGetClassObject( CLSID_PCHService, CLSCTX_ALL, NULL, IID_IClassFactory, (void**)&fact ));
|
|
|
|
if((disp = fact))
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, disp->CreateObject_RemoteDesktopSession( sharingClass, 0, (BSTR)pRcTicket, (BSTR)pNull, &pSession));
|
|
}
|
|
else
|
|
{
|
|
__MPC_SET_ERROR_AND_EXIT(hr, E_NOINTERFACE);
|
|
}
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pSession->CloseRemoteDesktopSession());
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|