Branch data Line data Source code
1 : : /*
2 : : * Copyright 2006-2009 Savarese Software Research Corporation
3 : : *
4 : : * Licensed under the Apache License, Version 2.0 (the "License");
5 : : * you may not use this file except in compliance with the License.
6 : : * You may obtain a copy of the License at
7 : : *
8 : : * https://www.savarese.com/software/ApacheLicense-2.0
9 : : *
10 : : * Unless required by applicable law or agreed to in writing, software
11 : : * distributed under the License is distributed on an "AS IS" BASIS,
12 : : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 : : * See the License for the specific language governing permissions and
14 : : * limitations under the License.
15 : : */
16 : :
17 : : /**
18 : : * @file
19 : : * This header defines the ServiceProtocolProcessor class.
20 : : */
21 : :
22 : : #ifndef __SSRC_WSPR_SERVICE_SERVICE_H
23 : : #define __SSRC_WSPR_SERVICE_SERVICE_H
24 : :
25 : : #include <ssrc/wispers/service/protocol.h>
26 : : #include <ssrc/wispers/registry/protocol.h>
27 : :
28 : : #include <ssrc/wisp/service.h>
29 : :
30 : : __BEGIN_NS_SSRC_WSPR_SERVICE
31 : :
32 : : using NS_SSRC_SPREAD::MembershipInfo;
33 : : using NS_SSRC_SPREAD::Message;
34 : : using NS_SSRC_SPREAD::GroupList;
35 : :
36 : : using NS_SSRC_WISP_PROTOCOL::MessageInfo;
37 : :
38 : : using NS_SSRC_WISP_SERVICE::EventLoop;
39 : : using NS_SSRC_WISP_SERVICE::EventHandler;
40 : : using NS_SSRC_WISP_SERVICE::EventInfo;
41 : : using NS_SSRC_WISP_SERVICE::ServiceEventHandler;
42 : : using NS_SSRC_WISP_SERVICE::Service;
43 : : using NS_SSRC_WISP_SERVICE::timeout_handler;
44 : : using NS_SSRC_WISP_SERVICE::timeout_ptr;
45 : : using NS_SSRC_WISP_SERVICE::message_handler_type;
46 : : using NS_SSRC_WISP_SERVICE::message_handler_entry;
47 : : using NS_SSRC_WISP_SERVICE::message_handler_map;
48 : :
49 : : class ServiceProtocolProcessor :
50 : : public
51 : : NS_SSRC_WISP_SERVICE::ServiceProtocolProcessor<ServiceProtocol::packing_traits>
52 : : {
53 : : friend class NS_SSRC_WISP_SERVICE::ServiceProtocolProcessor<packing_traits>;
54 : : typedef NS_SSRC_WISP_SERVICE::ServiceProtocolProcessor<packing_traits> super;
55 : :
56 : : registry::service_type_list _service_types;
57 : :
58 : 15 : void register_service_types(const string & reg) {
59 [ + + ]: 15 : if(_service_types.size() > 0) {
60 : 16 : GroupList dest;
61 [ + - ]: 8 : dest.add(reg);
62 [ + - + - : 8 : if(reg != registry::event_group_register())
+ - + - ]
63 [ + - + - : 8 : dest.add(registry::event_group_register());
+ - ]
64 : : _caller.
65 : : send<registry::CallReregister>(Message::Safe,
66 [ + - ]: 8 : dest, _caller.name(), _service_types);
67 : : }
68 : 15 : }
69 : :
70 : : protected:
71 : : WISP_IMPORT(ServiceProtocol, MessageStop);
72 : : WISP_IMPORT(ServiceProtocol, MessageEchoRequest);
73 : : WISP_IMPORT(ServiceProtocol, MessageReregister);
74 : : WISP_IMPORT(ServiceProtocol, MessageStatusRequest);
75 : : WISP_IMPORT(ServiceProtocol, CallStop);
76 : : WISP_IMPORT(ServiceProtocol, CallEchoReply);
77 : : WISP_IMPORT(ServiceProtocol, CallStatusReply);
78 : :
79 : 14 : virtual void process_request(const MessageStop & msg, const MessageInfo &) {
80 : 14 : stop();
81 : 14 : }
82 : :
83 : 3 : virtual void process_request(const MessageEchoRequest & msg,
84 : : const MessageInfo & msginfo)
85 : : {
86 : : _caller.
87 : 3 : reply<CallEchoReply>(msginfo.sender(), msginfo.token(),
88 : 6 : Message::FIFOSelfDiscard);
89 : 3 : }
90 : :
91 : 1 : virtual void process_request(const MessageReregister & msg,
92 : : const MessageInfo &)
93 : : {
94 : 1 : register_service_types(msg.registry);
95 : 1 : }
96 : :
97 : : virtual properties_ptr get_status();
98 : :
99 : : void process_request(const MessageStatusRequest & msg,
100 : : const MessageInfo & msginfo);
101 : :
102 : 29 : virtual void transition(State state) {
103 : 29 : super::transition(state);
104 [ + + ]: 29 : if(state == Started)
105 [ + - ]: 14 : register_service_types(registry::service_group_registry());
106 : 29 : }
107 : :
108 : : public:
109 : : typedef registry::service_type_list::const_iterator service_type_iterator;
110 : :
111 : 22 : explicit ServiceProtocolProcessor(caller_type & caller) :
112 [ + - ]: 22 : super(caller), _service_types(2)
113 : : {
114 [ + - ]: 22 : _service_types.resize(0);
115 : :
116 [ + - ]: 22 : WISP_SERVICE_REQUEST(MessageStop);
117 [ + - ]: 22 : WISP_SERVICE_REQUEST(MessageEchoRequest);
118 [ + - ]: 22 : WISP_SERVICE_REQUEST(MessageReregister);
119 [ + - ]: 22 : WISP_SERVICE_REQUEST(MessageStatusRequest);
120 : 22 : }
121 : :
122 [ + - - + ]: 22 : virtual ~ServiceProtocolProcessor() { }
123 : :
124 : 13 : void add_service_type(const string & service_type) {
125 : 13 : _service_types.push_back(service_type);
126 : 13 : }
127 : :
128 : 1 : service_type_iterator service_types_begin() {
129 : 1 : return _service_types.begin();
130 : : }
131 : :
132 : 1 : service_type_iterator service_types_end() {
133 : 1 : return _service_types.end();
134 : : }
135 : :
136 : 14 : void start() {
137 [ + - ]: 14 : _caller.join(ServiceProtocol::service_group());
138 : 14 : transition(Starting);
139 : 14 : }
140 : :
141 : : // Services listening for membership messages should wait for self-leave
142 : : // before transitioning to Stopped.
143 : 14 : void stop() {
144 [ + - ]: 14 : _caller.leave(ServiceProtocol::service_group());
145 : 14 : transition(Stopping);
146 : 14 : }
147 : :
148 : 5 : void membership(const MessageInfo & msginfo,
149 : : const MembershipInfo & meminfo)
150 : : {
151 [ + + + - : 12 : if(meminfo.is_self_leave() &&
+ + ]
152 [ + - + - : 7 : msginfo.sender() == ServiceProtocol::service_group())
+ + # # ]
153 : 1 : transition(Stopped);
154 [ + - ]: 4 : else if(state() != Stopping) {
155 : 4 : process_membership_message(msginfo, meminfo);
156 : : }
157 : 5 : }
158 : : };
159 : :
160 : : __END_NS_SSRC_WSPR_SERVICE
161 : :
162 : : #endif
|