Layer.hh 2.36 KB
Newer Older
filatov's avatar
filatov committed
1
2
#ifndef LAYER_HH
#define LAYER_HH
filatov's avatar
filatov committed
3
4
5
6
7
8
9
10
11
12
13
14
#include <string>
#include <map>
#include <vector>

typedef std::map<std::string, std::string> Params;
class OCTETSTRING;

class Layer {
  std::vector<Layer*> upperLayers;
  std::vector<Layer*> lowerLayers;
  public:
    Layer(){}
garciay's avatar
garciay committed
15
16
    virtual ~Layer() {};
    void deleteLayer() {};
filatov's avatar
filatov committed
17
  public:
garciay's avatar
garciay committed
18
19
    void addUpperLayer(Layer*) {};
    void removeUpperLayer(Layer*) {};
filatov's avatar
filatov committed
20

garciay's avatar
garciay committed
21
22
    virtual void sendData(const OCTETSTRING& data, const Params& params) {};
    virtual void receiveData(const OCTETSTRING& data, const Params& info) {};
filatov's avatar
filatov committed
23
24

  protected:
garciay's avatar
garciay committed
25
    void toAllLayers(std::vector<Layer*>&layers, const OCTETSTRING& data, const Params& info) {};
filatov's avatar
filatov committed
26
27
    inline void toAllUpperLayers(const OCTETSTRING& data, const Params& info) { toAllLayers(upperLayers, data, info); }
    inline void toAllLowerLayers(const OCTETSTRING& data, const Params& info) { toAllLayers(upperLayers, data, info); }
filatov's avatar
filatov committed
28
29
30
31
    inline void receiveToAllLayers(const OCTETSTRING& data, const Params& info) { toAllLayers(upperLayers, data, info); }
    inline void sendToAllLayers(const OCTETSTRING& data, const Params& info)  { toAllLayers(lowerLayers, data, info); }
};

filatov's avatar
filatov committed
32

filatov's avatar
filatov committed
33
34
template <typename TPort> class TLayer : public Layer {
  typedef std::vector<TPort*> TPortList;
35
  typedef typename std::vector<TPort*>::iterator TPortListIterator;
filatov's avatar
filatov committed
36

filatov's avatar
filatov committed
37
  TPortList upperPorts;
38
  
filatov's avatar
filatov committed
39
40
41
42
  public:
    TLayer(){}
    void addUpperPort(TPort*);
    void removeUpperPort(TPort*);
43

filatov's avatar
filatov committed
44
45
  protected:
    template <typename TMessage> void toAllUpperPorts(const TMessage& m, const Params& param) {
46
      for(TPortListIterator it=upperPorts.begin(); it<upperPorts.end(); ++it){
filatov's avatar
filatov committed
47
48
49
50
51
        (*it)->receiveMsg(m, param);
      }
    }
};

filatov's avatar
filatov committed
52

filatov's avatar
filatov committed
53
54
55
56
57
58
class LayerFactory {
  public:
   LayerFactory(){}
   virtual Layer * createLayer(const std::string & type, const std::string &  param) = 0;
};

filatov's avatar
filatov committed
59
60
61
62
63
64
65
class LayerStackBuilder {
   typedef std::map<std::string, LayerFactory*> LayerFactoryMap;

   static LayerStackBuilder * _instance;
   std::map<std::string, LayerFactory*> _fs;
  private:
   LayerStackBuilder(); // can not be created manually
filatov's avatar
filatov committed
66
  public:
filatov's avatar
filatov committed
67
68
   static LayerStackBuilder * GetInstance();
   static void RegisterLayerFactory(const std::string & type, LayerFactory * f);
filatov's avatar
filatov committed
69

filatov's avatar
filatov committed
70
  public:
filatov's avatar
filatov committed
71
72
73
74
   void registerLayerFactory(const std::string & type, LayerFactory * f);
   Layer* createLayerStack(const char*);
};

filatov's avatar
filatov committed
75
#endif