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.
535 lines
12 KiB
535 lines
12 KiB
/********************************************************************
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
IncidentItem.cpp
|
|
|
|
Abstract:
|
|
File for Implementation of CSAFIncidentItem
|
|
|
|
Revision History:
|
|
Steve Shih created 07/15/99
|
|
|
|
Davide Massarenti rewrote 12/05/2000
|
|
|
|
********************************************************************/
|
|
|
|
#include "stdafx.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSAFIncidentItem
|
|
|
|
CSAFIncidentItem::CSAFIncidentItem()
|
|
{
|
|
__HCP_FUNC_ENTRY( "CSAFIncidentItem::CSAFIncidentItem" );
|
|
|
|
// CSAFIncidentRecord m_increc;
|
|
m_fDirty = false; // bool m_fDirty;
|
|
}
|
|
|
|
HRESULT CSAFIncidentItem::Import( /*[in] */ const CSAFIncidentRecord& increc )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CSAFIncidentItem::Import" );
|
|
|
|
|
|
m_increc = increc;
|
|
|
|
|
|
__HCP_FUNC_EXIT(S_OK);
|
|
}
|
|
|
|
HRESULT CSAFIncidentItem::Export( /*[in] */ CSAFIncidentRecord& increc )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CSAFIncidentItem::Export" );
|
|
|
|
CSAFChannel *pChan;
|
|
|
|
|
|
Child_GetParent( &pChan );
|
|
|
|
increc = m_increc;
|
|
increc.m_bstrVendorID = pChan->GetVendorID ();
|
|
increc.m_bstrProductID = pChan->GetProductID();
|
|
|
|
pChan->Release();
|
|
|
|
|
|
__HCP_FUNC_EXIT(S_OK);
|
|
}
|
|
|
|
bool CSAFIncidentItem::MatchEnumOption( /*[in]*/ IncidentCollectionOptionEnum opt )
|
|
{
|
|
bool fRes = false;
|
|
DWORD dwGroups = 0;
|
|
|
|
switch(opt)
|
|
{
|
|
case pchAllIncidents : case pchAllIncidentsAllUsers : fRes = true ; break;
|
|
case pchOpenIncidents : case pchOpenIncidentsAllUsers : fRes = (m_increc.m_iStatus == pchIncidentOpen ); break;
|
|
case pchClosedIncidents: case pchClosedIncidentsAllUsers: fRes = (m_increc.m_iStatus == pchIncidentClosed); break;
|
|
}
|
|
|
|
switch(opt)
|
|
{
|
|
//
|
|
// For these options, administrators will see other users' incidents.
|
|
//
|
|
case pchAllIncidentsAllUsers :
|
|
case pchOpenIncidentsAllUsers :
|
|
case pchClosedIncidentsAllUsers:
|
|
dwGroups = MPC::IDENTITY_SYSTEM | MPC::IDENTITY_ADMIN | MPC::IDENTITY_ADMINS;
|
|
break;
|
|
}
|
|
|
|
if(fRes && FAILED(MPC::CheckCallerAgainstPrincipal( /*fImpersonate*/true, m_increc.m_bstrOwner, dwGroups )))
|
|
{
|
|
fRes = false;
|
|
}
|
|
|
|
return fRes;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT CSAFIncidentItem::VerifyPermissions( /*[in]*/ bool fModify )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CSAFIncidentItem::VerifyPermissions" );
|
|
|
|
HRESULT hr;
|
|
|
|
|
|
if(m_increc.m_bstrSecurity.Length())
|
|
{
|
|
MPC::AccessCheck ac;
|
|
BOOL fGranted;
|
|
DWORD dwGranted;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ac.GetTokenFromImpersonation());
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, ac.Verify( fModify ? ACCESS_WRITE : ACCESS_READ, fGranted, dwGranted, m_increc.m_bstrSecurity ));
|
|
|
|
if(fGranted == FALSE)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, E_ACCESSDENIED);
|
|
}
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP CSAFIncidentItem::get_DisplayString( /*[out, retval]*/ BSTR *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET("CSAFIncidentItem::get_DisplayString",hr,pVal);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( FALSE ));
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( m_increc.m_bstrDisplay, pVal ));
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncidentItem::put_DisplayString( /*[in]*/ BSTR newVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_PUT("CSAFIncidentItem::put_DisplayString",hr);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( TRUE ));
|
|
|
|
|
|
m_increc.m_bstrDisplay = newVal;
|
|
m_fDirty = true;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, Save());
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CSAFIncidentItem::get_URL( /*[out, retval]*/ BSTR *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET("CSAFIncidentItem::get_URL",hr,pVal);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( FALSE ));
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( m_increc.m_bstrURL, pVal ));
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncidentItem::put_URL( /*[in]*/ BSTR newVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_PUT("CSAFIncidentItem::put_URL",hr);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( TRUE ));
|
|
|
|
|
|
m_increc.m_bstrURL = newVal;
|
|
m_fDirty = true;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, Save());
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CSAFIncidentItem::get_Progress( /*[out, retval]*/ BSTR *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET("CSAFIncidentItem::get_Progress",hr,pVal);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( FALSE ));
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( m_increc.m_bstrProgress, pVal ));
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncidentItem::put_Progress( /*[in]*/ BSTR newVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_PUT("CSAFIncidentItem::put_Progress",hr);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( FALSE ));
|
|
|
|
|
|
m_increc.m_bstrProgress = newVal;
|
|
m_fDirty = true;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, Save());
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CSAFIncidentItem::get_XMLDataFile( /*[out, retval]*/ BSTR *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET("CSAFIncidentItem::get_XMLDataFile",hr,pVal);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( FALSE ));
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( m_increc.m_bstrXMLDataFile, pVal ));
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncidentItem::put_XMLDataFile( /*[in]*/ BSTR newVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_PUT("CSAFIncidentItem::put_XMLDataFile",hr);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( TRUE ));
|
|
|
|
|
|
m_increc.m_bstrXMLDataFile = newVal;
|
|
m_fDirty = true;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, Save());
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncidentItem::get_XMLBlob( /*[out, retval]*/ BSTR *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET("CSAFIncidentItem::get_XMLBlob",hr,pVal);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( FALSE ));
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( m_increc.m_bstrXMLBlob, pVal ));
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncidentItem::put_XMLBlob( /*[in]*/ BSTR newVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_PUT("CSAFIncidentItem::put_XMLBlob",hr);
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( TRUE ));
|
|
|
|
|
|
m_increc.m_bstrXMLBlob = newVal;
|
|
m_fDirty = true;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, Save());
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CSAFIncidentItem::get_CreationTime( /*[out, retval]*/ DATE *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET2("CSAFIncidentItem::get_CreationTime",hr,pVal,0);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( FALSE ));
|
|
|
|
|
|
*pVal = m_increc.m_dCreatedTime;
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CSAFIncidentItem::get_ChangedTime( /*[out, retval]*/ DATE *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET2("CSAFIncidentItem::get_ChangedTime",hr,pVal,0);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( FALSE ));
|
|
|
|
|
|
*pVal = m_increc.m_dChangedTime;
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncidentItem::get_ClosedTime( /*[out, retval]*/ DATE *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET2("CSAFIncidentItem::get_ClosedTime",hr,pVal,0);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( FALSE ));
|
|
|
|
|
|
*pVal = m_increc.m_dClosedTime;
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncidentItem::get_Status( /*[out, retval]*/ IncidentStatusEnum *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET2("CSAFIncidentItem::get_Status",hr,pVal,pchIncidentInvalid);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( TRUE ));
|
|
|
|
|
|
*pVal = m_increc.m_iStatus;
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT CSAFIncidentItem::Save()
|
|
{
|
|
__HCP_FUNC_ENTRY( "CSAFIncidentItem::Save" );
|
|
|
|
HRESULT hr;
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
CIncidentStore* pIStore = NULL;
|
|
|
|
CSAFChannel * pChan = NULL;
|
|
|
|
int ilstSize = 0x0;
|
|
|
|
m_increc.m_dChangedTime = MPC::GetLocalTime();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, CSAFChannel::OpenIncidentStore( pIStore ));
|
|
|
|
if(m_increc.m_iStatus == pchIncidentInvalid)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pIStore->DeleteRec( this ));
|
|
}
|
|
else
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pIStore->UpdateRec( this ));
|
|
}
|
|
|
|
// Grab the CSAFChannel (parent) of this CSAFIncidentItem
|
|
Child_GetParent( &pChan );
|
|
|
|
// Grab the size of the incident list to fire the event
|
|
ilstSize = pChan->GetSizeIncidentList();
|
|
|
|
// Fire the event EVENT_INCIDENTUPDATED
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pChan->Fire_NotificationEvent(EVENT_INCIDENTUPDATED,
|
|
ilstSize,
|
|
pChan,
|
|
this,
|
|
0));
|
|
|
|
m_fDirty = false;
|
|
hr = S_OK;
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
CSAFChannel::CloseIncidentStore( pIStore );
|
|
|
|
if(pChan) pChan->Release();
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP CSAFIncidentItem::get_Security( /*[out, retval]*/ IPCHSecurityDescriptor* *pVal )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CSAFIncidentItem::get_Security" );
|
|
|
|
HRESULT hr;
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( FALSE ));
|
|
|
|
|
|
if(m_increc.m_bstrSecurity.Length())
|
|
{
|
|
CPCHSecurityDescriptorDirect sdd;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, sdd.ConvertFromString( m_increc.m_bstrSecurity ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, CPCHSecurity::s_GLOBAL->CreateObject_SecurityDescriptor( pVal ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, sdd.ConvertSDToCOM( *pVal ));
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncidentItem::put_Security( /*[in]*/ IPCHSecurityDescriptor* newVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_PUT("CSAFChannel::put_Security",hr);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( TRUE ));
|
|
|
|
|
|
m_increc.m_bstrSecurity.Empty();
|
|
|
|
if(newVal)
|
|
{
|
|
CPCHSecurityDescriptorDirect sdd;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, sdd.ConvertSDFromCOM( newVal ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, sdd.ConvertToString( &m_increc.m_bstrSecurity ));
|
|
}
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, Save());
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncidentItem::get_Owner( /*[out, retval]*/ BSTR *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET("CSAFIncidentItem::get_Owner",hr,pVal);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( FALSE ));
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( m_increc.m_bstrOwner, pVal ));
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP CSAFIncidentItem::CloseIncidentItem()
|
|
{
|
|
__HCP_FUNC_ENTRY( "CSAFIncidentItem::CloseIncidentItem" );
|
|
|
|
HRESULT hr;
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( TRUE ));
|
|
|
|
|
|
m_increc.m_dClosedTime = MPC::GetLocalTime();
|
|
m_increc.m_iStatus = pchIncidentClosed;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, Save());
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
STDMETHODIMP CSAFIncidentItem::DeleteIncidentItem()
|
|
{
|
|
__HCP_FUNC_ENTRY( "CSAFIncidentItem::DeleteIncidentItem" );
|
|
|
|
HRESULT hr;
|
|
MPC::SmartLock<_ThreadModel> lock( this );
|
|
CSAFChannel* pChan = NULL;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, VerifyPermissions( TRUE ));
|
|
|
|
|
|
Child_GetParent( &pChan );
|
|
|
|
if(pChan)
|
|
{
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pChan->RemoveIncidentFromList( this ));
|
|
}
|
|
|
|
|
|
if(m_increc.m_iStatus != pchIncidentInvalid)
|
|
{
|
|
m_increc.m_dClosedTime = MPC::GetLocalTime();
|
|
m_increc.m_iStatus = pchIncidentInvalid;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, Save());
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
if(pChan) pChan->Release();
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|