summaryrefslogtreecommitdiff
path: root/TAO/examples/Event_Comm/Event_Comm_i.h
blob: 34d19972733477a96038380f7264dd38a257146b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/* -*- C++ -*- */
// $Id$

// ============================================================================
//
// = LIBRARY
//    EventComm
//
// = FILENAME
//    Event_Comm_i.h
//
// = DESCRIPTION
//    Class interface for the implementation of the distributed
//    event notification mechanism.
//
// = AUTHOR
//    Douglas C. Schmidt (schmidt@cs.wustl.edu) and Pradeep Gore
//    <pradeep@cs.wustl.edu>
//
// ============================================================================

#ifndef _EVENT_COMM_I_H
#define _EVENT_COMM_I_H

#include "ace/Map_Manager.h"

#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

#include "ace/Synch.h"
#include "ace/SString.h"
#include "Event_CommS.h"
#include "ace/Reactor.h"
#include "ace/Null_Mutex.h"

class ShutdownCallback
{
  // = TITLE
  //   Helper callback class to shutdown the application.
public:
  /// Destructor.
  virtual ~ShutdownCallback (void);

  virtual void close (void) = 0;
  // This method is to be called to shutdown the application.
};

class Consumer_i : public POA_Event_Comm::Consumer
{
  // = TITLE
  //   Defines the implementation class for event <Consumers>.
public:
  // = Initialization and termination methods.
  Consumer_i (void);
  // Constructor.

  ~Consumer_i (void);
  // Destructor.

  void set_reactor (ACE_Reactor *reactor);
  // set the <ACE_Reactor> to use when quitting.

  virtual void push (const Event_Comm::Event & event
                     ACE_ENV_ARG_DECL)
    ACE_THROW_SPEC ((CORBA::SystemException));
  // Pass the <event> to the <Consumer>.

  virtual void disconnect (const char * reason
                           ACE_ENV_ARG_DECL)
    ACE_THROW_SPEC ((CORBA::SystemException));

  // Disconnect the <Consumer> from the <Notifier>, giving it the
  // <reason>.

  void set (ShutdownCallback *_shutdown);
  // Set the Shutdown callback.

private:
  ShutdownCallback *shutdown;
  // The callback to shutdown the consumer application.
};

// Forward reference.
class Consumer_Entry;

class Notifier_i : public POA_Event_Comm::Notifier
{
  // = TITLE
  //   Defines the implementation class for event <Notifiers>.
public:
  enum
  {
    DEFAULT_SIZE = 1024
    // Default max number of Event_Comm::Consumers.
  };

  Notifier_i (size_t size_hint = Notifier_i::DEFAULT_SIZE);
  // Initialize a Notifier_i object with the specified size hint.

  virtual void disconnect (const char *reason
                           ACE_ENV_ARG_DECL)
    ACE_THROW_SPEC ((CORBA::SystemException));
  // Disconnect all the receivers, giving them the <reason>.

  virtual void push (const Event_Comm::Event &event
                     ACE_ENV_ARG_DECL)
    ACE_THROW_SPEC ((CORBA::SystemException));
  // Send the <event> to all the consumers who have subscribed and who
  // match the filtering criteria.

   virtual void subscribe (Event_Comm::Consumer_ptr Consumer,
                           const char * filtering_criteria
                           ACE_ENV_ARG_DECL)
     ACE_THROW_SPEC ((
                      CORBA::SystemException,
                      Event_Comm::Notifier::CannotSubscribe
                      ));
  // Subscribe the <Consumer> to receive events that match
  // <filtering_criteria> applied by the <Notifier>.

 void unsubscribe (Event_Comm::Consumer *consumer,
                    const char *filtering_criteria
                    ACE_ENV_ARG_DECL)
   ACE_THROW_SPEC ((
                    CORBA::SystemException,
                    Event_Comm::Notifier::CannotUnsubscribe
                    ));
  // Unsubscribe the <Consumer>.

private:
  typedef ACE_Map_Manager <Event_Comm::Consumer_ptr, Consumer_Entry *, ACE_Null_Mutex>
          MAP_MANAGER;
  typedef ACE_Map_Iterator <Event_Comm::Consumer_ptr, Consumer_Entry *, ACE_Null_Mutex>
          MAP_ITERATOR;
  typedef ACE_Map_Entry <Event_Comm::Consumer_ptr, Consumer_Entry *>
          MAP_ENTRY;

  MAP_MANAGER map_;
  // Table that maps a <Event_Comm::Consumer *> to a <Consumer_Entry *>.
};

#endif /* _EVENT_COMM_I_H */