version 1.38, 2004/05/18 11:03:38
|
version 1.43.2.1, 2005/03/29 19:35:20
|
|
|
//%2003//////////////////////////////////////////////////////////////////////// |
//%2004//////////////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Development |
// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development |
// Company, L. P., IBM Corp., The Open Group, Tivoli Systems. |
// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. |
// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.; | // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.; |
// IBM Corp.; EMC Corporation, The Open Group. | // IBM Corp.; EMC Corporation, The Open Group. |
|
// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.; |
|
// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. |
// | // |
// Permission is hereby granted, free of charge, to any person obtaining a copy | // Permission is hereby granted, free of charge, to any person obtaining a copy |
// of this software and associated documentation files (the "Software"), to | // of this software and associated documentation files (the "Software"), to |
|
|
// Modified By: Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com) | // Modified By: Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com) |
// Carol Ann Krug Graves, Hewlett-Packard Company | // Carol Ann Krug Graves, Hewlett-Packard Company |
// (carolann_graves@hp.com) | // (carolann_graves@hp.com) |
// Amit K Arora, IBM (amita@in.ibm.com) |
// Dave Sudlik, IBM (dsudlik@us.ibm.com) for Bug#1462 |
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
|
|
#include "CIMObjectPath.h" | #include "CIMObjectPath.h" |
#include "Indentor.h" | #include "Indentor.h" |
#include "CIMName.h" | #include "CIMName.h" |
|
#include "Destroyer.h" |
#include "XmlWriter.h" | #include "XmlWriter.h" |
#include "XmlReader.h" | #include "XmlReader.h" |
#include "ArrayInternal.h" | #include "ArrayInternal.h" |
|
|
}; | }; |
| |
| |
CIMKeyBinding::CIMKeyBinding(): |
CIMKeyBinding::CIMKeyBinding() |
_rep(new CIMKeyBindingRep()) |
|
{ | { |
|
_rep = new CIMKeyBindingRep(); |
} | } |
| |
CIMKeyBinding::CIMKeyBinding(const CIMKeyBinding& x): |
CIMKeyBinding::CIMKeyBinding(const CIMKeyBinding& x) |
_rep(new CIMKeyBindingRep(*(x._rep.get()))) |
|
{ | { |
|
_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); |
} | } |
| |
CIMKeyBinding::CIMKeyBinding(const CIMName& name, const CIMValue& value) | CIMKeyBinding::CIMKeyBinding(const CIMName& name, const CIMValue& value) |
|
|
break; | break; |
} | } |
| |
_rep.reset(new CIMKeyBindingRep(name, kbValue, kbType)); |
_rep = new CIMKeyBindingRep(name, kbValue, kbType); |
} | } |
| |
CIMKeyBinding::~CIMKeyBinding() | CIMKeyBinding::~CIMKeyBinding() |
{ | { |
|
delete _rep; |
} | } |
| |
CIMKeyBinding& CIMKeyBinding::operator=(const CIMKeyBinding& x) | CIMKeyBinding& CIMKeyBinding::operator=(const CIMKeyBinding& x) |
{ | { |
CIMKeyBindingRep *tmp = new CIMKeyBindingRep(*x._rep.get()); |
*_rep = *x._rep; |
_rep.reset(tmp); |
|
return *this; | return *this; |
} | } |
| |
|
|
// fully-qualified domain name (e.g., xyz.company.com) or may be an | // fully-qualified domain name (e.g., xyz.company.com) or may be an |
// IP address. A port number may follow the hostname. | // IP address. A port number may follow the hostname. |
// Hostnames must match one of the following regular expressions: | // Hostnames must match one of the following regular expressions: |
// ^([A-Za-z][A-Za-z0-9-]*)(\.[A-Za-z][A-Za-z0-9-]*)*(:[0-9]*)?$ |
// ^([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]*)?$ | // ^([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; | Uint32 i = 0; |
| |
|
Boolean isValid = false; |
|
|
if (isdigit(hostname[0])) | if (isdigit(hostname[0])) |
{ | { |
// Validate an IP address |
//-------------------------------------------------------------- |
|
// 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++) | for (Uint32 octet=1; octet<=4; octet++) |
{ | { |
Uint32 octetValue = 0; | 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 (!isdigit(hostname[i])) | if (!isdigit(hostname[i])) |
{ | { |
return false; |
isValid = false; |
|
break; |
} | } |
| |
while (isdigit(hostname[i])) |
while (isdigit(hostname[i])) // skip over digits |
{ | { |
octetValue = octetValue*10 + (hostname[i] - '0'); | octetValue = octetValue*10 + (hostname[i] - '0'); |
i++; | i++; |
|
|
| |
if (octetValue > 255) | if (octetValue > 255) |
{ | { |
return false; |
isValid = false; |
|
break; |
} | } |
| |
|
// Check for invalid character in IP address |
if ((octet != 4) && (hostname[i++] != '.')) | if ((octet != 4) && (hostname[i++] != '.')) |
{ | { |
return false; |
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; |
} | } |
} | } |
} | } |
else |
if (!isValid) // if it is not a valid IP address |
{ | { |
|
i = 0; // reset index for host name check |
|
|
// Validate a hostname | // Validate a hostname |
|
isValid = true; |
| |
Boolean expectHostSegment = true; | Boolean expectHostSegment = true; |
|
Boolean hostSegmentIsNumeric; |
| |
while (expectHostSegment == true) | while (expectHostSegment == true) |
{ | { |
expectHostSegment = false; | expectHostSegment = false; |
|
hostSegmentIsNumeric = true; // assume all-numeric host segment |
| |
if (!isalpha(hostname[i++])) |
if (!isalnum(hostname[i])) |
{ | { |
return false; | return false; |
} | } |
| |
while (isalnum(hostname[i]) || (hostname[i] == '-')) | while (isalnum(hostname[i]) || (hostname[i] == '-')) |
{ | { |
|
// If a non-digit is encountered, set "all-numeric" |
|
// flag to false |
|
if (isalpha(hostname[i]) || (hostname[i] == '-')) { |
|
hostSegmentIsNumeric = false; |
|
} |
i++; | i++; |
} | } |
| |
|
|
expectHostSegment = true; | 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 false; |
} | } |
| |
// Check for a port number: | // Check for a port number: |
|
|
}; | }; |
| |
| |
CIMObjectPath::CIMObjectPath() : |
CIMObjectPath::CIMObjectPath() |
_rep(new CIMObjectPathRep()) |
|
{ | { |
|
_rep = new CIMObjectPathRep(); |
} | } |
| |
CIMObjectPath::CIMObjectPath(const CIMObjectPath& x) : |
CIMObjectPath::CIMObjectPath(const CIMObjectPath& x) |
_rep(new CIMObjectPathRep(*x._rep.get())) |
|
{ | { |
|
_rep = new CIMObjectPathRep(*x._rep); |
} | } |
| |
CIMObjectPath::CIMObjectPath(const String& objectName) | CIMObjectPath::CIMObjectPath(const String& objectName) |
|
|
CIMObjectPath tmpRef; | CIMObjectPath tmpRef; |
tmpRef.set(objectName); | tmpRef.set(objectName); |
| |
_rep.reset(new CIMObjectPathRep(*tmpRef._rep.get())); |
_rep = new CIMObjectPathRep(*tmpRef._rep); |
} | } |
| |
CIMObjectPath::CIMObjectPath( | CIMObjectPath::CIMObjectPath( |
|
|
CIMObjectPath tmpRef; | CIMObjectPath tmpRef; |
tmpRef.set(host, nameSpace, className, keyBindings); | tmpRef.set(host, nameSpace, className, keyBindings); |
| |
_rep.reset(new CIMObjectPathRep(*tmpRef._rep.get())); |
_rep = new CIMObjectPathRep(*tmpRef._rep); |
} | } |
| |
CIMObjectPath::~CIMObjectPath() | CIMObjectPath::~CIMObjectPath() |
{ | { |
|
delete _rep; |
} | } |
| |
CIMObjectPath& CIMObjectPath::operator=(const CIMObjectPath& x) | CIMObjectPath& CIMObjectPath::operator=(const CIMObjectPath& x) |
{ | { |
CIMObjectPathRep *tmp = new CIMObjectPathRep(*x._rep.get()); |
*_rep = *x._rep; |
_rep.reset(tmp); |
|
return *this; | return *this; |
} | } |
| |
|
|
type = CIMKeyBinding::REFERENCE; | type = CIMKeyBinding::REFERENCE; |
} | } |
} | } |
catch (Exception & e) |
catch (const Exception &) |
{ | { |
// Not a reference value; leave type as STRING | // Not a reference value; leave type as STRING |
} | } |
|
|
return !operator==(x, y); | return !operator==(x, y); |
} | } |
| |
#ifdef PEGASUS_USE_DEPRECATED_INTERFACES |
|
PEGASUS_STD(ostream)& operator<<( |
|
PEGASUS_STD(ostream)& os, |
|
const CIMObjectPath& x) |
|
{ |
|
return os << x.toString(); |
|
} |
|
#endif |
|
|
|
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |