/*****************************************************************************/ // Copyright 2006-2008 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in // accordance with the terms of the Adobe license agreement accompanying it. /*****************************************************************************/ /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_abort_sniffer.h#2 $ */ /* $DateTime: 2012/07/11 10:36:56 $ */ /* $Change: 838485 $ */ /* $Author: tknoll $ */ /** \file * Classes supporting user cancellation and progress tracking. */ /*****************************************************************************/ #ifndef __dng_abort_sniffer__ #define __dng_abort_sniffer__ /*****************************************************************************/ #include "dng_flags.h" #include "dng_types.h" /*****************************************************************************/ /// \brief Thread priority level. enum dng_priority { dng_priority_low, dng_priority_medium, dng_priority_high, dng_priority_count, dng_priority_minimum = dng_priority_low, dng_priority_maximum = dng_priority_high }; /*****************************************************************************/ /// \brief Convenience class for setting thread priority level to minimum. class dng_set_minimum_priority { private: dng_priority fPriority; public: dng_set_minimum_priority (dng_priority priority); ~dng_set_minimum_priority (); }; /*****************************************************************************/ /** \brief Class for signaling user cancellation and receiving progress updates. * * DNG SDK clients should derive a host application specific implementation * from this class. */ class dng_abort_sniffer { friend class dng_sniffer_task; private: dng_priority fPriority; public: dng_abort_sniffer (); virtual ~dng_abort_sniffer (); /// Getter for priority level. dng_priority Priority () const { return fPriority; } /// Setter for priority level. void SetPriority (dng_priority priority) { fPriority = priority; } /// Check for pending user cancellation or other abort. ThrowUserCanceled /// will be called if one is pending. This static method is provided as a /// convenience for quickly testing for an abort and throwing an exception /// if one is pending. /// \param sniffer The dng_sniffer to test for a pending abort. Can be NULL, /// in which case there an abort is never signalled. static void SniffForAbort (dng_abort_sniffer *sniffer); // A way to call Sniff while bypassing the priority wait. void SniffNoPriorityWait () { Sniff (); } // Specifies whether or not the sniffer may be called by multiple threads // in parallel. Default result is false. Subclass must override to return // true. virtual bool ThreadSafe () const { return false; } protected: /// Should be implemented by derived classes to check for an user /// cancellation. virtual void Sniff () = 0; /// Signals the start of a named task withn processing in the DNG SDK. /// Tasks may be nested. /// \param name of the task /// \param fract Percentage of total processing this task is expected to /// take. From 0.0 to 1.0 . virtual void StartTask (const char *name, real64 fract); /// Signals the end of the innermost task that has been started. virtual void EndTask (); /// Signals progress made on current task. /// \param fract percentage of processing completed on current task. /// From 0.0 to 1.0 . virtual void UpdateProgress (real64 fract); }; /******************************************************************************/ /// \brief Class to establish scope of a named subtask in DNG processing. /// /// Instances of this class are intended to be stack allocated. class dng_sniffer_task { private: dng_abort_sniffer *fSniffer; public: /// Inform a sniffer of a subtask in DNG processing. /// \param sniffer The sniffer associated with the host on which this /// processing is occurring. /// \param name The name of this subtask as a NUL terminated string. /// \param fract Percentage of total processing this task is expected /// to take, from 0.0 to 1.0 . dng_sniffer_task (dng_abort_sniffer *sniffer, const char *name = NULL, real64 fract = 0.0) : fSniffer (sniffer) { if (fSniffer) fSniffer->StartTask (name, fract); } ~dng_sniffer_task () { if (fSniffer) fSniffer->EndTask (); } /// Check for pending user cancellation or other abort. ThrowUserCanceled /// will be called if one is pending. void Sniff () { dng_abort_sniffer::SniffForAbort (fSniffer); } /// Update progress on this subtask. /// \param fract Percentage of processing completed on current task, /// from 0.0 to 1.0 . void UpdateProgress (real64 fract) { if (fSniffer) fSniffer->UpdateProgress (fract); } /// Update progress on this subtask. /// \param done Amount of task completed in arbitrary integer units. /// \param total Total size of task in same arbitrary integer units as done. void UpdateProgress (uint32 done, uint32 total) { UpdateProgress ((real64) done / (real64) total); } /// Signal task completed for progress purposes. void Finish () { UpdateProgress (1.0); } private: // Hidden copy constructor and assignment operator. dng_sniffer_task (const dng_sniffer_task &task); dng_sniffer_task & operator= (const dng_sniffer_task &task); }; /*****************************************************************************/ #endif /*****************************************************************************/