diff options
author | Stef Walter <stef@thewalter.net> | 2003-09-17 19:07:23 +0000 |
---|---|---|
committer | Stef Walter <stef@thewalter.net> | 2003-09-17 19:07:23 +0000 |
commit | 3f95d417d9e623ac0c74df8ef11d7a01846392dd (patch) | |
tree | 45ec73f2dc07eafd7f41a6f62a8cdfbaa279469f /NSCmpts/ActionEngine.h |
Diffstat (limited to 'NSCmpts/ActionEngine.h')
-rw-r--r-- | NSCmpts/ActionEngine.h | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/NSCmpts/ActionEngine.h b/NSCmpts/ActionEngine.h new file mode 100644 index 0000000..301ed81 --- /dev/null +++ b/NSCmpts/ActionEngine.h @@ -0,0 +1,157 @@ +// ActionEngine.h: interface for the CActionEngine class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_ACTIONENGINE_H__00EC1855_A1A5_11D3_82DB_0020182B97FC__INCLUDED_) +#define AFX_ACTIONENGINE_H__00EC1855_A1A5_11D3_82DB_0020182B97FC__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include <path.h> +#include "NSMessages.h" + +//////////////////////////////////////////////////////////////////////// +// Hooks onto any object to provide reference count services + +template<class TBase> +class counted_obj +{ +public: + counted_obj() + { m_lCount = 0; } + long addref() + { return ++m_lCount; } + long release() + { + long lCount = --m_lCount; + + if(lCount <= 0) + delete (TBase*)this; + + return lCount; + } +protected: + long m_lCount; +}; + +//////////////////////////////////////////////////////////////////////// +// Forward Declarations + +class CAction; // Action processed by the Action Engine +class CActionError; // Error thrown by an Action +class CActionEngine; // The Engine + +///////////////////////////////////////////////////////////////////////// +// Abstract class: An Action for the Action Engine + +class CAction + : public counted_obj<CAction> +{ +public: + CAction() {}; + virtual ~CAction() {}; + + // Does the actual action + virtual bool Do(CActionEngine* pEngine, HWND hwndUpdates) + throw(CActionError) = 0; + // Retry after an error + virtual bool IsRetryable() const throw() = 0; + + // Try and fix after there's an error + virtual void Fix(HRESULT hr) throw(CActionError) = 0; + virtual bool IsFixable(HRESULT hr) const throw() = 0; + +protected: + // Helper function for implementations + // Updates the dialog + void Update(HWND hwndUpdates, LPCTSTR szDesc); + void Update(HWND hwndUpdates, LPCTSTR szStatus, LPCTSTR szDesc); +}; + + + +////////////////////////////////////////////////////////////////////// +// An Error thrown by an Action Object and caught by Action Engine +// With built in formatting +// +// %e Error Text +// %f File Name +// %F Full File Path + +class CActionError +{ +// Constructors +public: + // These two get the error message from the HRESULT + CActionError(HRESULT hr, const string& sMessage, + const file_path& path = file_path()); + CActionError(HRESULT hr, UINT nID, + const file_path& path = file_path()); + + // These two ask you to supply the error message + CActionError(const string& sError, HRESULT hr, UINT nID, + const file_path& path = file_path()); + CActionError(const string& sError, HRESULT hr, const string& sMessage, + const file_path& path = file_path()); + + string m_sDesc; // Formatted Error Text + HRESULT m_hRes; // Original HRESULT + +// Helper Functions +protected: + void Construct(HRESULT hr, string sMessage, const file_path& path); + void Construct(const string& sError, HRESULT hr, string sMessage, + const file_path& path); +}; + +///////////////////////////////////////////////////////////////////////// +// The Engine that processes CAction objects +// Derives from a vector of Action pointers + +typedef std::vector<CAction*> action_array; + +class CActionEngine + : protected action_array +{ +// Construction +public: + CActionEngine() {}; + CActionEngine(CAction* pFirstAction) + { push_back(pFirstAction); } + virtual ~CActionEngine() + { RemoveAll(); }; + +// Actions +public: + // These start engine in current thread + HRESULT Start(CAction* pFirstAction); + HRESULT Start(); + + // Start engine in another thread and return immediately + HANDLE StartThread(); + +// Set Properties +public: + void SetUpdates(HWND hwndUpdates = NULL, HWND hwndErrors = NULL); + +// A few array management functions for the outside world +public: + UINT Add(CAction* pAction); + UINT Insert(CAction* pAction, UINT nIndex); + void Remove(UINT nIndex); + void RemoveAll(CAction* pKeep = NULL); + CAction* At(UINT nIndex); + +protected: + HWND m_hwndUpdates; // Window to Send Updates to + HWND m_hwndErrors; // Window to Send Errors to + + // Used to start in a separate thread + static DWORD CALLBACK ThreadProc(LPVOID lpParam); +}; + +void Lower(string& s); +#endif // !defined(AFX_ACTIONENGINE_H__00EC1855_A1A5_11D3_82DB_0020182B97FC__INCLUDED_) + |