summaryrefslogtreecommitdiff
path: root/cpp/src/IceStorm/Subscriber.h
blob: 510a43752dd58a58319f3ba05a9143a802aa2a17 (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
// **********************************************************************
//
// Copyright (c) 2003-2006 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************

#ifndef SUBSCRIBER_H
#define SUBSCRIBER_H

#include <IceUtil/Handle.h>
#include <IceUtil/Shared.h>
#include <IceUtil/Mutex.h>
#include <Ice/CommunicatorF.h>
#include <Ice/Identity.h>

namespace IceStorm
{

//
// Forward declarations.
//
class TraceLevels;
typedef IceUtil::Handle<TraceLevels> TraceLevelsPtr;

class SubscriberFactory;
typedef IceUtil::Handle<SubscriberFactory> SubscriberFactoryPtr;

class Event;
typedef IceUtil::Handle<Event> EventPtr;

class QueuedProxy;
typedef IceUtil::Handle<QueuedProxy> QueuedProxyPtr;

//
// Subscriber interface.
//
class Subscriber : public virtual IceUtil::Shared
{
public:

    Subscriber(const SubscriberFactoryPtr&, const Ice::CommunicatorPtr&,
	       const TraceLevelsPtr&, const QueuedProxyPtr&);
    ~Subscriber();

    virtual bool persistent() const = 0;

    //
    // Return true if the Subscriber is not active, false otherwise.
    //
    bool inactive() const;

    //
    // Retrieve true if the Subscriber is in the error state, false
    // otherwise.
    //
    bool error() const;

    //
    // Retrieve the identity of the Subscriber.
    //
    Ice::Identity id() const;

    //
    // Activate. Called after any other subscribers with the same
    // identity have been deactivated.
    //
    virtual void activate();

    //
    // Unsubscribe. Mark the state as Unsubscribed.
    //
    virtual void unsubscribe();

    //
    // Unsubscribe. Mark the state as Replaced.
    //
    virtual void replace();

    //
    // Publish the given event. Mark the state as Error in the event of
    // a problem.
    //
    virtual void publish(const EventPtr&) = 0;

protected:

    // Immutable
    const SubscriberFactoryPtr _factory;
    const std::string _desc;
    const TraceLevelsPtr _traceLevels; 
    const QueuedProxyPtr _obj;

    //
    // Subscriber state.
    //
    enum State
    {
	//
	// The Subscriber is active.
	//
	StateActive,
	//
	// The Subscriber encountered an error during event
	// transmission.
	//
	StateError,
	//
	// The Subscriber has been unsubscribed.
	//
	StateUnsubscribed,
	//
	// The Subscriber has been replaced.
	//
	StateReplaced
    };

    IceUtil::Mutex _stateMutex;
    State _state;
};

typedef IceUtil::Handle<Subscriber> SubscriberPtr;

} // End namespace IceStorm

#endif