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

  1 karl  1.27 //%2004////////////////////////////////////////////////////////////////////////
  2 mike  1.8  //
  3 karl  1.27 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4            // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5            // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6 karl  1.23 // IBM Corp.; EMC Corporation, The Open Group.
  7 karl  1.27 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8            // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9 mike  1.8  //
 10            // Permission is hereby granted, free of charge, to any person obtaining a copy
 11 kumpf 1.11 // of this software and associated documentation files (the "Software"), to
 12            // deal in the Software without restriction, including without limitation the
 13            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 14 mike  1.8  // sell copies of the Software, and to permit persons to whom the Software is
 15            // furnished to do so, subject to the following conditions:
 16            // 
 17 kumpf 1.11 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 18 mike  1.8  // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 19            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 20 kumpf 1.11 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 21            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 22            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 23 mike  1.8  // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 24            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 25            //
 26            //==============================================================================
 27            //
 28            // Author: Mike Brasher (mbrasher@bmc.com)
 29            //
 30 kumpf 1.14 // Modified By: Roger Kumpf, Hewlett Packard Company (roger_kumpf@hp.com)
 31 kumpf 1.17 //              Carol Ann Krug Graves, Hewlett-Packard Company
 32            //                (carolann_graves@hp.com)
 33 mike  1.8  //
 34            //%/////////////////////////////////////////////////////////////////////////////
 35            
 36            #include <cctype>
 37            #include "CIMName.h"
 38 david 1.19 #include "CommonUTF.h"
 39 mike  1.8  
 40            PEGASUS_NAMESPACE_BEGIN
 41            
 42 kumpf 1.14 ////////////////////////////////////////////////////////////////////////////////
 43            //
 44            // CIMName
 45            //
 46            ////////////////////////////////////////////////////////////////////////////////
 47            
 48            #define PEGASUS_ARRAY_T CIMName
 49            # include "ArrayImpl.h"
 50            #undef PEGASUS_ARRAY_T
 51            
 52            CIMName::CIMName()
 53                : cimName(String::EMPTY)
 54            {
 55            }
 56            
 57            CIMName::CIMName(const String& name)
 58                : cimName(name)
 59            {
 60                if (!legal(name))
 61                {
 62 kumpf 1.16         throw InvalidNameException(name);
 63 kumpf 1.14     }
 64            }
 65            
 66            CIMName::CIMName(const char* name)
 67                : cimName(name)
 68            {
 69                if (!legal(name))
 70                {
 71 kumpf 1.16         throw InvalidNameException(name);
 72 kumpf 1.14     }
 73            }
 74            
 75            CIMName& CIMName::operator=(const CIMName& name)
 76            {
 77 kumpf 1.17     cimName=name.cimName;
 78 kumpf 1.14     return *this;
 79            }
 80            
 81            CIMName& CIMName::operator=(const String& name)
 82            {
 83                if (!legal(name))
 84                {
 85 kumpf 1.16         throw InvalidNameException(name);
 86 kumpf 1.14     }
 87                cimName=name;
 88                return *this;
 89            }
 90            
 91 kumpf 1.17 const String& CIMName::getString() const
 92 kumpf 1.14 {
 93                return cimName;
 94            }
 95            
 96            Boolean CIMName::isNull() const
 97            {
 98                return (cimName.size() == 0);
 99            }
100            
101            void CIMName::clear()
102            {
103                cimName.clear();
104            }
105            
106 kumpf 1.18 Boolean CIMName::legal(const String& name)
107 mike  1.8  {
108 kumpf 1.12     Uint32 length = name.size();
109 kumpf 1.21     Uint16 chkchr;
110 mike  1.8  
111 david 1.19     if (length == 0)
112 kumpf 1.10         return false;
113 mike  1.8  
114 david 1.20     chkchr = name[0];
115 david 1.19 
116 kumpf 1.21     // First character must be alphabetic or '_' if ASCII
117                if(!(
118                     (chkchr == 0x005F) ||
119                     ((chkchr >= 0x0041) && (chkchr <= 0x005A)) ||
120                     ((chkchr >= 0x0061) && (chkchr <= 0x007A)) ||
121                     ((chkchr >= 0x0080) && (chkchr <= 0xFFEF))))
122 david 1.20     {
123 kumpf 1.21         return false;
124 david 1.20     }
125 kumpf 1.21 
126                // Remaining characters must be alphanumeric or '_' if ASCII
127 david 1.20     for(Uint32 i = 1; i < length; ++i)
128 mike  1.8      {
129 kumpf 1.21         chkchr = name[i];
130                    if(!(
131                         (chkchr == 0x005F) ||
132                         ((chkchr >= 0x0041) && (chkchr <= 0x005A)) ||
133                         ((chkchr >= 0x0061) && (chkchr <= 0x007A)) ||
134                         ((chkchr >= 0x0080) && (chkchr <= 0xFFEF)) ||
135                         ((chkchr >= 0x0030) && (chkchr <= 0x0039))))
136 david 1.20         {
137 kumpf 1.21             return false;
138 david 1.20         }
139 mike  1.8      }
140            
141                return true;
142 kumpf 1.10 }
143            
144 kumpf 1.14 Boolean CIMName::equal(const CIMName& name) const
145            {
146                return String::equalNoCase(cimName, name.cimName);
147            }
148            
149 kumpf 1.15 Boolean operator==(const CIMName& name1, const CIMName& name2)
150            {
151                return name1.equal(name2);
152            }
153 kumpf 1.14 
154            
155            ////////////////////////////////////////////////////////////////////////////////
156            //
157            // CIMNamespaceName
158            //
159            ////////////////////////////////////////////////////////////////////////////////
160            
161 kumpf 1.17 #define PEGASUS_ARRAY_T CIMNamespaceName
162            # include "ArrayImpl.h"
163            #undef PEGASUS_ARRAY_T
164            
165 kumpf 1.14 CIMNamespaceName::CIMNamespaceName()
166                : cimNamespaceName(String::EMPTY)
167            {
168            }
169            
170            CIMNamespaceName::CIMNamespaceName(const String& name)
171            {
172 kumpf 1.24     *this = name;
173 kumpf 1.14 }
174            
175            CIMNamespaceName::CIMNamespaceName(const char* name)
176            {
177 kumpf 1.24     *this = String(name);
178 kumpf 1.14 }
179            
180            CIMNamespaceName& CIMNamespaceName::operator=(const CIMNamespaceName& name)
181            {
182 kumpf 1.17     cimNamespaceName=name.cimNamespaceName;
183 kumpf 1.14     return *this;
184            }
185            
186            CIMNamespaceName& CIMNamespaceName::operator=(const String& name)
187            {
188                if (!legal(name))
189                {
190 kumpf 1.16         throw InvalidNamespaceNameException(name);
191 kumpf 1.14     }
192 kumpf 1.24 
193                if (name[0] == '/')
194                {
195                    // Strip off the meaningless leading '/'
196                    cimNamespaceName=name.subString(1);
197                }
198                else
199                {
200                    cimNamespaceName=name;
201                }
202            
203 kumpf 1.14     return *this;
204            }
205            
206 kumpf 1.17 const String& CIMNamespaceName::getString() const
207 kumpf 1.14 {
208                return cimNamespaceName;
209            }
210            
211            Boolean CIMNamespaceName::isNull() const
212            {
213                return (cimNamespaceName.size() == 0);
214            }
215            
216            void CIMNamespaceName::clear()
217            {
218                cimNamespaceName.clear();
219            }
220            
221 kumpf 1.18 Boolean CIMNamespaceName::legal(const String& name)
222 kumpf 1.14 {
223 kumpf 1.21     Uint32 length = name.size();
224                Uint32 index = 0;
225 kumpf 1.14 
226 kumpf 1.21     // Skip a leading '/' because the CIM specification is ambiguous
227                if (name[0] == '/')
228 david 1.19     {
229 kumpf 1.21         index++;
230 kumpf 1.14     }
231            
232 kumpf 1.21     Boolean moreElements = true;
233 kumpf 1.14 
234 kumpf 1.21     // Check each namespace element (delimited by '/' characters)
235                while (moreElements)
236 kumpf 1.14     {
237 kumpf 1.21         moreElements = false;
238 kumpf 1.14 
239 kumpf 1.21         if (index == length)
240                    {
241                        return false;
242                    }
243 kumpf 1.14 
244 kumpf 1.21         Uint16 chkchr = name[index++];
245 kumpf 1.14 
246 kumpf 1.21         // First character must be alphabetic or '_' if ASCII
247                    if(!(
248                         (chkchr == 0x005F) ||
249                         ((chkchr >= 0x0041) && (chkchr <= 0x005A)) ||
250                         ((chkchr >= 0x0061) && (chkchr <= 0x007A)) ||
251                         ((chkchr >= 0x0080) && (chkchr <= 0xFFEF))))
252 kumpf 1.14         {
253                        return false;
254                    }
255 kumpf 1.21 
256                    // Remaining characters must be alphanumeric or '_' if ASCII
257                    while (index < length)
258                    {
259                        chkchr = name[index++];
260            
261                        // A '/' indicates another namespace element follows
262                        if (chkchr == '/')
263                        {
264                            moreElements = true;
265                            break;
266                        }
267            
268                        if(!(
269                             (chkchr == 0x005F) ||
270                             ((chkchr >= 0x0041) && (chkchr <= 0x005A)) ||
271                             ((chkchr >= 0x0061) && (chkchr <= 0x007A)) ||
272                             ((chkchr >= 0x0080) && (chkchr <= 0xFFEF)) ||
273                             ((chkchr >= 0x0030) && (chkchr <= 0x0039))))
274                        {
275                            return false;
276 kumpf 1.21             }
277                    }
278 kumpf 1.14     }
279            
280                return true;
281            }
282            
283            Boolean CIMNamespaceName::equal(const CIMNamespaceName& name) const
284            {
285                return String::equalNoCase(cimNamespaceName, name.cimNamespaceName);
286            }
287 kumpf 1.17 
288            Boolean operator==(const CIMNamespaceName& name1, const CIMNamespaceName& name2)
289            {
290                return name1.equal(name2);
291            }
292 mike  1.8  
293            PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2