/src/skia/third_party/externals/dng_sdk/source/dng_abort_sniffer.h
Line | Count | Source (jump to first uncovered line) |
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 | 0 | { |
92 | 0 | return fPriority; |
93 | 0 | } |
94 | | |
95 | | /// Setter for priority level. |
96 | | |
97 | | void SetPriority (dng_priority priority) |
98 | 0 | { |
99 | 0 | fPriority = priority; |
100 | 0 | } |
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 | 0 | { |
115 | 0 | Sniff (); |
116 | 0 | } |
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 | 0 | { |
124 | 0 | return false; |
125 | 0 | } |
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 | 0 | { |
184 | 0 | if (fSniffer) |
185 | 0 | fSniffer->StartTask (name, fract); |
186 | 0 | } |
187 | | |
188 | | ~dng_sniffer_task () |
189 | 0 | { |
190 | 0 | if (fSniffer) |
191 | 0 | fSniffer->EndTask (); |
192 | 0 | } |
193 | | |
194 | | /// Check for pending user cancellation or other abort. ThrowUserCanceled |
195 | | /// will be called if one is pending. |
196 | | |
197 | | void Sniff () |
198 | 0 | { |
199 | 0 | dng_abort_sniffer::SniffForAbort (fSniffer); |
200 | 0 | } |
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 | 0 | { |
208 | 0 | if (fSniffer) |
209 | 0 | fSniffer->UpdateProgress (fract); |
210 | 0 | } |
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 | 0 | { |
219 | 0 | UpdateProgress ((real64) done / |
220 | 0 | (real64) total); |
221 | 0 | } |
222 | | |
223 | | /// Signal task completed for progress purposes. |
224 | | |
225 | | void Finish () |
226 | 0 | { |
227 | 0 | UpdateProgress (1.0); |
228 | 0 | } |
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 | | /*****************************************************************************/ |