Menu

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