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
|