LCOV - code coverage report
Current view: top level - unodevtools/source/skeletonmaker - skeletoncommon.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 0 320 0.0 %
Date: 2014-11-03 Functions: 0 17 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "osl/thread.hxx"
      21             : 
      22             : #include "codemaker/commonjava.hxx"
      23             : #include "codemaker/commoncpp.hxx"
      24             : #include "codemaker/generatedtypeset.hxx"
      25             : #include "codemaker/global.hxx"
      26             : #include "unoidl/unoidl.hxx"
      27             : 
      28             : #include "skeletoncommon.hxx"
      29             : 
      30             : #include <cassert>
      31             : #include <iostream>
      32             : 
      33             : using namespace ::codemaker::cpp;
      34             : 
      35             : namespace skeletonmaker {
      36             : 
      37           0 : void printLicenseHeader(std::ostream& o, rtl::OString const & filename)
      38             : {
      39           0 :     sal_Int32 index = -1;
      40             : #ifdef SAL_UNX
      41           0 :     index = filename.lastIndexOf('/');
      42             : #else
      43             :     index = filename.lastIndexOf('\\');
      44             : #endif
      45           0 :     OString shortfilename(filename);
      46           0 :     if ( index != -1 )
      47           0 :         shortfilename = filename.copy(index+1);
      48             : 
      49             :     o << "/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */\n"
      50             :          "/*\n"
      51             :          " * This file is part of the LibreOffice project.\n"
      52             :          " *\n"
      53             :          " * This Source Code Form is subject to the terms of the Mozilla Public\n"
      54             :          " * License, v. 2.0. If a copy of the MPL was not distributed with this\n"
      55             :          " * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n"
      56           0 :          " */\n\n";
      57           0 : }
      58             : 
      59           0 : bool getOutputStream(ProgramOptions const & options,
      60             :                      OString const & extension,
      61             :                      std::ostream** ppOutputStream,
      62             :                      OString & targetSourceFileName,
      63             :                      OString & tmpSourceFileName)
      64             : {
      65           0 :     bool bStandardout = false;
      66           0 :     if ( options.outputpath.equals("stdout") )
      67             :     {
      68           0 :         bStandardout = true;
      69           0 :         *ppOutputStream = &std::cout;
      70           0 :         return bStandardout;
      71             :     }
      72             : 
      73           0 :     targetSourceFileName = createFileNameFromType(
      74           0 :         options.outputpath, options.implname.replace('.','/'), extension);
      75             : 
      76           0 :     OString tmpDir = getTempDir(targetSourceFileName);
      77           0 :     FileStream file;
      78           0 :     file.createTempFile(tmpDir);
      79             : 
      80           0 :     if( !file.isValid() )
      81             :     {
      82             :         throw CannotDumpException(
      83           0 :             "cannot open " + b2u(targetSourceFileName) + " for writing");
      84             :     } else {
      85           0 :         tmpSourceFileName = file.getName();
      86             :     }
      87           0 :     file.close();
      88             :     *ppOutputStream = new std::ofstream(tmpSourceFileName.getStr(),
      89           0 :                                         std::ios_base::binary);
      90             : 
      91           0 :     return bStandardout;
      92             : }
      93             : 
      94           0 : bool containsAttribute(AttributeInfo& attributes, OUString const & attrname)
      95             : {
      96           0 :     for ( AttributeInfo::const_iterator i(attributes.begin());
      97           0 :           i != attributes.end(); ++i ) {
      98           0 :         if ( (*i).name == attrname ) {
      99           0 :             return true;
     100             :         }
     101             :     }
     102           0 :     return false;
     103             : }
     104             : 
     105             : // collect attributes including inherited attributes
     106           0 : void checkAttributes(rtl::Reference< TypeManager > const & manager,
     107             :                      OUString const & name,
     108             :                      AttributeInfo& attributes,
     109             :                      std::set< OUString >& propinterfaces)
     110             : {
     111           0 :     if ( name == "com.sun.star.beans.XPropertySet" ||
     112           0 :          name == "com.sun.star.beans.XFastPropertySet" ||
     113           0 :          name == "com.sun.star.beans.XPropertyAccess" )
     114             :     {
     115           0 :         propinterfaces.insert(name);
     116             :     }
     117           0 :     rtl::Reference< unoidl::Entity > ent;
     118           0 :     switch (manager->getSort(name, &ent)) {
     119             :     case codemaker::UnoType::SORT_INTERFACE_TYPE:
     120             :         {
     121             :             rtl::Reference< unoidl::InterfaceTypeEntity > ent2(
     122           0 :                 dynamic_cast< unoidl::InterfaceTypeEntity * >(ent.get()));
     123             :             assert(ent2.is());
     124           0 :             for (std::vector< unoidl::AnnotatedReference >::const_iterator i(
     125           0 :                      ent2->getDirectMandatoryBases().begin());
     126           0 :                  i != ent2->getDirectMandatoryBases().end(); ++i)
     127             :             {
     128           0 :                 checkAttributes(manager, i->name, attributes, propinterfaces);
     129             :             }
     130           0 :             for (std::vector< unoidl::InterfaceTypeEntity::Attribute >::
     131           0 :                      const_iterator i(ent2->getDirectAttributes().begin());
     132           0 :                  i != ent2->getDirectAttributes().end(); ++i)
     133             :             {
     134           0 :                 if (!containsAttribute(attributes, i->name)) {
     135             :                     attributes.push_back(
     136             :                         unoidl::AccumulationBasedServiceEntity::Property(
     137           0 :                             i->name,
     138           0 :                             i->type,
     139             :                             (unoidl::AccumulationBasedServiceEntity::Property::
     140             :                              Attributes(
     141           0 :                                  ((i->bound
     142             :                                    ? (unoidl::AccumulationBasedServiceEntity::
     143             :                                       Property::ATTRIBUTE_BOUND)
     144             :                                    : 0)
     145           0 :                                   | (i->readOnly
     146             :                                      ? (unoidl::AccumulationBasedServiceEntity::
     147             :                                         Property::ATTRIBUTE_READ_ONLY)
     148             :                                      : 0)))),
     149           0 :                             std::vector< OUString >()));
     150             :                 }
     151             :             }
     152           0 :             break;
     153             :         }
     154             :     case codemaker::UnoType::SORT_ACCUMULATION_BASED_SERVICE:
     155             :         {
     156             :             rtl::Reference< unoidl::AccumulationBasedServiceEntity > ent2(
     157             :                 dynamic_cast< unoidl::AccumulationBasedServiceEntity * >(
     158           0 :                     ent.get()));
     159             :             assert(ent2.is());
     160           0 :             for (std::vector< unoidl::AnnotatedReference >::const_iterator i(
     161           0 :                      ent2->getDirectMandatoryBaseServices().begin());
     162           0 :                  i != ent2->getDirectMandatoryBaseServices().end(); ++i)
     163             :             {
     164           0 :                 checkAttributes(manager, i->name, attributes, propinterfaces);
     165             :             }
     166           0 :             for (std::vector< unoidl::AnnotatedReference >::const_iterator i(
     167           0 :                      ent2->getDirectMandatoryBaseInterfaces().begin());
     168           0 :                  i != ent2->getDirectMandatoryBaseInterfaces().end(); ++i)
     169             :             {
     170           0 :                 checkAttributes(manager, i->name, attributes, propinterfaces);
     171             :             }
     172           0 :             for (std::vector<
     173             :                      unoidl::AccumulationBasedServiceEntity::Property >::
     174           0 :                      const_iterator i(ent2->getDirectProperties().begin());
     175           0 :                  i != ent2->getDirectProperties().end(); ++i)
     176             :             {
     177           0 :                 if (!containsAttribute(attributes, i->name)) {
     178           0 :                     attributes.push_back(*i);
     179             :                 }
     180             :             }
     181           0 :             break;
     182             :         }
     183             :     default:
     184             :         throw CannotDumpException(
     185           0 :             "unexpected entity \"" + name
     186           0 :             + "\" in call to skeletonmaker::checkAttributes");
     187           0 :     }
     188           0 : }
     189             : 
     190           0 : void checkType(rtl::Reference< TypeManager > const & manager,
     191             :                OUString const & name,
     192             :                std::set< OUString >& interfaceTypes,
     193             :                std::set< OUString >& serviceTypes,
     194             :                AttributeInfo& properties)
     195             : {
     196           0 :     rtl::Reference< unoidl::Entity > ent;
     197           0 :     switch (manager->getSort(name, &ent)) {
     198             :     case codemaker::UnoType::SORT_INTERFACE_TYPE:
     199             :         // com.sun.star.lang.XComponent should be also not in the list
     200             :         // but it will be used for checking the impl helper and will be
     201             :         // removed later if necessary.
     202           0 :         if ( name == "com.sun.star.lang.XTypeProvider" ||
     203           0 :              name == "com.sun.star.uno.XWeak" )
     204           0 :             return;
     205           0 :         if (interfaceTypes.find(name) == interfaceTypes.end()) {
     206           0 :             interfaceTypes.insert(name);
     207             :         }
     208           0 :         break;
     209             :     case codemaker::UnoType::SORT_SINGLE_INTERFACE_BASED_SERVICE:
     210           0 :         if (serviceTypes.find(name) == serviceTypes.end()) {
     211           0 :             serviceTypes.insert(name);
     212             :             rtl::Reference< unoidl::SingleInterfaceBasedServiceEntity > ent2(
     213             :                 dynamic_cast< unoidl::SingleInterfaceBasedServiceEntity * >(
     214           0 :                     ent.get()));
     215             :             assert(ent2.is());
     216           0 :             if (interfaceTypes.find(ent2->getBase()) == interfaceTypes.end()) {
     217           0 :                 interfaceTypes.insert(ent2->getBase());
     218             :                 // check if constructors are specified, if yes automatically
     219             :                 // support of XInitialization. We will take care of the default
     220             :                 // constructor because in this case XInitialization is not
     221             :                 // called.
     222           0 :                 if (ent2->getConstructors().size() > 1 ||
     223           0 :                     (ent2->getConstructors().size() == 1 &&
     224           0 :                      !ent2->getConstructors()[0].defaultConstructor))
     225             :                 {
     226           0 :                     OUString s("com.sun.star.lang.XInitialization");
     227           0 :                     if (interfaceTypes.find(s) == interfaceTypes.end())
     228           0 :                         interfaceTypes.insert(s);
     229             :                 }
     230           0 :             }
     231             :         }
     232           0 :         break;
     233             :     case codemaker::UnoType::SORT_ACCUMULATION_BASED_SERVICE:
     234           0 :         if ( serviceTypes.find(name) == serviceTypes.end() ) {
     235           0 :             serviceTypes.insert(name);
     236             :             rtl::Reference< unoidl::AccumulationBasedServiceEntity > ent2(
     237             :                 dynamic_cast< unoidl::AccumulationBasedServiceEntity * >(
     238           0 :                     ent.get()));
     239             :             assert(ent2.is());
     240           0 :             for (std::vector< unoidl::AnnotatedReference >::const_iterator i(
     241           0 :                      ent2->getDirectMandatoryBaseServices().begin());
     242           0 :                  i != ent2->getDirectMandatoryBaseServices().end(); ++i)
     243             :             {
     244             :                 checkType(
     245           0 :                     manager, i->name, interfaceTypes, serviceTypes, properties);
     246             :             }
     247           0 :             for (std::vector< unoidl::AnnotatedReference >::const_iterator i(
     248           0 :                      ent2->getDirectMandatoryBaseInterfaces().begin());
     249           0 :                  i != ent2->getDirectMandatoryBaseInterfaces().end(); ++i)
     250             :             {
     251             :                 checkType(
     252           0 :                     manager, i->name, interfaceTypes, serviceTypes, properties);
     253             :             }
     254           0 :             for (std::vector<
     255             :                      unoidl::AccumulationBasedServiceEntity::Property >::
     256           0 :                      const_iterator i(ent2->getDirectProperties().begin());
     257           0 :                  i != ent2->getDirectProperties().end(); ++i)
     258             :             {
     259           0 :                 properties.push_back(*i);
     260           0 :             }
     261             :         }
     262           0 :         break;
     263             :     default:
     264             :         throw CannotDumpException(
     265           0 :             "unexpected entity \"" + name
     266           0 :             + "\" in call to skeletonmaker::checkType");
     267           0 :     }
     268             : }
     269             : 
     270           0 : void checkDefaultInterfaces(
     271             :     std::set< OUString >& interfaces,
     272             :     const std::set< OUString >& services,
     273             :     const OUString & propertyhelper)
     274             : {
     275           0 :     if ( services.empty() ) {
     276           0 :         interfaces.erase("com.sun.star.lang.XServiceInfo");
     277             :     } else {
     278           0 :         if (interfaces.find("com.sun.star.lang.XServiceInfo") == interfaces.end())
     279           0 :             interfaces.insert("com.sun.star.lang.XServiceInfo");
     280             :     }
     281             : 
     282           0 :     if ( propertyhelper.equals("_") ) {
     283           0 :         interfaces.erase("com.sun.star.beans.XPropertySet");
     284           0 :         interfaces.erase("com.sun.star.beans.XFastPropertySet");
     285           0 :         interfaces.erase("com.sun.star.beans.XPropertyAccess");
     286             :     }
     287           0 : }
     288             : 
     289           0 : bool checkServiceProperties(rtl::Reference< TypeManager > const & manager,
     290             :                             OUString const & name)
     291             : {
     292           0 :     rtl::Reference< unoidl::Entity > ent;
     293           0 :     if (manager->getSort(name, &ent)
     294             :         == codemaker::UnoType::SORT_ACCUMULATION_BASED_SERVICE)
     295             :     {
     296             :         rtl::Reference< unoidl::AccumulationBasedServiceEntity > ent2(
     297             :             dynamic_cast< unoidl::AccumulationBasedServiceEntity * >(
     298           0 :                 ent.get()));
     299             :         assert(ent2.is());
     300           0 :         if (!ent2->getDirectProperties().empty()) {
     301           0 :             return true;
     302             :         }
     303           0 :         for (std::vector< unoidl::AnnotatedReference >::const_iterator i(
     304           0 :                  ent2->getDirectMandatoryBaseServices().begin());
     305           0 :              i != ent2->getDirectMandatoryBaseServices().end(); ++i)
     306             :         {
     307           0 :             if (checkServiceProperties(manager, i->name)) {
     308           0 :                 return true;
     309             :             }
     310           0 :         }
     311             :     }
     312           0 :     return false;
     313             : }
     314             : 
     315             : 
     316           0 : OUString checkPropertyHelper(
     317             :     ProgramOptions const & options,
     318             :     rtl::Reference< TypeManager > const & manager,
     319             :     const std::set< OUString >& services,
     320             :     const std::set< OUString >& interfaces,
     321             :     AttributeInfo& attributes,
     322             :     std::set< OUString >& propinterfaces)
     323             : {
     324           0 :     std::set< OUString >::const_iterator iter;
     325           0 :     std::set< OUString >::const_iterator end;
     326             : 
     327           0 :     if ( !services.empty() ) {
     328           0 :         iter = services.begin();
     329           0 :         end = services.end();
     330             :     } else {
     331           0 :         iter = interfaces.begin();
     332           0 :         end = interfaces.end();
     333             :     }
     334             : 
     335           0 :     bool oldStyleWithProperties = false;
     336           0 :     while ( iter != end ) {
     337           0 :         rtl::Reference< unoidl::Entity > ent;
     338           0 :         codemaker::UnoType::Sort sort = manager->getSort(*iter, &ent);
     339           0 :         if ( !services.empty() ) {
     340           0 :             if (options.supportpropertysetmixin
     341           0 :                 && (sort
     342             :                     == codemaker::UnoType::SORT_SINGLE_INTERFACE_BASED_SERVICE))
     343             :             {
     344             :                 rtl::Reference< unoidl::SingleInterfaceBasedServiceEntity >
     345             :                     ent2(
     346             :                         dynamic_cast<
     347             :                         unoidl::SingleInterfaceBasedServiceEntity * >(
     348           0 :                             ent.get()));
     349             :                 assert(ent2.is());
     350             :                 checkAttributes(
     351           0 :                     manager, ent2->getBase(), attributes, propinterfaces);
     352           0 :                 if (!(attributes.empty() || propinterfaces.empty())) {
     353           0 :                     return ent2->getBase();
     354           0 :                 }
     355             :             } else {
     356           0 :                 oldStyleWithProperties = checkServiceProperties(manager, *iter);
     357             :             }
     358             :         } else {
     359           0 :             checkAttributes(manager, *iter, attributes, propinterfaces);
     360           0 :             if (!(attributes.empty() || propinterfaces.empty())) {
     361           0 :                 return *iter;
     362             :             }
     363             :         }
     364           0 :         ++iter;
     365           0 :     }
     366             : 
     367           0 :     return oldStyleWithProperties ? OUString("_") : OUString();
     368             : }
     369             : 
     370           0 : bool checkXComponentSupport(
     371             :     rtl::Reference< TypeManager > const & manager, OUString const & name)
     372             : {
     373             :     assert(manager.is());
     374           0 :     if (name == "com.sun.star.lang.XComponent") {
     375           0 :         return true;
     376             :     }
     377           0 :     rtl::Reference< unoidl::Entity > ent;
     378           0 :     codemaker::UnoType::Sort sort = manager->getSort(name, &ent);
     379           0 :     if (sort != codemaker::UnoType::SORT_INTERFACE_TYPE) {
     380             :         throw CannotDumpException(
     381           0 :             "unexpected entity \"" + name
     382           0 :             + "\" in call to skeletonmaker::checkXComponentSupport");
     383             :     }
     384             :     rtl::Reference< unoidl::InterfaceTypeEntity > ent2(
     385           0 :         dynamic_cast< unoidl::InterfaceTypeEntity * >(ent.get()));
     386             :     assert(ent2.is());
     387           0 :     for (std::vector< unoidl::AnnotatedReference >::const_iterator i(
     388           0 :              ent2->getDirectMandatoryBases().begin());
     389           0 :          i != ent2->getDirectMandatoryBases().end(); ++i)
     390             :     {
     391           0 :         if (checkXComponentSupport(manager, i->name)) {
     392           0 :             return true;
     393             :         }
     394             :     }
     395           0 :     return false;
     396             : }
     397             : 
     398             : 
     399             : // if XComponent is directly specified, return true and remove it from the
     400             : // supported interfaces list
     401           0 : bool checkXComponentSupport(rtl::Reference< TypeManager > const & manager,
     402             :                             std::set< OUString >& interfaces)
     403             : {
     404           0 :     if ( interfaces.empty() )
     405           0 :         return false;
     406             : 
     407           0 :     std::set< OUString >::const_iterator iter = interfaces.begin();
     408           0 :     while ( iter != interfaces.end() ) {
     409           0 :         if ( (*iter).equals("com.sun.star.lang.XComponent") ) {
     410           0 :             interfaces.erase("com.sun.star.lang.XComponent");
     411           0 :             return true;
     412             :         }
     413           0 :         if ( checkXComponentSupport(manager, *iter) )
     414           0 :             return true;
     415           0 :         ++iter;
     416             :     }
     417             : 
     418           0 :     return false;
     419             : }
     420             : 
     421             : unoidl::AccumulationBasedServiceEntity::Property::Attributes
     422           0 : checkAdditionalPropertyFlags(
     423             :     unoidl::InterfaceTypeEntity::Attribute const & attribute)
     424             : {
     425           0 :     int flags = 0;
     426           0 :     bool getterSupportsUnknown = false;
     427           0 :     for (std::vector< OUString >::const_iterator i(
     428           0 :              attribute.getExceptions.begin());
     429           0 :          i != attribute.getExceptions.end(); ++i)
     430             :     {
     431           0 :         if (*i == "com.sun.star.beans.UnknownPropertyException") {
     432           0 :             getterSupportsUnknown = true;
     433             :         }
     434             :     }
     435           0 :     for (std::vector< OUString >::const_iterator i(
     436           0 :              attribute.setExceptions.begin());
     437           0 :          i != attribute.setExceptions.end(); ++i)
     438             :     {
     439           0 :         if (*i == "com.sun.star.beans.PropertyVetoException") {
     440             :             flags |= unoidl::AccumulationBasedServiceEntity::Property::
     441           0 :                 ATTRIBUTE_CONSTRAINED;
     442           0 :         } else if (getterSupportsUnknown
     443           0 :                    && *i == "com.sun.star.beans.UnknownPropertyException")
     444             :         {
     445             :             flags |= unoidl::AccumulationBasedServiceEntity::Property::
     446           0 :                 ATTRIBUTE_OPTIONAL;
     447             :         }
     448             :     }
     449           0 :     return unoidl::AccumulationBasedServiceEntity::Property::Attributes(flags);
     450             : }
     451             : 
     452             : // This function checks if the specified types for parameters and return
     453             : // types are allowed add-in types, for more info see the com.sun.star.sheet.AddIn
     454             : // service description
     455           0 : bool checkAddinType(rtl::Reference< TypeManager > const & manager,
     456             :                     OUString const & type, bool & bLastAny,
     457             :                     bool & bHasXPropertySet, bool bIsReturn)
     458             : {
     459             :     assert(manager.is());
     460             :     sal_Int32 rank;
     461             :     codemaker::UnoType::Sort sort = manager->decompose(
     462           0 :         type, true, 0, &rank, 0, 0);
     463             : 
     464           0 :     if ( sort == codemaker::UnoType::SORT_LONG ||
     465           0 :          sort == codemaker::UnoType::SORT_DOUBLE ||
     466             :          sort == codemaker::UnoType::SORT_STRING )
     467             :     {
     468           0 :         if ( rank == 0 || rank ==2 )
     469           0 :             return true;
     470             :     }
     471           0 :     if ( sort == codemaker::UnoType::SORT_ANY )
     472             :     {
     473           0 :         if ( rank <= 2 ) {
     474           0 :             if ( rank ==1 ) {
     475           0 :                 if ( bIsReturn )
     476           0 :                     return false;
     477           0 :                 bLastAny = true;
     478             :             }
     479             : 
     480           0 :             return true;
     481             :         }
     482             :     }
     483           0 :     if ( sort == codemaker::UnoType::SORT_INTERFACE_TYPE )
     484             :     {
     485           0 :         if ( bIsReturn && type == "com.sun.star.sheet.XVolatileResult" )
     486           0 :             return true;
     487           0 :         if ( !bIsReturn && type == "com.sun.star.table.XCellRange" )
     488           0 :             return true;
     489           0 :         if ( !bIsReturn && type == "com.sun.star.beans.XPropertySet" )
     490             :         {
     491           0 :             if ( bHasXPropertySet ) {
     492           0 :                 return false;
     493             :             } else {
     494           0 :                 bHasXPropertySet = true;
     495           0 :                 return true;
     496             :             }
     497             :         }
     498             :     }
     499           0 :     return false;
     500             : }
     501             : 
     502           0 : void checkAddInTypes(
     503             :     rtl::Reference< TypeManager > const & manager, OUString const & name,
     504             :     rtl::Reference< unoidl::InterfaceTypeEntity > const & entity)
     505             : {
     506             :     assert(entity.is());
     507           0 :     bool bLastAny = false;
     508           0 :     bool bHasXPropertySet = false;
     509           0 :     for (std::vector< unoidl::InterfaceTypeEntity::Method >::const_iterator i(
     510           0 :              entity->getDirectMethods().begin());
     511           0 :          i != entity->getDirectMethods().end(); ++i)
     512             :     {
     513           0 :         if ( !checkAddinType(
     514           0 :                  manager, i->returnType, bLastAny, bHasXPropertySet, true) )
     515             :         {
     516             :             throw CannotDumpException(
     517           0 :                 "the return type of the calc add-in function '" + name
     518           0 :                 + ":" + i->name
     519           0 :                 + "' is invalid. Please check your IDL defintion.");
     520             :         }
     521             : 
     522           0 :         bHasXPropertySet = false;
     523           0 :         for (std::vector< unoidl::InterfaceTypeEntity::Method::Parameter >::
     524           0 :                  const_iterator j(i->parameters.begin());
     525           0 :              j != i->parameters.end(); ++j)
     526             :         {
     527           0 :             bLastAny = false;
     528           0 :             if ( !checkAddinType(manager, j->type,
     529           0 :                                 bLastAny, bHasXPropertySet, false) ||
     530             :                  bLastAny )
     531             :             {
     532             :                 throw CannotDumpException(
     533           0 :                     "the type of the " + j->name
     534           0 :                     + " parameter of the calc add-in function '" + name
     535           0 :                     + ":" + i->name + "' is invalid."
     536           0 :                     + (bLastAny
     537             :                        ? OUString(
     538             :                            " The type 'sequence<any>' is allowed as last"
     539             :                            " parameter only.")
     540           0 :                        : OUString())
     541           0 :                     + (bHasXPropertySet
     542             :                        ? OUString(
     543             :                            " The type 'XPropertySet' is allowed only once.")
     544           0 :                        : OUString())
     545           0 :                     + " Please check your IDL definition.");
     546             :             }
     547             :         }
     548             :     }
     549           0 : }
     550             : 
     551           0 : void generateFunctionParameterMap(std::ostream& o,
     552             :                                  ProgramOptions const & options,
     553             :                                  rtl::Reference< TypeManager > const & manager,
     554             :                                  OUString const & name,
     555             :                                  ::codemaker::GeneratedTypeSet & generated,
     556             :                                  bool bFirst)
     557             : {
     558           0 :     if ( name == "com.sun.star.uno.XInterface" ||
     559           0 :          name == "com.sun.star.lang.XLocalizable" ||
     560           0 :          name == "com.sun.star.lang.XServiceInfo" ||
     561             :          // the next three checks becomes obsolete when configuration is used
     562           0 :          name == "com.sun.star.sheet.XAddIn" ||
     563           0 :          name == "com.sun.star.sheet.XCompatibilityNames" ||
     564           0 :          name == "com.sun.star.lang.XServiceName" )
     565             :     {
     566           0 :         return;
     567             :     }
     568             : 
     569           0 :     rtl::Reference< unoidl::Entity > ent;
     570           0 :     codemaker::UnoType::Sort sort = manager->getSort(name, &ent);
     571           0 :     if (sort != codemaker::UnoType::SORT_INTERFACE_TYPE) {
     572             :         throw CannotDumpException(
     573           0 :             "unexpected entity \"" + name
     574           0 :             + "\" in call to skeletonmaker::generateFunctionParameterMap");
     575             :     }
     576             :     rtl::Reference< unoidl::InterfaceTypeEntity > ent2(
     577           0 :         dynamic_cast< unoidl::InterfaceTypeEntity * >(ent.get()));
     578             :     assert(ent2.is());
     579             : 
     580             :     // check if the specified add-in functions supports valid types
     581           0 :     checkAddInTypes(manager, name, ent2);
     582             : 
     583           0 :     for (std::vector< unoidl::AnnotatedReference >::const_iterator i(
     584           0 :              ent2->getDirectMandatoryBases().begin());
     585           0 :          i != ent2->getDirectMandatoryBases().end(); ++i)
     586             :     {
     587             :         generateFunctionParameterMap(
     588           0 :             o, options, manager, i->name, generated, bFirst);
     589             :     }
     590             : 
     591           0 :     if ( generated.contains(u2b(name)) )
     592           0 :         return;
     593             :     else
     594           0 :         generated.add(u2b(name));
     595             : 
     596           0 :     for (std::vector< unoidl::InterfaceTypeEntity::Method >::const_iterator i(
     597           0 :              ent2->getDirectMethods().begin());
     598           0 :          i != ent2->getDirectMethods().end(); ++i)
     599             :     {
     600           0 :         if ( bFirst ) {
     601           0 :             if (options.language == 2) {
     602           0 :                 o << "        ParamMap fpm;\n";
     603             :             }
     604             :             else {
     605             :                 o << "        java.util.Hashtable< Integer, String > fpm = "
     606           0 :                     "new java.util.Hashtable< Integer, String >();\n";
     607             :             }
     608           0 :             bFirst = false;
     609             :         } else
     610           0 :             if ( options.language == 2 ) {
     611           0 :                 o << "        fpm = ParamMap();\n";
     612             :             }
     613             :             else {
     614             :                 o << "        fpm = new java.util.Hashtable< "
     615           0 :                     "Integer, String >();\n";
     616             :             }
     617             : 
     618             :         std::vector< unoidl::InterfaceTypeEntity::Method::Parameter >::size_type
     619           0 :             n = 0;
     620           0 :         for (std::vector< unoidl::InterfaceTypeEntity::Method::Parameter >::
     621           0 :                  const_iterator j(i->parameters.begin());
     622           0 :              j != i->parameters.end(); ++j)
     623             :         {
     624           0 :             if ( options.language == 2 ) {
     625           0 :                 o << "        fpm[" << n
     626           0 :                   << "] = ::rtl::OUString(\""
     627           0 :                   << j->name
     628           0 :                   << "\");\n";
     629             :             }
     630             :             else {
     631           0 :                 o << "        fpm.put(" << n << ", \""
     632           0 :                   << j->name
     633           0 :                   << "\");\n";
     634             :             }
     635           0 :             ++n;
     636             :         }
     637             : 
     638           0 :         if ( options.language == 2 ) {
     639           0 :             o << "        m_functionMap[::rtl::OUString(\""
     640           0 :               << i->name << "\")] = fpm;\n\n";
     641             :         }
     642             :         else {
     643           0 :             o << "        m_functionMap.put(\"" << i->name << "\", fpm);\n\n";
     644             :         }
     645           0 :     }
     646             : }
     647             : 
     648           0 : void generateFunctionParameterMap(std::ostream& o,
     649             :          ProgramOptions const & options,
     650             :          rtl::Reference< TypeManager > const & manager,
     651             :          const std::set< OUString >& interfaces)
     652             : {
     653           0 :     ::codemaker::GeneratedTypeSet generated;
     654           0 :     bool bFirst = true;
     655           0 :     std::set< OUString >::const_iterator iter = interfaces.begin();
     656           0 :     while ( iter != interfaces.end() ) {
     657           0 :         generateFunctionParameterMap(o, options, manager, *iter, generated, bFirst);
     658           0 :         ++iter;
     659           0 :     }
     660           0 : }
     661             : 
     662           0 : }
     663             : 
     664             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10