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.
 
 
 
 
 
 

501 lines
17 KiB

/********************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name:
SAFlib.h
Abstract:
This is declaration of SAF Channel objects
Revision History:
Steve Shih created 07/15/99
********************************************************************/
#if !defined(__INCLUDED___PCH___SAFLIB_H___)
#define __INCLUDED___PCH___SAFLIB_H___
#include <time.h>
//
// From HelpServiceTypeLib.idl
//
#include <HelpServiceTypeLib.h>
#include <MPC_main.h>
#include <MPC_com.h>
#include <MPC_utils.h>
#include <MPC_xml.h>
#include <MPC_config.h>
#include <MPC_streams.h>
#include <AccountsLib.h>
#include <TaxonomyDatabase.h>
/////////////////////////////////////////////////////////////////////////////
class CSAFChannel;
class CSAFIncidentItem;
class CSAFReg;
class CIncidentStore;
typedef MPC::CComObjectParent<CSAFChannel> CSAFChannel_Object;
/////////////////////////////////////////////////////////////////////////////
#define MAX_REC_LEN 1024
#define MAX_ID 1024
class CSAFIncidentRecord
{
public:
DWORD m_dwRecIndex;
CComBSTR m_bstrVendorID;
CComBSTR m_bstrProductID;
CComBSTR m_bstrDisplay;
CComBSTR m_bstrURL;
CComBSTR m_bstrProgress;
CComBSTR m_bstrXMLDataFile;
CComBSTR m_bstrXMLBlob;
DATE m_dCreatedTime;
DATE m_dChangedTime;
DATE m_dClosedTime;
IncidentStatusEnum m_iStatus;
CComBSTR m_bstrSecurity;
CComBSTR m_bstrOwner;
CSAFIncidentRecord();
friend HRESULT operator>>( /*[in]*/ MPC::Serializer& stream, /*[out]*/ CSAFIncidentRecord& increc );
friend HRESULT operator<<( /*[in]*/ MPC::Serializer& stream, /*[in] */ const CSAFIncidentRecord& increc );
};
class CSAFChannelRecord
{
public:
typedef enum
{
SAFREG_SKU ,
SAFREG_Language ,
SAFREG_VendorID ,
SAFREG_ProductID ,
SAFREG_VendorName ,
SAFREG_ProductName ,
SAFREG_ProductDescription,
SAFREG_VendorIcon ,
SAFREG_SupportUrl ,
SAFREG_PublicKey ,
SAFREG_UserAccount ,
SAFREG_Security ,
SAFREG_Notification ,
} SAFREG_Field;
////////////////////
Taxonomy::HelpSet m_ths;
CComBSTR m_bstrVendorID;
CComBSTR m_bstrProductID;
CComBSTR m_bstrVendorName;
CComBSTR m_bstrProductName;
CComBSTR m_bstrDescription;
CComBSTR m_bstrIcon;
CComBSTR m_bstrURL;
CComBSTR m_bstrPublicKey;
CComBSTR m_bstrUserAccount;
CComBSTR m_bstrSecurity;
CComBSTR m_bstrNotification;
////////////////////
CSAFChannelRecord();
HRESULT GetField( /*[in]*/ SAFREG_Field field, /*[out]*/ BSTR *pVal );
HRESULT SetField( /*[in]*/ SAFREG_Field field, /*[in ]*/ BSTR newVal );
};
////////////////////////////////////////////////////////////////////////////////
//
// Adding MPC::CComObjectRootParentBase to take care of the Parent Child relation between Channel and IncidentItem.
//
class ATL_NO_VTABLE CSAFChannel :
public MPC::CComObjectRootParentBase,
public CComObjectRootEx<MPC::CComSafeMultiThreadModel>,
public IDispatchImpl<ISAFChannel, &IID_ISAFChannel, &LIBID_HelpServiceTypeLib>
{
public:
typedef std::list< CSAFIncidentItem* > List;
typedef List::iterator Iter;
typedef List::const_iterator IterConst;
private:
CSAFChannelRecord m_data;
CComPtr<IPCHSecurityDescriptor> m_Security;
List m_lstIncidentItems;
public:
DECLARE_NO_REGISTRY()
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CSAFChannel)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISAFChannel)
END_COM_MAP()
CSAFChannel();
void FinalRelease();
void Passivate ();
BSTR GetVendorID () { return m_data.m_bstrVendorID; }
BSTR GetProductID () { return m_data.m_bstrProductID; }
size_t GetSizeIncidentList() { return m_lstIncidentItems.size(); }
static HRESULT OpenIncidentStore ( /*[out]*/ CIncidentStore*& pIStore );
static HRESULT CloseIncidentStore( /*[out]*/ CIncidentStore*& pIStore );
HRESULT Init( /*[in]*/ const CSAFChannelRecord& cr );
HRESULT Import( /*[in]*/ const CSAFIncidentRecord& increc ,
/*[out]*/ CSAFIncidentItem* *pVal );
HRESULT Create( /*[in]*/ BSTR bstrDesc ,
/*[in]*/ BSTR bstrURL ,
/*[in]*/ BSTR bstrProgress ,
/*[in]*/ BSTR bstrXMLDataFile ,
/*[in]*/ BSTR bstrXMLBlob ,
/*[out]*/ CSAFIncidentItem* *pVal );
IterConst Find( /*[in]*/ BSTR bstrURL );
IterConst Find( /*[in]*/ DWORD dwIndex );
HRESULT RemoveIncidentFromList( /*[in]*/ CSAFIncidentItem* pVal );
HRESULT Fire_NotificationEvent( /*[in]*/ int iEventType ,
/*[in]*/ int iCountIncidentInChannel ,
/*[in]*/ ISAFChannel* pC ,
/*[in]*/ ISAFIncidentItem* pI ,
/*[in]*/ DWORD dwCode );
// ISAFChannel
public:
STDMETHOD(get_VendorID )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_ProductID )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_VendorName )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_ProductName )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_Description )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_VendorDirectory)( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_Security )( /*[out, retval]*/ IPCHSecurityDescriptor* *pVal );
STDMETHOD(put_Security )( /*[in] */ IPCHSecurityDescriptor* newVal );
STDMETHOD(get_Notification )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(put_Notification )( /*[in] */ BSTR newVal );
STDMETHOD(Incidents)( /*[in]*/ IncidentCollectionOptionEnum opt, /*[out, retval]*/ IPCHCollection* *ppC );
STDMETHOD(RecordIncident)( /*[in]*/ BSTR bstrDisplay ,
/*[in]*/ BSTR bstrURL ,
/*[in]*/ VARIANT vProgress ,
/*[in]*/ VARIANT vXMLDataFile ,
/*[in]*/ VARIANT vXMLBlob ,
/*[out]*/ ISAFIncidentItem* *pVal );
};
///////////////////////////////////////////////////////////////////////////////////////////////////
//
// Use CComObjectRootChildEx() in place of CComObjectRootEx()
// public CComObjectRootEx<CComSingleThreadModel>,
//
// Also adding MPC::CComObjectRootParentBase to take care of the Parent Child relation between Channel and IncidentItem.
//
// This is a child of Incidents Object.
class ATL_NO_VTABLE CSAFIncidentItem :
public MPC::CComObjectRootChildEx<MPC::CComSafeMultiThreadModel, CSAFChannel>,
public IDispatchImpl<ISAFIncidentItem, &IID_ISAFIncidentItem, &LIBID_HelpServiceTypeLib>
{
CSAFIncidentRecord m_increc;
bool m_fDirty;
public:
BEGIN_COM_MAP(CSAFIncidentItem)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISAFIncidentItem)
END_COM_MAP()
CSAFIncidentItem();
HRESULT Import( /*[in] */ const CSAFIncidentRecord& increc );
HRESULT Export( /*[out]*/ CSAFIncidentRecord& increc );
HRESULT Save();
DWORD GetRecIndex() { return m_increc.m_dwRecIndex; }
CComBSTR& GetURL () { return m_increc.m_bstrURL; }
bool MatchEnumOption( /*[in]*/ IncidentCollectionOptionEnum opt );
HRESULT VerifyPermissions( /*[in]*/ bool fModify = false );
// ISAFIncidentItem
public:
STDMETHOD(get_DisplayString)( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(put_DisplayString)( /*[in] */ BSTR newVal );
STDMETHOD(get_URL )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(put_URL )( /*[in] */ BSTR newVal );
STDMETHOD(get_Progress )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(put_Progress )( /*[in] */ BSTR newVal );
STDMETHOD(get_XMLDataFile )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(put_XMLDataFile )( /*[in] */ BSTR newVal );
STDMETHOD(get_XMLBlob )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(put_XMLBlob )( /*[in] */ BSTR newVal );
STDMETHOD(get_CreationTime )( /*[out, retval]*/ DATE *pVal );
STDMETHOD(get_ClosedTime )( /*[out, retval]*/ DATE *pVal );
STDMETHOD(get_ChangedTime )( /*[out, retval]*/ DATE *pVal );
STDMETHOD(get_Status )( /*[out, retval]*/ IncidentStatusEnum *pVal );
STDMETHOD(get_Security )( /*[out, retval]*/ IPCHSecurityDescriptor* *pVal );
STDMETHOD(put_Security )( /*[in] */ IPCHSecurityDescriptor* newVal );
STDMETHOD(get_Owner )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(CloseIncidentItem )();
STDMETHOD(DeleteIncidentItem)();
};
/////////////////////////////////////////////////////////////////////////////
//
// This is the read-only, flat version of CSAFReg.
//
class ATL_NO_VTABLE CSAFRegDummy :
public CComObjectRootEx<MPC::CComSafeMultiThreadModel>,
public IDispatchImpl<ISAFReg, &IID_ISAFReg, &LIBID_HelpServiceTypeLib>
{
typedef std::list< CSAFChannelRecord > ChannelsList;
typedef ChannelsList::iterator ChannelsIter;
typedef ChannelsList::const_iterator ChannelsIterConst;
////////////////////////////////////////
ChannelsList m_lstChannels;
ChannelsIter m_itCurrent; // Used by MoveFirst / MoveNext / get_EOF
////////////////////////////////////////
HRESULT ReturnField( /*[in]*/ CSAFChannelRecord::SAFREG_Field field, /*[out]*/ BSTR *pVal );
////////////////////////////////////////
public:
BEGIN_COM_MAP(CSAFRegDummy)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISAFReg)
END_COM_MAP()
CSAFRegDummy();
HRESULT Append( /*[in]*/ const CSAFChannelRecord& cr );
////////////////////////////////////////////////////////////////////////////////
// ISAFReg
public:
STDMETHOD(get_EOF )( /*[out, retval]*/ VARIANT_BOOL *pVal );
STDMETHOD(get_VendorID )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_ProductID )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_VendorName )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_ProductName )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_ProductDescription)( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_VendorIcon )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_SupportUrl )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_PublicKey )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_UserAccount )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(MoveFirst)();
STDMETHOD(MoveNext )();
};
/////////////////////////////////////////////////////////////////////////////
// CSAFReg
class CSAFReg :
public CComObjectRootEx<MPC::CComSafeMultiThreadModel>, // Just for locking...
public MPC::Config::TypeConstructor
{
class Inner_UI : public MPC::Config::TypeConstructor
{
DECLARE_CONFIG_MAP(Inner_UI);
public:
Taxonomy::HelpSet m_ths;
CComBSTR m_bstrVendorName;
CComBSTR m_bstrProductName;
CComBSTR m_bstrDescription;
CComBSTR m_bstrIcon;
CComBSTR m_bstrURL;
////////////////////////////////////////
//
// MPC::Config::TypeConstructor
//
DEFINE_CONFIG_DEFAULTTAG();
DECLARE_CONFIG_METHODS();
//
////////////////////////////////////////
};
typedef std::list< Inner_UI > UIList;
typedef UIList::iterator UIIter;
typedef UIList::const_iterator UIIterConst;
////////////////////////////////////////
class Inner_Product : public MPC::Config::TypeConstructor
{
DECLARE_CONFIG_MAP(Inner_Product);
public:
CComBSTR m_bstrProductID;
UIList m_lstUI;
CComBSTR m_bstrSecurity;
CComBSTR m_bstrNotification;
////////////////////////////////////////
//
// MPC::Config::TypeConstructor
//
DEFINE_CONFIG_DEFAULTTAG();
DECLARE_CONFIG_METHODS();
//
////////////////////////////////////////
};
typedef std::list< Inner_Product > ProdList;
typedef ProdList::iterator ProdIter;
typedef ProdList::const_iterator ProdIterConst;
////////////////////////////////////////
class Inner_Vendor : public MPC::Config::TypeConstructor
{
DECLARE_CONFIG_MAP(Inner_Vendor);
public:
CComBSTR m_bstrVendorID;
ProdList m_lstProducts;
CComBSTR m_bstrPublicKey;
CComBSTR m_bstrUserAccount;
////////////////////////////////////////
//
// MPC::Config::TypeConstructor
//
DEFINE_CONFIG_DEFAULTTAG();
DECLARE_CONFIG_METHODS();
//
////////////////////////////////////////
};
typedef std::list< Inner_Vendor > VendorList;
typedef VendorList::iterator VendorIter;
typedef VendorList::const_iterator VendorIterConst;
////////////////////////////////////////
DECLARE_CONFIG_MAP(CSAFReg);
MPC::wstring m_szSAFStore;
VendorList m_lstVendors;
bool m_fLoaded;
bool m_fDirty;
////////////////////////////////////////
HRESULT EnsureInSync();
HRESULT ParseFileField( /*[in]*/ MPC::XmlUtil& xml ,
/*[in]*/ LPCWSTR szTag ,
/*[in]*/ CComBSTR& bstrDest );
HRESULT ParseFile( /*[in ]*/ MPC::XmlUtil& xml ,
/*[in/out]*/ CSAFChannelRecord& cr );
HRESULT MoveToChannel( /*[in ]*/ const CSAFChannelRecord& cr ,
/*[in ]*/ bool fCreate ,
/*[out]*/ bool& fFound ,
/*[out]*/ VendorIter& itVendor ,
/*[out]*/ ProdIter* pitProduct = NULL ,
/*[out]*/ UIIter* pitUI = NULL );
void PopulateRecord( /*[in]*/ CSAFChannelRecord& cr ,
/*[in]*/ VendorIter itVendor ,
/*[in]*/ ProdIter itProduct ,
/*[in]*/ UIIter itUI );
////////////////////////////////////////
public:
CSAFReg();
////////////////////////////////////////
//
// MPC::Config::TypeConstructor
//
DEFINE_CONFIG_DEFAULTTAG();
DECLARE_CONFIG_METHODS();
//
////////////////////////////////////////
HRESULT CreateReadOnlyCopy( /*[in]*/ const Taxonomy::HelpSet& ths, /*[out]*/ CSAFRegDummy* *pVal );
HRESULT LookupAccountData( /*[in]*/ BSTR bstrVendorID, /*[out]*/ CPCHUserProcess::UserEntry& ue );
////////////////////////////////////////////////////////////////////////////////
static CSAFReg* s_GLOBAL;
static HRESULT InitializeSystem();
static void FinalizeSystem ();
////////////////////////////////////////////////////////////////////////////////
HRESULT RegisterSupportChannel( /*[in]*/ const CSAFChannelRecord& cr, /*[in]*/ MPC::XmlUtil& xml );
HRESULT RemoveSupportChannel ( /*[in]*/ const CSAFChannelRecord& cr, /*[in]*/ MPC::XmlUtil& xml );
HRESULT UpdateField( /*[in ]*/ const CSAFChannelRecord& cr, /*[in]*/ CSAFChannelRecord::SAFREG_Field field );
HRESULT Synchronize( /*[in/out]*/ CSAFChannelRecord& cr, /*[out]*/ bool& fFound );
HRESULT RemoveSKU( /*[in]*/ const Taxonomy::HelpSet& ths );
};
////////////////////////////////////////////////////////////////////////////////
#endif // !defined(__INCLUDED___PCH___SAFLIB_H___)