xref: /AOO41X/main/registry/inc/registry/reflwrit.hxx (revision 5a5f4a753fc2b8c5e36d61a0683c4a2f75cb68ee)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _REGISTRY_REFLWRIT_HXX_
25 #define _REGISTRY_REFLWRIT_HXX_
26 
27 #include <registry/refltype.hxx>
28 #include <registry/regtype.h>
29 #include <rtl/ustring.hxx>
30 
31 /// Implememetation handle
32 typedef void* TypeWriterImpl;
33 
34 /****************************************************************************
35 
36     C-Api
37 
38 *****************************************************************************/
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
44 /** specifies a collection of function pointers which represents the complete registry type writer C-API.
45 
46     This funtions pointers are used by the C++ wrapper to call the C-API.
47 */
48 struct RegistryTypeWriter_Api
49 {
50     TypeWriterImpl          (TYPEREG_CALLTYPE *createEntry)         (RTTypeClass, rtl_uString*, rtl_uString*, sal_uInt16, sal_uInt16, sal_uInt16);
51     void                    (TYPEREG_CALLTYPE *acquire)             (TypeWriterImpl);
52     void                    (TYPEREG_CALLTYPE *release)             (TypeWriterImpl);
53     void                    (TYPEREG_CALLTYPE *setUik)              (TypeWriterImpl, const RTUik*);
54     void                    (TYPEREG_CALLTYPE *setDoku)             (TypeWriterImpl, rtl_uString*);
55     void                    (TYPEREG_CALLTYPE *setFileName)         (TypeWriterImpl, rtl_uString*);
56     void                    (TYPEREG_CALLTYPE *setFieldData)        (TypeWriterImpl, sal_uInt16, rtl_uString*, rtl_uString*, rtl_uString*, rtl_uString*, RTFieldAccess, RTValueType, RTConstValueUnion);
57     void                    (TYPEREG_CALLTYPE *setMethodData)       (TypeWriterImpl, sal_uInt16, rtl_uString*, rtl_uString*, RTMethodMode, sal_uInt16, sal_uInt16, rtl_uString*);
58     void                    (TYPEREG_CALLTYPE *setParamData)        (TypeWriterImpl, sal_uInt16, sal_uInt16, rtl_uString*, rtl_uString*, RTParamMode);
59     void                    (TYPEREG_CALLTYPE *setExcData)          (TypeWriterImpl, sal_uInt16, sal_uInt16, rtl_uString*);
60     const sal_uInt8*        (TYPEREG_CALLTYPE *getBlop)             (TypeWriterImpl);
61     sal_uInt32              (TYPEREG_CALLTYPE *getBlopSize)         (TypeWriterImpl);
62 
63     void                    (TYPEREG_CALLTYPE *setReferenceData)    (TypeWriterImpl, sal_uInt16, rtl_uString*, RTReferenceType, rtl_uString*, RTFieldAccess);
64 };
65 
66 /** the API initialization function.
67 */
68 RegistryTypeWriter_Api* TYPEREG_CALLTYPE initRegistryTypeWriter_Api(void);
69 
70 #ifdef __cplusplus
71 }
72 #endif
73 
74 /** RegistryTypeWriter writes/creates a binary type blob.
75 
76     This class provides the necessary functions to write type informations
77     for all kinds of types into a blob.
78     The class is inline and use a C-Api.
79 
80     @deprecated
81     use typereg::Writer instead
82 */
83 class RegistryTypeWriter
84 {
85 public:
86 
87     /** Constructor.
88 
89         @param RTTypeClass specifies the type of the new blob.
90         @param typeName specifies the full qualified type name with '/' as separator.
91         @param superTypeName specifies the full qualified type name of the base type
92                              with '/' as separator.
93         @param fieldCount specifies the number of fields (eg. number of attrbutes/properties,
94                           enum values or constants).
95         @param methodCount specifies the number of methods.
96         @param referenceCount specifies the number of references (eg. number of supported interfaces,
97                               exported services ...)
98      */
99     inline RegistryTypeWriter(RTTypeClass               RTTypeClass,
100                               const ::rtl::OUString&    typeName,
101                               const ::rtl::OUString&    superTypeName,
102                               sal_uInt16                fieldCount,
103                               sal_uInt16                methodCount,
104                               sal_uInt16                referenceCount);
105 
106     /// Copy constructcor
107     inline RegistryTypeWriter(const RegistryTypeWriter& toCopy);
108 
109     /** Destructor. The Destructor frees the internal data block.
110 
111         The pointer (returned by getBlop) will be set to NULL.
112      */
113     inline ~RegistryTypeWriter();
114 
115     /// Assign operator
116     inline RegistryTypeWriter& operator == (const RegistryTypeWriter& toAssign);
117 
118     /** @deprecated
119         sets the unique identifier for an interface type.
120 
121         An earlier version of UNO used an unique identifier for interfaces. In the
122         current version of UNO this uik was eliminated and this function is
123         not longer used.
124      */
125     inline void setUik(const RTUik& uik);
126 
127     /** sets a documentation string for the type.
128 
129         This documentation should be the same as the documentation which is provided
130         for this type in IDL.
131      */
132     inline void setDoku(const ::rtl::OUString& doku);
133 
134     /** sets the IDL filename where this type is defined.
135      */
136     inline void setFileName(const ::rtl::OUString& fileName);
137 
138     /** sets the data for a field member of a type blob.
139 
140         @param index indicates the index of the field.
141         @param name specifies the name.
142         @param typeName specifies the full qualified typename.
143         @param doku specifies the documentation string of the field.
144         @param fileName specifies the name of the IDL file where the field is defined.
145         @param access specifies the access mode of the field.
146         @param constValue specifies the value of the field. The value is only interesting
147                           for enum values or constants.
148      */
149     inline void setFieldData( sal_uInt16                index,
150                               const ::rtl::OUString&    name,
151                               const ::rtl::OUString&    typeName,
152                               const ::rtl::OUString&    doku,
153                               const ::rtl::OUString&    fileName,
154                               RTFieldAccess             access,
155                               RTConstValue              constValue = RTConstValue());
156 
157     /** sets the data for a method.
158 
159         @param index indicates the index of the method.
160         @param name specifies the name.
161         @param typeName specifies the full qualified return typename.
162         @param mode specifies the method mode.
163         @param paramCount specifies the number of parameters.
164         @param excCount specifies the number of exceptions.
165         @param doku specifies the documentation string of the field.
166      */
167     inline void setMethodData(sal_uInt16                index,
168                               const ::rtl::OUString&    name,
169                               const ::rtl::OUString&    returnTypeName,
170                               RTMethodMode              mode,
171                               sal_uInt16                paramCount,
172                               sal_uInt16                excCount,
173                               const ::rtl::OUString&    doku);
174 
175     /** sets the data for the specified parameter of a method.
176 
177         @param index indicates the index of the method.
178         @param paramIndex specifies the index of the parameter.
179         @param type specifies the full qualified typename.
180         @param name specifies the name.
181         @param mode specifies the parameter mode.
182      */
183     inline void setParamData(sal_uInt16             index,
184                              sal_uInt16             paramIndex,
185                              const ::rtl::OUString& type,
186                              const ::rtl::OUString& name,
187                              RTParamMode            mode);
188 
189     /** sets the data for the specified exception of a mehtod.
190 
191         @param index indicates the index of the method.
192         @param excIndex specifies the index of the exception.
193         @param type specifies the full qualified typename of the exception.
194      */
195     inline void setExcData(sal_uInt16               index,
196                            sal_uInt16               excIndex,
197                            const ::rtl::OUString&   type);
198 
199     /** returns a pointer to the new type blob.
200 
201         The pointer will be invalid (NULL) if the instance of
202         the RegistryTypeWriter will be destroyed.
203      */
204     inline const sal_uInt8*     getBlop();
205 
206     /** returns the size of the new type blob in bytes.
207      */
208     inline sal_uInt32       getBlopSize();
209 
210     /** sets the data for a reference member.
211 
212         @param index indicates the index of the reference.
213         @param name specifies the name.
214         @param refType specifies the full qualified typename of the reference.
215         @param doku specifies the documentation string of the reference.
216         @param access specifies the access mode of the reference.
217      */
218     inline void setReferenceData( sal_uInt16                index,
219                                   const ::rtl::OUString&    name,
220                                   RTReferenceType           refType,
221                                   const ::rtl::OUString&    doku,
222                                   RTFieldAccess             access = RT_ACCESS_INVALID);
223 
224 protected:
225 
226     /// stores the registry type writer Api.
227     const RegistryTypeWriter_Api*                                m_pApi;
228     /// stores the handle of an implementation class
229     TypeWriterImpl                                               m_hImpl;
230 };
231 
232 
233 
RegistryTypeWriter(RTTypeClass RTTypeClass,const::rtl::OUString & typeName,const::rtl::OUString & superTypeName,sal_uInt16 fieldCount,sal_uInt16 methodCount,sal_uInt16 referenceCount)234 inline RegistryTypeWriter::RegistryTypeWriter(RTTypeClass               RTTypeClass,
235                                               const ::rtl::OUString&    typeName,
236                                               const ::rtl::OUString&    superTypeName,
237                                               sal_uInt16                fieldCount,
238                                               sal_uInt16                methodCount,
239                                               sal_uInt16                referenceCount)
240     : m_pApi(initRegistryTypeWriter_Api())
241     , m_hImpl(NULL)
242 {
243     m_hImpl = m_pApi->createEntry(RTTypeClass,
244                                   typeName.pData,
245                                   superTypeName.pData,
246                                   fieldCount,
247                                   methodCount,
248                                   referenceCount);
249 }
250 
251 
RegistryTypeWriter(const RegistryTypeWriter & toCopy)252 inline RegistryTypeWriter::RegistryTypeWriter(const RegistryTypeWriter& toCopy)
253     : m_pApi(toCopy.m_pApi)
254     , m_hImpl(toCopy.m_hImpl)
255 {
256     m_pApi->acquire(m_hImpl);
257 }
258 
~RegistryTypeWriter()259 inline RegistryTypeWriter::~RegistryTypeWriter()
260 {
261     m_pApi->release(m_hImpl);
262 }
263 
operator ==(const RegistryTypeWriter & toAssign)264 inline RegistryTypeWriter& RegistryTypeWriter::operator == (const RegistryTypeWriter& toAssign)
265 {
266     if (m_hImpl != toAssign.m_hImpl)
267     {
268         m_pApi->release(m_hImpl);
269         m_hImpl = toAssign.m_hImpl;
270         m_pApi->acquire(m_hImpl);
271     }
272 
273     return *this;
274 }
275 
setFieldData(sal_uInt16 index,const::rtl::OUString & name,const::rtl::OUString & typeName,const::rtl::OUString & doku,const::rtl::OUString & fileName,RTFieldAccess access,RTConstValue constValue)276 inline void RegistryTypeWriter::setFieldData( sal_uInt16                index,
277                                               const ::rtl::OUString&    name,
278                                               const ::rtl::OUString&    typeName,
279                                               const ::rtl::OUString&    doku,
280                                               const ::rtl::OUString&    fileName,
281                                               RTFieldAccess             access,
282                                               RTConstValue              constValue)
283 {
284     m_pApi->setFieldData(m_hImpl, index, name.pData, typeName.pData, doku.pData, fileName.pData, access, constValue.m_type, constValue.m_value);
285 }
286 
287 
setMethodData(sal_uInt16 index,const::rtl::OUString & name,const::rtl::OUString & returnTypeName,RTMethodMode mode,sal_uInt16 paramCount,sal_uInt16 excCount,const::rtl::OUString & doku)288 inline void RegistryTypeWriter::setMethodData(sal_uInt16                index,
289                                               const ::rtl::OUString&    name,
290                                               const ::rtl::OUString&    returnTypeName,
291                                               RTMethodMode              mode,
292                                               sal_uInt16                paramCount,
293                                               sal_uInt16                excCount,
294                                               const ::rtl::OUString&    doku)
295 {
296     m_pApi->setMethodData(m_hImpl, index, name.pData, returnTypeName.pData, mode, paramCount, excCount, doku.pData);
297 }
298 
299 
setUik(const RTUik & uik)300 inline void RegistryTypeWriter::setUik(const RTUik& uik)
301 {
302     m_pApi->setUik(m_hImpl, &uik);
303 }
304 
setDoku(const::rtl::OUString & doku)305 inline void RegistryTypeWriter::setDoku(const ::rtl::OUString& doku)
306 {
307     m_pApi->setDoku(m_hImpl, doku.pData);
308 }
309 
setFileName(const::rtl::OUString & doku)310 inline void RegistryTypeWriter::setFileName(const ::rtl::OUString& doku)
311 {
312     m_pApi->setFileName(m_hImpl, doku.pData);
313 }
314 
setParamData(sal_uInt16 index,sal_uInt16 paramIndex,const::rtl::OUString & type,const::rtl::OUString & name,RTParamMode mode)315 inline void RegistryTypeWriter::setParamData(sal_uInt16             index,
316                                              sal_uInt16             paramIndex,
317                                              const ::rtl::OUString& type,
318                                              const ::rtl::OUString& name,
319                                              RTParamMode            mode)
320 {
321     m_pApi->setParamData(m_hImpl, index, paramIndex, type.pData, name.pData, mode);
322 }
323 
setExcData(sal_uInt16 index,sal_uInt16 excIndex,const::rtl::OUString & type)324 inline void RegistryTypeWriter::setExcData(sal_uInt16               index,
325                                            sal_uInt16               excIndex,
326                                            const ::rtl::OUString&   type)
327 {
328     m_pApi->setExcData(m_hImpl, index, excIndex, type.pData);
329 }
330 
getBlop()331 inline const sal_uInt8* RegistryTypeWriter::getBlop()
332 {
333     return m_pApi->getBlop(m_hImpl);
334 }
335 
getBlopSize()336 inline sal_uInt32 RegistryTypeWriter::getBlopSize()
337 {
338     return m_pApi->getBlopSize(m_hImpl);
339 }
340 
341 
setReferenceData(sal_uInt16 index,const::rtl::OUString & name,RTReferenceType refType,const::rtl::OUString & doku,RTFieldAccess access)342 inline void RegistryTypeWriter::setReferenceData( sal_uInt16                index,
343                                                   const ::rtl::OUString&    name,
344                                                   RTReferenceType           refType,
345                                                   const ::rtl::OUString&    doku,
346                                                   RTFieldAccess             access)
347 {
348     m_pApi->setReferenceData(m_hImpl, index, name.pData, refType, doku.pData, access);
349 }
350 
351 #endif
352