|
|
#pragma once
/************************************************************************
Copyright (c) 2001 Microsoft Corporation
File Name: CSite.h -- Definition of CSite.cpp
Abstract: Site objects that manages partner site settings through XML and DB. Site interface to manage SiteXXX.xml.
Revision History:
2001/1/24 lifenwu Created.
***************************************************************************/
#include "PSANexus.h" //sd_uncommented
#include "atlcoll.h"
#include "atltime.h"
//
// XML Item Node type
//
typedef enum siteItemNodeType { stnt_Device = 1, stnt_Item, stnt_ExtItem, stnt_CBScriptVar, stnt_Invalid } SITE_ITEM_NODE_TYPE;
//
// Each XML node owns a set of attributes
//
class CSiteAttribute { public: virtual ~CSiteAttribute();
//
// Random Access to an attribute
//
BOOL AttributeGet(CString szName, CString *pszValue);
BOOL AttributeGet(POSITION pos, CString *pszName, CString *pszValue) { if (pos == NULL) return FALSE; m_mapFields.GetAt(pos, *pszName, pszValue); return TRUE; }
//
// enumeration through
//
POSITION AttributeGetStartPosition() { return m_mapFields.GetStartPosition(); }
BOOL AttributeGetNext(POSITION& pos, CString *pszName, CString *pszValue) { CString *csValue;
if (pos == NULL) return FALSE; m_mapFields.GetNextAssoc(pos, *pszName, csValue); *pszValue = *csValue; return TRUE; } ULONG AttributeGetCount() { return m_mapFields.GetCount(); }
//
// Add/Update/Delete operation
//
BOOL AttributeAdd(CString szName, CString szValue); BOOL AttributeUpdate(CString szName, CString szValue); BOOL AttributeDelete(CString szName);
//
// Initialization routines
//
HRESULT InitAttributes(IXMLDOMNode *pNode);
protected: typedef CAtlMap<CString, CString *, CStringElementTraits<CString> > ATTRIBUTE_MAP; ATTRIBUTE_MAP m_mapFields;
private:
};
//
// CSite Item represents a leaf XML node,
// such <Item>Birthdate</Item> or <ExtItem> or <CBScriptVar>
//
class CSiteItem : public CSiteAttribute { public:
~CSiteItem() { };
//
// Get/Set Item value and its type
//
LPCTSTR GetItem() { return m_szItem; } void SetItem(LPCTSTR szItem) { m_szItem = szItem; } SITE_ITEM_NODE_TYPE GetType() { return m_enumType; } void SetType(SITE_ITEM_NODE_TYPE t) { m_enumType = t; }
//
// Initialization routines
// $$Todo$$ Add DB init
//
HRESULT InitFromXML(IXMLDOMNode *pNode);
protected:
CString m_szItem; SITE_ITEM_NODE_TYPE m_enumType; };
//
// Represents an XML containder node such as <Section>, <Device>, <Locale>
// Internally, a CAtlArray maintains the container.
// The ordering of the elements are implicitly stored in the array
//
template<class T> class CSiteContainer : public CSiteAttribute { public:
~CSiteContainer() { // Deep clean up array
for (ULONG ulIndex = 0; ulIndex < m_array.GetCount(); ulIndex++) { T * pT = m_array[ulIndex]; if (pT != NULL) { delete pT; pT = 0; //sd_added
} }
m_array.RemoveAll(); }
//
// Access to container array
//
T *GetItem(unsigned long ulItemIdx) { return m_array[ulItemIdx]; } size_t AddItem(T *t) { return m_array.Add(t); } ULONG GetCount() { return m_array.GetCount(); }
//
// Initializations
//
HRESULT InitFromXML(IXMLDOMNode *pNode) { HRESULT hr = E_FAIL; CComPtr<IXMLDOMNode> pItem = NULL; CComPtr<IXMLDOMNodeList> pList = NULL; long i, lNumChildren; CComBSTR bstr; CComVariant var;
hr = InitAttributes(pNode);
hr = pNode->get_childNodes(&pList); if (FAILED(hr)) { goto exit; }
hr = pList->get_length(&lNumChildren);
for (i=0; i < lNumChildren; i++) { pItem = NULL; hr = pList->get_item(i, &pItem); T *pT = new T; if (pT == NULL) { hr = E_OUTOFMEMORY; goto exit; }
hr = pT->InitFromXML(pItem);
if (FAILED(hr)) { if (pT != NULL) delete pT; } else { AddItem(pT); } }
hr = S_OK; exit: return hr; } protected:
typedef CAtlArray<T *> SITEITEM_ARRAY; SITEITEM_ARRAY m_array; };
//
// Container objects class
//
typedef CSiteContainer<CSiteItem> CSiteSection; typedef CSiteContainer<CSiteItem> CSiteLocale;
//
// Device has been referred as Style (mainly indicates HTML, WML, CDML, Wizard, etc
//
class CSiteDevice : public CSiteContainer<CSiteSection> { public: CSiteDevice() { } CSiteDevice(CString szDeviceName) { m_szName = szDeviceName; } void SetDeviceName(CString sz) { m_szName = sz; }
// Persist as XML blob in DB
//
HRESULT Pesist(LONG lSiteID);
HRESULT InitFromDB(LONG lSiteID); HRESULT InitFromStream(ISequentialStream *pStream);
private: CString m_szName; COleDateTime m_dtSRFChangedTime; };
//
// Main entry object to a partner site settings data
//
//sd_added, 08/March/2001, use this type to pass the site info to be stored in DB
//to CSite obj.
typedef CPSANexusFlexRegInsert::tagInputParameters SITEMETRICS_STRUCT;
class CSite : public CSiteAttribute { public: CSite() { m_lSiteID = -1;}; CSite(LONG lSiteID) { m_lSiteID = lSiteID; } ~CSite() { };
// Initialize from DB, Read Only, to be used during Runtime
HRESULT InitSiteAttributes(); HRESULT InitSiteDevices(int iTargetType); HRESULT InitDevice(CString szwStyle, int iTargetType);
// Initialize from XML -- an XML for a site customization ; used by preprocessing
HRESULT Init(IXMLDOMDocument *pXMLDoc); HRESULT InitFromDB(int iTargetType);
// Persist to DB through XML only
// never persist from object memory
HRESULT Persist(SITEMETRICS_STRUCT *pSiteMetrics); HRESULT GetDateTime(COleDateTime *pDateTime);
CSiteContainer<CSiteDevice>* GetDeviceContainer() { return &m_Devices; } CSiteContainer<CSiteLocale>* GetLocaleContainer() { return &m_Locales; } LONG GetSiteID() { return m_lSiteID; } void SetSiteID(LONG l) { m_lSiteID = l; } CSiteDevice * GetDevice(CString cszDevice);
private: typedef CAtlMap< CString, LONG, CStringElementTraits<CString> > SITEDEVICE_MAP; CSiteContainer<CSiteDevice> m_Devices; SITEDEVICE_MAP m_DeviceMap; CSiteContainer<CSiteLocale> m_Locales; LONG m_lSiteID; COleDateTime m_oledtDateUpdated; };
class CSitesAll : public CSiteContainer<CSite> { public: protected:
private: };
|