Web Wispers 1.2.2 C++ Unit Test Coverage
Current view: top level - ssrc/wispers/service - service.h (source / functions) Hit Total Coverage
Test: Web Wispers 1.2.2 C++ Unit Tests Lines: 54 54 100.0 %
Date: 2012-04-09 Functions: 13 14 92.9 %
Branches: 34 60 56.7 %

           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