//======================================================================= // // Copyright (c) 1998-2000 Microsoft Corporation. All Rights Reserved. // // File: History.h // Author: Charles Ma, 10/13/2000 // // Revision History: // // // // Description: // // Class to handle history log // //======================================================================= #include "iuxml.h" // ---------------------------------------------------------------------- // // define the enum for download/install status // // ---------------------------------------------------------------------- enum _HISTORY_STATUS { HISTORY_STATUS_COMPLETE = 0, HISTORY_STATUS_IN_PROGRESS = 1, // currently should be ignored of this! HISTORY_STATUS_FAILED = -1 }; // ---------------------------------------------------------------------- // // define the class for history // // ---------------------------------------------------------------------- class CIUHistory { public: CIUHistory(); ~CIUHistory(); // ------------------------------------------------------------------ // // public function SetDownloadBasePath() // this function should be called before AddHistoryItemDownloadStatus() // for corporate case to set the download path that the user has input, // so that we know where to save the history log. // // ------------------------------------------------------------------ HRESULT SetDownloadBasePath(LPCTSTR pszDownloadedBasePath); // ------------------------------------------------------------------ // // public function AddHistoryItemDownloadStatus() // this function should be called when you want to record the // download status of this item. A new history item will be // added to the history file // // ------------------------------------------------------------------ HRESULT AddHistoryItemDownloadStatus( CXmlCatalog* pCatalog, HANDLE_NODE hCatalogItem, // a handle points to node in catalog _HISTORY_STATUS enDownloadStatus, LPCTSTR lpcszDownloadedTo, LPCTSTR lpcszClient, DWORD dwErrorCode = 0 ); // ------------------------------------------------------------------ // // public function AddHistoryItemInstallStatus() // this function should be called when you want to record the // install status of this item. This function will go to the // existing history tree and find the first item that matches // the identity of hCatalogItem, and assume that one as // the one you want to modify the install status // // // return: // HRESULT - S_OK if succeeded // - E_HANDLE if can't find hCatalogItem from // the current history log tree // - or other HRESULT error // // ------------------------------------------------------------------ HRESULT AddHistoryItemInstallStatus( CXmlCatalog* pCatalog, HANDLE_NODE hCatalogItem, // a handle points to node in catalog _HISTORY_STATUS enInstallStatus, LPCTSTR lpcszClient, BOOL fNeedsReboot, DWORD dwErrorCode = 0 ); // ------------------------------------------------------------------ // // public function UpdateHistoryItemInstallStatus() // this function should be called when you want to record the // install status of this item. This function will go to the // existing history tree and find the first item that matches // the identity of hCatalogItem, and assume that one as // the one you want to modify the install status // // // return: // HRESULT - S_OK if succeeded // - E_HANDLE if can't find hCatalogItem from // the current history log tree // - or other HRESULT error // // ------------------------------------------------------------------ HRESULT UpdateHistoryItemInstallStatus( CXmlCatalog* pCatalog, HANDLE_NODE hCatalogItem, // a handle points to node in catalog _HISTORY_STATUS enInstallStatus, BOOL fNeedsReboot, DWORD dwErrorCode /*= 0*/ ); /* // ------------------------------------------------------------------ // // public function RetrieveItemDownloadPath() // this function will go to the existing history tree and find // the first item that matches the identity of hCatalogItem, and // assume that's the one you want to retrieve the download path from // // return: // HRESULT - S_OK if succeeded // - E_HANDLE if can't find hCatalogItem from // the current history log tree // - or other HRESULT error // // ------------------------------------------------------------------ HRESULT CIUHistory::RetrieveItemDownloadPath( CXmlCatalog* pCatalog, HANDLE_NODE hCatalogItem, // a handle points to node in catalog BSTR* pbstrDownloadPath ); */ // ------------------------------------------------------------------ // // public function ReadHistoryFromDisk() // this function will read the history from the given file // // ------------------------------------------------------------------ HRESULT ReadHistoryFromDisk(LPCTSTR lpszLogFile, BOOL fCorpAdmin = FALSE); // ------------------------------------------------------------------ // // public function SaveHistoryToDisk() // this function will re-read the history in exclusive mode, and // merge the newly added data to the tree (so we don't overwrite // new changes made by other instances of this control) and // write it back // // ------------------------------------------------------------------ HRESULT SaveHistoryToDisk(void); // ------------------------------------------------------------------ // // public function to set the client name // // a client name is used to put in history to denode who // caused download/install happened. // // ------------------------------------------------------------------ void SetClientName(BSTR bstrClientName); // ------------------------------------------------------------------ // // public function GetHistory // // read the current history XML file and convert it // into bstr to pass out // // ------------------------------------------------------------------ HRESULT GetHistoryStr( LPCTSTR lpszLogFile, BSTR BeginDateTime, BSTR EndDateTime, BSTR* pbstrHistory); private: // ------------------------------------------------------------------ // // private inline function GetBSTRStatus // // ------------------------------------------------------------------ inline BSTR GetBSTRStatus(_HISTORY_STATUS enStatus) { BSTR bstrStatus = NULL; switch (enStatus) { case HISTORY_STATUS_COMPLETE: bstrStatus = SysAllocString(L"COMPLETE"); break; case HISTORY_STATUS_IN_PROGRESS: bstrStatus = SysAllocString(L"IN_PROGRESS"); break; default: bstrStatus = SysAllocString(L"FAILED"); }; return bstrStatus; }; // // named mutex used to gain exclusive access to the history file // BOOL m_fSavePending; HANDLE m_hMutex; HRESULT m_ErrorCode; BSTR m_bstrCurrentClientName; TCHAR m_szLogFilePath[MAX_PATH]; LPTSTR m_pszDownloadBasePath; CXmlItems *m_pxmlExisting; CXmlItems *m_pxmlDownload; CXmlItems *m_pxmlInstall; };