summaryrefslogtreecommitdiff
path: root/gpr/source/lib/dng_sdk/dng_abort_sniffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'gpr/source/lib/dng_sdk/dng_abort_sniffer.h')
-rw-r--r--gpr/source/lib/dng_sdk/dng_abort_sniffer.h244
1 files changed, 244 insertions, 0 deletions
diff --git a/gpr/source/lib/dng_sdk/dng_abort_sniffer.h b/gpr/source/lib/dng_sdk/dng_abort_sniffer.h
new file mode 100644
index 0000000..3a2f553
--- /dev/null
+++ b/gpr/source/lib/dng_sdk/dng_abort_sniffer.h
@@ -0,0 +1,244 @@
+/*****************************************************************************/
+// 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
+
+/*****************************************************************************/