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.
402 lines
12 KiB
402 lines
12 KiB
/********************************************************************
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
IncidentStore.cpp
|
|
|
|
Abstract:
|
|
File for Implementation of CIncidentStore
|
|
|
|
Revision History:
|
|
Steve Shih created 07/19/99
|
|
|
|
Davide Massarenti rewrote 12/05/2000
|
|
|
|
********************************************************************/
|
|
#include "stdafx.h"
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT operator>>( /*[in]*/ MPC::Serializer& stream, /*[out]*/ IncidentStatusEnum& val ) { return stream.read ( &val, sizeof(val) ); }
|
|
HRESULT operator<<( /*[in]*/ MPC::Serializer& stream, /*[in] */ const IncidentStatusEnum& val ) { return stream.write( &val, sizeof(val) ); }
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
static const WCHAR c_szEventObject[] = L"PCH_INCIDENTSTORE";
|
|
static const WCHAR c_szStorePath [] = HC_HELPSVC_STORE_INCIDENTITEMS;
|
|
|
|
|
|
static const DWORD l_dwVersion = 0x0100AF05; // SAF 01
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
CSAFIncidentRecord::CSAFIncidentRecord()
|
|
{
|
|
m_dwRecIndex = -1; // DWORD m_dwRecIndex;
|
|
//
|
|
// CComBSTR m_bstrVendorID;
|
|
// CComBSTR m_bstrProductID;
|
|
// CComBSTR m_bstrDisplay;
|
|
// CComBSTR m_bstrURL;
|
|
// CComBSTR m_bstrProgress;
|
|
// CComBSTR m_bstrXMLDataFile;
|
|
// CComBSTR m_bstrXMLBlob;
|
|
m_dCreatedTime = 0; // DATE m_dCreatedTime;
|
|
m_dChangedTime = 0; // DATE m_dChangedTime;
|
|
m_dClosedTime = 0; // DATE m_dClosedTime;
|
|
m_iStatus = pchIncidentInvalid; // IncidentStatusEnum m_iStatus;
|
|
//
|
|
// CComBSTR m_bstrSecurity;
|
|
// CComBSTR m_bstrOwner;
|
|
}
|
|
|
|
HRESULT operator>>( /*[in]*/ MPC::Serializer& stream, /*[out]*/ CSAFIncidentRecord& increc )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CSAFIncidentRecord::operator>>" );
|
|
|
|
HRESULT hr;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_dwRecIndex );
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_bstrVendorID );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_bstrProductID );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_bstrDisplay );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_bstrURL );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_bstrProgress );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_bstrXMLDataFile);
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_bstrXMLBlob );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_dCreatedTime );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_dChangedTime );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_dClosedTime );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_iStatus );
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_bstrSecurity );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream >> increc.m_bstrOwner );
|
|
|
|
hr = S_OK;
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
HRESULT operator<<( /*[in]*/ MPC::Serializer& stream, /*[in] */ const CSAFIncidentRecord& increc )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CSAFIncidentRecord::operator<<" );
|
|
|
|
HRESULT hr;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_dwRecIndex );
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_bstrVendorID );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_bstrProductID );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_bstrDisplay );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_bstrURL );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_bstrProgress );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_bstrXMLDataFile);
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_bstrXMLBlob );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_dCreatedTime );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_dChangedTime );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_dClosedTime );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_iStatus );
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_bstrSecurity );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << increc.m_bstrOwner );
|
|
|
|
hr = S_OK;
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
CIncidentStore::CIncidentStore() : MPC::NamedMutex( c_szEventObject )
|
|
{
|
|
m_fLoaded = false; // bool m_fLoaded;
|
|
m_fDirty = false; // bool m_fDirty;
|
|
m_dwNextIndex = 0; // DWORD m_dwNextIndex;
|
|
// List m_lstIncidents;
|
|
m_strNotificationGuid = ""; // String m_strNotificationGuid;
|
|
}
|
|
|
|
|
|
CIncidentStore::~CIncidentStore()
|
|
{
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT CIncidentStore::Load()
|
|
{
|
|
__HCP_FUNC_ENTRY( "CIncidentStore::Load" );
|
|
|
|
HRESULT hr;
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
|
|
|
|
if(m_fLoaded == false)
|
|
{
|
|
MPC::wstring szFile = c_szStorePath; MPC::SubstituteEnvVariables( szFile );
|
|
|
|
|
|
m_dwNextIndex = 0;
|
|
|
|
|
|
//
|
|
// Get the named mutex, so that only one instance at a time can access the store.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, Acquire());
|
|
|
|
//
|
|
// Open the store.
|
|
//
|
|
hFile = ::CreateFileW( szFile.c_str() ,
|
|
GENERIC_READ ,
|
|
0 ,
|
|
NULL ,
|
|
OPEN_EXISTING ,
|
|
FILE_ATTRIBUTE_NORMAL ,
|
|
NULL );
|
|
if(hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
DWORD dwRes = ::GetLastError();
|
|
|
|
if(dwRes != ERROR_FILE_NOT_FOUND)
|
|
{
|
|
__MPC_SET_WIN32_ERROR_AND_EXIT(hr, dwRes);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MPC::Serializer& stream = MPC::Serializer_File( hFile );
|
|
DWORD dwVer;
|
|
|
|
|
|
if(SUCCEEDED(stream >> dwVer) && dwVer == l_dwVersion)
|
|
{
|
|
if(SUCCEEDED(stream >> m_dwNextIndex))
|
|
{
|
|
//if (SUCCEEDED( stream >> m_strNotificationGuid))
|
|
//{
|
|
while(1)
|
|
{
|
|
Iter it = m_lstIncidents.insert( m_lstIncidents.end() );
|
|
|
|
if(FAILED(stream >> *it))
|
|
{
|
|
m_lstIncidents.erase( it );
|
|
break;
|
|
}
|
|
}
|
|
//}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
m_fLoaded = true;
|
|
m_fDirty = false;
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
if(hFile != INVALID_HANDLE_VALUE) ::CloseHandle( hFile );
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
HRESULT CIncidentStore::Save()
|
|
{
|
|
__HCP_FUNC_ENTRY( "CIncidentStore::Save" );
|
|
|
|
HRESULT hr;
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
|
|
|
|
if(m_fLoaded && m_fDirty)
|
|
{
|
|
MPC::wstring szFile = c_szStorePath; MPC::SubstituteEnvVariables( szFile );
|
|
|
|
|
|
//
|
|
// Open the store.
|
|
//
|
|
__MPC_EXIT_IF_INVALID_HANDLE(hr, hFile, ::CreateFileW( szFile.c_str() ,
|
|
GENERIC_WRITE ,
|
|
0 ,
|
|
NULL ,
|
|
CREATE_ALWAYS ,
|
|
FILE_ATTRIBUTE_NORMAL ,
|
|
NULL ));
|
|
|
|
{
|
|
MPC::Serializer& stream = MPC::Serializer_File( hFile );
|
|
Iter it;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << l_dwVersion );
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << m_dwNextIndex);
|
|
|
|
// Persist the string version of the notification GUID
|
|
//__MPC_EXIT_IF_METHOD_FAILS(hr, stream << m_strNotificationGuid);
|
|
|
|
|
|
for(it = m_lstIncidents.begin(); it != m_lstIncidents.end(); it++)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, stream << *it);
|
|
}
|
|
}
|
|
|
|
m_fDirty = false;
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
if(hFile != INVALID_HANDLE_VALUE) ::CloseHandle( hFile );
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT CIncidentStore::OpenChannel( CSAFChannel* pChan )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CIncidentStore::OpenChannel" );
|
|
|
|
HRESULT hr;
|
|
LPCWSTR szVendorID = pChan->GetVendorID ();
|
|
LPCWSTR szProductID = pChan->GetProductID();
|
|
IterConst it;
|
|
|
|
SANITIZEWSTR( szVendorID );
|
|
SANITIZEWSTR( szProductID );
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, Load());
|
|
|
|
|
|
for(it = m_lstIncidents.begin(); it != m_lstIncidents.end(); it++)
|
|
{
|
|
if(MPC::StrICmp( it->m_bstrVendorID , szVendorID ) == 0 &&
|
|
MPC::StrICmp( it->m_bstrProductID, szProductID ) == 0 )
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pChan->Import( *it, NULL ));
|
|
}
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
HRESULT CIncidentStore::AddRec( CSAFChannel* pChan ,
|
|
BSTR bstrOwner ,
|
|
BSTR bstrDesc ,
|
|
BSTR bstrURL ,
|
|
BSTR bstrProgress ,
|
|
BSTR bstrXMLDataFile,
|
|
BSTR bstrXMLBlob,
|
|
CSAFIncidentItem* *ppItem )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CIncidentStore::Init" );
|
|
|
|
HRESULT hr;
|
|
Iter it;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, Load());
|
|
|
|
it = m_lstIncidents.insert( m_lstIncidents.end() );
|
|
it->m_dwRecIndex = m_dwNextIndex++;
|
|
|
|
it->m_bstrVendorID = pChan->GetVendorID ();
|
|
it->m_bstrProductID = pChan->GetProductID();
|
|
it->m_bstrDisplay = bstrDesc;
|
|
it->m_bstrURL = bstrURL;
|
|
it->m_bstrProgress = bstrProgress;
|
|
it->m_bstrXMLDataFile = bstrXMLDataFile;
|
|
it->m_bstrXMLBlob = bstrXMLBlob;
|
|
it->m_dCreatedTime = MPC::GetLocalTime();
|
|
it->m_dChangedTime = it->m_dCreatedTime;
|
|
it->m_dClosedTime = 0;
|
|
it->m_iStatus = pchIncidentOpen;
|
|
it->m_bstrOwner = bstrOwner;
|
|
m_fDirty = true;
|
|
|
|
//
|
|
// Create the IncidentItem.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pChan->Import( *it, ppItem ));
|
|
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
HRESULT CIncidentStore::DeleteRec( CSAFIncidentItem* pItem )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CIncidentStore::DeleteRec" );
|
|
|
|
HRESULT hr;
|
|
DWORD dwIndex = pItem->GetRecIndex();
|
|
Iter it;
|
|
|
|
|
|
for(it = m_lstIncidents.begin(); it != m_lstIncidents.end(); it++)
|
|
{
|
|
if(it->m_dwRecIndex == dwIndex)
|
|
{
|
|
m_lstIncidents.erase( it );
|
|
|
|
m_fDirty = true; break;
|
|
}
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
HRESULT CIncidentStore::UpdateRec( CSAFIncidentItem* pItem )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CIncidentStore::UpdateRec" );
|
|
|
|
HRESULT hr;
|
|
DWORD dwIndex = pItem->GetRecIndex();
|
|
Iter it;
|
|
|
|
|
|
for(it = m_lstIncidents.begin(); it != m_lstIncidents.end(); it++)
|
|
{
|
|
if(it->m_dwRecIndex == dwIndex)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pItem->Export( *it ));
|
|
|
|
m_fDirty = true; break;
|
|
}
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|