xref: /aoo4110/main/idlc/source/astoperation.cxx (revision b1cdbd2c)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_idlc.hxx"
26 #include <idlc/astoperation.hxx>
27 #include <idlc/asttype.hxx>
28 #include <idlc/astbasetype.hxx>
29 #include <idlc/astparameter.hxx>
30 #include <idlc/errorhandler.hxx>
31 
32 #include "registry/writer.hxx"
33 
34 using namespace ::rtl;
35 
setExceptions(DeclList const * pExceptions)36 void AstOperation::setExceptions(DeclList const * pExceptions)
37 {
38     if (pExceptions != 0) {
39         if (isOneway()) {
40             idlc()->error()->error1(EIDL_ONEWAY_RAISE_CONFLICT, this);
41         }
42         m_exceptions = *pExceptions;
43     }
44 }
45 
isVariadic() const46 bool AstOperation::isVariadic() const {
47     DeclList::const_iterator i(getIteratorEnd());
48     return i != getIteratorBegin()
49         && static_cast< AstParameter const * >(*(--i))->isRest();
50 }
51 
dumpBlob(typereg::Writer & rBlob,sal_uInt16 index)52 sal_Bool AstOperation::dumpBlob(typereg::Writer & rBlob, sal_uInt16 index)
53 {
54 	sal_uInt16		nParam = getNodeCount(NT_parameter);
55 	sal_uInt16		nExcep = nExceptions();
56 	RTMethodMode 	methodMode = RT_MODE_TWOWAY;
57 
58 	if ( isOneway() )
59 		methodMode = RT_MODE_ONEWAY;
60 
61     rtl::OUString returnTypeName;
62     if (m_pReturnType == 0) {
63         returnTypeName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("void"));
64     } else {
65         returnTypeName = rtl::OStringToOUString(
66             m_pReturnType->getRelativName(), RTL_TEXTENCODING_UTF8);
67     }
68     rBlob.setMethodData(
69         index, getDocumentation(), methodMode,
70         OStringToOUString(getLocalName(), RTL_TEXTENCODING_UTF8),
71         returnTypeName, nParam, nExcep);
72 
73 	if ( nParam )
74 	{
75 		DeclList::const_iterator iter = getIteratorBegin();
76 		DeclList::const_iterator end = getIteratorEnd();
77 		AstDeclaration* pDecl = NULL;
78 		RTParamMode paramMode;
79 		sal_uInt16 paramIndex = 0;
80 		while ( iter != end )
81 		{
82 			pDecl = *iter;
83 			if ( pDecl->getNodeType() == NT_parameter )
84 			{
85 				AstParameter* pParam = (AstParameter*)pDecl;
86 				switch (pParam->getDirection())
87 				{
88 					case DIR_IN :
89 						paramMode = RT_PARAM_IN;
90 						break;
91 					case DIR_OUT :
92 						paramMode = RT_PARAM_OUT;
93 						break;
94 					case DIR_INOUT :
95 						paramMode = RT_PARAM_INOUT;
96 						break;
97 					default:
98 						paramMode = RT_PARAM_INVALID;
99 						break;
100 				}
101                 if (pParam->isRest()) {
102                     paramMode = static_cast< RTParamMode >(
103                         paramMode | RT_PARAM_REST);
104                 }
105 
106 				rBlob.setMethodParameterData(
107                     index, paramIndex++, paramMode,
108                     OStringToOUString(
109                         pDecl->getLocalName(), RTL_TEXTENCODING_UTF8),
110                     OStringToOUString(
111                         pParam->getType()->getRelativName(),
112                         RTL_TEXTENCODING_UTF8));
113 			}
114 			++iter;
115 		}
116 	}
117 
118 	if ( nExcep )
119 	{
120 		DeclList::iterator iter = m_exceptions.begin();
121 		DeclList::iterator end = m_exceptions.end();
122 		sal_uInt16 exceptIndex = 0;
123 		while ( iter != end )
124 		{
125 			rBlob.setMethodExceptionTypeName(
126                 index, exceptIndex++,
127                 OStringToOUString(
128                     (*iter)->getRelativName(), RTL_TEXTENCODING_UTF8));
129 			++iter;
130 		}
131 	}
132 
133 	return sal_True;
134 }
135 
addDeclaration(AstDeclaration * pDecl)136 AstDeclaration* AstOperation::addDeclaration(AstDeclaration* pDecl)
137 {
138 	if ( pDecl->getNodeType() == NT_parameter )
139 	{
140 		AstParameter* pParam = (AstParameter*)pDecl;
141 		if ( isOneway() &&
142 			 (pParam->getDirection() == DIR_OUT || pParam->getDirection() == DIR_INOUT) )
143 		{
144 			idlc()->error()->error2(EIDL_ONEWAY_CONFLICT, pDecl, this);
145 			return NULL;
146 		}
147 	}
148 	return AstScope::addDeclaration(pDecl);
149 }
150