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

  1 karl  1.49 //%2006////////////////////////////////////////////////////////////////////////
  2 mike  1.13 //
  3 karl  1.40 // 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.39 // IBM Corp.; EMC Corporation, The Open Group.
  7 karl  1.40 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8            // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9 karl  1.42 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10            // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 karl  1.49 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 12            // EMC Corporation; Symantec Corporation; The Open Group.
 13 mike  1.13 //
 14            // Permission is hereby granted, free of charge, to any person obtaining a copy
 15 kumpf 1.24 // of this software and associated documentation files (the "Software"), to
 16            // deal in the Software without restriction, including without limitation the
 17            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 18 mike  1.13 // sell copies of the Software, and to permit persons to whom the Software is
 19            // furnished to do so, subject to the following conditions:
 20 karl  1.49 // 
 21 kumpf 1.24 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 22 mike  1.13 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 23            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 24 kumpf 1.24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 25            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 26            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 27 mike  1.13 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 28            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 29            //
 30            //==============================================================================
 31            //
 32            //%/////////////////////////////////////////////////////////////////////////////
 33            
 34 sage  1.15 #include <Pegasus/Common/Config.h>
 35 mike  1.13 #include "CIMMethod.h"
 36 kumpf 1.18 #include "CIMMethodRep.h"
 37 kumpf 1.27 #include "Resolver.h"
 38 mike  1.13 #include "Indentor.h"
 39            #include "CIMName.h"
 40            #include "CIMScope.h"
 41            #include "XmlWriter.h"
 42 kumpf 1.23 #include "MofWriter.h"
 43 kumpf 1.51 #include <Pegasus/Common/MessageLoader.h>
 44 mike  1.48 #include "StrLit.h"
 45 mike  1.13 
 46            PEGASUS_NAMESPACE_BEGIN
 47            
 48 chip  1.44 CIMMethodRep::CIMMethodRep(const CIMMethodRep& x) :
 49                Sharable(),
 50                _name(x._name),
 51                _type(x._type),
 52                _classOrigin(x._classOrigin),
 53                _propagated(x._propagated)
 54            {
 55                x._qualifiers.cloneTo(_qualifiers);
 56            
 57                _parameters.reserveCapacity(x._parameters.size());
 58            
 59                for (Uint32 i = 0, n = x._parameters.size(); i < n; i++)
 60                {
 61                    _parameters.append(x._parameters[i].clone());
 62                }
 63            }
 64            
 65 mike  1.13 CIMMethodRep::CIMMethodRep(
 66 kumpf 1.29     const CIMName& name,
 67 mike  1.13     CIMType type,
 68 kumpf 1.29     const CIMName& classOrigin,
 69 mike  1.13     Boolean propagated)
 70                : _name(name), _type(type),
 71                _classOrigin(classOrigin), _propagated(propagated)
 72            {
 73 chip  1.44     // ensure name is not null
 74 kumpf 1.51     if (name.isNull())
 75 chip  1.44     {
 76                    throw UninitializedObjectException();
 77                }
 78 mike  1.13 }
 79            
 80            CIMMethodRep::~CIMMethodRep()
 81            {
 82            }
 83            
 84 kumpf 1.29 void CIMMethodRep::setName(const CIMName& name)
 85 mike  1.13 {
 86 chip  1.44     // ensure name is not null
 87 kumpf 1.51     if (name.isNull())
 88 chip  1.44     {
 89                    throw UninitializedObjectException();
 90                }
 91            
 92 mike  1.13     _name = name;
 93            }
 94            
 95 kumpf 1.29 void CIMMethodRep::setClassOrigin(const CIMName& classOrigin)
 96 mike  1.13 {
 97                _classOrigin = classOrigin;
 98            }
 99            
100            void CIMMethodRep::addParameter(const CIMParameter& x)
101            {
102 kumpf 1.31     if (x.isUninitialized())
103 david.dillard 1.43         throw UninitializedObjectException();
104 mike          1.13 
105 kumpf         1.50     if (findParameter(x.getName()) != PEG_NOT_FOUND)
106                        {
107 humberto      1.38         MessageLoaderParms parms("Common.CIMMethodRep.PARAMETER",
108 kumpf         1.50             "parameter \"$0\"",
109                                x.getName().getString());
110 humberto      1.38         throw AlreadyExistsException(parms);
111                        }
112 mike          1.13 
113                        _parameters.append(x);
114                    }
115                    
116 kumpf         1.29 Uint32 CIMMethodRep::findParameter(const CIMName& name) const
117 mike          1.13 {
118                        for (Uint32 i = 0, n = _parameters.size(); i < n; i++)
119                        {
120 david.dillard 1.43         if (name.equal(_parameters[i].getName()))
121                                return i;
122 mike          1.13     }
123                    
124                        return PEG_NOT_FOUND;
125                    }
126                    
127 kumpf         1.36 CIMParameter CIMMethodRep::getParameter(Uint32 index)
128 mike          1.13 {
129 kumpf         1.36     if (index >= _parameters.size())
130 david.dillard 1.43         throw IndexOutOfBoundsException();
131 mike          1.13 
132 kumpf         1.36     return _parameters[index];
133 mike          1.13 }
134                    
135 kumpf         1.36 void CIMMethodRep::removeParameter(Uint32 index)
136 kumpf         1.32 {
137 kumpf         1.36     if (index >= _parameters.size())
138 david.dillard 1.43         throw IndexOutOfBoundsException();
139 kumpf         1.32 
140 kumpf         1.36     _parameters.remove (index);
141 kumpf         1.32 }
142                    
143 mike          1.13 Uint32 CIMMethodRep::getParameterCount() const
144                    {
145                        return _parameters.size();
146                    }
147                    
148                    void CIMMethodRep::resolve(
149                        DeclContext* declContext,
150 kumpf         1.29     const CIMNamespaceName& nameSpace,
151 mike          1.13     const CIMConstMethod& inheritedMethod)
152                    {
153                        // ATTN: Check to see if this method has same signature as
154                        // inherited one.
155                    
156                        // Check for type mismatch between return types.
157                    
158 kumpf         1.31     PEGASUS_ASSERT(!inheritedMethod.isUninitialized());
159 mike          1.13 
160                        // Validate the qualifiers of the method (according to
161                        // superClass's method with the same name). This method
162                        // will throw an exception if the validation fails.
163                    
164                        _qualifiers.resolve(
165 david.dillard 1.43         declContext,
166                            nameSpace,
167                            CIMScope::METHOD,
168                            false,
169                            inheritedMethod._rep->_qualifiers,
170                            true);
171 mike          1.13 
172                        // Validate each of the parameters:
173                    
174 david.dillard 1.43     for (Uint32 i = 0; i < _parameters.size(); i++)
175                            Resolver::resolveParameter (_parameters[i], declContext, nameSpace);
176 mike          1.13 
177                        _classOrigin = inheritedMethod.getClassOrigin();
178                    }
179                    
180                    void CIMMethodRep::resolve(
181                        DeclContext* declContext,
182 kumpf         1.29     const CIMNamespaceName& nameSpace)
183 mike          1.13 {
184                        // Validate the qualifiers:
185                    
186                        CIMQualifierList dummy;
187                    
188                        _qualifiers.resolve(
189 david.dillard 1.43         declContext,
190                            nameSpace,
191                            CIMScope::METHOD,
192                            false,
193                            dummy,
194                            true);
195 mike          1.13 
196                        // Validate each of the parameters:
197                    
198 david.dillard 1.43     for (Uint32 i = 0; i < _parameters.size(); i++)
199                            Resolver::resolveParameter (_parameters[i], declContext, nameSpace);
200 mike          1.13 }
201                    
202                    static const char* _toString(Boolean x)
203                    {
204                        return x ? "true" : "false";
205                    }
206                    
207 mike          1.47 void CIMMethodRep::toXml(Buffer& out) const
208 mike          1.13 {
209 mike          1.48     out << STRLIT("<METHOD NAME=\"") << _name;
210                        out.append('"');
211 mike          1.13 
212 mike          1.48     out << STRLIT(" TYPE=\"") << cimTypeToString(_type);
213                        out.append('"');
214 mike          1.13 
215 kumpf         1.29     if (!_classOrigin.isNull())
216 mike          1.48     {
217                            out << STRLIT(" CLASSORIGIN=\"") << _classOrigin;
218 kumpf         1.50         out.append('"');
219 mike          1.48     }
220 mike          1.13 
221                        if (_propagated != false)
222 mike          1.48     {
223                            out << STRLIT(" PROPAGATED=\"") << _toString(_propagated);
224 kumpf         1.50         out.append('"');
225 mike          1.48     }
226 mike          1.13 
227 mike          1.48     out << STRLIT(">\n");
228 mike          1.13 
229                        _qualifiers.toXml(out);
230                    
231                        for (Uint32 i = 0, n = _parameters.size(); i < n; i++)
232 david.dillard 1.43         XmlWriter::appendParameterElement(out, _parameters[i]);
233 mike          1.13 
234 mike          1.48     out << STRLIT("</METHOD>\n");
235 mike          1.13 }
236                    
237 mike          1.14 /**
238                        The BNF for this is;
239 david.dillard 1.43     methodDeclaration   =  [ qualifierList ] dataType methodName
240                                               "(" [ parameterList ] ")" ";"
241 mike          1.14 
242 david.dillard 1.43     parameterList       =  parameter *( "," parameter )
243 mike          1.14     Format with qualifiers on one line and declaration on another. Start
244                        with newline but none at the end.
245                    */
246 mike          1.47 void CIMMethodRep::toMof(Buffer& out) const   //ATTNKS:
247 mike          1.14 {
248                        // Output the qualifier list starting on new line
249                        if (_qualifiers.getCount())
250 mike          1.48         out.append('\n');
251 mike          1.14 
252                        _qualifiers.toMof(out);
253                    
254 david.dillard 1.43     // output the type, MethodName and ParmeterList left enclosure
255 mike          1.48     out.append('\n');
256                        out << cimTypeToString(_type);
257                        out.append(' ');
258                        out << _name;
259                        out.append('(');
260 mike          1.14 
261                        // output the param list separated by commas.
262 chip          1.44 
263 mike          1.14     for (Uint32 i = 0, n = _parameters.size(); i < n; i++)
264                        {
265 david.dillard 1.43         // If not first, output comma separator
266                            if (i)
267 mike          1.48             out << STRLIT(", ");
268 mike          1.14 
269 david.dillard 1.43         MofWriter::appendParameterElement(out, _parameters[i]);
270 mike          1.14     }
271                    
272                        // output the parameterlist and method terminator
273 mike          1.48     out << STRLIT(");");
274 mike          1.14 }
275                    
276                    
277 mike          1.13 Boolean CIMMethodRep::identical(const CIMMethodRep* x) const
278                    {
279 kumpf         1.52     // If the pointers are the same, the objects must be identical
280                        if (this == x)
281                        {
282                            return true;
283                        }
284                    
285 kumpf         1.37     if (!_name.equal (x->_name))
286 david.dillard 1.43         return false;
287 mike          1.13 
288                        if (_type != x->_type)
289 david.dillard 1.43         return false;
290 mike          1.13 
291                        if (!_qualifiers.identical(x->_qualifiers))
292 david.dillard 1.43         return false;
293 mike          1.13 
294                        if (_parameters.size() != x->_parameters.size())
295 david.dillard 1.43         return false;
296 mike          1.13 
297                        for (Uint32 i = 0, n = _parameters.size(); i < n; i++)
298                        {
299 david.dillard 1.43         if (!_parameters[i].identical(x->_parameters[i]))
300                                return false;
301 mike          1.13     }
302                    
303                        return true;
304                    }
305                    
306                    void CIMMethodRep::setType(CIMType type)
307                    {
308                        _type = type;
309                    }
310                    
311                    PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2