AFPSubscriberEventChannel.h
Go to the documentation of this file.00001 /******************************************************************************* 00002 * 00003 * Copyright (c) 2009-2010 Philipp Werner <philipp.werner@st.ovgu.de> 00004 * Michael Schulze <mschulze@ivs.cs.uni-magdeburg.de> 00005 * All rights reserved. 00006 * 00007 * Redistribution and use in source and binary forms, with or without 00008 * modification, are permitted provided that the following conditions 00009 * are met: 00010 * 00011 * * Redistributions of source code must retain the above copyright 00012 * notice, this list of conditions and the following disclaimer. 00013 * 00014 * * Redistributions in binary form must reproduce the above copyright 00015 * notice, this list of conditions and the following disclaimer in 00016 * the documentation and/or other materials provided with the 00017 * distribution. 00018 * 00019 * * Neither the name of the copyright holders nor the names of 00020 * contributors may be used to endorse or promote products derived 00021 * from this software without specific prior written permission. 00022 * 00023 * 00024 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 00025 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 00026 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 00027 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 00028 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00029 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 00030 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 00031 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 00032 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00033 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00034 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00035 * 00036 * 00037 * $Id$ 00038 * 00039 ******************************************************************************/ 00040 00041 00042 #ifndef __AFPSUBSCRIBEREVENTCHANNEL_H_A97131CF417B97__ 00043 #define __AFPSUBSCRIBEREVENTCHANNEL_H_A97131CF417B97__ 00044 00045 00046 #include "mw/afp/Defragmentation.h" 00047 00048 #include "mw/common/Event.h" 00049 #include "mw/common/Subject.h" 00050 #include "mw/api/CallBack.h" 00051 00052 00053 namespace famouso { 00054 namespace mw { 00055 namespace afp { 00056 00057 00058 using famouso::mw::Event; 00059 using famouso::mw::Subject; 00060 00061 00067 template < class SEC, class AFPDC, class EventType = Event > 00068 class AFPSubscriberEventChannel { 00069 00070 /* The order of member declarations is important! The sec has to 00071 * be destructed first to ensure that no callback will happen while 00072 * dp is destructed. That's why dp has to be declared first. 00073 */ 00074 00076 DefragmentationProcessor<AFPDC> dp; 00077 00079 SEC sec; 00080 00084 void incoming_event(famouso::mw::api::SECCallBackData& cbd) { 00085 DefragmentationStep<AFPDC> ds(cbd.data, cbd.length); 00086 00087 dp.process_fragment(ds); 00088 00089 if (ds.event_complete()) { 00090 EventType e(cbd.subject); 00091 e.data = ds.get_event_data(); 00092 e.length = ds.get_event_length(); 00093 00094 if (callback) 00095 callback(e); 00096 00097 dp.event_processed(ds); 00098 } 00099 } 00100 00101 00102 public: 00109 famouso::util::Delegate<const EventType &> callback; 00110 00116 AFPSubscriberEventChannel(const Subject &s, uint16_t mtu) : 00117 dp(mtu), sec(s) { 00118 } 00119 00121 ~AFPSubscriberEventChannel() { 00122 } 00123 00127 void subscribe() { 00128 sec.callback.template bind < typeof(*this), & AFPSubscriberEventChannel<SEC, AFPDC, EventType>::incoming_event > (this); 00129 sec.subscribe(); 00130 } 00131 00135 const Subject &subject() const { 00136 return sec.subject(); 00137 } 00138 }; 00139 00140 00141 } // namespace afp 00142 } // namespace mw 00143 } // namespace famouso 00144 00145 00146 #endif // __AFPSUBSCRIBEREVENTCHANNEL_H_A97131CF417B97__ 00147