00001 /* 00002 Copyright 2007, 2008, 2009, 2010, 2011 Instituto de Sistemas e Robotica, Instituto Superior Tecnico 00003 00004 This file is part of MeRMaID. 00005 00006 MeRMaID is free software: you can redistribute it and/or modify 00007 it under the terms of the GNU Lesser General Public License as published by 00008 the Free Software Foundation, either version 3 of the License, or 00009 (at your option) any later version. 00010 00011 MeRMaID is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU Lesser General Public License for more details. 00015 00016 You should have received a copy of the GNU Lesser General Public License 00017 along with MeRMaID. If not, see <http://www.gnu.org/licenses/>. 00018 */ 00019 00020 00021 00022 #ifndef __STREAMOPERATIONHANDLERMETHOD_H 00023 #define __STREAMOPERATIONHANDLERMETHOD_H 00024 00025 00026 00027 00028 00029 namespace mermaid 00030 { 00031 namespace support 00032 { 00033 namespace io 00034 { 00035 00036 using boost::shared_ptr; 00037 00038 /** 00039 * @Class StreamOperationHandlerMethodBase StreamOperationHandlerMethod.hpp "StreamOperationHandlerMethod.hpp" 00040 * @Description Base class for all StreamOperationHandlerMethod objects. 00041 * 00042 * This class is needed in order to call StreamOperationHandlerMethod without having to know the specific class used by the template. 00043 * @Author Joao Carreira 00044 */ 00045 class StreamOperationHandlerMethodBase 00046 { 00047 public: 00048 virtual void callHandler (size_t, size_t, const char*, bool) = 0; 00049 virtual ~StreamOperationHandlerMethodBase() {} 00050 }; 00051 00052 00053 /** 00054 * @Class StreamOperationHandlerMethod StreamOperationHandlerMethod.hpp "StreamOperationHandlerMethod.hpp" 00055 * @Description Class that stores a pointer to a method of an object. It holds a pointer to a method suitable for handling io operations replies 00056 * @Author Joao Carreira 00057 */ 00058 template <class o> 00059 class StreamOperationHandlerMethod : public StreamOperationHandlerMethodBase 00060 { 00061 typedef void (o::*STREAM_OPERATION_HANDLER_METHOD) (size_t, size_t, const char*, bool); 00062 public: 00063 00064 /** 00065 * @Description Constructor. 00066 * @Argument object Object instance on which the method shall be called 00067 * @Argument method Method of the object's class 00068 */ 00069 StreamOperationHandlerMethod (o * object, STREAM_OPERATION_HANDLER_METHOD method) { 00070 object_ = object; 00071 method_ = method; 00072 } 00073 00074 /** 00075 * @Description IO Handlers call (read and write) 00076 * @Argument bytesRead The number of bytes read/written 00077 * @Argument requestedBytes The number of bytes requested to be read/written 00078 * @Argument data The data read/written 00079 * @Argument success TRUE if operation was successful, FALSE otherwise 00080 */ 00081 virtual void callHandler (size_t bytesRead, size_t requestedBytes, const char* data, bool success) { 00082 (object_->*method_) (bytesRead, requestedBytes, data, success); 00083 } 00084 00085 /** 00086 * @Description Destructor 00087 */ 00088 virtual ~StreamOperationHandlerMethod() {} 00089 00090 private: 00091 o * object_; 00092 STREAM_OPERATION_HANDLER_METHOD method_; 00093 }; // class StreamOperationHandlerMethod 00094 } // namespace io 00095 } // namespace support 00096 } // namespace mermaid 00097 00098 #endif // __STREAMOPERATIONHANDLERMETHOD_H