(file) Return to CIMObjectPath.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

Diff for /pegasus/src/Pegasus/Common/CIMObjectPath.cpp between version 1.55 and 1.62.4.2

version 1.55, 2006/05/02 20:26:58 version 1.62.4.2, 2007/11/08 09:15:06
Line 29 
Line 29 
 // //
 //============================================================================== //==============================================================================
 // //
 // Author: Mike Brasher (mbrasher@bmc.com)  
 //  
 // Modified By: Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)  
 //              Carol Ann Krug Graves, Hewlett-Packard Company  
 //                (carolann_graves@hp.com)  
 //              Dave Sudlik, IBM (dsudlik@us.ibm.com)  
 //              Vijay Eli, IBM (vijayeli@in.ibm.com), bug#2556.  
 //  
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
 #include <Pegasus/Common/Config.h> #include <Pegasus/Common/Config.h>
Line 49 
Line 41 
 #include "XmlWriter.h" #include "XmlWriter.h"
 #include "XmlReader.h" #include "XmlReader.h"
 #include "ArrayInternal.h" #include "ArrayInternal.h"
   #include "HostLocator.h"
  
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
  
Line 193 
Line 186 
     _rep = new CIMKeyBindingRep(*x._rep);     _rep = new CIMKeyBindingRep(*x._rep);
 } }
  
 CIMKeyBinding::CIMKeyBinding(const CIMName& name, const String& value, Type type)  CIMKeyBinding::CIMKeyBinding(
       const CIMName& name,
       const String& value,
       Type type)
 { {
     _rep = new CIMKeyBindingRep(name, value, type);     _rep = new CIMKeyBindingRep(name, value, type);
 } }
Line 357 
Line 353 
         catch (Exception&)         catch (Exception&)
         {         {
             // If CIMObjectPath parsing fails, just compare strings             // If CIMObjectPath parsing fails, just compare strings
             return (String::equal(x.getValue(), y.getValue()));              return String::equal(x.getValue(), y.getValue());
         }         }
         break;         break;
     case CIMKeyBinding::BOOLEAN:     case CIMKeyBinding::BOOLEAN:
         // Case-insensitive comparison is sufficient for booleans         // Case-insensitive comparison is sufficient for booleans
         return (String::equalNoCase(x.getValue(), y.getValue()));          return String::equalNoCase(x.getValue(), y.getValue());
         break;         break;
     case CIMKeyBinding::NUMERIC:     case CIMKeyBinding::NUMERIC:
         // Note: This comparison assumes XML syntax for integers         // Note: This comparison assumes XML syntax for integers
Line 392 
Line 388 
         }         }
         // Note: Keys may not be real values, so don't try comparing as reals         // Note: Keys may not be real values, so don't try comparing as reals
         // We couldn't parse the numbers, so just compare the strings         // We couldn't parse the numbers, so just compare the strings
         return (String::equal(x.getValue(), y.getValue()));          return String::equal(x.getValue(), y.getValue());
         break;         break;
     default:  // CIMKeyBinding::STRING     default:  // CIMKeyBinding::STRING
         return (String::equal(x.getValue(), y.getValue()));          return String::equal(x.getValue(), y.getValue());
         break;         break;
     }     }
  
Line 412 
Line 408 
 class CIMObjectPathRep class CIMObjectPathRep
 { {
 public: public:
     CIMObjectPathRep()      CIMObjectPathRep(): _refCounter(1)
     {     {
     }     }
  
     CIMObjectPathRep(const CIMObjectPathRep& x)     CIMObjectPathRep(const CIMObjectPathRep& x)
         : _host(x._host), _nameSpace(x._nameSpace),          : _refCounter(1), _host(x._host), _nameSpace(x._nameSpace),
         _className(x._className), _keyBindings(x._keyBindings)         _className(x._className), _keyBindings(x._keyBindings)
     {     {
     }     }
Line 427 
Line 423 
         const CIMNamespaceName& nameSpace,         const CIMNamespaceName& nameSpace,
         const CIMName& className,         const CIMName& className,
         const Array<CIMKeyBinding>& keyBindings)         const Array<CIMKeyBinding>& keyBindings)
         : _host(host), _nameSpace(nameSpace),          : _refCounter(1), _host(host), _nameSpace(nameSpace),
         _className(className), _keyBindings(keyBindings)         _className(className), _keyBindings(keyBindings)
     {     {
     }     }
Line 450 
Line 446 
  
     static Boolean isValidHostname(const String& hostname)     static Boolean isValidHostname(const String& hostname)
     {     {
         //------------------------------------------------------------------          HostLocator addr(hostname);
         // Validate the hostname.  The hostname value may or may not be a  
         // fully-qualified domain name (e.g., xyz.company.com) or may be an  
         // IP address.  A port number may follow the hostname.  
         // Hostnames must match one of the following regular expressions:  
         // ^([A-Za-z0-9][A-Za-z0-9-]*)(\.[A-Za-z][A-Za-z0-9-]*)*(:[0-9]*)?$  
         // ^([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)(:[0-9]*)?$  
         // Note for Bug#1462. Be careful here, from RFC 1123:  
         // - The syntax of a legal Internet host name was specified in  
         //   RFC-952 [DNS:4]. One aspect of host name syntax is hereby  
         //   changed: the restriction on the first character is relaxed to  
         //   allow either a letter or a digit.  
         // - If a dotted-decimal number can be entered without identifying  
         //   delimiters, then a full syntactic check must be made, because  
         //   a segment of a host domain name is now allowed to begin with a  
         //   digit and could legally be entirely numeric (see Section 6.1.2.4).  
         //   However, a valid host name can never have the dotted-decimal form  
         //   #.#.#.#, since at least the highest-level component label will be  
         //   alphabetic.  
         // The algorithm below has been updated accordingly.  
         //------------------------------------------------------------------  
   
         Uint32 i = 0;  
   
         Boolean isValid = false;  
   
         if (isascii(hostname[0]) && isdigit(hostname[0]))  
         {  
             //--------------------------------------------------------------  
             // Attempt to validate an IP address, but keep in mind that it  
             // might be a host name, since the leading character can now be  
             // a digit.  
             //--------------------------------------------------------------  
             isValid = true;  
   
             for (Uint32 octet=1; octet<=4; octet++)  
             {  
                 Uint32 octetValue = 0;  
   
                 //----------------------------------------------------------  
                 // If a non-digit is encountered in the input parameter,  
                 // then break from here and attempt to validate as host name.  
                 //----------------------------------------------------------  
                 if (!(isascii(hostname[i]) && isdigit(hostname[i])))  
                 {  
                     isValid = false;  
                     break;  
                 }  
   
                 // skip over digits  
                 while (isascii(hostname[i]) && isdigit(hostname[i]))  
                 {  
                     octetValue = octetValue*10 + (hostname[i] - '0');  
                     i++;  
                 }  
   
                 if (octetValue > 255)  
                 {  
                     isValid = false;  
                     break;  
                 }  
   
                 // Check for invalid character in IP address  
                 if ((octet != 4) && (hostname[i++] != '.'))  
                 {  
                     isValid = false;  
                     break;  
                 }  
   
                 // Check for the case where it's a valid host name that happens  
                 // to have 4 (or more) leading all-numeric host segments.  
                 if ((octet == 4) && (hostname[i] != ':') && hostname[i] != char(0))  
                 {  
                     isValid = false;  
                     break;  
                 }  
             }  
         }  
         if (!isValid)   // if it is not a valid IP address  
         {  
             i = 0;  // reset index for host name check  
   
             // Validate a host name  
             isValid = true;  
   
             Boolean expectHostSegment = true;  
             Boolean hostSegmentIsNumeric;  
   
             while (expectHostSegment == true)  
             {  
                 expectHostSegment = false;  
                 hostSegmentIsNumeric = true; // assume all-numeric host segment  
   
                 if (!(isascii(hostname[i]) &&  
                       (isalnum(hostname[i]) || (hostname[i] == '_'))))  
                 {  
                     return false;  
                 }  
   
                 while (isascii(hostname[i]) &&  
                        (isalnum(hostname[i]) || (hostname[i] == '-') ||  
                         (hostname[i] == '_')))  
                 {  
                     // If a non-digit is encountered, set "all-numeric"  
                     // flag to false  
                     if (isalpha(hostname[i]) || (hostname[i] == '-') ||  
                                                 (hostname[i] == '_')) {  
                         hostSegmentIsNumeric = false;  
                     }  
                     i++;  
                 }  
   
                 if (hostname[i] == '.')  
                 {  
                     i++;  
                     expectHostSegment = true;  
                 }  
             }  
             // If the last Host Segment is all numeric, then return false.  
             // RFC 1123 says "highest-level component label will be alphabetic".  
             if (hostSegmentIsNumeric) {  
                 return false;  
             }  
         }  
  
         if (!isValid) // if not a valid IP address or host name          return addr.isValid();
         {  
             return false;  
         }  
   
         // Check for a port number:  
   
         if (hostname[i] == ':')  
         {  
             i++;  
             if (!(isascii(hostname[i]) && isdigit(hostname[i])))  
             {  
                 return false;  
             }  
             i++;  
   
             while (isascii(hostname[i]) && isdigit(hostname[i]))  
             {  
                 i++;  
             }  
         }  
   
         return (hostname[i] == char(0));  
     }     }
  
       // reference counter as member to avoid
       // virtual function resolution overhead
       AtomicInt _refCounter;
     //     //
     // Contains port as well (e.g., myhost:1234).     // Contains port as well (e.g., myhost:1234).
     //     //
Line 610 
Line 464 
     Array<CIMKeyBinding> _keyBindings;     Array<CIMKeyBinding> _keyBindings;
 }; };
  
   template<class REP>
   inline void Ref(REP* rep)
   {
           rep->_refCounter++;
   }
   
   template<class REP>
   inline void Unref(REP* rep)
   {
       if (rep->_refCounter.decAndTestIfZero())
           delete rep;
   }
  
 CIMObjectPath::CIMObjectPath() CIMObjectPath::CIMObjectPath()
 { {
Line 618 
Line 484 
  
 CIMObjectPath::CIMObjectPath(const CIMObjectPath& x) CIMObjectPath::CIMObjectPath(const CIMObjectPath& x)
 { {
     _rep = new CIMObjectPathRep(*x._rep);      _rep = x._rep;
       Ref(_rep);
 } }
  
 CIMObjectPath::CIMObjectPath(const String& objectName) CIMObjectPath::CIMObjectPath(const String& objectName)
Line 627 
Line 494 
     CIMObjectPath tmpRef;     CIMObjectPath tmpRef;
     tmpRef.set(objectName);     tmpRef.set(objectName);
  
     _rep = new CIMObjectPathRep(*tmpRef._rep);      _rep = tmpRef._rep;
       Ref(_rep);
 } }
  
 CIMObjectPath::CIMObjectPath( CIMObjectPath::CIMObjectPath(
Line 639 
Line 507 
     // Test the objectName out to see if we get an exception     // Test the objectName out to see if we get an exception
     CIMObjectPath tmpRef;     CIMObjectPath tmpRef;
     tmpRef.set(host, nameSpace, className, keyBindings);     tmpRef.set(host, nameSpace, className, keyBindings);
       _rep = tmpRef._rep;
     _rep = new CIMObjectPathRep(*tmpRef._rep);      Ref(_rep);
 } }
  
 CIMObjectPath::~CIMObjectPath() CIMObjectPath::~CIMObjectPath()
 { {
     delete _rep;      Unref(_rep);
 } }
  
 CIMObjectPath& CIMObjectPath::operator=(const CIMObjectPath& x) CIMObjectPath& CIMObjectPath::operator=(const CIMObjectPath& x)
 { {
     *_rep = *x._rep;      if (x._rep != _rep)
       {
           Unref(_rep);
           _rep = x._rep;
           Ref(_rep);
       }
     return *this;     return *this;
 } }
  
   static inline CIMObjectPathRep* _copyOnWriteCIMObjectPathRep(
       CIMObjectPathRep* rep)
   {
       if (rep->_refCounter.get() > 1)
       {
           CIMObjectPathRep* tmpRep= new CIMObjectPathRep(*rep);
           Unref(rep);
           return tmpRep;
       }
       else
       {
           return rep;
       }
   }
   
 void CIMObjectPath::clear() void CIMObjectPath::clear()
 { {
       // If there is more than one reference
       // remove reference and get a new shiny empty representation
       if (_rep->_refCounter.get() > 1)
       {
           Unref(_rep);
           _rep = new CIMObjectPathRep();
       }
       else
       {
           // If there is only one reference
           // no need to copy the data, we own it
           // just clear the fields
     _rep->_host.clear();     _rep->_host.clear();
     _rep->_nameSpace.clear();     _rep->_nameSpace.clear();
     _rep->_className.clear();     _rep->_className.clear();
     _rep->_keyBindings.clear();     _rep->_keyBindings.clear();
 } }
   }
  
 void CIMObjectPath::set( void CIMObjectPath::set(
     const String& host,     const String& host,
Line 668 
Line 569 
     const CIMName& className,     const CIMName& className,
     const Array<CIMKeyBinding>& keyBindings)     const Array<CIMKeyBinding>& keyBindings)
 { {
    setHost(host);      if ((host != String::EMPTY) && !CIMObjectPathRep::isValidHostname(host))
    setNameSpace(nameSpace);      {
    setClassName(className);          throw MalformedObjectNameException(host);
    setKeyBindings(keyBindings);      }
   
       _rep = _copyOnWriteCIMObjectPathRep(_rep);
   
       _rep->_host.assign(host);
       _rep->_nameSpace = nameSpace;
       _rep->_className = className;
       _rep->_keyBindings = keyBindings;
       _BubbleSort(_rep->_keyBindings);
 } }
  
 Boolean _parseHostElement( Boolean _parseHostElement(
Line 804 
Line 713 
  
             p++;             p++;
  
               Array<Uint8> keyValueUTF8;
               keyValueUTF8.reserveCapacity(128);
   
             while (*p && *p != '"')             while (*p && *p != '"')
             {             {
                 if (*p == '\\')                 if (*p == '\\')
                 {                 {
                     *p++;                      p++;
  
                     if ((*p != '\\') && (*p != '"'))                     if ((*p != '\\') && (*p != '"'))
                     {                     {
Line 816 
Line 728 
                     }                     }
                 }                 }
  
                 valueString.append(*p++);                  keyValueUTF8.append(*p++);
             }             }
  
             if (*p++ != '"')             if (*p++ != '"')
                 throw MalformedObjectNameException(objectName);                 throw MalformedObjectNameException(objectName);
  
               // Convert the UTF-8 value to a UTF-16 String
   
               valueString.assign(
                   (const char*)keyValueUTF8.getData(),
                   keyValueUTF8.size());
   
             /*             /*
                 Guess at the type of this quoted key value.  If the value                 Guess at the type of this quoted key value.  If the value
                 can be parsed into a CIMObjectPath with at least one key                 can be parsed into a CIMObjectPath with at least one key
Line 886 
Line 804 
                 isComma = true;                 isComma = true;
             }             }
  
               if (*p == '-')
               {
             Sint64 x;             Sint64 x;
   
             if (!XmlReader::stringToSignedInteger(p, x))             if (!XmlReader::stringToSignedInteger(p, x))
                 throw MalformedObjectNameException(objectName);                 throw MalformedObjectNameException(objectName);
               }
               else
               {
                   Uint64 x;
                   if (!XmlReader::stringToUnsignedInteger(p, x))
                       throw MalformedObjectNameException(objectName);
               }
  
             valueString.assign(p, n);             valueString.assign(p, n);
  
Line 918 
Line 844 
  
 void CIMObjectPath::set(const String& objectName) void CIMObjectPath::set(const String& objectName)
 { {
       // the clear automatically ensures
       // we have our own copy of the representation
     clear();     clear();
  
     //--------------------------------------------------------------------------     //--------------------------------------------------------------------------
Line 976 
Line 904 
  
 CIMObjectPath& CIMObjectPath::operator=(const String& objectName) CIMObjectPath& CIMObjectPath::operator=(const String& objectName)
 { {
       // set will call clear, which will cause copyOnWrite if necessary
     set(objectName);     set(objectName);
     return *this;     return *this;
 } }
Line 987 
Line 916 
  
 void CIMObjectPath::setHost(const String& host) void CIMObjectPath::setHost(const String& host)
 { {
     if ((host != String::EMPTY) && !CIMObjectPathRep::isValidHostname(host))      if ((host != String::EMPTY) &&
           (host != System::getHostName()) &&
           !CIMObjectPathRep::isValidHostname(host))
     {     {
         throw MalformedObjectNameException(host);         throw MalformedObjectNameException(host);
     }     }
       _rep = _copyOnWriteCIMObjectPathRep(_rep);
  
     _rep->_host = host;     _rep->_host = host;
 } }
Line 1002 
Line 934 
  
 void CIMObjectPath::setNameSpace(const CIMNamespaceName& nameSpace) void CIMObjectPath::setNameSpace(const CIMNamespaceName& nameSpace)
 { {
       _rep = _copyOnWriteCIMObjectPathRep(_rep);
    _rep->_nameSpace = nameSpace;    _rep->_nameSpace = nameSpace;
 } }
  
Line 1012 
Line 945 
  
 void CIMObjectPath::setClassName(const CIMName& className) void CIMObjectPath::setClassName(const CIMName& className)
 { {
       _rep = _copyOnWriteCIMObjectPathRep(_rep);
     _rep->_className = className;     _rep->_className = className;
 } }
  
Line 1022 
Line 956 
  
 void CIMObjectPath::setKeyBindings(const Array<CIMKeyBinding>& keyBindings) void CIMObjectPath::setKeyBindings(const Array<CIMKeyBinding>& keyBindings)
 { {
       _rep = _copyOnWriteCIMObjectPathRep(_rep);
     _rep->_keyBindings = keyBindings;     _rep->_keyBindings = keyBindings;
     _BubbleSort(_rep->_keyBindings);     _BubbleSort(_rep->_keyBindings);
 } }
Line 1075 
Line 1010 
  
             CIMKeyBinding::Type type = keyBindings[i].getType();             CIMKeyBinding::Type type = keyBindings[i].getType();
  
             if (type == CIMKeyBinding::STRING || type == CIMKeyBinding::REFERENCE)              if (type == CIMKeyBinding::STRING ||
                   type == CIMKeyBinding::REFERENCE)
                 objectName.append('"');                 objectName.append('"');
  
             objectName.append(value);             objectName.append(value);
  
             if (type == CIMKeyBinding::STRING || type == CIMKeyBinding::REFERENCE)              if (type == CIMKeyBinding::STRING ||
                   type == CIMKeyBinding::REFERENCE)
                 objectName.append('"');                 objectName.append('"');
  
             if (i + 1 != n)             if (i + 1 != n)
Line 1093 
Line 1030 
  
 String CIMObjectPath::_toStringCanonical() const String CIMObjectPath::_toStringCanonical() const
 { {
     CIMObjectPath ref = *this;      CIMObjectPath ref;
       *ref._rep = *this->_rep;
  
     // Normalize hostname by changing to lower case     // Normalize hostname by changing to lower case
     ref._rep->_host.toLower(); // ICU_TODO:     ref._rep->_host.toLower(); // ICU_TODO:


Legend:
Removed from v.1.55  
changed lines
  Added in v.1.62.4.2

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2