OverlayAccess.h

Go to the documentation of this file.
00001 //
00002 // Copyright (C) 2008 Institut fuer Telematik, Universitaet Karlsruhe (TH)
00003 //
00004 // This program is free software; you can redistribute it and/or
00005 // modify it under the terms of the GNU General Public License
00006 // as published by the Free Software Foundation; either version 2
00007 // of the License, or (at your option) any later version.
00008 //
00009 // This program is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 // GNU General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License
00015 // along with this program; if not, write to the Free Software
00016 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00017 //
00018 
00024 #ifndef __OVERLAY_ACCESS_H__
00025 #define __OVERLAY_ACCESS_H__
00026 
00027 
00028 #include <omnetpp.h>
00029 
00030 #include <BaseOverlay.h>
00031 #include <NotificationBoard.h>
00032 
00036 class OverlayAccess
00037 {
00038 public:
00039     
00040     BaseOverlay* get
00041         (cModule* refMod)
00042     {
00043         // obtains the overlay related to the module, taking in account the index in case of SMOHs
00044         BaseOverlay *overlay = NULL;
00045         cModule *tmpMod = refMod;
00046         cModule *tmpParent = NULL; // parent of tmpMod
00047 
00048         // go up from refMod until we get a NotificationBoard module, then we're at root
00049         // this will fail if the overlay is not in a container module!
00050         while (true) {
00051             tmpParent = tmpMod->getParentModule(); // get parent
00052             // search for a "notificationBoard" module
00053             cModule *notBoard = tmpParent->getSubmodule("notificationBoard"); 
00054             // is this a real NotificationBoard? then we're at root
00055             if (dynamic_cast<NotificationBoard*>(notBoard) != NULL) break; 
00056             tmpMod = tmpParent; // else keep going up
00057             if (!tmpParent) throw cRuntimeError("OverlayAccess::get(): Overlay module not found!");
00058         }
00059         // get the overlay container, with the proper index
00060         cModule *overlayContainer = tmpParent->getSubmodule("overlay", tmpMod->getIndex()); 
00061         overlay = dynamic_cast<BaseOverlay*>
00062                 (overlayContainer->gate("appIn")->getNextGate()->getOwnerModule()); // get the contained overlay module
00063         
00064         if (!overlay) throw cRuntimeError("OverlayAccess::get(): Overlay module not found!");
00065         
00066         return overlay;
00067     }
00068 };
00069 
00070 #endif
Generated on Wed May 26 16:21:14 2010 for OverSim by  doxygen 1.6.3