address.cpp

来自「JdonFramework need above jdk 1.4.0 This」· C++ 代码 · 共 2,430 行 · 第 1/5 页

CPP
2,430
字号
   if (tmp != NULL)   {     *tmp=0;   // new null terminator     tmp++;     socketid = atoi(tmp);   }   set_socket(socketid);   return IpxAddress::parse_address(buffer);}//-------------[ set the socket number ]----------------------------------void IpxSockAddress::set_socket(const unsigned short s){  unsigned short sock_nbo = htons(s);  MEMCPY(&address_buffer[IPXLEN], &sock_nbo, 2);  addr_changed = true;}//--------------[ get the socket number ]---------------------------------unsigned short IpxSockAddress::get_socket() const{  if (valid_flag)  {    unsigned short sock_nbo;    MEMCPY(&sock_nbo, &address_buffer[IPXLEN], 2);    return ntohs(sock_nbo);  }  return 0; // don't use uninitialized memory}#endif // _IPX_ADDRESS#ifdef _MAC_ADDRESS//========================================================================//======== MACAddress Implementation =====================================//========================================================================//--------[ constructor, no arguments ]-----------------------------------MacAddress::MacAddress() : Address(){  // always initialize SMI info  smival.syntax = sNMP_SYNTAX_OCTETS;  smival.value.string.len = MACLEN;  smival.value.string.ptr = address_buffer;  valid_flag = false;  addr_changed = true;}//-----[ MAC Address copy constructor ]---------------------------------MacAddress::MacAddress(const MacAddress &macaddr){  // always initialize SMI info  smival.syntax = sNMP_SYNTAX_OCTETS;  smival.value.string.len = MACLEN;  smival.value.string.ptr = address_buffer;  valid_flag = macaddr.valid_flag;  if (valid_flag)    MEMCPY(address_buffer, macaddr.address_buffer, MACLEN);  addr_changed = true;}//---------[ constructor with a string argument ]-------------------------MacAddress::MacAddress(const char  *inaddr):Address(){  // always initialize SMI info  smival.syntax = sNMP_SYNTAX_OCTETS;  smival.value.string.len = MACLEN;  smival.value.string.ptr = address_buffer;  valid_flag = parse_address(inaddr);  addr_changed = true;}//-----[ construct a MacAddress from a GenAddress ]------------------------MacAddress::MacAddress(const GenAddress &genaddr){  // always initialize SMI info  smival.syntax = sNMP_SYNTAX_OCTETS;  smival.value.string.len = MACLEN;  smival.value.string.ptr = address_buffer;  valid_flag = false;  // allow use of mac address  if (genaddr.get_type() == type_mac)  {    valid_flag = genaddr.valid();    if (valid_flag)    {      // copy in the Mac address data      *this = genaddr.cast_macaddress();    }  }  addr_changed = true;}//------[ assignment to another ipaddress object overloaded ]--------------MacAddress& MacAddress::operator=(const MacAddress &macaddress){  if (this == &macaddress) return *this;// protect against assignment from self  valid_flag = macaddress.valid_flag;  if (valid_flag)    MEMCPY(address_buffer, macaddress.address_buffer, MACLEN);  addr_changed = true;  return *this;}//-----[ MAC Address general = operator ]---------------------------------SnmpSyntax& MacAddress::operator=(const SnmpSyntax &val){  if (this == &val) return *this;  // protect against assignment from itself  valid_flag = false;              // will set to TRUE if really valid  if (val.valid())  {    switch (val.get_syntax())    {      case sNMP_SYNTAX_OCTETS:	if (((MacAddress &)val).smival.value.string.len == MACLEN)	{	  MEMCPY(address_buffer, ((MacAddress &)val).smival.value.string.ptr,		 MACLEN);	  valid_flag = true;	}	break;    }  }  addr_changed = true;  return *this;}//-----[ MAC Address parse Address ]--------------------------------------// Convert a string to a six byte MAC address// On success sets validity TRUE or FALSE////     MAC address format////   MAC ADDRESS//   01 02 03 04 05 06//   XX:XX:XX:XX:XX:XX//   Valid input format////   XXXXXXXXXXXX//   Total length must be 17//   Each char must take on value 0-F////bool MacAddress::parse_address(const char *inaddr){  char temp[30];    // don't destroy original  char unsigned *tmp;  size_t z;  // save the orginal source  if (!inaddr || (strlen(inaddr) > 30)) return FALSE;  strcpy(temp, inaddr);  trim_white_space(temp);  // bad total length check  if (strlen(temp) != 17)     return FALSE;  // check for colons  if ((temp[2] != ':')||(temp[5] != ':')||(temp[8]!=':')||(temp[11]!=':')||(temp[14] !=':'))     return FALSE;  // strip off the colons  tmp = (unsigned char *) temp;  int i = 0;  while (*tmp != 0)  {     if (*tmp != ':')     {        temp[i] = *tmp;        i++;     }     tmp++;  }  temp[i] = 0;  // convert to lower  for(z=0;z<strlen(temp);z++)     temp[z] = tolower(temp[z]);  // check out the MAC address  tmp = (unsigned char *) temp;  while(*tmp != 0)    if (((*tmp >= '0') && (*tmp <= '9'))||   // good 0-9        ((*tmp >= 'a') && (*tmp <= 'f')))    // or a-f      tmp++;    else      return FALSE;  // convert to target string  tmp = (unsigned char *) temp;  while (*tmp != 0)  {  if ((*tmp >= '0') && (*tmp <= '9'))    *tmp = *tmp - (char unsigned )'0';  else    *tmp = *tmp - (char unsigned) 'a' + (char unsigned) 10;  tmp++;  }  address_buffer[0] =  (temp[0]*16) + temp[1];  address_buffer[1] =  (temp[2]*16) + temp[3];  address_buffer[2] =  (temp[4]*16) + temp[5];  address_buffer[3] =  (temp[6]*16) + temp[7];  address_buffer[4] =  (temp[8]*16) + temp[9];  address_buffer[5] =  (temp[10]*16) + temp[11];  return TRUE;}//----[ MAC address format output ]---------------------------------void MacAddress::format_output() const{  if (valid_flag)    sprintf((char*)output_buffer,"%02x:%02x:%02x:%02x:%02x:%02x",	    address_buffer[0], address_buffer[1], address_buffer[2],	    address_buffer[3], address_buffer[4], address_buffer[5]);  else    *(char*)output_buffer = 0;  MacAddress *nc_this = PP_CONST_CAST(MacAddress*, this);  nc_this->addr_changed = false;}unsigned int MacAddress::hashFunction() const{  return ((((address_buffer[0] << 8) + address_buffer[1]) * HASH0)	+ (((address_buffer[2] << 8) + address_buffer[3]) * HASH1)        + (((address_buffer[4] << 8) + address_buffer[5]) * HASH2));}#endif // _MAC_ADDRESS//========================================================================//========== Generic Address Implementation ==============================//========================================================================//-----------[ constructor, no arguments ]--------------------------------GenAddress::GenAddress() : Address(){  ADDRESS_TRACE;  // initialize SMI info  // BOK: this is generally not used for GenAddress,  // but we need this to be a replica of the real address'  // smival info so that operator=SnmpSyntax will work.  smival.syntax = sNMP_SYNTAX_NULL;                // to be overridden  smival.value.string.len = 0;                        // to be overridden  smival.value.string.ptr = address_buffer;        // constant  valid_flag = false;  address = 0;  output_buffer[0] = 0;}//-----------[ constructor with a string argument ]----------------------GenAddress::GenAddress(const char  *addr,		       const Address::addr_type use_type){  ADDRESS_TRACE;  // initialize SMI info  // BOK: smival is generally not used for GenAddress, but  //      we need this to be a replica of the real address'  //      smival info so that <class>::operator=SnmpSyntax  //      will work.  smival.syntax = sNMP_SYNTAX_NULL;                // to be overridden  smival.value.string.len = 0;                        // to be overridden  smival.value.string.ptr = address_buffer;        // constant  address = 0;  parse_address(addr, use_type);  // Copy real address smival info into GenAddr smival  // BOK: smival is generally not used for GenAddress, but  //      we need this to be a replica of the real address'  //      smival info so that <class>::operator=SnmpSyntax  //      will work.  if (valid_flag ) {      smival.syntax = ((GenAddress *)address)->smival.syntax;      smival.value.string.len =          ((GenAddress *)address)->smival.value.string.len;      memcpy(smival.value.string.ptr,          ((GenAddress *)address)->smival.value.string.ptr,          (size_t)smival.value.string.len);  }  output_buffer[0] = 0;}//-----------[ constructor with an Address argument ]--------------------GenAddress::GenAddress(const Address &addr){  ADDRESS_TRACE;  output_buffer[0] = 0;  // initialize SMI info  // BOK: this is generally not used for GenAddress,  // but we need this to be a replica of the real address'  // smival info so that operator=SnmpSyntax will work.  smival.syntax = sNMP_SYNTAX_NULL;                // to be overridden  smival.value.string.len = 0;                        // to be overridden  smival.value.string.ptr = address_buffer;        // constant  valid_flag = false;  // make sure that the object is valid  if (!addr.valid()) {    address = 0;    return;  }  // addr can be a GenAddress object and calling clone() on that is bad...  if (addr.is_gen_address())    address = (Address *)(((const GenAddress&)addr).address->clone());  else    address = (Address*)addr.clone();  if (address)    valid_flag = address->valid();  // Copy real address smival info into GenAddr smival  // BOK: smival is generally not used for GenAddress, but  //      we need this to be a replica of the real address'  //      smival info so that <class>::operator=SnmpSyntax  //      will work.  if (valid_flag )  {    smival.syntax = address->get_syntax();    smival.value.string.len = ((GenAddress *)address)->smival.value.string.len;    memcpy(smival.value.string.ptr,           ((GenAddress *)address)->smival.value.string.ptr,           (size_t)smival.value.string.len);  }}//-----------------[ constructor with another GenAddress object ]-------------GenAddress::GenAddress(const GenAddress &addr){  ADDRESS_TRACE;  output_buffer[0] = 0;  // initialize SMI info  // BOK: this is generally not used for GenAddress,  // but we need this to be a replica of the real address'  // smival info so that operator=SnmpSyntax will work.  smival.syntax = sNMP_SYNTAX_OCTETS;  smival.value.string.len = 0;  smival.value.string.ptr = address_buffer;  valid_flag = false;  // make sure that the object is valid  if (!addr.valid_flag)  {    address = 0;    return;  }  address = (Address *)addr.address->clone();  if (address)    valid_flag = address->valid();  // Copy real address smival info into GenAddr smival  // BOK: smival is generally not used for GenAddress, but  //      we need this to be a replica of the real address'  //      smival info so that <class>::operator=SnmpSyntax  //      will work.  if (valid_flag )  {    smival.syntax = ((GenAddress *)address)->smival.syntax;    smival.value.string.len = ((GenAddress *)address)->smival.value.string.len;    memcpy(smival.value.string.ptr,           ((GenAddress *)address)->smival.value.string.ptr,           (size_t)smival.value.string.len);  }}//------[ assignment GenAddress = GenAddress ]-----------------------------GenAddress& GenAddress::operator=(const GenAddress &addr){  ADDRESS_TRACE;  if (this == &addr) return *this;  // protect against assignment from itself  valid_flag = false;  if (address)  {    delete address;    address = 0;  }  if (addr.address)    address = (Address *)(addr.address->clone());  if (address)    valid_flag = address->valid();  // Copy real address smival info into GenAddr smival  // BOK: smival is generally not used for GenAddress, but  //      we need this to be a replica of the real address'  //      smival info so that <class>::operator=SnmpSyntax  //      will work.  if (valid_flag )  {    smival.syntax = ((GenAddress *)address)->smival.syntax;    smival.value.string.len = ((GenAddress *)address)->smival.value.string.len;    memcpy(smival.value.string.ptr,           ((GenAddress *)address)->smival.value.string.ptr,           (size_t)smival.value.string.len);  }  return *this;}//------[ assignment GenAddress = Address ]--------------------------------GenAddress& GenAddress::operator=(const Address &addr){  ADDRESS_TRACE;  if (this == &addr) return *this;  // protect against assignment from itself  valid_flag = false;  if (address)  {    delete address;    address = 0;  }  // addr can be a GenAddress object and calling clone() on that is bad...  if (addr.is_gen_address())    address = (Address *)(((const GenAddress&)addr).address->clone());  else    address = (Address*)addr.clone();  if (address)    valid_flag = address->valid();  // Copy real address smival info into GenAddr smival  // BOK: smival is generally not used for GenAddress, but  //      we need this to be a replica of the real address'  //      smival info so that <class>::operator=SnmpSyntax  //      will work.  if (valid_flag )  {    smival.syntax = ((GenAddress *)address)->smival.syntax;    smival.value.string.len = ((GenAddress *)address)->smival.value.string.len;    memcpy(smival.value.string.ptr,           ((GenAddress *)address)->smival.value.string.ptr,           (size_t)smival.value.string.len);  }  return *this;}//------[ assignment GenAddress = any SnmpSyntax ]-----------------------SnmpSyntax& GenAddress::operator=(const SnmpSyntax &val){  ADDRESS_TRACE;  if (this == &val) return *this; // protect against assignment from itself  valid_flag = false;             // will get set to TRUE if really valid  if (address)  {    delete address;    address = 0;  }  if (val.valid())  {    switch (val.get_syntax() )    {      //-----[ ip address case ]-------------      // BOK: this case shouldn't be needed since there is an explicit      // GenAddr=Address assignment that will override this assignment.      // Left here for posterity.      case sNMP_SYNTAX_IPADDR:      {        address = new IpAddress

⌨️ 快捷键说明

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