📄 uri.cc
字号:
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 + -