Menu

NetworkAdapter.h

Go to the documentation of this file.
00001 /*******************************************************************************
00002  *
00003  * Copyright (c) 2008-2010 Michael Schulze <mschulze@ivs.cs.uni-magdeburg.de>
00004  * All rights reserved.
00005  *
00006  *    Redistribution and use in source and binary forms, with or without
00007  *    modification, are permitted provided that the following conditions
00008  *    are met:
00009  *
00010  *    * Redistributions of source code must retain the above copyright
00011  *      notice, this list of conditions and the following disclaimer.
00012  *
00013  *    * Redistributions in binary form must reproduce the above copyright
00014  *      notice, this list of conditions and the following disclaimer in
00015  *      the documentation and/or other materials provided with the
00016  *      distribution.
00017  *
00018  *    * Neither the name of the copyright holders nor the names of
00019  *      contributors may be used to endorse or promote products derived
00020  *      from this software without specific prior written permission.
00021  *
00022  *
00023  *    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
00024  *    IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00025  *    TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00026  *    PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00027  *    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00028  *    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00029  *    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00030  *    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00031  *    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00032  *    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00033  *    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00034  *
00035  *
00036  * $Id$
00037  *
00038  ******************************************************************************/
00039 
00040 #ifndef __NetworkAdapter_h__
00041 #define __NetworkAdapter_h__
00042 
00043 #include "mw/nl/DistinctNL.h"
00044 #include "mw/el/EventLayer.h"
00045 #include "mw/api/SubscriberEventChannel.h"
00046 #include "mw/gwl/GatewayEventChannel.h"
00047 #include "mw/common/Event.h"
00048 
00049 namespace famouso {
00050     namespace mw {
00051         namespace nal {
00052 
00061             template < class ANL_A, class ANL_B >
00062             class NetworkAdapter {
00063                     typedef NetworkAdapter< ANL_A, ANL_B> this_type;
00064 
00065                     ANL_A  _ANL_A;
00066                     ANL_B  _ANL_B;
00067                     famouso::mw::nl::DistinctNL *_bnl;
00068 
00069                 protected:
00070 
00074                     struct SNN {
00075                         typename ANL_A::SNN SNN_A;
00076                         typename ANL_B::SNN SNN_B;
00077                     };
00078 
00081                     void init() {
00082                         _ANL_A.init();
00083                         _ANL_B.init();
00084                     }
00085 
00086                 public:
00096                     void publish_to_network_with_id(const SNN &snn, const Event &e, const famouso::mw::nl::DistinctNL *bnl) {
00097                         if (_ANL_A.id() == bnl)
00098                             _ANL_A.publish(snn.SNN_A , e);
00099                         else
00100                             _ANL_B.publish(snn.SNN_B , e);
00101                     }
00102 
00114                     const bool event_from_network_with_id(const famouso::mw::nl::DistinctNL *b) const {
00115                         if ((!_bnl)  || (_bnl == b))
00116                             return true;
00117                         else
00118                             return false;
00119                     }
00120 
00128                     const famouso::mw::nl::DistinctNL * const get_network_id() const {
00129                         return _bnl;
00130                     }
00131 
00132                 protected:
00133 
00141                     void announce(const Subject &s, SNN &snn) {
00142                         _ANL_A.announce(s, snn.SNN_A);
00143                         _ANL_B.announce(s, snn.SNN_B);
00144                     }
00145 
00153                     void publish(const SNN &snn, const Event &e) {
00154                         _ANL_A.publish(snn.SNN_A , e);
00155                         _ANL_B.publish(snn.SNN_B , e);
00156                     }
00157 
00165                     void subscribe(const Subject &s, SNN &snn) {
00166                         _ANL_A.subscribe(s, snn.SNN_A);
00167                         _ANL_B.subscribe(s, snn.SNN_B);
00168                     }
00169 
00183                     int8_t fetch(const SNN &snn, Event &e, const famouso::mw::nl::DistinctNL *bnl) {
00186                         if (_ANL_A.id() == bnl)
00187                             return _ANL_A.fetch(snn.SNN_A, e, bnl);
00188                         else
00189                             return _ANL_B.fetch(snn.SNN_B, e, bnl);
00190                     }
00191 
00197                     void event_process_request(famouso::mw::nl::DistinctNL * const bnl) {
00198                         _bnl = bnl;
00199                         if (_ANL_A.id() == bnl)
00200                             _ANL_A.event_process_request(bnl);
00201                         else
00202                             _ANL_B.event_process_request(bnl);
00203                     }
00204 
00208                     void event_processed() {
00209                         if (_ANL_A.id() == _bnl)
00210                             _ANL_A.event_processed();
00211                         else
00212                             _ANL_B.event_processed();
00213                         _bnl = 0;
00214                     }
00215             };
00216         } // namespace nal
00217     } // namespace mw
00218 } //namespace famouso
00219 
00220 #endif /* __NetworkAdapter_h__ */