Leaked source code of windows server 2003
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

/********************************************************************
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);
}