Home | History | Annotate | Download | only in source
      1 /*****************************************************************************/
      2 // Copyright 2006-2008 Adobe Systems Incorporated
      3 // All Rights Reserved.
      4 //
      5 // NOTICE:  Adobe permits you to use, modify, and distribute this file in
      6 // accordance with the terms of the Adobe license agreement accompanying it.
      7 /*****************************************************************************/
      8 
      9 /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_abort_sniffer.h#2 $ */
     10 /* $DateTime: 2012/07/11 10:36:56 $ */
     11 /* $Change: 838485 $ */
     12 /* $Author: tknoll $ */
     13 
     14 /** \file
     15  * Classes supporting user cancellation and progress tracking.
     16  */
     17 
     18 /*****************************************************************************/
     19 
     20 #ifndef __dng_abort_sniffer__
     21 #define __dng_abort_sniffer__
     22 
     23 /*****************************************************************************/
     24 
     25 #include "dng_flags.h"
     26 #include "dng_types.h"
     27 
     28 /*****************************************************************************/
     29 
     30 /// \brief Thread priority level.
     31 
     32 enum dng_priority
     33 	{
     34 
     35 	dng_priority_low,
     36 	dng_priority_medium,
     37 	dng_priority_high,
     38 
     39 	dng_priority_count,
     40 
     41 	dng_priority_minimum = dng_priority_low,
     42 	dng_priority_maximum = dng_priority_high
     43 
     44 	};
     45 
     46 /*****************************************************************************/
     47 
     48 /// \brief Convenience class for setting thread priority level to minimum.
     49 
     50 class dng_set_minimum_priority
     51 	{
     52 
     53 	private:
     54 
     55 		dng_priority fPriority;
     56 
     57 	public:
     58 
     59 		dng_set_minimum_priority (dng_priority priority);
     60 
     61 		~dng_set_minimum_priority ();
     62 
     63 	};
     64 
     65 /*****************************************************************************/
     66 
     67 /** \brief Class for signaling user cancellation and receiving progress updates.
     68  *
     69  * DNG SDK clients should derive a host application specific implementation
     70  * from this class.
     71  */
     72 
     73 class dng_abort_sniffer
     74 	{
     75 
     76 	friend class dng_sniffer_task;
     77 
     78 	private:
     79 
     80 		dng_priority fPriority;
     81 
     82 	public:
     83 
     84 		dng_abort_sniffer ();
     85 
     86 		virtual ~dng_abort_sniffer ();
     87 
     88 		/// Getter for priority level.
     89 
     90 		dng_priority Priority () const
     91 			{
     92 			return fPriority;
     93 			}
     94 
     95 		/// Setter for priority level.
     96 
     97 		void SetPriority (dng_priority priority)
     98 			{
     99 			fPriority = priority;
    100 			}
    101 
    102 		/// Check for pending user cancellation or other abort. ThrowUserCanceled
    103 		/// will be called if one is pending. This static method is provided as a
    104 		/// convenience for quickly testing for an abort and throwing an exception
    105 		/// if one is pending.
    106 		/// \param sniffer The dng_sniffer to test for a pending abort. Can be NULL,
    107 		/// in which case there an abort is never signalled.
    108 
    109 		static void SniffForAbort (dng_abort_sniffer *sniffer);
    110 
    111 		// A way to call Sniff while bypassing the priority wait.
    112 
    113 		void SniffNoPriorityWait ()
    114 			{
    115 			Sniff ();
    116 			}
    117 
    118 		// Specifies whether or not the sniffer may be called by multiple threads
    119 		// in parallel. Default result is false. Subclass must override to return
    120 		// true.
    121 
    122 		virtual bool ThreadSafe () const
    123 			{
    124 			return false;
    125 			}
    126 
    127 	protected:
    128 
    129 		/// Should be implemented by derived classes to check for an user
    130 		/// cancellation.
    131 
    132 		virtual void Sniff () = 0;
    133 
    134 		/// Signals the start of a named task withn processing in the DNG SDK.
    135 		/// Tasks may be nested.
    136 		/// \param name of the task
    137 		/// \param fract Percentage of total processing this task is expected to
    138 		/// take. From 0.0 to 1.0 .
    139 
    140 		virtual void StartTask (const char *name,
    141 								real64 fract);
    142 
    143 		/// Signals the end of the innermost task that has been started.
    144 
    145 		virtual void EndTask ();
    146 
    147 		/// Signals progress made on current task.
    148 		/// \param fract percentage of processing completed on current task.
    149 		/// From 0.0 to 1.0 .
    150 
    151 		virtual void UpdateProgress (real64 fract);
    152 
    153 	};
    154 
    155 /******************************************************************************/
    156 
    157 /// \brief Class to establish scope of a named subtask in DNG processing.
    158 ///
    159 /// Instances of this class are intended to be stack allocated.
    160 
    161 class dng_sniffer_task
    162 	{
    163 
    164 	private:
    165 
    166 		dng_abort_sniffer *fSniffer;
    167 
    168 	public:
    169 
    170 		/// Inform a sniffer of a subtask in DNG processing.
    171 		/// \param sniffer The sniffer associated with the host on which this
    172 		/// processing is occurring.
    173 		/// \param name The name of this subtask as a NUL terminated string.
    174 		/// \param fract Percentage of total processing this task is expected
    175 		/// to take, from 0.0 to 1.0 .
    176 
    177 		dng_sniffer_task (dng_abort_sniffer *sniffer,
    178 					      const char *name = NULL,
    179 					      real64 fract = 0.0)
    180 
    181 			:	fSniffer (sniffer)
    182 
    183 			{
    184 			if (fSniffer)
    185 				fSniffer->StartTask (name, fract);
    186 			}
    187 
    188 		~dng_sniffer_task ()
    189 			{
    190 			if (fSniffer)
    191 				fSniffer->EndTask ();
    192 			}
    193 
    194 		/// Check for pending user cancellation or other abort. ThrowUserCanceled
    195 		/// will be called if one is pending.
    196 
    197 		void Sniff ()
    198 			{
    199 			dng_abort_sniffer::SniffForAbort (fSniffer);
    200 			}
    201 
    202 		/// Update progress on this subtask.
    203 		/// \param fract Percentage of processing completed on current task,
    204 		/// from 0.0 to 1.0 .
    205 
    206 		void UpdateProgress (real64 fract)
    207 			{
    208 			if (fSniffer)
    209 				fSniffer->UpdateProgress (fract);
    210 			}
    211 
    212 		/// Update progress on this subtask.
    213 		/// \param done Amount of task completed in arbitrary integer units.
    214 		/// \param total Total size of task in same arbitrary integer units as done.
    215 
    216 		void UpdateProgress (uint32 done,
    217 							 uint32 total)
    218 			{
    219 			UpdateProgress ((real64) done /
    220 							(real64) total);
    221 			}
    222 
    223 		/// Signal task completed for progress purposes.
    224 
    225 		void Finish ()
    226 			{
    227 			UpdateProgress (1.0);
    228 			}
    229 
    230 	private:
    231 
    232 		// Hidden copy constructor and assignment operator.
    233 
    234 		dng_sniffer_task (const dng_sniffer_task &task);
    235 
    236 		dng_sniffer_task & operator= (const dng_sniffer_task &task);
    237 
    238 	};
    239 
    240 /*****************************************************************************/
    241 
    242 #endif
    243 
    244 /*****************************************************************************/
    245