Menu

Gateway.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 __Gateway_h__
00041 #define __Gateway_h__
00042 
00043 #include "debug.h"
00044 #include "mw/nl/DistinctNL.h"
00045 #include "mw/el/EventLayer.h"
00046 #include "mw/api/SubscriberEventChannel.h"
00047 #include "mw/gwl/GatewayEventChannel.h"
00048 #include "mw/common/Event.h"
00049 #include "object/Storage.h"
00050 
00051 namespace famouso {
00052     namespace mw {
00053         namespace gwl {
00054 
00067             template < class ECH, template < typename > class Storage=object::Storage >
00068             class Gateway  : private famouso::mw::api::SubscriberEventChannel<ECH> {
00069                     typedef GatewayEventChannel<ECH> GEC;
00070                     typedef typename Storage<GEC>::depot depot;
00071 
00072                     depot gecs;
00073                 public:
00074 
00077                     Gateway() : famouso::mw::api::SubscriberEventChannel< ECH > (famouso::mw::Subject("SUBSCRIBE")) {
00078                         this->subscribe();
00079                         this->callback.template bind<Gateway, &Gateway::subscribe_from_network>(this);
00080                     }
00081 
00082                 private:
00083 
00084                     void subscribe_from_network(famouso::mw::api::SECCallBackData& cbd) {
00085                         if (this->ech().get_network_id() == 0) {
00086                             ::logging::log::emit()
00087                                 << PROGMEMSTRING("Lokal Subscription")
00088                                 << ::logging::log::endl;
00089                         } else {
00090                             if (this->subject() == famouso::mw::Subject(cbd.data)) {
00091                                 ::logging::log::emit()
00092                                     << PROGMEMSTRING("Subscribe Message of another gateway")
00093                                     << ::logging::log::endl;
00094                             } else {
00095                                 typename depot::iterator ii = gecs.begin();
00096                                 while (ii != gecs.end()) {
00098                                     if ((*ii).subject() == famouso::mw::Subject(cbd.data)) {
00099                                         ::logging::log::emit()
00100                                             << PROGMEMSTRING("forward channel exits")
00101                                             << ::logging::log::endl;
00102                                         return;
00103                                     }
00104                                     ii++;
00105                                 }
00106                                 // hier muss ein neuer rein
00107                                 GEC *p=gecs.newElement();
00108                                 if ( p ) {
00109                                     ::logging::log::emit()
00110                                         << PROGMEMSTRING("Generate a new proxy channel for forwarding events of Subject ")
00111                                         << cbd.data << ::logging::log::endl;
00112                                     new(p) GEC(famouso::mw::Subject(cbd.data), this->ech().get_network_id());
00113                                 }
00114                             }
00115                         }
00116                     }
00117             };
00118         } // namespace gwl
00119     } // namespace mw
00120 } //namespace famouso
00121 
00122 #endif /* __Gateway_h__ */