1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_codemaker.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "includes.hxx"
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include "dumputils.hxx"
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include "codemaker/dependencies.hxx"
32*b1cdbd2cSJim Jagielski #include "codemaker/global.hxx"
33*b1cdbd2cSJim Jagielski #include "codemaker/typemanager.hxx"
34*b1cdbd2cSJim Jagielski #include "codemaker/unotype.hxx"
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include "osl/diagnose.h"
37*b1cdbd2cSJim Jagielski #include "rtl/string.hxx"
38*b1cdbd2cSJim Jagielski #include "rtl/ustring.hxx"
39*b1cdbd2cSJim Jagielski #include "sal/types.h"
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #include <vector>
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski using codemaker::cppumaker::Includes;
44*b1cdbd2cSJim Jagielski 
Includes(TypeManager const & manager,codemaker::Dependencies const & dependencies,bool hpp)45*b1cdbd2cSJim Jagielski Includes::Includes(
46*b1cdbd2cSJim Jagielski     TypeManager const & manager, codemaker::Dependencies const & dependencies,
47*b1cdbd2cSJim Jagielski     bool hpp):
48*b1cdbd2cSJim Jagielski     m_manager(manager), m_map(dependencies.getMap()), m_hpp(hpp),
49*b1cdbd2cSJim Jagielski     m_includeAny(dependencies.hasAnyDependency()), m_includeReference(false),
50*b1cdbd2cSJim Jagielski     m_includeSequence(dependencies.hasSequenceDependency()),
51*b1cdbd2cSJim Jagielski     m_includeType(dependencies.hasTypeDependency()),
52*b1cdbd2cSJim Jagielski     m_includeCppuMacrosHxx(false), m_includeCppuUnotypeHxx(false),
53*b1cdbd2cSJim Jagielski     m_includeOslDoublecheckedlockingH(false), m_includeOslMutexHxx(false),
54*b1cdbd2cSJim Jagielski     m_includeRtlStrbufHxx(false), m_includeRtlStringH(false),
55*b1cdbd2cSJim Jagielski     m_includeRtlTextencH(false), m_includeRtlUstrbufHxx(false),
56*b1cdbd2cSJim Jagielski     m_includeRtlUstringH(false),
57*b1cdbd2cSJim Jagielski     m_includeRtlUstringHxx(dependencies.hasStringDependency()),
58*b1cdbd2cSJim Jagielski     m_includeSalTypesH(
59*b1cdbd2cSJim Jagielski         dependencies.hasBooleanDependency() || dependencies.hasByteDependency()
60*b1cdbd2cSJim Jagielski         || dependencies.hasShortDependency()
61*b1cdbd2cSJim Jagielski         || dependencies.hasUnsignedShortDependency()
62*b1cdbd2cSJim Jagielski         || dependencies.hasLongDependency()
63*b1cdbd2cSJim Jagielski         || dependencies.hasUnsignedShortDependency()
64*b1cdbd2cSJim Jagielski         || dependencies.hasHyperDependency()
65*b1cdbd2cSJim Jagielski         || dependencies.hasUnsignedHyperDependency()
66*b1cdbd2cSJim Jagielski         || dependencies.hasCharDependency()),
67*b1cdbd2cSJim Jagielski     m_includeTypelibTypeclassH(false),
68*b1cdbd2cSJim Jagielski     m_includeTypelibTypedescriptionH(false)
69*b1cdbd2cSJim Jagielski {}
70*b1cdbd2cSJim Jagielski 
~Includes()71*b1cdbd2cSJim Jagielski Includes::~Includes()
72*b1cdbd2cSJim Jagielski {}
73*b1cdbd2cSJim Jagielski 
add(rtl::OString const & registryType)74*b1cdbd2cSJim Jagielski void Includes::add(rtl::OString const & registryType) {
75*b1cdbd2cSJim Jagielski     sal_Int32 rank;
76*b1cdbd2cSJim Jagielski     std::vector< rtl::OString > args;
77*b1cdbd2cSJim Jagielski     rtl::OString type(
78*b1cdbd2cSJim Jagielski         codemaker::UnoType::decompose(registryType, &rank, &args));
79*b1cdbd2cSJim Jagielski     if (rank > 0) {
80*b1cdbd2cSJim Jagielski         m_includeSequence = true;
81*b1cdbd2cSJim Jagielski     }
82*b1cdbd2cSJim Jagielski     switch (codemaker::UnoType::getSort(type)) {
83*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_VOID:
84*b1cdbd2cSJim Jagielski         OSL_ASSERT(args.empty());
85*b1cdbd2cSJim Jagielski         OSL_ASSERT(false);
86*b1cdbd2cSJim Jagielski         break;
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_BOOLEAN:
89*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_BYTE:
90*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_SHORT:
91*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_UNSIGNED_SHORT:
92*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_LONG:
93*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_UNSIGNED_LONG:
94*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_HYPER:
95*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_UNSIGNED_HYPER:
96*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_CHAR:
97*b1cdbd2cSJim Jagielski         OSL_ASSERT(args.empty());
98*b1cdbd2cSJim Jagielski         m_includeSalTypesH = true;
99*b1cdbd2cSJim Jagielski         break;
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_FLOAT:
102*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_DOUBLE:
103*b1cdbd2cSJim Jagielski         OSL_ASSERT(args.empty());
104*b1cdbd2cSJim Jagielski         break;
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_STRING:
107*b1cdbd2cSJim Jagielski         OSL_ASSERT(args.empty());
108*b1cdbd2cSJim Jagielski         m_includeRtlUstringHxx = true;
109*b1cdbd2cSJim Jagielski         break;
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_TYPE:
112*b1cdbd2cSJim Jagielski         OSL_ASSERT(args.empty());
113*b1cdbd2cSJim Jagielski         m_includeType = true;
114*b1cdbd2cSJim Jagielski         break;
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_ANY:
117*b1cdbd2cSJim Jagielski         OSL_ASSERT(args.empty());
118*b1cdbd2cSJim Jagielski         m_includeAny = true;
119*b1cdbd2cSJim Jagielski         break;
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski     case codemaker::UnoType::SORT_COMPLEX:
122*b1cdbd2cSJim Jagielski         m_map.insert(
123*b1cdbd2cSJim Jagielski             codemaker::Dependencies::Map::value_type(
124*b1cdbd2cSJim Jagielski                 type, codemaker::Dependencies::KIND_NO_BASE));
125*b1cdbd2cSJim Jagielski         {for (std::vector< rtl::OString >::iterator i(args.begin());
126*b1cdbd2cSJim Jagielski               i != args.end(); ++i)
127*b1cdbd2cSJim Jagielski         {
128*b1cdbd2cSJim Jagielski             add(*i);
129*b1cdbd2cSJim Jagielski         }}
130*b1cdbd2cSJim Jagielski         break;
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski     default:
133*b1cdbd2cSJim Jagielski         OSL_ASSERT(false);
134*b1cdbd2cSJim Jagielski         break;
135*b1cdbd2cSJim Jagielski     }
136*b1cdbd2cSJim Jagielski }
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski namespace {
139*b1cdbd2cSJim Jagielski 
dumpEmptyLineBeforeFirst(FileStream & out,bool * first)140*b1cdbd2cSJim Jagielski void dumpEmptyLineBeforeFirst(FileStream & out, bool * first) {
141*b1cdbd2cSJim Jagielski     OSL_ASSERT(first != 0);
142*b1cdbd2cSJim Jagielski     if (*first) {
143*b1cdbd2cSJim Jagielski         out << "\n";
144*b1cdbd2cSJim Jagielski         *first = false;
145*b1cdbd2cSJim Jagielski     }
146*b1cdbd2cSJim Jagielski }
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski 
dump(FileStream & out,rtl::OString const * companionHdl)150*b1cdbd2cSJim Jagielski void Includes::dump(FileStream & out, rtl::OString const * companionHdl) {
151*b1cdbd2cSJim Jagielski     OSL_ASSERT(companionHdl == 0 || m_hpp);
152*b1cdbd2cSJim Jagielski     if (!m_includeReference) {
153*b1cdbd2cSJim Jagielski         for (codemaker::Dependencies::Map::iterator i(m_map.begin());
154*b1cdbd2cSJim Jagielski              i != m_map.end(); ++i)
155*b1cdbd2cSJim Jagielski         {
156*b1cdbd2cSJim Jagielski             if (isInterfaceType(i->first)) {
157*b1cdbd2cSJim Jagielski                 m_includeReference = true;
158*b1cdbd2cSJim Jagielski                 break;
159*b1cdbd2cSJim Jagielski             }
160*b1cdbd2cSJim Jagielski         }
161*b1cdbd2cSJim Jagielski     }
162*b1cdbd2cSJim Jagielski     out << "#include \"sal/config.h\"\n";
163*b1cdbd2cSJim Jagielski     if (companionHdl) {
164*b1cdbd2cSJim Jagielski         out << "\n";
165*b1cdbd2cSJim Jagielski         dumpInclude(out, *companionHdl, false);
166*b1cdbd2cSJim Jagielski     }
167*b1cdbd2cSJim Jagielski     bool first = true;
168*b1cdbd2cSJim Jagielski     for (codemaker::Dependencies::Map::iterator i(m_map.begin());
169*b1cdbd2cSJim Jagielski          i != m_map.end(); ++i)
170*b1cdbd2cSJim Jagielski     {
171*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
172*b1cdbd2cSJim Jagielski         if (m_hpp || i->second == codemaker::Dependencies::KIND_BASE
173*b1cdbd2cSJim Jagielski             || !isInterfaceType(i->first))
174*b1cdbd2cSJim Jagielski         {
175*b1cdbd2cSJim Jagielski             dumpInclude(out, i->first, m_hpp);
176*b1cdbd2cSJim Jagielski         } else {
177*b1cdbd2cSJim Jagielski             bool ns = dumpNamespaceOpen(out, i->first, false);
178*b1cdbd2cSJim Jagielski             if (ns) {
179*b1cdbd2cSJim Jagielski                 out << " ";
180*b1cdbd2cSJim Jagielski             }
181*b1cdbd2cSJim Jagielski             out << "class ";
182*b1cdbd2cSJim Jagielski             dumpTypeIdentifier(out, i->first);
183*b1cdbd2cSJim Jagielski             out << ";";
184*b1cdbd2cSJim Jagielski             if (ns) {
185*b1cdbd2cSJim Jagielski                 out << " ";
186*b1cdbd2cSJim Jagielski             }
187*b1cdbd2cSJim Jagielski             dumpNamespaceClose(out, i->first, false);
188*b1cdbd2cSJim Jagielski             out << "\n";
189*b1cdbd2cSJim Jagielski         }
190*b1cdbd2cSJim Jagielski     }
191*b1cdbd2cSJim Jagielski     static char const * hxxExtension[2] = { "h", "hxx" };
192*b1cdbd2cSJim Jagielski     if (m_includeAny) {
193*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
194*b1cdbd2cSJim Jagielski         out << "#include \"com/sun/star/uno/Any." << hxxExtension[m_hpp] << "\"\n";
195*b1cdbd2cSJim Jagielski     }
196*b1cdbd2cSJim Jagielski     if (m_includeReference) {
197*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
198*b1cdbd2cSJim Jagielski         out << "#include \"com/sun/star/uno/Reference." << hxxExtension[m_hpp] << "\"\n";
199*b1cdbd2cSJim Jagielski     }
200*b1cdbd2cSJim Jagielski     if (m_includeSequence) {
201*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
202*b1cdbd2cSJim Jagielski         out << "#include \"com/sun/star/uno/Sequence." << hxxExtension[m_hpp] << "\"\n";
203*b1cdbd2cSJim Jagielski     }
204*b1cdbd2cSJim Jagielski     if (m_includeType) {
205*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
206*b1cdbd2cSJim Jagielski         out << "#include \"com/sun/star/uno/Type." << hxxExtension[m_hpp] << "\"\n";
207*b1cdbd2cSJim Jagielski     }
208*b1cdbd2cSJim Jagielski     if (m_includeCppuMacrosHxx) {
209*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
210*b1cdbd2cSJim Jagielski         out << ("#include \"cppu/macros.hxx\"\n");
211*b1cdbd2cSJim Jagielski     }
212*b1cdbd2cSJim Jagielski     if (m_includeCppuUnotypeHxx) {
213*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
214*b1cdbd2cSJim Jagielski         out << ("#include \"cppu/unotype.hxx\"\n");
215*b1cdbd2cSJim Jagielski     }
216*b1cdbd2cSJim Jagielski     if (m_includeOslDoublecheckedlockingH) {
217*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
218*b1cdbd2cSJim Jagielski         out << ("#include \"osl/doublecheckedlocking.h\"\n");
219*b1cdbd2cSJim Jagielski     }
220*b1cdbd2cSJim Jagielski     if (m_includeOslMutexHxx) {
221*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
222*b1cdbd2cSJim Jagielski         out << "#include \"osl/mutex.hxx\"\n";
223*b1cdbd2cSJim Jagielski     }
224*b1cdbd2cSJim Jagielski     if (m_includeRtlStrbufHxx) {
225*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
226*b1cdbd2cSJim Jagielski         out << ("#include \"rtl/strbuf.hxx\"\n");
227*b1cdbd2cSJim Jagielski     }
228*b1cdbd2cSJim Jagielski     if (m_includeRtlStringH) {
229*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
230*b1cdbd2cSJim Jagielski         out << "#include \"rtl/string.h\"\n";
231*b1cdbd2cSJim Jagielski     }
232*b1cdbd2cSJim Jagielski     if (m_includeRtlTextencH) {
233*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
234*b1cdbd2cSJim Jagielski         out << "#include \"rtl/textenc.h\"\n";
235*b1cdbd2cSJim Jagielski     }
236*b1cdbd2cSJim Jagielski     if (m_includeRtlUstrbufHxx) {
237*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
238*b1cdbd2cSJim Jagielski         out << ("#include \"rtl/ustrbuf.hxx\"\n");
239*b1cdbd2cSJim Jagielski     }
240*b1cdbd2cSJim Jagielski     if (m_includeRtlUstringH) {
241*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
242*b1cdbd2cSJim Jagielski         out << "#include \"rtl/ustring.h\"\n";
243*b1cdbd2cSJim Jagielski     }
244*b1cdbd2cSJim Jagielski     if (m_includeRtlUstringHxx) {
245*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
246*b1cdbd2cSJim Jagielski         out << ("#include \"rtl/ustring.hxx\"\n");
247*b1cdbd2cSJim Jagielski     }
248*b1cdbd2cSJim Jagielski     if (m_includeSalTypesH) {
249*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
250*b1cdbd2cSJim Jagielski         out << "#include \"sal/types.h\"\n";
251*b1cdbd2cSJim Jagielski     }
252*b1cdbd2cSJim Jagielski     if (m_includeTypelibTypeclassH) {
253*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
254*b1cdbd2cSJim Jagielski         out << ("#include \"typelib/typeclass.h\"\n");
255*b1cdbd2cSJim Jagielski     }
256*b1cdbd2cSJim Jagielski     if (m_includeTypelibTypedescriptionH) {
257*b1cdbd2cSJim Jagielski         dumpEmptyLineBeforeFirst(out, &first);
258*b1cdbd2cSJim Jagielski         out << ("#include \"typelib/typedescription.h\"\n");
259*b1cdbd2cSJim Jagielski     }
260*b1cdbd2cSJim Jagielski }
261*b1cdbd2cSJim Jagielski 
dumpInclude(FileStream & out,rtl::OString const & registryType,bool hpp,rtl::OString const & suffix)262*b1cdbd2cSJim Jagielski void Includes::dumpInclude(
263*b1cdbd2cSJim Jagielski     FileStream & out, rtl::OString const & registryType, bool hpp,
264*b1cdbd2cSJim Jagielski     rtl::OString const & suffix)
265*b1cdbd2cSJim Jagielski {
266*b1cdbd2cSJim Jagielski     static char const * extension[2] = { "hdl", "hpp" };
267*b1cdbd2cSJim Jagielski     out << "#include \"" << registryType;
268*b1cdbd2cSJim Jagielski     if ( !suffix.isEmpty() ) {
269*b1cdbd2cSJim Jagielski         out << "/" << suffix;
270*b1cdbd2cSJim Jagielski     }
271*b1cdbd2cSJim Jagielski     out << "." << extension[hpp] << "\"\n";
272*b1cdbd2cSJim Jagielski }
273*b1cdbd2cSJim Jagielski 
isInterfaceType(rtl::OString const & registryType) const274*b1cdbd2cSJim Jagielski bool Includes::isInterfaceType(rtl::OString const & registryType) const {
275*b1cdbd2cSJim Jagielski     return m_manager.getTypeClass(registryType) == RT_TYPE_INTERFACE;
276*b1cdbd2cSJim Jagielski }
277