Ssrc C++ Binding for Spread 1.0.15 Unit Test Coverage
Current view: top level - ssrc/spread - BaseMessage.h (source / functions) Hit Total Coverage
Test: Ssrc C++/Lua/Perl/Python/Ruby Bindings for Spread 1.0.15 Unit Tests Lines: 33 33 100.0 %
Date: 2017-11-28 00:28:17 Functions: 13 14 92.9 %
Branches: 5 8 62.5 %

           Branch data     Line data    Source code
       1                 :            : /* Copyright 2006 Savarese Software Research Corporation
       2                 :            :  *
       3                 :            :  * Licensed under the Apache License, Version 2.0 (the "License");
       4                 :            :  * you may not use this file except in compliance with the License.
       5                 :            :  * You may obtain a copy of the License at
       6                 :            :  *
       7                 :            :  *     http://www.savarese.com/software/ApacheLicense-2.0
       8                 :            :  *
       9                 :            :  * Unless required by applicable law or agreed to in writing, software
      10                 :            :  * distributed under the License is distributed on an "AS IS" BASIS,
      11                 :            :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      12                 :            :  * See the License for the specific language governing permissions and
      13                 :            :  * limitations under the License.
      14                 :            :  */
      15                 :            : 
      16                 :            : /**
      17                 :            :  * @file
      18                 :            :  * This header defines the BaseMessage class.
      19                 :            :  */
      20                 :            : 
      21                 :            : #ifndef __SSRC_SPREAD_BASE_MESSAGE_H
      22                 :            : #define __SSRC_SPREAD_BASE_MESSAGE_H
      23                 :            : 
      24                 :            : #include <string>
      25                 :            : 
      26                 :            : #include <ssrc/libssrcspread-packages.h>
      27                 :            : 
      28                 :            : // sp.h includes stddef.h, so we need to include it before sp.h in
      29                 :            : // order to ensure it gets skipped while inside the Spread namespace.
      30                 :            : #include <cstddef>
      31                 :            : 
      32                 :            : __BEGIN_NS_SPREAD_INCLUDE
      33                 :            : # include <sp.h>
      34                 :            : 
      35                 :            :   // Convert define to typedef.
      36                 :            : # if defined(int16)
      37                 :            :   typedef int16 foo_int16;
      38                 :            : # undef int16
      39                 :            :   typedef foo_int16 int16;
      40                 :            : # endif
      41                 :            : __END_NS_SPREAD_INCLUDE
      42                 :            : 
      43                 :            : #include <ssrc/spread/Error.h>
      44                 :            : #include <ssrc/spread/GroupList.h>
      45                 :            : 
      46                 :            : __BEGIN_NS_SSRC_SPREAD
      47                 :            : 
      48                 :            : #ifdef LIBSSRCSPREAD_ENABLE_MEMBERSHIP_INFO
      49                 :            : 
      50                 :            : // Forward declaration
      51                 :            : class MembershipInfo;
      52                 :            : 
      53                 :            : #endif
      54                 :            : 
      55                 :            : /**
      56                 :            :  * BaseMessage is an abstract class defining the operations shared in
      57                 :            :  * common by Message and ScatterMessage.  We do not document its
      58                 :            :  * protected members because they are intended only for internal library use.
      59                 :            :  */
      60                 :            : class BaseMessage {
      61                 :            : public:
      62                 :            :   /** Defines the type for 16-bit message type identifiers. */
      63                 :            :   typedef Spread::int16 message_type;
      64                 :            : 
      65                 :            :   /** Defines the type for specifying service types. */
      66                 :            :   typedef Spread::service service_type;
      67                 :            : 
      68                 :            :   /**
      69                 :            :    * Service is not a proper enumeration, but rather a specification
      70                 :            :    * of constants corresponding to the %Spread service type flags.  We
      71                 :            :    * do not document the meaning of these flags here.  See the %Spread
      72                 :            :    * C API documentation to understand their meaning.  We will note,
      73                 :            :    * however, that DropReceive is not a service type, but rather a
      74                 :            :    * flag instructing the %Spread receive functions to truncate
      75                 :            :    * messages and group lists if the buffers are too small.  There
      76                 :            :    * should be no need to use this constant in the API as it is
      77                 :            :    * handled by Mailbox::set_drop_receive.
      78                 :            :    *
      79                 :            :    *
      80                 :            :    */
      81                 :            :   enum Service {
      82                 :            :     Unreliable  = UNRELIABLE_MESS,
      83                 :            :     Reliable    = RELIABLE_MESS,
      84                 :            :     FIFO        = FIFO_MESS,
      85                 :            :     Causal      = CAUSAL_MESS,
      86                 :            :     Agreed      = AGREED_MESS,
      87                 :            :     Safe        = SAFE_MESS,
      88                 :            :     SelfDiscard = SELF_DISCARD,
      89                 :            :     DropReceive = DROP_RECV,
      90                 :            : #define SERVICE_TYPE_DISCARD(s) s ## SelfDiscard = s | SelfDiscard
      91                 :            : 
      92                 :            :     SERVICE_TYPE_DISCARD(Unreliable),
      93                 :            :     SERVICE_TYPE_DISCARD(Reliable),
      94                 :            :     SERVICE_TYPE_DISCARD(FIFO),
      95                 :            :     SERVICE_TYPE_DISCARD(Causal),
      96                 :            :     SERVICE_TYPE_DISCARD(Agreed),
      97                 :            :     SERVICE_TYPE_DISCARD(Safe)
      98                 :            : 
      99                 :            : #undef SERVICE_TYPE_DISCARD
     100                 :            :   };
     101                 :            : 
     102                 :            : private:
     103                 :            : 
     104                 :            : #ifdef LIBSSRCSPREAD_ENABLE_MEMBERSHIP_INFO
     105                 :            : 
     106                 :            :   void get_vs_set_members(const Spread::vs_set_info *vs_set,
     107                 :            :                           GroupList *members, unsigned int offset = 0) const;
     108                 :            : 
     109                 :            : #endif
     110                 :            : 
     111                 :            : protected:
     112                 :            : 
     113                 :            :   message_type _type;
     114                 :            :   service_type _service_type;
     115                 :            :   bool _endian_mismatch;
     116                 :            :   string _sender;
     117                 :            : 
     118                 :            :   /**
     119                 :            :    * Initializes the class with a message type equal to 0, service
     120                 :            :    * type equal to Safe, endian mismatch equal to false, and a
     121                 :            :    * zero-length string for the sender.
     122                 :            :    */
     123                 :         46 :   BaseMessage() :
     124         [ +  - ]:         46 :     _type(0), _service_type(Safe), _endian_mismatch(false), _sender("")
     125                 :         46 :   { }
     126                 :            : 
     127                 :            : #ifdef LIBSSRCSPREAD_ENABLE_MEMBERSHIP_INFO
     128                 :            : 
     129                 :            :   virtual int sp_get_membership_info(Spread::membership_info *info) const = 0;
     130                 :            : 
     131                 :            :   virtual int sp_get_vs_set_members(const Spread::vs_set_info *vs_set,
     132                 :            :                                     Spread::group_type member_names[],
     133                 :            :                                     unsigned int member_names_count) const = 0;
     134                 :            : 
     135                 :            :   virtual int sp_get_vs_sets_info(Spread::vs_set_info *vs_sets,
     136                 :            :                                   unsigned int num_vs_sets,
     137                 :            :                                   unsigned int *index) const = 0;
     138                 :            : 
     139                 :            : #endif
     140                 :            : 
     141                 :            : public:
     142                 :            : 
     143                 :            :   /** Virtual destructor. */
     144                 :         46 :   virtual ~BaseMessage() { }
     145                 :            : 
     146                 :            :   /**
     147                 :            :    * Returns the number of bytes in the message.
     148                 :            :    *
     149                 :            :    * @return The number of bytes in the message.
     150                 :            :    */
     151                 :            :   virtual unsigned int size() const = 0;
     152                 :            : 
     153                 :            :   /** Clears the message for reuse, resetting its size to zero. */
     154                 :            :   virtual void clear() = 0;
     155                 :            : 
     156                 :            : #ifdef LIBSSRCSPREAD_ENABLE_MEMBERSHIP_INFO
     157                 :            : 
     158                 :            :   void get_membership_info(MembershipInfo & info) const SSRC_DECL_THROW(Error);
     159                 :            : 
     160                 :            : #endif
     161                 :            : 
     162                 :            :   /**
     163                 :            :    * Sets the service type of the message.
     164                 :            :    *
     165                 :            :    * @param service The service type of the message.
     166                 :            :    */
     167                 :         33 :   void set_service(const service_type service) {
     168                 :         33 :     _service_type = service;
     169                 :         33 :   }
     170                 :            : 
     171                 :            :   /**
     172                 :            :    * Returns the service type requested (for sends) or sent under (for
     173                 :            :    * receives) of the message.
     174                 :            :    *
     175                 :            :    * @return The service type of the message.
     176                 :            :    */
     177                 :         46 :   service_type service() const {
     178                 :         46 :     return _service_type;
     179                 :            :   }
     180                 :            : 
     181                 :            :   /**
     182                 :            :    * Sets the message type identifier.
     183                 :            :    * @param type The new message type.
     184                 :            :    */
     185                 :         32 :   void set_type(const message_type type) {
     186                 :         32 :     _type = type;
     187                 :         32 :   }
     188                 :            : 
     189                 :            :   /**
     190                 :            :    * Returns the type of the message.
     191                 :            :    * @return The type of the message.
     192                 :            :    */
     193                 :         28 :   message_type type() const {
     194                 :         28 :     return _type;
     195                 :            :   }
     196                 :            : 
     197                 :            :   /**
     198                 :            :    * Sets the message sender.
     199                 :            :    * @param sender The message sender.
     200                 :            :    */
     201                 :         23 :   void set_sender(const string & sender) {
     202                 :         23 :     _sender = sender;
     203                 :         23 :   }
     204                 :            : 
     205                 :            :   /**
     206                 :            :    * Returns the message sender.  This only has meaning for received messages.
     207                 :            :    * @return The message sender.
     208                 :            :    */
     209                 :          8 :   const string & sender() const {
     210                 :          8 :     return _sender;
     211                 :            :   }
     212                 :            : 
     213                 :            :   /**
     214                 :            :    * Sets the endian mismatch flag to the specified value.
     215                 :            :    * @param mismatch The mismatch value.
     216                 :            :    */
     217                 :         23 :   void set_endian_mismatch(const bool mismatch = true) {
     218                 :         23 :     _endian_mismatch = mismatch;
     219                 :         23 :   }
     220                 :            : 
     221                 :            :   /**
     222                 :            :    * Returns true if there is an endian mismatch between sender and receiver,
     223                 :            :    * false otherwise.  This only has meaning for received messages.
     224                 :            :    * @return true if there is an endian mismatch between sender and receiver,
     225                 :            :    * false otherwise.
     226                 :            :    */
     227                 :         13 :   bool endian_mismatch() const {
     228                 :         13 :     return _endian_mismatch;
     229                 :            :   }
     230                 :            : 
     231                 :            :   /** Sets the service type to BaseMessage::Agreed.  */
     232                 :            :   void set_agreed() {
     233                 :            :     set_service(Agreed);
     234                 :            :   }
     235                 :            : 
     236                 :            :   /**
     237                 :            :    * Returns true if service type is BaseMessage::Agreed, false otherwise.
     238                 :            :    * @return true if service type is BaseMessage::Agreed, false otherwise.
     239                 :            :    */
     240                 :            :   bool is_agreed() const {
     241                 :            :     return Is_agreed_mess(service());
     242                 :            :   }
     243                 :            : 
     244                 :            :   /** Sets the service type to BaseMessage::Causal.  */
     245                 :            :   void set_causal() {
     246                 :            :     set_service(Causal);
     247                 :            :   }
     248                 :            : 
     249                 :            :   /**
     250                 :            :    * Returns true if service type is BaseMessage::Causal, false otherwise.
     251                 :            :    * @return true if service type is BaseMessage::Causal, false otherwise.
     252                 :            :    */
     253                 :            :   bool is_causal() const {
     254                 :            :     return Is_causal_mess(service());
     255                 :            :   }
     256                 :            : 
     257                 :            :   /** Sets the service type to BaseMessage::FIFO.  */
     258                 :            :   void set_fifo() {
     259                 :            :     set_service(FIFO);
     260                 :            :   }
     261                 :            : 
     262                 :            :   /**
     263                 :            :    * Returns true if service type is BaseMessage::FIFO, false otherwise.
     264                 :            :    * @return true if service type is BaseMessage::FIFO, false otherwise.
     265                 :            :    */
     266                 :            :   bool is_fifo() const {
     267                 :            :     return Is_fifo_mess(service());
     268                 :            :   }
     269                 :            : 
     270                 :            :   /** Sets the service type to BaseMessage::Reliable.  */
     271                 :            :   void set_reliable() {
     272                 :            :     set_service(Reliable);
     273                 :            :   }
     274                 :            : 
     275                 :            :   /**
     276                 :            :    * Returns true if service type is BaseMessage::Reliable, false otherwise.
     277                 :            :    * @return true if service type is BaseMessage::Reliable, false otherwise.
     278                 :            :    */
     279                 :            :   bool is_reliable() const {
     280                 :            :     return Is_reliable_mess(service());
     281                 :            :   }
     282                 :            : 
     283                 :            :   /** Sets the service type to BaseMessage::Unreliable.  */
     284                 :            :   void set_unreliable() {
     285                 :            :     set_service(Unreliable);
     286                 :            :   }
     287                 :            : 
     288                 :            :   /**
     289                 :            :    * Returns true if service type is BaseMessage::Unreliable, false otherwise.
     290                 :            :    * @return true if service type is BaseMessage::Unreliable, false otherwise.
     291                 :            :    */
     292                 :            :   bool is_unreliable() const {
     293                 :            :     return Is_unreliable_mess(service());
     294                 :            :   }
     295                 :            : 
     296                 :            :   /** Sets the service type to BaseMessage::Safe.  */
     297                 :            :   void set_safe() {
     298                 :            :     set_service(Safe);
     299                 :            :   }
     300                 :            : 
     301                 :            :   /**
     302                 :            :    * Returns true if service type is BaseMessage::Safe, false otherwise.
     303                 :            :    * @return true if service type is BaseMessage::Safe, false otherwise.
     304                 :            :    */
     305                 :            :   bool is_safe() const {
     306                 :            :     return Is_safe_mess(service());
     307                 :            :   }
     308                 :            : 
     309                 :            :   /**
     310                 :            :    * Adds or removes the BaseMessage::SelfDiscard flag to or from the
     311                 :            :    * service type.
     312                 :            :    *
     313                 :            :    * @param discard true to set the BaseMessage::SelfDiscard flag, false
     314                 :            :    * to remove it.
     315                 :            :    */
     316                 :          2 :   void set_self_discard(const bool discard = true) {
     317                 :          2 :     _service_type |= SelfDiscard;
     318         [ +  + ]:          2 :     if(!discard)
     319                 :          1 :       _service_type ^= SelfDiscard;
     320                 :          2 :   }
     321                 :            : 
     322                 :            :   /**
     323                 :            :    * Returns true if service type has the BaseMessage::SelfDiscard flag set,
     324                 :            :    * false otherwise.
     325                 :            :    * @return true if service type has the BaseMessage::SelfDiscard flag set,
     326                 :            :    * false otherwise.
     327                 :            :    */
     328                 :          3 :   bool is_self_discard() const {
     329                 :          3 :     return Is_self_discard(service());
     330                 :            :   }
     331                 :            : 
     332                 :            :   /**
     333                 :            :    * Returns true if this is a regular data (as opposed to membership)
     334                 :            :    * message, false otherwise.
     335                 :            :    * @return true if this is a regular message, false otherwise.
     336                 :            :    */
     337                 :            :   bool is_regular() const {
     338                 :            :     return Is_regular_mess(service());
     339                 :            :   }
     340                 :            : 
     341                 :            :   /**
     342                 :            :    * Returns true if this is a membership message, false otherwise.
     343                 :            :    * @return true if this is a membership message, false otherwise.
     344                 :            :    */
     345                 :          4 :   bool is_membership() const {
     346   [ +  -  +  - ]:          4 :     return Is_membership_mess(service());
     347                 :            :   }
     348                 :            : };
     349                 :            : 
     350                 :            : __END_NS_SSRC_SPREAD
     351                 :            : 
     352                 :            : #endif