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

📄 uri.cc

📁 编译工具
💻 CC
📖 第 1 页 / 共 3 页
字号:
  CORBA::Object_ptr obj = locToObject(c, cycles);  if (*c != '\0') {    // uri didn't end with the object key    CORBA::release(obj);    OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadSchemeSpecificPart,		  CORBA::COMPLETED_NO);  }  return obj;}CORBA::BooleancorbalocURIHandler::syntaxIsValid(const char* uri){  const char* c = uri + 9;  try {    Parsed parsed(c, 0);  }  catch (...) {    return 0;  }  if (*c != '\0') {    // uri didn't end with the object key    return 0;  }  return 1;}corbalocURIHandler::ObjAddr*corbalocURIHandler::ObjAddr::parse(const char*& c){  if (!strncmp(c, ":", 1)) {    c += 1;    return new corbalocURIHandler::IiopObjAddr(c);  }  if (!strncmp(c, "iiop:", 5)) {    c += 5;    return new corbalocURIHandler::IiopObjAddr(c);  }  if (!strncmp(c, "ssliop:", 7)) {    c += 7;    return new corbalocURIHandler::SsliopObjAddr(c);  }  if (!strncmp(c, "omniunix:", 9)) {    c += 9;    return new corbalocURIHandler::UiopObjAddr(c);  }  if (!strncmp(c, "rir:", 4)) {    c += 4;    return new corbalocURIHandler::RirObjAddr(c);  }  OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadSchemeName, CORBA::COMPLETED_NO);  return 0;}static voidParseVersionNumber(const char*& c, CORBA::Char& majver, CORBA::Char& minver){  const char* p;  for (p=c;       *p && *p != '@' && *p != ':' && *p != ',' && *p != '/' && *p != '#';       p++);  if (*p == '@') {    // Found a version number    unsigned long l;    // Major    p = c;    if (!isdigit(*p)) OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadSchemeSpecificPart,				    CORBA::COMPLETED_NO);    l = strtoul(p, (char**)&p, 10);    if (l > 0xff)     OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadSchemeSpecificPart,				    CORBA::COMPLETED_NO);    majver = l;    // Minor    if (*p++ != '.')  OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadSchemeSpecificPart,				    CORBA::COMPLETED_NO);    if (!isdigit(*p)) OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadSchemeSpecificPart,				    CORBA::COMPLETED_NO);    l = strtoul(p, (char**)&p, 10);    if (l > 0xff)     OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadSchemeSpecificPart,				    CORBA::COMPLETED_NO);    minver = l;    if (*p != '@')    OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadSchemeSpecificPart,				    CORBA::COMPLETED_NO);    c = p + 1;  }  else {    majver = 1;    minver = 0;  }}corbalocURIHandler::UiopObjAddr::UiopObjAddr(const char*& c){  const char* p;  ParseVersionNumber(c, majver_, minver_);  for (p=c; *p && *p != ':' && *p != ',' && *p != '#'; p++);  if (p == c) OMNIORB_THROW(BAD_PARAM,                            BAD_PARAM_BadSchemeSpecificPart,			    CORBA::COMPLETED_NO);  filename_ = CORBA::string_alloc(1 + p - c);  char* f = (char*)filename_;  for (; c != p; c++, f++) *f = *c;  *f = '\0';  if (*c == ':') {    // Object key should follow.    ++c;  }}corbalocURIHandler::IiopObjAddr::IiopObjAddr(const char*& c){  if (*c == '\0' || *c == ',' || *c == '/' || *c == '#') {    // Empty host name -- use localhost, default port    host_   = CORBA::string_dup("localhost");    port_   = IIOP::DEFAULT_CORBALOC_PORT;    majver_ = 1;    minver_ = 0;    return;  }  const char* p;  ParseVersionNumber(c, majver_, minver_);  for (p=c; *p && *p != ':' && *p != ',' && *p != '/' && *p != '#'; p++);  if (p == c) OMNIORB_THROW(BAD_PARAM,			    BAD_PARAM_BadSchemeSpecificPart,			    CORBA::COMPLETED_NO);  host_ = CORBA::string_alloc(1 + p - c);  char* h = (char*)host_;  for (; c != p; c++, h++) *h = *c;  *h = '\0';  if (*c == ':') {    // Port number follows    c++;    if (isdigit(*c)) {      unsigned long l;      l = strtoul(c, (char**)&c, 10);      if (l > 0xffff) OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadAddress,				    CORBA::COMPLETED_NO);      port_ = l;    }    else {      port_ = IIOP::DEFAULT_CORBALOC_PORT;    }  }  else {    port_ = IIOP::DEFAULT_CORBALOC_PORT;  }}static inline intvalidKeyChar(const char c){  return ((c >= 'A' && c <= 'Z') ||	  (c >= 'a' && c <= 'z') ||	  (c >= '0' && c <= '9') ||	  c == ';' || c == '/' || c == '?' || c == ':' || c == '@' ||	  c == '&' || c == '=' || c == '+' || c == '$' || c == ',' ||	  c == '-' || c == '_' || c == '.' || c == '!' || c == '~' ||	  c == '*' || c == '(' || c == ')' || c == '\'');}static char*unescapeKey(const char*& c, unsigned int& key_size){  const char* p;  for (p=c; *p && *p != '#'; p++);  char* key = CORBA::string_alloc(1 + p - c);  char* k   = key;  key_size  = 0;  for (; c != p; c++, k++) {    key_size++;    if (validKeyChar(*c)) {      *k = *c;    }    else if (*c == '%') {      // Escape char      c++;      if      (*c >= '0' && *c <= '9') *k = (*c - '0')      << 4;      else if (*c >= 'A' && *c <= 'F') *k = (*c - 'A' + 10) << 4;      else if (*c >= 'a' && *c <= 'f') *k = (*c - 'a' + 10) << 4;      else {	CORBA::string_free(key);	OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadURIOther, CORBA::COMPLETED_NO);      }      c++;      if      (*c >= '0' && *c <= '9') *k |= (*c - '0');      else if (*c >= 'A' && *c <= 'F') *k |= (*c - 'A' + 10);      else if (*c >= 'a' && *c <= 'f') *k |= (*c - 'a' + 10);      else {	CORBA::string_free(key);	OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadURIOther, CORBA::COMPLETED_NO);      }    }    else {      CORBA::string_free(key);      OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadURIOther, CORBA::COMPLETED_NO);    }  }  *k = '\0';  return key;}corbalocURIHandler::Parsed::Parsed(const char*& c, const char* def_key){  ObjAddr* addr;  is_rir_     = 0;  addr_count_ = 1;  addr = ObjAddr::parse(c);  if (!addr)     OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadURIOther, CORBA::COMPLETED_NO);  if (addr->kind() == ObjAddr::rir) is_rir_ = 1;  addrList_.append(addr);  while (*c == ',') {    c++;    addr_count_++;    addr = ObjAddr::parse(c);    if (!addr)       OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadURIOther, CORBA::COMPLETED_NO);    if (addr->kind() == ObjAddr::rir) is_rir_ = 1;    addrList_.append(addr);  }  if (is_rir_ && (addr_count_ != 1))    OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadURIOther, CORBA::COMPLETED_NO);  if (*c == '/') {    // Key string follows    c++;    key_ = unescapeKey(c, key_size_);  }  else if (def_key) {    key_      = def_key; // Copying assignment of default key    key_size_ = strlen(key_);  }  else    OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadURIOther, CORBA::COMPLETED_NO);}CORBA::Object_ptrcorbalocURIHandler::locToObject(const char*& c, unsigned int cycles,				const char* def_key){  Parsed parsed(c, def_key);  if (parsed.is_rir_) {    try {      return omniInitialReferences::resolve(parsed.key_, cycles+1);    }    catch (CORBA::ORB::InvalidName& ex) {      OMNIORB_THROW(BAD_PARAM, BAD_PARAM_BadURIOther, CORBA::COMPLETED_NO);    }  }  else {    // Protocols other than rir    IIOP::Address* addrlist = new IIOP::Address[parsed.addr_count_];    int iiop_addr_count = 0;    IOP::MultipleComponentProfile tagged_components;    GIOP::Version ver;    ver.major = 127; ver.minor = 127;    char  self[64];    char* selfp = 0;    ObjAddr* addr;    int i;    for (i=0, addr = parsed.addrList_.head_; 	 addr; 	 addr = addr->next_, i++)       {	switch (addr->kind()) {	case ObjAddr::iiop:	case ObjAddr::ssliop:	  {	    IiopObjAddr* iaddr = (IiopObjAddr*)addr;	    addrlist[iiop_addr_count].host = iaddr->host();	    addrlist[iiop_addr_count].port = iaddr->port();	    if (iaddr->majver() < ver.major ||		iaddr->minver() < ver.minor) {	      ver.major = iaddr->majver();	      ver.minor = iaddr->minver();	    }            ++iiop_addr_count;                        if (addr->kind() == ObjAddr::ssliop) {	      addrlist[iiop_addr_count - 1].port = 0;	      ver.major = 1;	      ver.minor = 2;	      CORBA::ULong index = tagged_components.length();	      tagged_components.length(index+1);	      IOP::TaggedComponent& c = tagged_components[index];	      c.tag = IOP::TAG_SSL_SEC_TRANS;	      cdrEncapsulationStream s(CORBA::ULong(0),CORBA::Boolean(1));	      CORBA::UShort zero = 0;	      zero >>= s;	      zero >>= s;	      iaddr->port() >>= s;	      CORBA::Octet* p;	      CORBA::ULong max, len;	      s.getOctetStream(p,max,len);	      c.component_data.replace(max,len,p,1);            }	  }	  break;	case ObjAddr::uiop:	  {	    if (!selfp) {	      if (gethostname(&self[0],64) == RC_SOCKET_ERROR) {		omniORB::logs(1, "Cannot get the name of this host.");		self[0] = '\0';	      }	      selfp = self;	    }            UiopObjAddr* uiop_addr = (UiopObjAddr*)addr;            CORBA::ULong index = tagged_components.length();            tagged_components.length(index+1);            IOP::TaggedComponent& c = tagged_components[index];            c.tag = IOP::TAG_OMNIORB_UNIX_TRANS;            cdrEncapsulationStream s(CORBA::ULong(0),CORBA::Boolean(1));            s.marshalRawString(self);            s.marshalRawString(uiop_addr->filename());            CORBA::Octet* p;	    CORBA::ULong max, len;	    s.getOctetStream(p,max,len);            c.component_data.replace(max,len,p,1);	  }	  break;	default:	  OMNIORB_ASSERT(0);	}      }        _CORBA_Unbounded_Sequence_Octet key;    key.replace(parsed.key_size_,		parsed.key_size_,		(CORBA::Octet*)(const char*)parsed.key_,0);    if (iiop_addr_count <= 0) {      OMNIORB_ASSERT(selfp);      ver.major = 1;      ver.minor = 2;      addrlist[0].host = (const char *)self;      addrlist[0].port = 0;      ++iiop_addr_count;    }    omniIOR* ior = new omniIOR((const char*)"",			       key,			       addrlist,iiop_addr_count,			       ver,omniIOR::NoInterceptor,                               &tagged_components);    delete [] addrlist;    omniObjRef* objref = omni::createObjRef(CORBA::Object::_PD_repoId,ior,0);    OMNIORB_ASSERT(objref);

⌨️ 快捷键说明

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