Index: src/ch/task.h =================================================================== diff -u -N -r583756058945ab95a48e17b31455b0ed4b213b8e -r678a716a4ed83d5790a407ce60dfcf7d8ca703fa --- src/ch/task.h (.../task.h) (revision 583756058945ab95a48e17b31455b0ed4b213b8e) +++ src/ch/task.h (.../task.h) (revision 678a716a4ed83d5790a407ce60dfcf7d8ca703fa) @@ -137,6 +137,98 @@ bool bProcessed; // has the element been processed ? (false if skipped) }; +/// class encapsulates windows HANDLE, allowing automatic closing it in destructor. +class TAutoFileHandle +{ +public: + // ============================================================================ + /// TAutoFileHandle::TAutoFileHandle + /// @date 2010/08/26 + /// + /// @brief Constructs the TAutoFileHandle object. + // ============================================================================ + TAutoFileHandle() : + m_hHandle(INVALID_HANDLE_VALUE) + { + } + + // ============================================================================ + /// TAutoFileHandle::TAutoFileHandle + /// @date 2010/08/26 + /// + /// @brief Constructs the TAutoFileHandle object with specified handle. + /// @param[in] hHandle - System handle to be managed by this class. + // ============================================================================ + TAutoFileHandle(HANDLE hHandle) : + m_hHandle(hHandle) + { + } + + // ============================================================================ + /// TAutoFileHandle::~TAutoFileHandle + /// @date 2010/08/26 + /// + /// @brief Destructs the TAutoFileHandle object and closes handle if not closed already. + // ============================================================================ + ~TAutoFileHandle() + { + _ASSERTE(m_hHandle == INVALID_HANDLE_VALUE); + Close(); + } + + // ============================================================================ + /// TAutoFileHandle::operator= + /// @date 2010/08/26 + /// + /// @brief Assignment operator. + /// @param[in] hHandle - Handle to be assigned. + /// @return Reference to this object, + // ============================================================================ + TAutoFileHandle& operator=(HANDLE hHandle) + { + if(m_hHandle != hHandle) + { + VERIFY(Close()); + m_hHandle = hHandle; + } + return *this; + } + + // ============================================================================ + /// TAutoFileHandle::operator HANDLE + /// @date 2010/08/26 + /// + /// @brief Retrieves the system handle. + /// @return HANDLE value. + // ============================================================================ + operator HANDLE() + { + return m_hHandle; + } + + // ============================================================================ + /// TAutoFileHandle::Close + /// @date 2010/08/26 + /// + /// @brief Closes the internal handle if needed. + /// @return Result of the CloseHandle() function. + // ============================================================================ + BOOL Close() + { + BOOL bResult = TRUE; + if(m_hHandle != INVALID_HANDLE_VALUE) + { + bResult = CloseHandle(m_hHandle); + m_hHandle = INVALID_HANDLE_VALUE; + } + + return bResult; + } + +private: + HANDLE m_hHandle; ///< System handle +}; + class CTask { public: