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