LTP GCOV extension - code coverage report
Current view: directory - src/cpp/prod/CORBA - YAOrb.cpp
Test: YAORB-0.2.info
Date: 2006-02-27 Instrumented lines: 89
Code covered: 92.1 % Executed lines: 82

       1                 : //=============================================================================
       2                 : // File <$/src/cpp/prod/CORBA/YAOrb.cpp>
       3                 : // This file is part of YaOrb : Yet Another Object Request Broker,
       4                 : // Copyright (c) 2000-2003, Marc Alff.
       5                 : //
       6                 : // This program is free software; you can redistribute it and/or
       7                 : // modify it under the terms of the GNU General Public License
       8                 : // as published by the Free Software Foundation; either version 2
       9                 : // of the License, or (at your option) any later version.
      10                 : //
      11                 : // This program is distributed in the hope that it will be useful,
      12                 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13                 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14                 : // GNU General Public License for more details.
      15                 : //
      16                 : // You should have received a copy of the GNU General Public License
      17                 : // along with this program; if not, write to the Free Software
      18                 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
      19                 : //
      20                 : //=============================================================================
      21                 : 
      22                 : // Portability
      23                 : #include "yaorb/config.h"
      24                 : #include "src/cpp/prod/port/port_time.h"
      25                 : #include "src/cpp/prod/port/port_stdc.h"
      26                 : #include "src/cpp/prod/port/port_socket.h"
      27                 : #include "src/cpp/prod/port/port_unistd.h"
      28                 : 
      29                 : #include <sys/types.h>
      30                 : #include <sys/select.h>
      31                 : #include <rpc/types.h>
      32                 : #include <stdio.h>
      33                 : 
      34                 : #include <yaorb/CORBA.h>
      35                 : #include <yaorb/YAORB.h>
      36                 : 
      37                 : #include "src/cpp/prod/CORBA/YAOrb.h"
      38                 : #include "src/cpp/prod/CORBA/YARemoteOrb.h"
      39                 : #include "src/cpp/prod/boot/boot.h"
      40                 : #include "src/cpp/prod/tool/DEVELOPMENT.h"
      41                 : #include "src/cpp/prod/tool/Assert.h"
      42                 : #include "src/cpp/prod/protocol/iop/iop.h"
      43                 : #include "src/cpp/prod/protocol/iiop/iiop.h"
      44                 : #include "src/cpp/prod/protocol/cdr/cdr_memory.h"
      45                 : 
      46                 : // Max number of pending connect request on the _listning socket.
      47                 : const int NUMBER_OF_CONNECTIONS = 5 ;
      48                 : 
      49                 : //==============================================================================
      50                 : // SERVICES
      51                 : //==============================================================================
      52                 : #define SERVICE_ROOT_POA             (const char*)"RootPOA"
      53                 : #define SERVICE_POA_CURRENT          (const char*)"POACurrent"
      54                 : #define SERVICE_INTERFACE_REPOSITORY (const char*)"InterfaceRepository"
      55                 : #define SERVICE_NAME_SERVICE         (const char*)"NameService"
      56                 : #define SERVICE_TRADING_SERVICE      (const char*)"TradingService"
      57                 : #define SERVICE_SECURITY_CURRENT     (const char*)"SecurityCurrent"
      58                 : #define SERVICE_TRANSACTION_CURRENT  (const char*)"TransactionCurrent"
      59                 : #define SERVICE_DYN_ANY_FACTORY      (const char*)"DynAnyFactory"
      60                 : 
      61                 : //==============================================================================
      62                 : // YAORB.
      63                 : //==============================================================================
      64                 : 
      65               7 : YAOrb::YAOrb(const char * confFileName)
      66                 :  : _state(OrbState_Running),
      67                 :    _refCount(1),
      68               7 :    _confFileName(confFileName)
      69                 : {
      70                 : }
      71                 : 
      72               1 : YAOrb::~YAOrb()
      73                 : {
      74               1 : }
      75                 : 
      76                 : void
      77               6 : YAOrb::IncRefCount(void)
      78                 : {
      79               6 :    _refCount ++ ;
      80                 : }
      81                 : 
      82                 : void
      83               6 : YAOrb::DecRefCount(void)
      84                 : {
      85               6 :    _refCount -- ;
      86                 : 
      87               6 :    if (_refCount == 0)
      88                 :    {
      89               0 :       delete this ;
      90                 :    }
      91                 : }
      92                 : 
      93                 : static CORBA::Octet convert(char hi, char lo)
      94                 : {
      95                 :    CORBA::Octet result = 0 ;
      96                 : 
      97            1392 :    if ( ('0' <= hi) && (hi <= '9'))
      98                 :    {
      99            1308 :       result = hi - '0' ;
     100                 :    }
     101              84 :    else if (('a' <= hi) && (hi <= 'f'))
     102                 :    {
     103               0 :       result = hi - 'a' + 0x0A ;
     104                 :    }
     105              84 :    else if (('A' <= hi) && (hi <= 'F'))
     106                 :    {
     107              84 :       result = hi - 'A' + 0x0A ;
     108                 :    }
     109                 :    else
     110                 :    {
     111               0 :       NON_DEV("Throw BAD_PARAM") ;
     112                 :    }
     113                 : 
     114                 :    result <<= 4 ;
     115                 : 
     116            1392 :    if ( ('0' <= lo) && (lo <= '9'))
     117                 :    {
     118            1232 :       result += lo - '0' ;
     119                 :    }
     120             160 :    else if (('a' <= lo) && (lo <= 'f'))
     121                 :    {
     122              40 :       result += lo - 'a' + 0x0A ;
     123                 :    }
     124             120 :    else if (('A' <= lo) && (lo <= 'F'))
     125                 :    {
     126             120 :       result += lo - 'A' + 0x0A ;
     127                 :    }
     128                 :    else
     129                 :    {
     130               0 :       NON_DEV("Throw BAD_PARAM") ;
     131                 :    }
     132                 : 
     133                 :    return result ;
     134                 : }
     135                 : 
     136                 : //=============================================================================
     137                 : // Convert between an object reference and a string.
     138                 : // REFERENCE : 99-07-17, section 13.6.6, page 13-21.
     139                 : //=============================================================================
     140                 : 
     141               4 : CORBA::Object_ptr YAOrb::stringToObject(const char* str)
     142                 : {
     143                 :    ASSERT(str != NULL) ;
     144               4 :    int len = strlen(str) ;
     145               4 :    CORBA::Object_var result = CORBA::Object::_nil() ;
     146                 : 
     147                 :    //--------------------------------------------------------------------------
     148                 :    // Sanity checks on the input string
     149                 :    //--------------------------------------------------------------------------
     150                 : 
     151                 :    const int minimum_len = 4 + 2 + 8 ;
     152                 :    const int prefix_len = 4 ;
     153                 :    const char* const prefix_data = "IDL:" ;
     154                 : 
     155               4 :    if (  (len < minimum_len)
     156                 :       || ((len % 2) != 0)
     157                 :       )
     158                 :    {
     159                 :       // minimum length : "IDL:" + endianess (+ padding) + encapsulation
     160                 :       // String should have an even number of hexadecimal characters
     161                 :       return result._retn() ;
     162                 :    }
     163                 : 
     164               4 :    if (strncmp(str, prefix_data, prefix_len) != 0)
     165                 :    {
     166                 :       // String should begin with "IDL:"
     167                 :       return result._retn() ;
     168                 :    }
     169                 : 
     170                 :    //--------------------------------------------------------------------------
     171                 :    // Decode the hexadecimal string representation in memory.
     172                 :    //--------------------------------------------------------------------------
     173                 : 
     174               4 :    int data_len = (len - prefix_len) / 2 ;
     175               4 :    CORBA::Octet *data = new CORBA::Octet[data_len] ;
     176               4 :    const char* str2 = str + prefix_len ;
     177                 :    int index = 0 ;
     178                 :    char hi ;
     179                 :    char lo ;
     180                 : 
     181            1396 :    while (index < data_len)
     182                 :    {
     183            1392 :       hi = *str2 ;
     184                 :       str2 ++ ;
     185            1392 :       lo = *str2 ;
     186            1392 :       str2 ++ ;
     187                 : 
     188            1392 :       data[index] = convert(hi, lo) ;
     189                 : 
     190            1392 :       index ++ ;
     191                 :    }
     192                 : 
     193                 :    //--------------------------------------------------------------------------
     194                 :    // Demangle a GIOP Encapsulation from memory.
     195                 :    //--------------------------------------------------------------------------
     196                 : 
     197               4 :    CDRMemory cdrs(data, data_len, YAORB::CDR_READ) ;
     198                 : 
     199               4 :    cdrs.cdr_ByteOrder() ;
     200                 : 
     201               4 :    GIOPEncapsulation encapsulation ;
     202               4 :    encapsulation.cdr(& cdrs) ;
     203                 : 
     204               4 :    delete [] data ;
     205                 :    data = NULL ;
     206                 : 
     207                 :    //--------------------------------------------------------------------------
     208                 :    // Demangle an IOP::IOR from the encapsulation.
     209                 :    //--------------------------------------------------------------------------
     210                 : 
     211               4 :    data = encapsulation.GetData() ;
     212               4 :    data_len = encapsulation.GetLength() ;
     213                 : 
     214               4 :    CDRMemory cdrs2(data, data_len, YAORB::CDR_READ) ;
     215                 : 
     216               4 :    cdrs2.cdr_ByteOrder() ;
     217               4 :    IOP::IOR ior ;
     218               4 :    ior.cdr(& cdrs2) ;
     219                 : 
     220                 :    //--------------------------------------------------------------------------
     221                 :    // Find an existing object with this IOP::IOR
     222                 :    //--------------------------------------------------------------------------
     223                 : 
     224                 :    CORBA::Boolean isLocal = FALSE ;
     225               4 :    isLocal = IsLocalIOR(ior) ;
     226                 : 
     227               4 :    if (isLocal == TRUE)
     228                 :    {
     229               0 :       result = ResolveLocalIOR(ior) ;
     230                 :    }
     231                 :    else
     232                 :    {
     233               4 :       result = ResolveDistantIOR(ior) ;
     234                 :    }
     235                 : 
     236               4 :    return result._retn() ;
     237                 : }
     238                 : 
     239                 : CORBA::Object_ptr
     240               4 : YAOrb::ResolveDistantIOR(IOP::IOR & ior)
     241                 : {
     242               4 :    CORBA::Object_var result = CORBA::Object::_nil() ;
     243                 : 
     244                 :    //--------------------------------------------------------------------------
     245                 :    // Find where the remote orb is.
     246                 :    //--------------------------------------------------------------------------
     247                 : 
     248               4 :    CORBA::String_var host ;
     249                 :    int port = -1 ;
     250               4 :    GIOPEncapsulation objKey ;
     251                 :    bool iiopFound = false ;
     252                 : 
     253               8 :    int profile_len = ior._profiles.length() ;
     254                 :    int index ;
     255                 : 
     256                 :    CORBA::Octet *data = NULL ;
     257                 :    CORBA::ULong data_len ;
     258                 : 
     259               4 :    for (index = 0 ;
     260                 :         index < profile_len ;
     261                 :         index ++)
     262                 :    {
     263               4 :       const IOP::TaggedProfile & profile = ior._profiles[index] ;
     264               4 :       data = profile._profile_data.GetData() ;
     265               4 :       data_len = profile._profile_data.GetLength() ;
     266                 : 
     267               4 :       CDRMemory cdrs(data, data_len, YAORB::CDR_READ) ;
     268                 : 
     269               4 :       switch(profile._tag)
     270                 :       {
     271                 :          case IOP::TAG_INTERNET_IOP :
     272                 :          {
     273               4 :             IIOP::ProfileBody iiop ;
     274               4 :             cdrs.cdr_ByteOrder() ;
     275               4 :             iiop.cdr(& cdrs) ;
     276                 : 
     277               4 :             host = iiop._host ;
     278               4 :             port = iiop._port ;
     279               4 :             objKey = iiop._object_key ;
     280               4 :             iiopFound = true ;
     281                 :          }
     282                 :          default :
     283                 :          {
     284                 :             // Do **NOT** raise anything.
     285                 :             // Just ignore unsupported transport protocols.
     286                 :          }
     287                 :       }
     288                 :    }
     289                 : 
     290               4 :    if (iiopFound == false)
     291                 :    {
     292               0 :       NON_DEV("Throw exception ?") ;
     293                 :       return result._retn() ;
     294                 :    }
     295                 : 
     296                 :    //--------------------------------------------------------------------------
     297                 :    // Find or create a new orb proxie pointing to the remote orb.
     298                 :    //--------------------------------------------------------------------------
     299                 :    YARemoteOrb *remoteOrb = NULL ;
     300                 : 
     301               4 :    NON_DEV("Hash table for remote orb") ;
     302               4 :    remoteOrb = new YARemoteOrb(host, port) ;
     303                 : 
     304                 :    //--------------------------------------------------------------------------
     305                 :    // Find or create a new proxie pointing to the remote object.
     306                 :    //--------------------------------------------------------------------------
     307                 : 
     308               4 :    const char* id = ior._type_id ;
     309               4 :    YAORB::RepositoryID rep_id(id) ;
     310                 : 
     311               4 :    YAORB::StubInfo* stubInfo = YAORB::StubMgr::FindStubInfo(& rep_id) ;
     312                 : 
     313               4 :    YAORB::Ref ref(remoteOrb, objKey) ;
     314                 : 
     315               4 :    if (stubInfo != NULL)
     316                 :    {
     317               4 :       result = stubInfo->createStub(ref) ;
     318                 :    }
     319                 :    else
     320                 :    {
     321               0 :       NON_DEV("Dynamic Invocation Interface") ;
     322                 :    }
     323                 : 
     324               4 :    return result._retn() ;
     325                 : }
     326                 : 
     327               1 : char* YAOrb::objectToString(CORBA::Object_ptr obj)
     328                 : {
     329               1 :    NON_DEV("objectToString") ;
     330               1 :    char *str = new char[80] ;
     331               1 :    strcpy(str, "DUMMY STRING") ;
     332                 :    return str ;
     333                 : }
     334                 : 
     335                 : CORBA::Boolean
     336                 : YAOrb::readConf(
     337                 :    const char * section,
     338                 :    const char * entry,
     339               4 :    String & value)
     340                 : {
     341                 :    return FALSE ;
     342                 : }
     343                 : 

Generated by: LTP GCOV extension version 1.4