#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 > ATTRIBUTE_MAP; ATTRIBUTE_MAP m_mapFields; private: }; // // CSite Item represents a leaf XML node, // such Birthdate or or // 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
, , // Internally, a CAtlArray maintains the container. // The ordering of the elements are implicitly stored in the array // template 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 pItem = NULL; CComPtr 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 SITEITEM_ARRAY; SITEITEM_ARRAY m_array; }; // // Container objects class // typedef CSiteContainer CSiteSection; typedef CSiteContainer CSiteLocale; // // Device has been referred as Style (mainly indicates HTML, WML, CDML, Wizard, etc // class CSiteDevice : public CSiteContainer { 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* GetDeviceContainer() { return &m_Devices; } CSiteContainer* 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 > SITEDEVICE_MAP; CSiteContainer m_Devices; SITEDEVICE_MAP m_DeviceMap; CSiteContainer m_Locales; LONG m_lSiteID; COleDateTime m_oledtDateUpdated; }; class CSitesAll : public CSiteContainer { public: protected: private: };