502 lines
17 KiB
C++
502 lines
17 KiB
C++
/********************************************************************
|
|
|
|
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___)
|