⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 giopendpoint.cc

📁 编译工具
💻 CC
字号:
// -*- Mode: C++; -*-//                            Package   : omniORB// giopEndpoint.cc            Created on: 29 Mar 2001//                            Author    : Sai Lai Lo (sll)////    Copyright (C) 2001 AT&T Laboratories Cambridge////    This file is part of the omniORB library////    The omniORB library is free software; you can redistribute it and/or//    modify it under the terms of the GNU Library General Public//    License as published by the Free Software Foundation; either//    version 2 of the License, or (at your option) any later version.////    This library is distributed in the hope that it will be useful,//    but WITHOUT ANY WARRANTY; without even the implied warranty of//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU//    Library General Public License for more details.////    You should have received a copy of the GNU Library General Public//    License along with this library; if not, write to the Free//    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA//    02111-1307, USA////// Description://	*** PROPRIETORY INTERFACE ***///*  $Log: giopEndpoint.cc,v $  Revision 1.1.2.17  2005/09/05 14:31:08  dgrisby  SSL transport extensions from Jon Biggar; SSL command line options.  Revision 1.1.2.16  2004/02/11 18:33:20  dgrisby  Windows / MSVC 7 fixes.  Revision 1.1.2.15  2003/11/06 10:19:19  dgrisby  Remove transports from linked list when they are deleted.  Revision 1.1.2.14  2003/05/22 13:41:41  dgrisby  HPUX patches.  Revision 1.1.2.13  2002/09/08 21:58:55  dgrisby  Support for MSVC 7. (Untested.)  Revision 1.1.2.12  2002/03/11 12:21:07  dpg1  ETS things.  Revision 1.1.2.11  2001/08/24 16:45:42  sll  Switch to use Winsock 2. Moved winsock initialisation to this module.  Revision 1.1.2.10  2001/08/23 16:00:50  sll  Added method in giopTransportImpl to return the addresses of the host  interfaces.  Revision 1.1.2.9  2001/08/21 11:02:14  sll  orbOptions handlers are now told where an option comes from. This  is necessary to process DefaultInitRef and InitRef correctly.  Revision 1.1.2.8  2001/08/17 17:12:36  sll  Modularise ORB configuration parameters.  Revision 1.1.2.7  2001/08/08 15:57:45  sll  Allows something like giop:unix: to be used.  Revision 1.1.2.6  2001/07/31 16:16:25  sll  New transport interface to support the monitoring of active connections.  Revision 1.1.2.5  2001/07/26 16:37:21  dpg1  Make sure static initialisers always run.  Revision 1.1.2.4  2001/07/25 14:22:02  dpg1  Same old static initialiser problem, this time with transports.  Revision 1.1.2.3  2001/07/13 15:13:32  sll  giopConnection is now reference counted.  Revision 1.1.2.2  2001/06/13 20:13:15  sll  Minor updates to make the ORB compiles with MSVC++.  Revision 1.1.2.1  2001/04/18 18:10:51  sll  Big checkin with the brand new internal APIs.*/#include <omniORB4/CORBA.h>#include <omniORB4/omniTransport.h>#include <omniORB4/giopEndpoint.h>#include <omniORB4/linkHacks.h>#include <initialiser.h>#include <orbOptions.h>#include <orbParameters.h>#include <SocketCollection.h>#include <stdio.h>//// Make sure built-in transports are always linkedOMNI_FORCE_LINK(tcpTransportImpl);OMNI_NAMESPACE_BEGIN(omni)////////////////////////////////////////////////////////////////////////static giopTransportImpl*& implHead() {  static giopTransportImpl* head_ = 0;  return head_;}////////////////////////////////////////////////////////////////////////staticgiopTransportImpl*matchType(const char* uri,const char*& param,CORBA::Boolean allowShortHand) {  const char* protocol = uri;  param = 0;  CORBA::String_var expanded;  if (allowShortHand) {    const char* p1 = strchr(uri,':');    // Either the uri is of the form ":xxxx:xxxx" or "xxx::xxxx" do we    // have to expand.    if (p1 && (uri == p1 || *(p1+1) == ':')) {      const char* p2 = strchr(p1+1,':');      if (p2) {	CORBA::ULong len = (p1 - uri) + (p2 - p1) + sizeof("giop:tcp");	expanded = CORBA::string_alloc(len);	if (uri == p1) {	  strcpy(expanded,"giop");	}	else {	  strncpy(expanded,uri,(p1-uri));	  ((char*) expanded)[p1-uri] = '\0';	}	if (p2 == p1+1) {	  strcat(expanded,":tcp");	}	else {	  len = strlen(expanded);	  strncat(expanded,p1,(p2-p1));	  ((char*)expanded)[len+(p2-p1)] = '\0';	}	protocol = expanded;	param = p2 + 1;      }    }  }  giopTransportImpl* impl = implHead();  while (impl) {    int len = strlen(impl->type);    if (strncmp(protocol,impl->type,len) == 0) {      if (param == 0) {	param = uri + len + 1;	if (*(param-1) != ':') impl = 0;      }      break;    }    impl = impl->next;  }  return impl;}////////////////////////////////////////////////////////////////////////giopAddress*giopAddress::str2Address(const char* address) {  const char* param;  giopTransportImpl* impl = matchType(address,param,1);  if (impl) {    return impl->toAddress(param);  }  return 0;}////////////////////////////////////////////////////////////////////////giopAddress*giopAddress::fromTcpAddress(const IIOP::Address& addr) {  const char* format = "giop:tcp:%s:%d";  CORBA::ULong len = strlen(addr.host);  if (len == 0) return 0;  len += strlen(format) + 6;  CORBA::String_var addrstr;  addrstr = CORBA::string_alloc(len);  sprintf(addrstr,format,(const char*)addr.host,addr.port);  return giopAddress::str2Address(addrstr);}////////////////////////////////////////////////////////////////////////giopAddress*giopAddress::fromSslAddress(const IIOP::Address& addr) {  const char* format = "giop:ssl:%s:%d";  CORBA::ULong len = strlen(addr.host);  if (len == 0) return 0;  len += strlen(format) + 6;  CORBA::String_var addrstr;  addrstr = CORBA::string_alloc(len);  sprintf(addrstr,format,(const char*)addr.host,addr.port);  return giopAddress::str2Address(addrstr);}////////////////////////////////////////////////////////////////////////giopEndpoint*giopEndpoint::str2Endpoint(const char* endpoint) {  const char* param;  giopTransportImpl* impl = matchType(endpoint,param,1);  if (impl) {    return impl->toEndpoint(param);  }  return 0;}////////////////////////////////////////////////////////////////////////CORBA::BooleangiopEndpoint::strIsValidEndpoint(const char* endpoint) {  const char* param;  giopTransportImpl* impl = matchType(endpoint,param,0);  if (impl) {    return impl->isValid(param);  }  return 0;}////////////////////////////////////////////////////////////////////////CORBA::BooleangiopEndpoint::addToIOR(const char* endpoint) {  const char* param;  giopTransportImpl* impl = matchType(endpoint,param,0);  if (impl) {    return impl->addToIOR(param);  }  return 0;}////////////////////////////////////////////////////////////////////////giopTransportImpl::giopTransportImpl(const char* t) : type(t), next(0) {  giopTransportImpl** pp = &implHead();  while (*pp) pp = &((*pp)->next);  *pp = this;}////////////////////////////////////////////////////////////////////////giopTransportImpl::~giopTransportImpl() {  giopTransportImpl** pp = &implHead();  while (*pp && *pp != this) pp = &((*pp)->next);  if (*pp == this) *pp = this->next;}////////////////////////////////////////////////////////////////////////voidgiopConnection::incrRefCount() {  ASSERT_OMNI_TRACEDMUTEX_HELD(*omniTransportLock,1);  OMNIORB_ASSERT(pd_refcount >= 0);  pd_refcount++;}////////////////////////////////////////////////////////////////////////intgiopConnection::decrRefCount(CORBA::Boolean forced) {  if (!forced) {    ASSERT_OMNI_TRACEDMUTEX_HELD(*omniTransportLock,1);  }  int rc = --pd_refcount;  OMNIORB_ASSERT(rc >= 0);  if (rc == 0)    delete this;  return rc;}////////////////////////////////////////////////////////////////////////#if 0// Disabled for library binary compatibility.const char*giopConnection::peeridentity() {  return 0;}#endif////////////////////////////////////////////////////////////////////////const omnivector<const char*>*giopTransportImpl::getInterfaceAddress(const char* t) {  giopTransportImpl* impl = implHead();  while (impl) {    if ( strcmp(t,impl->type) == 0 )      return impl->getInterfaceAddress();    impl = impl->next;  }  return 0;}////////////////////////////////////////////////////////////////////////voidgiopTransportImpl::initialise() {}//////////////////////////////////////////////////////////////////////////////             Configuration options                                      //////////////////////////////////////////////////////////////////////////////#ifdef __HP_aCCCORBA::String_var orbParameters::unixTransportDirectory =                                                (const char*)"/tmp/omni-%u";#elseCORBA::String_var orbParameters::unixTransportDirectory(		                                (const char*)"/tmp/omni-%u");#endif//  Applies to the server side. Determine the directory in which//  the unix domain socket is to be created.////  Valid values = a valid pathname for a directory.//                 %u in the string will be expanded into the user nameCORBA::UShort   orbParameters::unixTransportPermission = 0777;//  Applies to the server side. Determine the permission mode bits//  the unix domain socket is set to.////  Valid values = unix permission mode bits in octal radix (e.g. 0755)///////////////////////////////////////////////////////////////////////////////            Handlers for Configuration Options                           ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////class unixTransportDirectoryHandler : public orbOptions::Handler {public:  unixTransportDirectoryHandler() :    orbOptions::Handler("unixTransportDirectory",			"unixTransportDirectory = <dir name>",			1,			"-ORBunixTransportDirectory <dir name>") {}  void visit(const char* value,orbOptions::Source) throw (orbOptions::BadParam) {    orbParameters::unixTransportDirectory = value;  }  void dump(orbOptions::sequenceString& result) {    CORBA::String_var kv;    CORBA::ULong l;    const char* format = "unixTransportDirectory = %s";    l = strlen(format) + strlen(orbParameters::unixTransportDirectory);    kv = CORBA::string_alloc(l);    sprintf(kv,format,(const char*)orbParameters::unixTransportDirectory);    l = result.length();    result.length(l+1);    result[l] = kv._retn();  }};static unixTransportDirectoryHandler unixTransportDirectoryHandler_;/////////////////////////////////////////////////////////////////////////////class unixTransportPermissionHandler : public orbOptions::Handler {public:  unixTransportPermissionHandler() :    orbOptions::Handler("unixTransportPermission",			"unixTransportPermission = <mode bits in octal radix>",			1,			"-ORBunixTransportPermission <mode bits in octal radix>") {}  void visit(const char* value,orbOptions::Source) throw (orbOptions::BadParam) {    unsigned int v;    if( sscanf(value,"%o",&v) != 1 ) {      throw orbOptions::BadParam(key(),value,				 "Invalid value, expect mode bits in octal radix");    }    orbParameters::unixTransportPermission = v;  }  void dump(orbOptions::sequenceString& result) {    CORBA::String_var kv;    CORBA::ULong l;    const char* format = "unixTransportPermission = %4o";    l = strlen(format) + 10;    kv = CORBA::string_alloc(l);    sprintf(kv,format,orbParameters::unixTransportPermission);    l = result.length();    result.length(l+1);    result[l] = kv._retn();  }};static unixTransportPermissionHandler unixTransportPermissionHandler_;///////////////////////////////////////////////////////////////////////////////            Module initialiser                                           ///////////////////////////////////////////////////////////////////////////////class omni_giopEndpoint_initialiser : public omniInitialiser {public:  omni_giopEndpoint_initialiser() {    orbOptions::singleton().registerHandler(unixTransportDirectoryHandler_);    orbOptions::singleton().registerHandler(unixTransportPermissionHandler_);  }  void attach() {    static CORBA::Boolean once = 0;    if (once) return;#ifdef __WIN32__    // Initialize WinSock:    WORD versionReq;    WSADATA wData;#ifdef __ETS_KERNEL__    versionReq = MAKEWORD(1, 1);  // ETS kernel only supports 1.1#else    versionReq = MAKEWORD(2, 0);  // Must use 2.0 in order to use                                  // SIO_ADDRESS_LIST_QUERY#endif    int rc = WSAStartup(versionReq, &wData);    if (rc != 0) {      // Couldn't find a usable DLL.      OMNIORB_THROW(INITIALIZE,INITIALIZE_FailedLoadLibrary,		    CORBA::COMPLETED_NO);    }    // Confirm that the returned Windows Sockets DLL supports 2.0#ifdef __ETS_KERNEL__    // Confirm that the returned Windows Sockets DLL supports 1.1    if ( LOBYTE( wData.wVersion ) != 1 ||         HIBYTE( wData.wVersion ) != 1 )  {#else    if ( LOBYTE( wData.wVersion ) != 2 ||         HIBYTE( wData.wVersion ) != 0 )  {#endif      // Couldn't find a usable DLL      WSACleanup();      OMNIORB_THROW(INITIALIZE,INITIALIZE_FailedLoadLibrary,		    CORBA::COMPLETED_NO);    }#endif    giopTransportImpl* impl = implHead();    while (impl) {      impl->initialise();      impl = impl->next;    }  }  void detach() { }};static omni_giopEndpoint_initialiser initialiser;omniInitialiser& omni_giopEndpoint_initialiser_ = initialiser;OMNI_NAMESPACE_END(omni)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -