1 //-----------------------------------------------------------------------------
2 //
3 //	Wait.h
4 //
5 //	Cross-platform abstract base class for objects we
6 //	want to be able to wait for.
7 //
8 //	Copyright (c) 2010 Mal Lansell <mal@lansell.org>
9 //	All rights reserved.
10 //
11 //	SOFTWARE NOTICE AND LICENSE
12 //
13 //	This file is part of OpenZWave.
14 //
15 //	OpenZWave is free software: you can redistribute it and/or modify
16 //	it under the terms of the GNU Lesser General Public License as published
17 //	by the Free Software Foundation, either version 3 of the License,
18 //	or (at your option) any later version.
19 //
20 //	OpenZWave is distributed in the hope that it will be useful,
21 //	but WITHOUT ANY WARRANTY; without even the implied warranty of
22 //	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 //	GNU Lesser General Public License for more details.
24 //
25 //	You should have received a copy of the GNU Lesser General Public License
26 //	along with OpenZWave.  If not, see <http://www.gnu.org/licenses/>.
27 //
28 //-----------------------------------------------------------------------------
29 #ifndef _Wait_H
30 #define _Wait_H
31 
32 #include <list>
33 #include "platform/Ref.h"
34 
35 namespace OpenZWave
36 {
37 	class WaitImpl;
38 
39 	/** \brief Platform-independent definition of Wait objects.
40 	 */
41 	class Wait: public Ref
42 	{
43 		friend class WaitImpl;
44 		friend class ThreadImpl;
45 
46 	public:
47 		enum
48 		{
49 			Timeout_Immediate = 0,
50 			Timeout_Infinite = -1
51 		};
52 
53 		typedef void (*pfnWaitNotification_t)( void* _context );
54 
55 		/**
56 		 * Add a watcher to our object.  The watcher will be triggered
57 		 * by the derived class, when it enters a certain state.
58 		 * \param _callback pointer to the function that will be called when the wait is over.
59 		 * \param _context pointer to custom data that will be sent with the callback.
60 		 */
61 		void AddWatcher( pfnWaitNotification_t _callback, void* _context );
62 
63 		/**
64 		 * Remove a watcher from our object.  Both the _callback and _context pointers
65 		 * must match those used in a previous call to AddWatcher.
66 		 * \param _callback pointer to the function that will be called when the wait is over.
67 		 * \param _context pointer to custom data that will be sent with the callback.
68 		 */
69 		void RemoveWatcher( pfnWaitNotification_t _callback, void* _context );
70 
71 		/**
72 		 * Wait for a single object to become signalled.
73 		 * \param _object pointer to the object to wait on.
74 		 * \param _timeout optional maximum time to wait.  Defaults to -1, which means wait forever.
75 		 * \return zero if the object was signalled, -1 if the wait timed out.
76 		 */
77 		static int32 Single( Wait* _object, int32 _timeout = -1 ){ return Multiple( &_object, 1, _timeout ); }
78 
79 		/**
80 		 * Wait for one of multiple objects to become signalled.  If more than one object is in
81 		 * a signalled state, the lowest array index will be returned.
82 		 * \param _objects array of pointers to objects to wait on.
83 		 * \param _numObjects number of objects in the array.
84 		 * \param _timeout optional maximum time to wait.  Defaults to -1, which means wait forever.
85 		 * \return index into the array of the object that was signalled, -1 if the wait timed out.
86 		 */
87 		static int32 Multiple( Wait** _objects, uint32 _numObjects, int32 _timeout = -1 );
88 
89 	protected:
90 		Wait();
91 		virtual ~Wait();
92 
93 		/**
94 		 * Notify the watchers that the object is signalled.
95 		 */
96 		void Notify();
97 
98 		/**
99 		 * Test whether an object is signalled.
100 		 */
101 		virtual bool IsSignalled() = 0;
102 
103 	private:
104 		Wait( Wait const&	);					// prevent copy
105 		Wait& operator = ( Wait const& );		// prevent assignment
106 
107 		WaitImpl*	m_pImpl;					// Pointer to an object that encapsulates the platform-specific implementation of a Wait object.
108 	};
109 
110 } // namespace OpenZWave
111 
112 #endif //_Wait_H
113 
114