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

📄 convertior.cc

📁 编译工具
💻 CC
字号:
// -*- Mode: C++; -*-//                              Package   : convertior// convertior.cc                Author    : Eoin Carroll (ewc)////    Copyright (C) 1997-1999 AT&T Laboratories Cambridge////  This file is part of convertior.////  Convertior is free software; you can redistribute it and/or modify//  it under the terms of the GNU General Public License as published by//  the Free Software Foundation; either version 2 of the License, or//  (at your option) any later version.////  This program 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 General Public License for more details.////  You should have received a copy of the GNU General Public License//  along with this program; if not, write to the Free Software//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,//  USA.////// Takes an IOR, hostname as arguments. Outputs IOR with new hostname.#include <string.h>#include <stdlib.h>#include <omniORB4/CORBA.h>#ifdef HAVE_STD#  include <iostream>   using namespace std;#else#  include <iostream.h>#endif#ifdef HAVE_UNISTD_H#  include <unistd.h>#endif// unistd.h on some platforms, Mac OS X 10.4 for example, defines a// macro called minor.#undef minor#ifndef Swap16#define Swap16(s) ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff))#else#error "Swap16 has already been defined"#endif#ifndef Swap32#define Swap32(l) ((((l) & 0xff000000) >> 24) | \		   (((l) & 0x00ff0000) >> 8)  | \		   (((l) & 0x0000ff00) << 8)  | \		   (((l) & 0x000000ff) << 24))#else#error "Swap32 has already been defined"#endifstatic char* convertRef(const char* old_ior, const char* hostname);static void usage(char* progname){  cerr << "usage: " << progname << " <stringified IOR> <new hostname>" << endl;}#ifdef HAVE_GETOPTextern char* optarg;extern int optind;#else// WIN32 doesn't have an implementation of getopt() - // supply a getopt() for this program:char* optarg;int optind = 1;intgetopt(int num_args, char* const* args, const char* optstring){  if (optind == num_args) return EOF;  char* buf_left = *(args+optind);  if ((*buf_left != '-' && *buf_left != '/') || buf_left == NULL ) return EOF;  else if ((optind < (num_args-1)) && strcmp(buf_left,"-") == 0 && 	   strcmp(*(args+optind+1),"-") == 0)    {      optind+=2;      return EOF;    }  else if (strcmp(buf_left,"-") == 0)    {      optind++;      return '?';    }  for(int count = 0; count < strlen(optstring); count++)    {      if (optstring[count] == ':') continue;      if (buf_left[1] == optstring[count])	{	  if(optstring[count+1] == ':')	    {	      if (strlen(buf_left) > 2)		{		  optarg = (buf_left+2);		  optind++;		}	      else if (optind < (num_args-1))		{		  optarg = *(args+optind+1);		  optind+=2;		}	      else		{		  optind++;		  return '?';		}	    }	  else optind++;	  	  return buf_left[1];	}    }  optind++;  return '?';}#endifint main(int argc, char* argv[]){  if (argc < 3)     {      usage(argv[0]);      return 1;    }	  // Get options:  int c;  while((c = getopt(argc,argv,"x")) != EOF)    {      switch(c)	{	case '?':	case 'h':	  {	    usage(argv[0]);	    return 1;	  }	}    }	    if (optind >= argc)    {      usage(argv[0]);      return 1;    }  CORBA::String_var oldior(CORBA::string_dup(argv[1]));  CORBA::String_var newhost(CORBA::string_dup(argv[2]));  CORBA::String_var newior;   newior = convertRef(oldior,newhost);  if ((const char*)newior) {    cout << (const char*) newior << endl;    return 0;  }  else {    return 1;  }}  staticvoidtoIOR(const char* iorstr,IOP::IOR& ior){  size_t s = (iorstr ? strlen(iorstr) : 0);  if (s<4)    throw CORBA::MARSHAL(0,CORBA::COMPLETED_NO);  const char *p = iorstr;  if (p[0] != 'I' ||      p[1] != 'O' ||      p[2] != 'R' ||      p[3] != ':')    throw CORBA::MARSHAL(0,CORBA::COMPLETED_NO);  s = (s-4)/2;  // how many octets are there in the string  p += 4;  cdrMemoryStream buf((CORBA::ULong)s,0);  for (int i=0; i<(int)s; i++) {    int j = i*2;    CORBA::Octet v;        if (p[j] >= '0' && p[j] <= '9') {      v = ((p[j] - '0') << 4);    }    else if (p[j] >= 'a' && p[j] <= 'f') {      v = ((p[j] - 'a' + 10) << 4);    }    else if (p[j] >= 'A' && p[j] <= 'F') {      v = ((p[j] - 'A' + 10) << 4);    }    else      throw CORBA::MARSHAL(0,CORBA::COMPLETED_NO);    if (p[j+1] >= '0' && p[j+1] <= '9') {      v += (p[j+1] - '0');    }    else if (p[j+1] >= 'a' && p[j+1] <= 'f') {      v += (p[j+1] - 'a' + 10);    }    else if (p[j+1] >= 'A' && p[j+1] <= 'F') {      v += (p[j+1] - 'A' + 10);    }    else      throw CORBA::MARSHAL(0,CORBA::COMPLETED_NO);    buf.marshalOctet(v);  }  buf.rewindInputPtr();  CORBA::Boolean b = buf.unmarshalBoolean();  buf.setByteSwapFlag(b);  ior.type_id = IOP::IOR::unmarshaltype_id(buf);  ior.profiles <<= buf;}staticchar* toString(IOP::IOR& ior){  cdrMemoryStream buf(CORBA::ULong(0),CORBA::Boolean(1));  buf.marshalBoolean(omni::myByteOrder);  buf.marshalRawString(ior.type_id);  ior.profiles >>= buf;  // turn the encapsulation into a hex string with "IOR:" prepended  buf.rewindInputPtr();  size_t s = buf.bufSize();  CORBA::Char * data = (CORBA::Char *)buf.bufPtr();  char *result = new char[4+s*2+1];  result[4+s*2] = '\0';  result[0] = 'I';  result[1] = 'O';  result[2] = 'R';  result[3] = ':';  for (int i=0; i < (int)s; i++) {    int j = 4 + i*2;    int v = (data[i] & 0xf0);    v = v >> 4;    if (v < 10)      result[j] = '0' + v;    else      result[j] = 'a' + (v - 10);    v = ((data[i] & 0xf));    if (v < 10)      result[j+1] = '0' + v;    else      result[j+1] = 'a' + (v - 10);  }  return result;}staticchar* convertRef(const char* old_ior, const char* hostname){  try {    IOP::IOR ior;    toIOR(old_ior,ior);    for (unsigned long count=0; count < ior.profiles.length(); count++) {      if (ior.profiles[count].tag == IOP::TAG_INTERNET_IOP) {	IIOP::ProfileBody pBody;	IIOP::unmarshalProfile(ior.profiles[count],pBody);	pBody.address.host = hostname;	IOP::TaggedProfile profile;	IIOP::encodeProfile(pBody,profile);	CORBA::ULong max = profile.profile_data.maximum();	CORBA::ULong len = profile.profile_data.length();	CORBA::Octet* buf = profile.profile_data.get_buffer(1);	ior.profiles[count].profile_data.replace(max,len,buf,1);      }    }    CORBA::String_var result = toString(ior);    return result._retn();  }  catch(CORBA::MARSHAL& ex) {    cerr << "Invalid stringified IOR supplied." << endl;    cerr << "(Minor = " << ex.minor() << ")" << endl;    return 0;  }  catch(...) {    cerr << "Exception while processing stringified IOR." << endl;    return 0;  }}

⌨️ 快捷键说明

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