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