17ceddb92SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 37ceddb92SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 47ceddb92SAndrew Rist * or more contributor license agreements. See the NOTICE file 57ceddb92SAndrew Rist * distributed with this work for additional information 67ceddb92SAndrew Rist * regarding copyright ownership. The ASF licenses this file 77ceddb92SAndrew Rist * to you under the Apache License, Version 2.0 (the 87ceddb92SAndrew Rist * "License"); you may not use this file except in compliance 97ceddb92SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 117ceddb92SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 137ceddb92SAndrew Rist * Unless required by applicable law or agreed to in writing, 147ceddb92SAndrew Rist * software distributed under the License is distributed on an 157ceddb92SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 167ceddb92SAndrew Rist * KIND, either express or implied. See the License for the 177ceddb92SAndrew Rist * specific language governing permissions and limitations 187ceddb92SAndrew Rist * under the License. 19cdf0e10cSrcweir * 207ceddb92SAndrew Rist *************************************************************/ 217ceddb92SAndrew Rist 227ceddb92SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #include "codemaker/commoncpp.hxx" 25cdf0e10cSrcweir 26cdf0e10cSrcweir #include "skeletoncommon.hxx" 27cdf0e10cSrcweir #include "skeletoncpp.hxx" 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <iostream> 30cdf0e10cSrcweir 31cdf0e10cSrcweir using namespace ::rtl; 32cdf0e10cSrcweir using namespace ::codemaker::cpp; 33cdf0e10cSrcweir 34cdf0e10cSrcweir namespace skeletonmaker { namespace cpp { 35cdf0e10cSrcweir 36cdf0e10cSrcweir void generateIncludes(std::ostream & o, 37cdf0e10cSrcweir const std::hash_set< OString, OStringHash >& interfaces, 38cdf0e10cSrcweir const AttributeInfo& /*properties*/, 39cdf0e10cSrcweir OString propertyhelper, bool serviceobject, 40cdf0e10cSrcweir bool supportxcomponent) 41cdf0e10cSrcweir { 42cdf0e10cSrcweir o << "#include \"sal/config.h\"\n"; 43cdf0e10cSrcweir if (serviceobject) { 44cdf0e10cSrcweir o << "#include \"cppuhelper/factory.hxx\"\n" 45cdf0e10cSrcweir << "#include \"cppuhelper/implementationentry.hxx\"\n"; 46cdf0e10cSrcweir } else { 47cdf0e10cSrcweir o << "#include \"com/sun/star/uno/XComponentContext.hpp\"\n"; 48cdf0e10cSrcweir } 49cdf0e10cSrcweir if (supportxcomponent) { 50cdf0e10cSrcweir o << "#include \"cppuhelper/compbase" << interfaces.size() << ".hxx\"\n"; 51cdf0e10cSrcweir o << "#include \"cppuhelper/basemutex.hxx\"\n"; 52cdf0e10cSrcweir } else { 53cdf0e10cSrcweir o << "#include \"cppuhelper/implbase" << interfaces.size() << ".hxx\"\n"; 54cdf0e10cSrcweir } 55cdf0e10cSrcweir 56cdf0e10cSrcweir if (propertyhelper.getLength() > 1) { 57cdf0e10cSrcweir if (propertyhelper.equals("_")) 58cdf0e10cSrcweir o << "#include \"cppuhelper/rpopshlp.hxx\"\n"; 59cdf0e10cSrcweir else 60cdf0e10cSrcweir o << "#include \"cppuhelper/propertysetmixin.hxx\"\n"; 61cdf0e10cSrcweir } 62cdf0e10cSrcweir 63cdf0e10cSrcweir std::hash_set< OString, OStringHash >::const_iterator iter = interfaces.begin(); 64cdf0e10cSrcweir while (iter != interfaces.end()) 65cdf0e10cSrcweir { 66cdf0e10cSrcweir o << "#include \"" 67cdf0e10cSrcweir << ((*iter).replace('.', '/').getStr()) 68cdf0e10cSrcweir << ".hpp\"\n"; 69cdf0e10cSrcweir iter++; 70cdf0e10cSrcweir } 71cdf0e10cSrcweir } 72cdf0e10cSrcweir 73cdf0e10cSrcweir short generateNamespace(std::ostream & o, 74cdf0e10cSrcweir const OString & implname, 75cdf0e10cSrcweir bool serviceobject, 76cdf0e10cSrcweir OString & nm) 77cdf0e10cSrcweir { 78cdf0e10cSrcweir short count=0; 79cdf0e10cSrcweir sal_Int32 index = implname.lastIndexOf('.'); 80cdf0e10cSrcweir if (serviceobject) { 81cdf0e10cSrcweir o << "\n\n// component helper namespace\n"; 82cdf0e10cSrcweir } else { 83cdf0e10cSrcweir o << "\n"; 84cdf0e10cSrcweir } 85cdf0e10cSrcweir OStringBuffer buf; 86cdf0e10cSrcweir if (index == -1) { 87cdf0e10cSrcweir if (serviceobject) { 88cdf0e10cSrcweir buf.append("comp_"); 89cdf0e10cSrcweir buf.append(implname); 90cdf0e10cSrcweir nm = buf.makeStringAndClear(); 91cdf0e10cSrcweir o << "namespace comp_" << implname << " {\n\n"; 92cdf0e10cSrcweir count=1; 93cdf0e10cSrcweir } else { 94cdf0e10cSrcweir nm = OString(); 95cdf0e10cSrcweir } 96cdf0e10cSrcweir } else { 97cdf0e10cSrcweir sal_Int32 nPos=0; 98cdf0e10cSrcweir do { 99cdf0e10cSrcweir OString token(implname.getToken(0, '.', nPos)); 100cdf0e10cSrcweir if (nPos < 0 && serviceobject) { 101cdf0e10cSrcweir buf.append("::comp_"); 102cdf0e10cSrcweir buf.append(token); 103cdf0e10cSrcweir o << "namespace comp_" << token << " { "; 104cdf0e10cSrcweir count++; 105cdf0e10cSrcweir } else { 106cdf0e10cSrcweir buf.append("::"); 107cdf0e10cSrcweir buf.append(token); 108cdf0e10cSrcweir o << "namespace " << token << " { "; 109cdf0e10cSrcweir count++; 110cdf0e10cSrcweir } 111cdf0e10cSrcweir } while( nPos <= index ); 112cdf0e10cSrcweir nm = buf.makeStringAndClear(); 113cdf0e10cSrcweir o << "\n\n"; 114cdf0e10cSrcweir } 115cdf0e10cSrcweir return count; 116cdf0e10cSrcweir } 117cdf0e10cSrcweir 118cdf0e10cSrcweir OString generateCompHelperDeclaration(std::ostream & o, 119cdf0e10cSrcweir const OString & implname) 120cdf0e10cSrcweir { 121cdf0e10cSrcweir OString nm; 122cdf0e10cSrcweir short nbrackets = generateNamespace(o, implname, true, nm); 123cdf0e10cSrcweir 124cdf0e10cSrcweir o << "namespace css = ::com::sun::star;\n\n"; 125cdf0e10cSrcweir 126cdf0e10cSrcweir // generate component/service helper functions 127cdf0e10cSrcweir o << "// component and service helper functions:\n" 128cdf0e10cSrcweir "::rtl::OUString SAL_CALL _getImplementationName();\n" 129cdf0e10cSrcweir "css::uno::Sequence< ::rtl::OUString > SAL_CALL " 130cdf0e10cSrcweir "_getSupportedServiceNames();\n" 131cdf0e10cSrcweir "css::uno::Reference< css::uno::XInterface > SAL_CALL _create(" 132cdf0e10cSrcweir " css::uno::Reference< css::uno::XComponentContext > const & " 133cdf0e10cSrcweir "context );\n\n"; 134cdf0e10cSrcweir 135*2814ae3cSJohn Bampton // close namespace 136cdf0e10cSrcweir for (short i=0; i < nbrackets; i++) 137cdf0e10cSrcweir o << "} "; 138cdf0e10cSrcweir o << "// closing component helper namespace\n\n"; 139cdf0e10cSrcweir 140cdf0e10cSrcweir return nm; 141cdf0e10cSrcweir } 142cdf0e10cSrcweir 143cdf0e10cSrcweir void generateCompHelperDefinition(std::ostream & o, 144cdf0e10cSrcweir const OString & implname, 145cdf0e10cSrcweir const OString & classname, 146cdf0e10cSrcweir const std::hash_set< OString, OStringHash >& services) 147cdf0e10cSrcweir { 148cdf0e10cSrcweir OString nm; 149cdf0e10cSrcweir short nbrackets = generateNamespace(o, implname, true, nm); 150cdf0e10cSrcweir 151cdf0e10cSrcweir o << "::rtl::OUString SAL_CALL _getImplementationName() {\n" 152cdf0e10cSrcweir << " return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(\n" 153cdf0e10cSrcweir << " \"" << implname << "\"));\n}\n\n"; 154cdf0e10cSrcweir 155cdf0e10cSrcweir o << "css::uno::Sequence< ::rtl::OUString > SAL_CALL " 156cdf0e10cSrcweir "_getSupportedServiceNames()\n{\n css::uno::Sequence< " 157cdf0e10cSrcweir << "::rtl::OUString >" << " s(" << services.size() << ");\n"; 158cdf0e10cSrcweir 159cdf0e10cSrcweir std::hash_set< OString, OStringHash >::const_iterator iter = services.begin(); 160cdf0e10cSrcweir short i=0; 161cdf0e10cSrcweir while (iter != services.end()) 162cdf0e10cSrcweir { 163cdf0e10cSrcweir o << " s[" << i++ << "] = ::rtl::OUString(" 164cdf0e10cSrcweir << "RTL_CONSTASCII_USTRINGPARAM(\n \"" 165cdf0e10cSrcweir << (*iter).replace('/','.') << "\"));\n"; 166cdf0e10cSrcweir iter++; 167cdf0e10cSrcweir } 168cdf0e10cSrcweir o << " return s;\n}\n\n"; 169cdf0e10cSrcweir 170cdf0e10cSrcweir o << "css::uno::Reference< css::uno::XInterface > SAL_CALL _create(" 171cdf0e10cSrcweir << "\n const css::uno::Reference< css::uno::XComponentContext > & " 172cdf0e10cSrcweir << "context)\n SAL_THROW((css::uno::Exception))\n{\n" 173cdf0e10cSrcweir << " return static_cast< ::cppu::OWeakObject * >(new " 174cdf0e10cSrcweir << classname << "(context));\n}\n\n"; 175cdf0e10cSrcweir 176*2814ae3cSJohn Bampton // close namespace 177cdf0e10cSrcweir for (short j=0; j < nbrackets; j++) 178cdf0e10cSrcweir o << "} "; 179cdf0e10cSrcweir o << "// closing component helper namespace\n\n"; 180cdf0e10cSrcweir 181cdf0e10cSrcweir } 182cdf0e10cSrcweir 183cdf0e10cSrcweir void generateCompFunctions(std::ostream & o, const OString & nmspace) 184cdf0e10cSrcweir { 185cdf0e10cSrcweir o << "static ::cppu::ImplementationEntry const entries[] = {\n" 186cdf0e10cSrcweir << " { &" << nmspace << "::_create,\n &" 187cdf0e10cSrcweir << nmspace << "::_getImplementationName,\n &" 188cdf0e10cSrcweir << nmspace << "::_getSupportedServiceNames,\n" 189cdf0e10cSrcweir << " &::cppu::createSingleComponentFactory, 0, 0 },\n" 190cdf0e10cSrcweir << " { 0, 0, 0, 0, 0, 0 }\n};\n\n"; 191cdf0e10cSrcweir 192cdf0e10cSrcweir o << "extern \"C\" void SAL_CALL component_getImplementationEnvironment(\n" 193cdf0e10cSrcweir << " const char ** envTypeName, uno_Environment **)\n{\n" 194cdf0e10cSrcweir << " *envTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;\n}\n\n"; 195cdf0e10cSrcweir 196cdf0e10cSrcweir o << "extern \"C\" void * SAL_CALL component_getFactory(\n" 197cdf0e10cSrcweir << " const char * implName, void * serviceManager, void * registryKey)\n{\n" 198cdf0e10cSrcweir << " return ::cppu::component_getFactoryHelper(\n" 199cdf0e10cSrcweir << " implName, serviceManager, registryKey, entries);\n}\n\n"; 200cdf0e10cSrcweir 201cdf0e10cSrcweir o << "extern \"C\" sal_Bool SAL_CALL component_writeInfo(\n" 202cdf0e10cSrcweir << " void * serviceManager, void * registryKey)\n{\n" 203cdf0e10cSrcweir << " return ::cppu::component_writeInfoHelper(" 204cdf0e10cSrcweir << "serviceManager, registryKey, entries);\n}\n"; 205cdf0e10cSrcweir } 206cdf0e10cSrcweir 207cdf0e10cSrcweir void generateXPropertySetBodies(std::ostream& o, 208cdf0e10cSrcweir const OString & classname, 209cdf0e10cSrcweir const OString & propertyhelper) 210cdf0e10cSrcweir { 211cdf0e10cSrcweir o << "// com.sun.star.beans.XPropertySet:\n"; 212cdf0e10cSrcweir 213cdf0e10cSrcweir o << "css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL " 214cdf0e10cSrcweir << classname << "getPropertySetInfo() throw (" 215cdf0e10cSrcweir "css::uno::RuntimeException)\n{\n return ::cppu::PropertySetMixin< " 216cdf0e10cSrcweir << propertyhelper 217cdf0e10cSrcweir << " >::getPropertySetInfo();\n}\n\n"; 218cdf0e10cSrcweir 219cdf0e10cSrcweir o << "void SAL_CALL " << classname << "setPropertyValue(const ::rtl::OUString" 220cdf0e10cSrcweir " & aPropertyName, const css::uno::Any & aValue) throw (" 221cdf0e10cSrcweir "css::uno::RuntimeException, css::beans::UnknownPropertyException, " 222cdf0e10cSrcweir "css::beans::PropertyVetoException, css::lang::IllegalArgumentException, " 223cdf0e10cSrcweir "css::lang::WrappedTargetException)\n{\n ::cppu::PropertySetMixin< " 224cdf0e10cSrcweir << propertyhelper << " >::setPropertyValue(aPropertyName, aValue);\n}\n\n"; 225cdf0e10cSrcweir 226cdf0e10cSrcweir 227cdf0e10cSrcweir o << "css::uno::Any SAL_CALL " << classname << "getPropertyValue(const " 228cdf0e10cSrcweir "::rtl::OUString & aPropertyName) throw (css::uno::RuntimeException, " 229cdf0e10cSrcweir "css::beans::UnknownPropertyException, css::lang::WrappedTargetException)" 230cdf0e10cSrcweir "\n{\n return ::cppu::PropertySetMixin< " 231cdf0e10cSrcweir << propertyhelper << " >::getPropertyValue(aPropertyName);\n}\n\n"; 232cdf0e10cSrcweir 233cdf0e10cSrcweir o << "void SAL_CALL " << classname << "addPropertyChangeListener(const " 234cdf0e10cSrcweir "::rtl::OUString & aPropertyName, const css::uno::Reference< " 235cdf0e10cSrcweir "css::beans::XPropertyChangeListener > & xListener) throw (" 236cdf0e10cSrcweir "css::uno::RuntimeException, css::beans::UnknownPropertyException, " 237cdf0e10cSrcweir "css::lang::WrappedTargetException)\n{\n ::cppu::PropertySetMixin< " 238cdf0e10cSrcweir << propertyhelper 239cdf0e10cSrcweir << " >::addPropertyChangeListener(aPropertyName, xListener);\n}\n\n"; 240cdf0e10cSrcweir 241cdf0e10cSrcweir o << "void SAL_CALL " << classname << "removePropertyChangeListener(const " 242cdf0e10cSrcweir "::rtl::OUString & aPropertyName, const css::uno::Reference< " 243cdf0e10cSrcweir "css::beans::XPropertyChangeListener > & xListener) throw (" 244cdf0e10cSrcweir "css::uno::RuntimeException, css::beans::UnknownPropertyException, " 245cdf0e10cSrcweir "css::lang::WrappedTargetException)\n{\n ::cppu::PropertySetMixin< " 246cdf0e10cSrcweir << propertyhelper 247cdf0e10cSrcweir << " >::removePropertyChangeListener(aPropertyName, xListener);\n}\n\n"; 248cdf0e10cSrcweir 249cdf0e10cSrcweir o << "void SAL_CALL " << classname << "addVetoableChangeListener(const " 250cdf0e10cSrcweir "::rtl::OUString & aPropertyName, const css::uno::Reference< " 251cdf0e10cSrcweir "css::beans::XVetoableChangeListener > & xListener) throw (" 252cdf0e10cSrcweir "css::uno::RuntimeException, css::beans::UnknownPropertyException, " 253cdf0e10cSrcweir "css::lang::WrappedTargetException)\n{\n ::cppu::PropertySetMixin< " 254cdf0e10cSrcweir << propertyhelper 255cdf0e10cSrcweir << " >::addVetoableChangeListener(aPropertyName, xListener);\n}\n\n"; 256cdf0e10cSrcweir 257cdf0e10cSrcweir o << "void SAL_CALL " << classname << "removeVetoableChangeListener(const " 258cdf0e10cSrcweir "::rtl::OUString & aPropertyName, const css::uno::Reference< " 259cdf0e10cSrcweir "css::beans::XVetoableChangeListener > & xListener) throw (" 260cdf0e10cSrcweir "css::uno::RuntimeException, css::beans::UnknownPropertyException, " 261cdf0e10cSrcweir "css::lang::WrappedTargetException)\n{\n ::cppu::PropertySetMixin< " 262cdf0e10cSrcweir << propertyhelper 263cdf0e10cSrcweir << " >::removeVetoableChangeListener(aPropertyName, xListener);\n}\n\n"; 264cdf0e10cSrcweir } 265cdf0e10cSrcweir 266cdf0e10cSrcweir void generateXFastPropertySetBodies(std::ostream& o, 267cdf0e10cSrcweir const OString & classname, 268cdf0e10cSrcweir const OString & propertyhelper) 269cdf0e10cSrcweir { 270cdf0e10cSrcweir o << "// com.sun.star.beans.XFastPropertySet:\n"; 271cdf0e10cSrcweir 272cdf0e10cSrcweir o << "void SAL_CALL " << classname << "setFastPropertyValue( ::sal_Int32 " 273cdf0e10cSrcweir "nHandle, const css::uno::Any& aValue ) throw (" 274cdf0e10cSrcweir "css::beans::UnknownPropertyException, css::beans::PropertyVetoException, " 275cdf0e10cSrcweir "css::lang::IllegalArgumentException, css::lang::WrappedTargetException, " 276cdf0e10cSrcweir "css::uno::RuntimeException)\n{\n ::cppu::PropertySetMixin< " 277cdf0e10cSrcweir << propertyhelper << " >::setFastPropertyValue(nHandle, aValue);\n}\n\n"; 278cdf0e10cSrcweir 279cdf0e10cSrcweir 280cdf0e10cSrcweir o << "css::uno::Any SAL_CALL " << classname << "getFastPropertyValue( " 281cdf0e10cSrcweir "::sal_Int32 nHandle ) throw (css::beans::UnknownPropertyException, " 282cdf0e10cSrcweir "css::lang::WrappedTargetException, css::uno::RuntimeException)\n{\n" 283cdf0e10cSrcweir " return ::cppu::PropertySetMixin< " 284cdf0e10cSrcweir << propertyhelper << " >::getFastPropertyValue(nHandle);\n}\n\n"; 285cdf0e10cSrcweir } 286cdf0e10cSrcweir 287cdf0e10cSrcweir void generateXPropertyAccessBodies(std::ostream& o, 288cdf0e10cSrcweir const OString & classname, 289cdf0e10cSrcweir const OString & propertyhelper) 290cdf0e10cSrcweir { 291cdf0e10cSrcweir o << " // com.sun.star.beans.XPropertyAccess:\n"; 292cdf0e10cSrcweir 293cdf0e10cSrcweir o << "css::uno::Sequence< css::beans::PropertyValue > SAL_CALL " 294cdf0e10cSrcweir << classname << "getPropertyValues( ) throw (" 295cdf0e10cSrcweir "::com::sun::star::uno::RuntimeException)\n{\n" 296cdf0e10cSrcweir " return ::cppu::PropertySetMixin< " 297cdf0e10cSrcweir << propertyhelper << " >::getPropertyValues();\n}\n\n"; 298cdf0e10cSrcweir 299cdf0e10cSrcweir o << "void SAL_CALL " << classname << "setPropertyValues( const " 300cdf0e10cSrcweir "css::uno::Sequence< css::beans::PropertyValue >& aProps ) throw (" 301cdf0e10cSrcweir "css::beans::UnknownPropertyException, css::beans::PropertyVetoException, " 302cdf0e10cSrcweir "css::lang::IllegalArgumentException, css::lang::WrappedTargetException, " 303cdf0e10cSrcweir "css::uno::RuntimeException)\n{\n" 304cdf0e10cSrcweir " ::cppu::PropertySetMixin< " 305cdf0e10cSrcweir << propertyhelper << " >::setPropertyValues(aProps);\n}\n\n"; 306cdf0e10cSrcweir } 307cdf0e10cSrcweir 308cdf0e10cSrcweir void generateXLocalizable(std::ostream& o, const OString & classname) 309cdf0e10cSrcweir { 310cdf0e10cSrcweir o << "// ::com::sun::star::lang::XLocalizable:\n" 311cdf0e10cSrcweir "void SAL_CALL " << classname << "setLocale(const css::lang::" 312cdf0e10cSrcweir "Locale & eLocale) throw (css::uno::RuntimeException)\n{\n" 313cdf0e10cSrcweir " m_locale = eLocale;\n}\n\n" 314cdf0e10cSrcweir "css::lang::Locale SAL_CALL " << classname << "getLocale() " 315cdf0e10cSrcweir "throw (css::uno::RuntimeException)\n{\n return m_locale;\n}\n\n"; 316cdf0e10cSrcweir } 317cdf0e10cSrcweir 318cdf0e10cSrcweir void generateXAddInBodies(std::ostream& o, const OString & classname) 319cdf0e10cSrcweir { 320cdf0e10cSrcweir o << "// ::com::sun::star::sheet::XAddIn:\n"; 321cdf0e10cSrcweir 322cdf0e10cSrcweir o << "::rtl::OUString SAL_CALL " << classname << "getProgrammaticFuntionName(" 323cdf0e10cSrcweir "const ::rtl::OUString & aDisplayName) throw (css::uno::RuntimeException)" 324cdf0e10cSrcweir "\n{\n ::rtl::OUString ret;\n try {\n css::uno::Reference< " 325cdf0e10cSrcweir "css::container::XNameAccess > xNAccess(m_xHAccess, css::uno::UNO_QUERY);\n" 326cdf0e10cSrcweir " css::uno::Sequence< ::rtl::OUString > functions = " 327cdf0e10cSrcweir "xNAccess->getElementNames();\n sal_Int32 len = functions." 328cdf0e10cSrcweir "getLength();\n ::rtl::OUString sDisplayName;\n" 329cdf0e10cSrcweir " for (sal_Int32 i=0; i < len; ++i) {\n" 330cdf0e10cSrcweir " sDisplayName = getAddinProperty(functions[i], " 331cdf0e10cSrcweir "::rtl::OUString(),\n " 332cdf0e10cSrcweir "sDISPLAYNAME);\n if (sDisplayName.equals(aDisplayName))\n" 333cdf0e10cSrcweir " return functions[i];\n }\n }\n" 334cdf0e10cSrcweir " catch ( css::uno::RuntimeException & e ) {\n throw e;\n }\n" 335cdf0e10cSrcweir " catch ( css::uno::Exception & ) {\n }\n return ret;\n}\n\n"; 336cdf0e10cSrcweir 337cdf0e10cSrcweir o << "::rtl::OUString SAL_CALL " << classname << "getDisplayFunctionName(const " 338cdf0e10cSrcweir "::rtl::OUString & aProgrammaticName) throw (css::uno::RuntimeException)\n" 339cdf0e10cSrcweir "{\n return getAddinProperty(aProgrammaticName, ::rtl::OUString(), " 340cdf0e10cSrcweir "sDISPLAYNAME);\n}\n\n"; 341cdf0e10cSrcweir 342cdf0e10cSrcweir o << "::rtl::OUString SAL_CALL " << classname << "getFunctionDescription(const " 343cdf0e10cSrcweir "::rtl::OUString & aProgrammaticName) throw (css::uno::RuntimeException)\n" 344cdf0e10cSrcweir "{\n return getAddinProperty(aProgrammaticName, ::rtl::OUString(), " 345cdf0e10cSrcweir "sDESCRIPTION);\n}\n\n"; 346cdf0e10cSrcweir 347cdf0e10cSrcweir o << "::rtl::OUString SAL_CALL " << classname << "getDisplayArgumentName(const " 348cdf0e10cSrcweir "::rtl::OUString & aProgrammaticFunctionName, ::sal_Int32 nArgument) throw " 349cdf0e10cSrcweir "(css::uno::RuntimeException)\n{\n return getAddinProperty(" 350cdf0e10cSrcweir "aProgrammaticFunctionName,\n m_functionMap[" 351cdf0e10cSrcweir "aProgrammaticFunctionName][nArgument],\n" 352cdf0e10cSrcweir " sDISPLAYNAME);\n}\n\n"; 353cdf0e10cSrcweir 354cdf0e10cSrcweir o << "::rtl::OUString SAL_CALL " << classname << "getArgumentDescription(const " 355cdf0e10cSrcweir "::rtl::OUString & aProgrammaticFunctionName, ::sal_Int32 nArgument) throw " 356cdf0e10cSrcweir "(css::uno::RuntimeException)\n{\n return getAddinProperty(" 357cdf0e10cSrcweir "aProgrammaticFunctionName,\n " 358cdf0e10cSrcweir "m_functionMap[aProgrammaticFunctionName][nArgument],\n" 359cdf0e10cSrcweir " sDESCRIPTION);\n}\n\n"; 360cdf0e10cSrcweir 361cdf0e10cSrcweir o << "::rtl::OUString SAL_CALL " << classname << "getProgrammaticCategoryName(" 362cdf0e10cSrcweir "const ::rtl::OUString & aProgrammaticFunctionName) throw (" 363cdf0e10cSrcweir "css::uno::RuntimeException)\n{\n return getAddinProperty(" 364cdf0e10cSrcweir "aProgrammaticFunctionName, ::rtl::OUString(), sCATEGORY);\n}\n\n"; 365cdf0e10cSrcweir 366cdf0e10cSrcweir o << "::rtl::OUString SAL_CALL " << classname << "getDisplayCategoryName(const " 367cdf0e10cSrcweir "::rtl::OUString & aProgrammaticFunctionName) throw (" 368cdf0e10cSrcweir "css::uno::RuntimeException)\n{\n return getAddinProperty(" 369cdf0e10cSrcweir "aProgrammaticFunctionName, ::rtl::OUString(), " 370cdf0e10cSrcweir "sCATEGORYDISPLAYNAME);\n}\n\n"; 371cdf0e10cSrcweir } 372cdf0e10cSrcweir 373cdf0e10cSrcweir void generateXCompatibilityNamesBodies(std::ostream& o, const OString & classname) 374cdf0e10cSrcweir { 375cdf0e10cSrcweir o << "// ::com::sun::star::sheet::XCompatibilityNames:\n" 376cdf0e10cSrcweir "css::uno::Sequence< css::sheet::LocalizedName > SAL_CALL " << classname 377cdf0e10cSrcweir << "getCompatibilityNames(const ::rtl::OUString & aProgrammaticName) throw " 378cdf0e10cSrcweir "(css::uno::RuntimeException)\n{\n css::uno::Sequence< " 379cdf0e10cSrcweir "css::sheet::LocalizedName > seqLocalizedNames;\n try {\n " 380cdf0e10cSrcweir "::rtl::OUStringBuffer buf(" 381cdf0e10cSrcweir "aProgrammaticName);\n buf.appendAscii(\"/CompatibilityName\");\n" 382cdf0e10cSrcweir " ::rtl::OUString hname(buf.makeStringAndClear());\n\n " 383cdf0e10cSrcweir "if ( m_xCompAccess->hasByHierarchicalName(hname) ) {\n" 384cdf0e10cSrcweir " css::uno::Reference< css::container::XNameAccess > " 385cdf0e10cSrcweir "xNameAccess(\n" 386cdf0e10cSrcweir " m_xCompAccess->getByHierarchicalName(hname), " 387cdf0e10cSrcweir "css::uno::UNO_QUERY);\n\n css::uno::Sequence< ::rtl::OUString" 388cdf0e10cSrcweir " > elems = \n xNameAccess->getElementNames();" 389cdf0e10cSrcweir "\n ::sal_Int32 len = elems.getLength();\n\n " 390cdf0e10cSrcweir "seqLocalizedNames.realloc(len);\n\n ::rtl::OUString " 391cdf0e10cSrcweir "sCompatibilityName;\n for (::sal_Int32 i=0; i < len; ++i) {\n" 392cdf0e10cSrcweir " ::rtl::OUString sLocale(elems[i]);\n " 393cdf0e10cSrcweir "xNameAccess->getByName(sLocale) >>= sCompatibilityName;\n\n" 394cdf0e10cSrcweir " css::lang::Locale aLocale;\n " 395cdf0e10cSrcweir "::sal_Int32 nIndex = 0, nToken = 0;\n " 396cdf0e10cSrcweir "do {\n ::rtl::OUString aToken = sLocale.getToken(0, '-', " 397cdf0e10cSrcweir "nIndex);\n switch (nToken++) {\n " 398cdf0e10cSrcweir "case 0:\n aLocale.Language = aToken;\n" 399cdf0e10cSrcweir " break;\n case 1:\n" 400cdf0e10cSrcweir " aLocale.Country = aToken;\n " 401cdf0e10cSrcweir " break;\n default:\n " 402cdf0e10cSrcweir "aLocale.Variant = sLocale.copy(nIndex-aToken.getLength()-1);\n" 403cdf0e10cSrcweir " nIndex = -1;\n }\n" 404cdf0e10cSrcweir " } while ( nIndex >= 0 );\n\n " 405cdf0e10cSrcweir "seqLocalizedNames[i].Locale = aLocale;\n " 406cdf0e10cSrcweir "seqLocalizedNames[i].Name = sCompatibilityName;\n }" 407cdf0e10cSrcweir "\n }\n }\n catch ( css::uno::RuntimeException & e ) {\n " 408cdf0e10cSrcweir "throw e;\n }\n catch ( css::uno::Exception & ) {\n }\n\n" 409cdf0e10cSrcweir " return seqLocalizedNames;\n}\n\n"; 410cdf0e10cSrcweir } 411cdf0e10cSrcweir 412cdf0e10cSrcweir void generateXInitialization(std::ostream& o, const OString & classname) 413cdf0e10cSrcweir { 414cdf0e10cSrcweir o << "// ::com::sun::star::lang::XInitialization:\n" 415cdf0e10cSrcweir "void SAL_CALL " << classname << "initialize( const css::uno::Sequence< " 416cdf0e10cSrcweir "css::uno::Any >& aArguments ) " 417cdf0e10cSrcweir "throw (css::uno::Exception, css::uno::RuntimeException)\n{\n" 418cdf0e10cSrcweir " css::uno::Reference < css::frame::XFrame > xFrame;\n" 419cdf0e10cSrcweir " if ( aArguments.getLength() ) {\n aArguments[0] >>= xFrame;\n" 420cdf0e10cSrcweir " m_xFrame = xFrame;\n }\n}\n\n"; 421cdf0e10cSrcweir } 422cdf0e10cSrcweir 423cdf0e10cSrcweir void generateXDispatch(std::ostream& o, 424cdf0e10cSrcweir const OString & classname, 425cdf0e10cSrcweir const ProtocolCmdMap & protocolCmdMap) 426cdf0e10cSrcweir { 427cdf0e10cSrcweir // com.sun.star.frame.XDispatch 428cdf0e10cSrcweir // dispatch 429cdf0e10cSrcweir o << "// ::com::sun::star::frame::XDispatch:\n" 430cdf0e10cSrcweir "void SAL_CALL " << classname << "dispatch( const css::util::URL& aURL, const " 431cdf0e10cSrcweir "css::uno::Sequence< css::beans::PropertyValue >& aArguments ) throw" 432cdf0e10cSrcweir "(css::uno::RuntimeException)\n{\n"; 433cdf0e10cSrcweir 434cdf0e10cSrcweir ProtocolCmdMap::const_iterator iter = protocolCmdMap.begin(); 435cdf0e10cSrcweir while (iter != protocolCmdMap.end()) { 436cdf0e10cSrcweir o << " if ( aURL.Protocol.equalsAscii(\"" << (*iter).first 437cdf0e10cSrcweir << "\") == 0 )\n {\n"; 438cdf0e10cSrcweir 439cdf0e10cSrcweir for (std::vector< OString >::const_iterator i = (*iter).second.begin(); 440cdf0e10cSrcweir i != (*iter).second.end(); ++i) { 441cdf0e10cSrcweir o << " if ( aURL.Path.equalsAscii(\"" << (*i) << "\") )\n" 442cdf0e10cSrcweir " {\n // add your own code here\n" 443cdf0e10cSrcweir " return;\n }\n"; 444cdf0e10cSrcweir } 445cdf0e10cSrcweir 446cdf0e10cSrcweir o << " }\n"; 447cdf0e10cSrcweir iter++; 448cdf0e10cSrcweir } 449cdf0e10cSrcweir o << "}\n\n"; 450cdf0e10cSrcweir 451cdf0e10cSrcweir // addStatusListener 452cdf0e10cSrcweir o << "void SAL_CALL " << classname << "addStatusListener( const css::uno::Reference< " 453cdf0e10cSrcweir "css::frame::XStatusListener >& xControl, const css::util::URL& aURL ) " 454cdf0e10cSrcweir "throw (css::uno::RuntimeException)\n{\n" 455cdf0e10cSrcweir " // add your own code here\n}\n\n"; 456cdf0e10cSrcweir 457cdf0e10cSrcweir // removeStatusListener 458cdf0e10cSrcweir o << "void SAL_CALL " << classname << "removeStatusListener( const css::uno::Reference" 459cdf0e10cSrcweir "< css::frame::XStatusListener >& xControl, const css::util::URL& aURL ) " 460cdf0e10cSrcweir "throw (css::uno::RuntimeException)\n{\n" 461cdf0e10cSrcweir " // add your own code here\n}\n\n"; 462cdf0e10cSrcweir } 463cdf0e10cSrcweir 464cdf0e10cSrcweir void generateXDispatchProvider(std::ostream& o, 465cdf0e10cSrcweir const OString & classname, 466cdf0e10cSrcweir const ProtocolCmdMap & protocolCmdMap) 467cdf0e10cSrcweir { 468cdf0e10cSrcweir 469cdf0e10cSrcweir // com.sun.star.frame.XDispatchProvider 470cdf0e10cSrcweir // queryDispatch 471cdf0e10cSrcweir o << "// ::com::sun::star::frame::XDispatchProvider:\n" 472cdf0e10cSrcweir "css::uno::Reference< css::frame::XDispatch > SAL_CALL " << classname 473cdf0e10cSrcweir << "queryDispatch( const css::util::URL& aURL," 474cdf0e10cSrcweir " const ::rtl::OUString& sTargetFrameName, sal_Int32 nSearchFlags ) " 475cdf0e10cSrcweir "throw(css::uno::RuntimeException)\n{\n css::uno::Reference< " 476cdf0e10cSrcweir "css::frame::XDispatch > xRet;\n" 477cdf0e10cSrcweir " if ( !m_xFrame.is() )\n return 0;\n\n"; 478cdf0e10cSrcweir 479cdf0e10cSrcweir ProtocolCmdMap::const_iterator iter = protocolCmdMap.begin(); 480cdf0e10cSrcweir while (iter != protocolCmdMap.end()) { 481cdf0e10cSrcweir o << " if ( aURL.Protocol.equalsAscii(\"" << (*iter).first 482cdf0e10cSrcweir << "\") == 0 )\n {\n"; 483cdf0e10cSrcweir 484cdf0e10cSrcweir for (std::vector< OString >::const_iterator i = (*iter).second.begin(); 485cdf0e10cSrcweir i != (*iter).second.end(); ++i) { 486cdf0e10cSrcweir o << " if ( aURL.Path.equalsAscii(\"" << (*i) << "\") == 0 )\n" 487cdf0e10cSrcweir " xRet = this;\n"; 488cdf0e10cSrcweir } 489cdf0e10cSrcweir 490cdf0e10cSrcweir o << " }\n"; 491cdf0e10cSrcweir iter++; 492cdf0e10cSrcweir } 493cdf0e10cSrcweir o << " return xRet;\n}\n\n"; 494cdf0e10cSrcweir 495cdf0e10cSrcweir // queryDispatches 496cdf0e10cSrcweir o << "css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL " 497cdf0e10cSrcweir << classname << "queryDispatches( const css::uno::Sequence< " 498cdf0e10cSrcweir "css::frame::DispatchDescriptor >& seqDescripts ) throw(" 499cdf0e10cSrcweir "css::uno::RuntimeException)\n{\n" 500cdf0e10cSrcweir " sal_Int32 nCount = seqDescripts.getLength();\n" 501cdf0e10cSrcweir " css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > " 502cdf0e10cSrcweir "lDispatcher(nCount);\n\n" 503cdf0e10cSrcweir " for( sal_Int32 i=0; i<nCount; ++i ) {\n" 504cdf0e10cSrcweir " lDispatcher[i] = queryDispatch( seqDescripts[i].FeatureURL,\n" 505cdf0e10cSrcweir " seqDescripts[i].FrameName,\n" 506cdf0e10cSrcweir " seqDescripts[i].SearchFlags );\n" 507cdf0e10cSrcweir " }\n\n return lDispatcher;\n}\n\n"; 508cdf0e10cSrcweir } 509cdf0e10cSrcweir 510cdf0e10cSrcweir void generateAddinConstructorAndHelper(std::ostream& o, 511cdf0e10cSrcweir ProgramOptions const & options, 512cdf0e10cSrcweir TypeManager const & manager, const OString & classname, 513cdf0e10cSrcweir const std::hash_set< OString, OStringHash >& interfaces) 514cdf0e10cSrcweir { 515cdf0e10cSrcweir o << classname << "::" << classname 516cdf0e10cSrcweir << "(css::uno::Reference< css::uno::XComponentContext > const & context) :\n" 517cdf0e10cSrcweir << " m_xContext(context), m_locale()\n{\n"; 518cdf0e10cSrcweir 519cdf0e10cSrcweir if (options.backwardcompatible) { 520cdf0e10cSrcweir o << " try {\n"; 521cdf0e10cSrcweir 522cdf0e10cSrcweir generateFunctionParameterMap(o, options, manager, interfaces); 523cdf0e10cSrcweir 524cdf0e10cSrcweir o << " css::uno::Reference< css::lang::XMultiServiceFactory > xProvider" 525cdf0e10cSrcweir "(\n m_xContext->getServiceManager()->createInstanceWithContext" 526cdf0e10cSrcweir "(\n ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(\n " 527cdf0e10cSrcweir " \"com.sun.star.configuration.ConfigurationProvider\"))," 528cdf0e10cSrcweir "\n m_xContext ), css::uno::UNO_QUERY );\n\n"; 529cdf0e10cSrcweir 530cdf0e10cSrcweir o << " ::rtl::OUString sReadOnlyView(\n" 531cdf0e10cSrcweir " RTL_CONSTASCII_USTRINGPARAM(\n" 532cdf0e10cSrcweir " \"com.sun.star.configuration.ConfigurationAccess\"));\n\n"; 533cdf0e10cSrcweir 534cdf0e10cSrcweir o << " ::rtl::OUStringBuffer sPath(::rtl::OUString::createFromAscii(\n" 535cdf0e10cSrcweir " \"/org.openoffice.Office.CalcAddIns/AddInInfo/\"));\n" 536cdf0e10cSrcweir " sPath.appendAscii(sADDIN_SERVICENAME);\n" 537cdf0e10cSrcweir " sPath.appendAscii(\"/AddInFunctions\");\n\n" 538cdf0e10cSrcweir " // create arguments: nodepath\n" 539cdf0e10cSrcweir " css::beans::PropertyValue aArgument;\n" 540cdf0e10cSrcweir " aArgument.Name = ::rtl::OUString::createFromAscii(\"nodepath\");\n" 541cdf0e10cSrcweir " aArgument.Value <<= sPath.makeStringAndClear();\n\n" 542cdf0e10cSrcweir " css::uno::Sequence< css::uno::Any > aArguments(1);\n" 543cdf0e10cSrcweir " aArguments[0] <<= aArgument;\n\n"; 544cdf0e10cSrcweir 545cdf0e10cSrcweir o << " // create the default view using default UI locale\n" 546cdf0e10cSrcweir " css::uno::Reference< css::uno::XInterface > xIface =\n" 547cdf0e10cSrcweir " xProvider->createInstanceWithArguments(sReadOnlyView, " 548cdf0e10cSrcweir "aArguments);\n\n" 549cdf0e10cSrcweir " m_xHAccess = css::uno::Reference<\n " 550cdf0e10cSrcweir "css::container::XHierarchicalNameAccess >(xIface, css::uno::UNO_QUERY);" 551cdf0e10cSrcweir "\n\n"; 552cdf0e10cSrcweir 553cdf0e10cSrcweir o << " // extend arguments to create a view for all locales to get " 554cdf0e10cSrcweir "simple\n // access to the compatibilityname property\n" 555cdf0e10cSrcweir " aArgument.Name = ::rtl::OUString::createFromAscii(\"locale\");\n" 556cdf0e10cSrcweir " aArgument.Value <<= ::rtl::OUString::createFromAscii(\"*\");\n" 557cdf0e10cSrcweir " aArguments.realloc(2);\n" 558cdf0e10cSrcweir " aArguments[1] <<= aArgument;\n\n" 559cdf0e10cSrcweir " // create view for all locales\n" 560cdf0e10cSrcweir " xIface = xProvider->createInstanceWithArguments(sReadOnlyView, " 561cdf0e10cSrcweir "aArguments);\n\n" 562cdf0e10cSrcweir " m_xCompAccess = css::uno::Reference<\n " 563cdf0e10cSrcweir "css::container::XHierarchicalNameAccess >(xIface, css::uno::UNO_QUERY);\n"; 564cdf0e10cSrcweir 565cdf0e10cSrcweir o << " }\n catch ( css::uno::Exception & ) {\n }\n}\n\n"; 566cdf0e10cSrcweir 567cdf0e10cSrcweir o << "// addin configuration property helper function:\n::rtl::OUString " 568cdf0e10cSrcweir "SAL_CALL " << classname << "::getAddinProperty(const ::rtl::OUString &" 569cdf0e10cSrcweir " funcName, const ::rtl::OUString & paramName, const char * propName) " 570cdf0e10cSrcweir "throw (css::uno::RuntimeException)\n{\n" 571cdf0e10cSrcweir " ::rtl::OUString ret;\n try {\n " 572cdf0e10cSrcweir "::rtl::OUStringBuffer buf(funcName);\n" 573cdf0e10cSrcweir " if (paramName.getLength() > 0) {\n" 574cdf0e10cSrcweir " buf.appendAscii(\"/Parameters/\");\n" 575cdf0e10cSrcweir " buf.append(paramName);\n }\n\n" 576cdf0e10cSrcweir " css::uno::Reference< css::beans::XPropertySet > xPropSet(\n" 577cdf0e10cSrcweir " m_xHAccess->getByHierarchicalName(\n" 578cdf0e10cSrcweir " buf.makeStringAndClear()), css::uno::UNO_QUERY);\n" 579cdf0e10cSrcweir " xPropSet->getPropertyValue(\n " 580cdf0e10cSrcweir "::rtl::OUString::createFromAscii(propName)) >>= ret;\n }\n" 581cdf0e10cSrcweir " catch ( css::uno::RuntimeException & e ) {\n throw e;\n }\n" 582cdf0e10cSrcweir " catch ( css::uno::Exception & ) {\n }\n return ret;\n"; 583cdf0e10cSrcweir } 584cdf0e10cSrcweir o <<"}\n\n"; 585cdf0e10cSrcweir } 586cdf0e10cSrcweir 587cdf0e10cSrcweir void generateMemberInitialization(std::ostream& o, 588cdf0e10cSrcweir ProgramOptions const & options, 589cdf0e10cSrcweir TypeManager const & manager, 590cdf0e10cSrcweir AttributeInfo const & members) 591cdf0e10cSrcweir { 592cdf0e10cSrcweir if (!members.empty()) { 593cdf0e10cSrcweir for (AttributeInfo::const_iterator i(members.begin()); 594cdf0e10cSrcweir i != members.end(); ++i) 595cdf0e10cSrcweir { 596cdf0e10cSrcweir RTTypeClass typeClass; 597cdf0e10cSrcweir OString type(i->second.first.replace('.','/')); 598cdf0e10cSrcweir OString name; 599cdf0e10cSrcweir sal_Int32 rank; 600cdf0e10cSrcweir std::vector< OString > arguments; 601cdf0e10cSrcweir codemaker::UnoType::Sort sort = codemaker::decomposeAndResolve( 602cdf0e10cSrcweir manager, type, true, true, true, &typeClass, &name, &rank, 603cdf0e10cSrcweir &arguments); 604cdf0e10cSrcweir 605cdf0e10cSrcweir if (sort <= codemaker::UnoType::SORT_CHAR && rank == 0) { 606cdf0e10cSrcweir o << ",\n m_" << i->first << "("; 607cdf0e10cSrcweir printType(o, options, manager, type, 16, true); 608cdf0e10cSrcweir o << ")"; 609cdf0e10cSrcweir } 610cdf0e10cSrcweir } 611cdf0e10cSrcweir } 612cdf0e10cSrcweir } 613cdf0e10cSrcweir 614cdf0e10cSrcweir void generateMemberDeclaration(std::ostream& o, 615cdf0e10cSrcweir ProgramOptions const & options, 616cdf0e10cSrcweir TypeManager const & manager, 617cdf0e10cSrcweir AttributeInfo const & members) 618cdf0e10cSrcweir { 619cdf0e10cSrcweir for (AttributeInfo::const_iterator i(members.begin()); 620cdf0e10cSrcweir i != members.end(); ++i) 621cdf0e10cSrcweir { 622cdf0e10cSrcweir o << " "; 623cdf0e10cSrcweir printType(o, options, manager, i->second.first.replace('.','/'), 624cdf0e10cSrcweir 1, false); 625cdf0e10cSrcweir o << " m_" << i->first << ";\n"; 626cdf0e10cSrcweir } 627cdf0e10cSrcweir } 628cdf0e10cSrcweir 629cdf0e10cSrcweir OString generateClassDefinition(std::ostream& o, 630cdf0e10cSrcweir ProgramOptions const & options, 631cdf0e10cSrcweir TypeManager const & manager, 632cdf0e10cSrcweir OString const & classname, 633cdf0e10cSrcweir std::hash_set< OString, OStringHash > const & interfaces, 634cdf0e10cSrcweir AttributeInfo const & properties, 635cdf0e10cSrcweir AttributeInfo const & attributes, 636cdf0e10cSrcweir std::hash_set< OString, OStringHash > const & propinterfaces, 637cdf0e10cSrcweir OString const & propertyhelper, bool supportxcomponent) 638cdf0e10cSrcweir { 639cdf0e10cSrcweir OStringBuffer parentname(64); 640cdf0e10cSrcweir o << "class " << classname << ":\n"; 641cdf0e10cSrcweir 642cdf0e10cSrcweir if (!interfaces.empty()) { 643cdf0e10cSrcweir if (supportxcomponent) { 644cdf0e10cSrcweir parentname.append("::cppu::WeakComponentImplHelper"); 645cdf0e10cSrcweir parentname.append(static_cast<sal_Int32>(interfaces.size())); 646cdf0e10cSrcweir o << " private ::cppu::BaseMutex,\n" 647cdf0e10cSrcweir << " public ::cppu::WeakComponentImplHelper" 648cdf0e10cSrcweir << interfaces.size() << "<"; 649cdf0e10cSrcweir } else { 650cdf0e10cSrcweir parentname.append("::cppu::WeakImplHelper"); 651cdf0e10cSrcweir parentname.append(static_cast<sal_Int32>(interfaces.size())); 652cdf0e10cSrcweir o << " public ::cppu::WeakImplHelper" << interfaces.size() << "<"; 653cdf0e10cSrcweir } 654cdf0e10cSrcweir 655cdf0e10cSrcweir std::hash_set< OString, OStringHash >::const_iterator iter = 656cdf0e10cSrcweir interfaces.begin(); 657cdf0e10cSrcweir while (iter != interfaces.end()) 658cdf0e10cSrcweir { 659cdf0e10cSrcweir o << "\n " << scopedCppName(*iter, false, true); 660cdf0e10cSrcweir iter++; 661cdf0e10cSrcweir if (iter != interfaces.end()) 662cdf0e10cSrcweir o << ","; 663cdf0e10cSrcweir else 664cdf0e10cSrcweir o << ">"; 665cdf0e10cSrcweir } 666cdf0e10cSrcweir } 667cdf0e10cSrcweir 668cdf0e10cSrcweir if (propertyhelper.getLength() > 1) { 669cdf0e10cSrcweir o << ",\n public ::cppu::PropertySetMixin< " 670cdf0e10cSrcweir << scopedCppName(propertyhelper, false, true) << " >"; 671cdf0e10cSrcweir } 672cdf0e10cSrcweir 673cdf0e10cSrcweir o << "\n{\npublic:\n" 674cdf0e10cSrcweir << " explicit " << classname << "(" 675cdf0e10cSrcweir << "css::uno::Reference< css::uno::XComponentContext > const & context);\n\n"; 676cdf0e10cSrcweir 677cdf0e10cSrcweir // generate component/service helper functions 678cdf0e10cSrcweir // o << " // component and service helper functions:\n" 679cdf0e10cSrcweir // << " static ::rtl::OUString SAL_CALL _getImplementationName();\n" 680cdf0e10cSrcweir // << " static css::uno::Sequence< ::rtl::OUString > SAL_CALL " 681cdf0e10cSrcweir // << "_getSupportedServiceNames();\n" 682cdf0e10cSrcweir // << " static css::uno::Reference< css::uno::XInterface > SAL_CALL _create(" 683cdf0e10cSrcweir // << "\n css::uno::Reference< css::uno::XComponentContext > const & " 684cdf0e10cSrcweir // << "context);\n\n"; 685cdf0e10cSrcweir 686cdf0e10cSrcweir // overload queryInterface 687cdf0e10cSrcweir if (propertyhelper.getLength() > 1) { 688cdf0e10cSrcweir o << " // ::com::sun::star::uno::XInterface:\n" 689cdf0e10cSrcweir " virtual css::uno::Any SAL_CALL queryInterface(" 690cdf0e10cSrcweir "css::uno::Type const & type) throw (" 691cdf0e10cSrcweir "css::uno::RuntimeException);\n"; 692cdf0e10cSrcweir 693cdf0e10cSrcweir OStringBuffer buffer(256); 694cdf0e10cSrcweir buffer.append(parentname); 695cdf0e10cSrcweir buffer.append("< "); 696cdf0e10cSrcweir std::hash_set< OString, OStringHash >::const_iterator iter = 697cdf0e10cSrcweir interfaces.begin(); 698cdf0e10cSrcweir while (iter != interfaces.end()) 699cdf0e10cSrcweir { 700cdf0e10cSrcweir buffer.append(scopedCppName(*iter, false, true)); 701cdf0e10cSrcweir iter++; 702cdf0e10cSrcweir if (iter != interfaces.end()) 703cdf0e10cSrcweir buffer.append(", "); 704cdf0e10cSrcweir else 705cdf0e10cSrcweir buffer.append(" >"); 706cdf0e10cSrcweir } 707cdf0e10cSrcweir OString parent(buffer.makeStringAndClear()); 708cdf0e10cSrcweir o << " virtual void SAL_CALL acquire() throw ()\n { " 709cdf0e10cSrcweir << parent << "::acquire(); }\n"; 710cdf0e10cSrcweir o << " virtual void SAL_CALL release() throw ()\n { " 711cdf0e10cSrcweir << parent << "::release(); }\n\n"; 712cdf0e10cSrcweir } 713cdf0e10cSrcweir 714cdf0e10cSrcweir std::hash_set< OString, OStringHash >::const_iterator it = 715cdf0e10cSrcweir interfaces.begin(); 716cdf0e10cSrcweir codemaker::GeneratedTypeSet generated; 717cdf0e10cSrcweir while (it != interfaces.end()) 718cdf0e10cSrcweir { 719cdf0e10cSrcweir typereg::Reader reader(manager.getTypeReader((*it).replace('.','/'))); 720cdf0e10cSrcweir printMethods(o, options, manager, reader, generated, "", "", " ", 721cdf0e10cSrcweir true, propertyhelper); 722cdf0e10cSrcweir it++; 723cdf0e10cSrcweir } 724cdf0e10cSrcweir 725cdf0e10cSrcweir o << "private:\n " << classname << "(const " << classname << " &); // not defined\n" 726cdf0e10cSrcweir << " " << classname << "& operator=(const " << classname << " &); // not defined\n\n" 727cdf0e10cSrcweir << " // destructor is private and will be called indirectly by the release call" 728cdf0e10cSrcweir << " virtual ~" << classname << "() {}\n\n"; 729cdf0e10cSrcweir 730cdf0e10cSrcweir if (options.componenttype == 2) { 731cdf0e10cSrcweir o << " typedef std::hash_map< ::sal_Int32, rtl::OUString, " 732cdf0e10cSrcweir "std::hash<::sal_Int32> > ParamMap;\n" 733cdf0e10cSrcweir " typedef std::hash_map< rtl::OUString, ParamMap, " 734cdf0e10cSrcweir "rtl::OUStringHash > FunctionMap;\n\n" 735cdf0e10cSrcweir " ::rtl::OUString SAL_CALL getAddinProperty(const ::rtl::OUString & " 736cdf0e10cSrcweir "funcName, const ::rtl::OUString & paramName, const char * propName) " 737cdf0e10cSrcweir "throw (css::uno::RuntimeException);\n\n"; 738cdf0e10cSrcweir } 739cdf0e10cSrcweir 740cdf0e10cSrcweir if (supportxcomponent) { 741cdf0e10cSrcweir o << " // overload WeakComponentImplHelperBase::disposing()\n" 742cdf0e10cSrcweir " // This function is called upon disposing the component,\n" 743cdf0e10cSrcweir " // if your component needs special work when it becomes\n" 744cdf0e10cSrcweir " // disposed, do it here.\n" 745cdf0e10cSrcweir " virtual void SAL_CALL disposing();\n\n"; 746cdf0e10cSrcweir } 747cdf0e10cSrcweir 748cdf0e10cSrcweir // members 749cdf0e10cSrcweir o << " css::uno::Reference< css::uno::XComponentContext > m_xContext;\n"; 750cdf0e10cSrcweir if (!supportxcomponent && !attributes.empty()) 751cdf0e10cSrcweir o << " mutable ::osl::Mutex m_aMutex;\n"; 752cdf0e10cSrcweir 753cdf0e10cSrcweir // additional member for add-ons 754cdf0e10cSrcweir if (options.componenttype == 3) { 755cdf0e10cSrcweir o << " css::uno::Reference< css::frame::XFrame > m_xFrame;\n"; 756cdf0e10cSrcweir } 757cdf0e10cSrcweir 758cdf0e10cSrcweir if (options.componenttype == 2) { 759cdf0e10cSrcweir if (options.backwardcompatible) { 760cdf0e10cSrcweir o <<" css::uno::Reference< css::container::XHierarchicalNameAccess > " 761cdf0e10cSrcweir "m_xHAccess;\n" 762cdf0e10cSrcweir " css::uno::Reference< css::container::XHierarchicalNameAccess > " 763cdf0e10cSrcweir "m_xCompAccess;\n" 764cdf0e10cSrcweir " FunctionMap m_functionMap;\n"; 765cdf0e10cSrcweir } 766cdf0e10cSrcweir o << " css::lang::Locale m_locale;\n"; 767cdf0e10cSrcweir } 768cdf0e10cSrcweir 769cdf0e10cSrcweir generateMemberDeclaration(o, options, manager, properties); 770cdf0e10cSrcweir generateMemberDeclaration(o, options, manager, attributes); 771cdf0e10cSrcweir 772cdf0e10cSrcweir // if (!properties.empty()) 773cdf0e10cSrcweir // { 774cdf0e10cSrcweir // AttributeInfo::const_iterator iter = properties.begin(); 775cdf0e10cSrcweir // while (iter != properties.end()) 776cdf0e10cSrcweir // { 777cdf0e10cSrcweir // o << " "; 778cdf0e10cSrcweir // printType(o, options, manager, iter->second.first.replace('.','/'), 779cdf0e10cSrcweir // 1, false); 780cdf0e10cSrcweir // o << " m_" << iter->first << ";\n"; 781cdf0e10cSrcweir // iter++; 782cdf0e10cSrcweir // } 783cdf0e10cSrcweir // } 784cdf0e10cSrcweir // if (!attributes.empty()) 785cdf0e10cSrcweir // { 786cdf0e10cSrcweir // AttributeInfo::const_iterator iter = attributes.begin(); 787cdf0e10cSrcweir // while (iter != attributes.end()) 788cdf0e10cSrcweir // { 789cdf0e10cSrcweir // o << " "; 790cdf0e10cSrcweir // printType(o, options, manager, iter->second.first.replace('.','/'), 791cdf0e10cSrcweir // 1, false); 792cdf0e10cSrcweir // o << " m_" << iter->first << ";\n"; 793cdf0e10cSrcweir // iter++; 794cdf0e10cSrcweir // } 795cdf0e10cSrcweir // } 796cdf0e10cSrcweir 797cdf0e10cSrcweir o << "};\n\n"; 798cdf0e10cSrcweir 799cdf0e10cSrcweir // generate constructor 800cdf0e10cSrcweir if (options.componenttype == 2) { 801cdf0e10cSrcweir generateAddinConstructorAndHelper(o, options, manager, 802cdf0e10cSrcweir classname, interfaces); 803cdf0e10cSrcweir } else { 804cdf0e10cSrcweir o << classname << "::" << classname 805cdf0e10cSrcweir << "(css::uno::Reference< css::uno::XComponentContext > const & context) :\n"; 806cdf0e10cSrcweir if (supportxcomponent) { 807cdf0e10cSrcweir o << " ::cppu::WeakComponentImplHelper" << interfaces.size() << "<"; 808cdf0e10cSrcweir std::hash_set< OString, OStringHash >::const_iterator iter = 809cdf0e10cSrcweir interfaces.begin(); 810cdf0e10cSrcweir while (iter != interfaces.end()) { 811cdf0e10cSrcweir o << "\n " << scopedCppName(*iter, false, true); 812cdf0e10cSrcweir iter++; 813cdf0e10cSrcweir if (iter != interfaces.end()) 814cdf0e10cSrcweir o << ","; 815cdf0e10cSrcweir else 816cdf0e10cSrcweir o << ">(m_aMutex),\n"; 817cdf0e10cSrcweir } 818cdf0e10cSrcweir } 819cdf0e10cSrcweir if (propertyhelper.getLength() > 1) { 820cdf0e10cSrcweir o << " ::cppu::PropertySetMixin< " 821cdf0e10cSrcweir << scopedCppName(propertyhelper, false, true) << " >(\n" 822cdf0e10cSrcweir << " context, static_cast< Implements >(\n "; 823cdf0e10cSrcweir OStringBuffer buffer(128); 824cdf0e10cSrcweir if (propinterfaces.find("com/sun/star/beans/XPropertySet") 825cdf0e10cSrcweir != propinterfaces.end()) { 826cdf0e10cSrcweir buffer.append("IMPLEMENTS_PROPERTY_SET"); 827cdf0e10cSrcweir } 828cdf0e10cSrcweir if (propinterfaces.find("com/sun/star/beans/XFastPropertySet") 829cdf0e10cSrcweir != propinterfaces.end()) { 830cdf0e10cSrcweir if (buffer.getLength() > 0) 831cdf0e10cSrcweir buffer.append(" | IMPLEMENTS_FAST_PROPERTY_SET"); 832cdf0e10cSrcweir else 833cdf0e10cSrcweir buffer.append("IMPLEMENTS_FAST_PROPERTY_SET"); 834cdf0e10cSrcweir } 835cdf0e10cSrcweir if (propinterfaces.find("com/sun/star/beans/XPropertyAccess") 836cdf0e10cSrcweir != propinterfaces.end()) { 837cdf0e10cSrcweir if (buffer.getLength() > 0) 838cdf0e10cSrcweir buffer.append(" | IMPLEMENTS_PROPERTY_ACCESS"); 839cdf0e10cSrcweir else 840cdf0e10cSrcweir buffer.append("IMPLEMENTS_PROPERTY_ACCESS"); 841cdf0e10cSrcweir } 842cdf0e10cSrcweir o << buffer.makeStringAndClear() 843cdf0e10cSrcweir << "), css::uno::Sequence< ::rtl::OUString >()),\n"; 844cdf0e10cSrcweir } 845cdf0e10cSrcweir o << " m_xContext(context)"; 846cdf0e10cSrcweir 847cdf0e10cSrcweir generateMemberInitialization(o, options, manager, properties); 848cdf0e10cSrcweir generateMemberInitialization(o, options, manager, attributes); 849cdf0e10cSrcweir 850cdf0e10cSrcweir o << "\n{}\n\n"; 851cdf0e10cSrcweir } 852cdf0e10cSrcweir 853cdf0e10cSrcweir // generate service/component helper function implementations 854cdf0e10cSrcweir // generateServiceHelper(o, options.implname, classname, services); 855cdf0e10cSrcweir 856cdf0e10cSrcweir if (supportxcomponent) { 857cdf0e10cSrcweir o << "// overload WeakComponentImplHelperBase::disposing()\n" 858cdf0e10cSrcweir "// This function is called upon disposing the component,\n" 859cdf0e10cSrcweir "// if your component needs special work when it becomes\n" 860cdf0e10cSrcweir "// disposed, do it here.\n" 861cdf0e10cSrcweir "void SAL_CALL " << classname << "::disposing()\n{\n\n}\n\n"; 862cdf0e10cSrcweir } 863cdf0e10cSrcweir 864cdf0e10cSrcweir return parentname.makeStringAndClear(); 865cdf0e10cSrcweir } 866cdf0e10cSrcweir 867cdf0e10cSrcweir void generateXServiceInfoBodies(std::ostream& o, 868cdf0e10cSrcweir OString const & classname, 869cdf0e10cSrcweir OString const & comphelpernamespace) 870cdf0e10cSrcweir { 871cdf0e10cSrcweir o << "// com.sun.star.uno.XServiceInfo:\n" 872cdf0e10cSrcweir << "::rtl::OUString SAL_CALL " << classname << "getImplementationName() " 873cdf0e10cSrcweir << "throw (css::uno::RuntimeException)\n{\n " 874cdf0e10cSrcweir << "return " << comphelpernamespace << "::_getImplementationName();\n}\n\n"; 875cdf0e10cSrcweir 876cdf0e10cSrcweir o << "::sal_Bool SAL_CALL " << classname 877cdf0e10cSrcweir << "supportsService(::rtl::OUString const & " 878cdf0e10cSrcweir << "serviceName) throw (css::uno::RuntimeException)\n{\n " 879cdf0e10cSrcweir << "css::uno::Sequence< ::rtl::OUString > serviceNames = " 880cdf0e10cSrcweir << comphelpernamespace << "::_getSupportedServiceNames();\n " 881cdf0e10cSrcweir << "for (::sal_Int32 i = 0; i < serviceNames.getLength(); ++i) {\n " 882cdf0e10cSrcweir << " if (serviceNames[i] == serviceName)\n return sal_True;\n" 883cdf0e10cSrcweir << " }\n return sal_False;\n}\n\n"; 884cdf0e10cSrcweir 885cdf0e10cSrcweir o << "css::uno::Sequence< ::rtl::OUString > SAL_CALL " << classname 886cdf0e10cSrcweir << "getSupportedServiceNames() throw (css::uno::RuntimeException)\n{\n " 887cdf0e10cSrcweir << "return " << comphelpernamespace 888cdf0e10cSrcweir << "::_getSupportedServiceNames();\n}\n\n"; 889cdf0e10cSrcweir } 890cdf0e10cSrcweir 891cdf0e10cSrcweir 892cdf0e10cSrcweir void generateMethodBodies(std::ostream& o, 893cdf0e10cSrcweir ProgramOptions const & options, 894cdf0e10cSrcweir TypeManager const & manager, 895cdf0e10cSrcweir std::hash_set< OString, OStringHash > const & interfaces, 896cdf0e10cSrcweir OString const & classname, 897cdf0e10cSrcweir OString const & comphelpernamespace, 898cdf0e10cSrcweir OString const & propertyhelper) 899cdf0e10cSrcweir { 900cdf0e10cSrcweir OString name(classname.concat("::")); 901cdf0e10cSrcweir std::hash_set< OString, OStringHash >::const_iterator iter = 902cdf0e10cSrcweir interfaces.begin(); 903cdf0e10cSrcweir codemaker::GeneratedTypeSet generated; 904cdf0e10cSrcweir while (iter != interfaces.end()) { 905cdf0e10cSrcweir if ( (*iter).equals("com.sun.star.lang.XServiceInfo") ) { 906cdf0e10cSrcweir generateXServiceInfoBodies(o, name, comphelpernamespace); 907cdf0e10cSrcweir generated.add(*iter); 908cdf0e10cSrcweir } else { 909cdf0e10cSrcweir typereg::Reader reader(manager.getTypeReader((*iter).replace('.','/'))); 910cdf0e10cSrcweir printMethods(o, options, manager, reader, generated, "_", 911cdf0e10cSrcweir name, "", true, propertyhelper); 912cdf0e10cSrcweir } 913cdf0e10cSrcweir iter++; 914cdf0e10cSrcweir } 915cdf0e10cSrcweir } 916cdf0e10cSrcweir 917cdf0e10cSrcweir void generateQueryInterface(std::ostream& o, 918cdf0e10cSrcweir ProgramOptions const & options, 919cdf0e10cSrcweir TypeManager const & manager, 920cdf0e10cSrcweir const std::hash_set< OString, OStringHash >& interfaces, 921cdf0e10cSrcweir OString const & parentname, 922cdf0e10cSrcweir OString const & classname, 923cdf0e10cSrcweir OString const & propertyhelper) 924cdf0e10cSrcweir { 925cdf0e10cSrcweir if (propertyhelper.getLength() == 0) 926cdf0e10cSrcweir return; 927cdf0e10cSrcweir 928cdf0e10cSrcweir o << "css::uno::Any " << classname 929cdf0e10cSrcweir << "::queryInterface(css::uno::Type const & type) throw (" 930cdf0e10cSrcweir "css::uno::RuntimeException)\n{\n "; 931cdf0e10cSrcweir 932cdf0e10cSrcweir if (propertyhelper.getLength() >= 1) 933cdf0e10cSrcweir o << "return "; 934cdf0e10cSrcweir else 935cdf0e10cSrcweir o << "css::uno::Any a("; 936cdf0e10cSrcweir 937cdf0e10cSrcweir o << parentname << "<"; 938cdf0e10cSrcweir std::hash_set< OString, OStringHash >::const_iterator iter = 939cdf0e10cSrcweir interfaces.begin(); 940cdf0e10cSrcweir while (iter != interfaces.end()) 941cdf0e10cSrcweir { 942cdf0e10cSrcweir o << "\n " << scopedCppName(*iter, false, true); 943cdf0e10cSrcweir iter++; 944cdf0e10cSrcweir if (iter != interfaces.end()) 945cdf0e10cSrcweir o << ","; 946cdf0e10cSrcweir else 947cdf0e10cSrcweir o << ">"; 948cdf0e10cSrcweir } 949cdf0e10cSrcweir 950cdf0e10cSrcweir if (propertyhelper.getLength() >= 1) { 951cdf0e10cSrcweir o << "::queryInterface(type);\n"; 952cdf0e10cSrcweir } else { 953cdf0e10cSrcweir o << "::queryInterface(type));\n"; 954cdf0e10cSrcweir o << " return a.hasValue() ? a\n : ("; 955cdf0e10cSrcweir if (propertyhelper.equals("_")) { 956cdf0e10cSrcweir o << "::cppu::OPropertySetHelper::queryInterface(type));\n"; 957cdf0e10cSrcweir } else { 958cdf0e10cSrcweir o << "::cppu::PropertySetMixin<\n "; 959cdf0e10cSrcweir printType(o, options, manager, propertyhelper.replace('.', '/'), 960cdf0e10cSrcweir 0, false); 961cdf0e10cSrcweir o << " >::queryInterface(\n type));\n"; 962cdf0e10cSrcweir } 963cdf0e10cSrcweir } 964cdf0e10cSrcweir o << "}\n\n"; 965cdf0e10cSrcweir } 966cdf0e10cSrcweir 967cdf0e10cSrcweir void generateSkeleton(ProgramOptions const & options, 968cdf0e10cSrcweir TypeManager const & manager, 969cdf0e10cSrcweir std::vector< OString > const & types, 970cdf0e10cSrcweir OString const & /*delegate*/) 971cdf0e10cSrcweir { 972cdf0e10cSrcweir // special handling of calc add-ins 973cdf0e10cSrcweir if (options.componenttype == 2) { 974cdf0e10cSrcweir generateCalcAddin(options, manager, types); 975cdf0e10cSrcweir return; 976cdf0e10cSrcweir } 977cdf0e10cSrcweir 978cdf0e10cSrcweir std::hash_set< OString, OStringHash > interfaces; 979cdf0e10cSrcweir std::hash_set< OString, OStringHash > services; 980cdf0e10cSrcweir AttributeInfo properties; 981cdf0e10cSrcweir AttributeInfo attributes; 982cdf0e10cSrcweir std::hash_set< OString, OStringHash > propinterfaces; 983cdf0e10cSrcweir bool serviceobject = false; 984cdf0e10cSrcweir bool supportxcomponent = false; 985cdf0e10cSrcweir 986cdf0e10cSrcweir std::vector< OString >::const_iterator iter = types.begin(); 987cdf0e10cSrcweir while (iter != types.end()) { 988cdf0e10cSrcweir checkType(manager, *iter, interfaces, services, properties); 989cdf0e10cSrcweir iter++; 990cdf0e10cSrcweir } 991cdf0e10cSrcweir 992cdf0e10cSrcweir if (options.componenttype == 3) { 993cdf0e10cSrcweir // the Protocolhandler service is mandatory for an protocol handler add-on, 994cdf0e10cSrcweir // so it is defaulted. The XDispatchProvider provides Dispatch objects for 995cdf0e10cSrcweir // certain functions and the generated impl object implements XDispatch 996cdf0e10cSrcweir // directly for simplicity reasons. 997cdf0e10cSrcweir checkType(manager, "com.sun.star.frame.ProtocolHandler", 998cdf0e10cSrcweir interfaces, services, properties); 999cdf0e10cSrcweir checkType(manager, "com.sun.star.frame.XDispatch", 1000cdf0e10cSrcweir interfaces, services, properties); 1001cdf0e10cSrcweir } 1002cdf0e10cSrcweir 1003cdf0e10cSrcweir // check if service object or simple UNO object 1004cdf0e10cSrcweir if (!services.empty()) 1005cdf0e10cSrcweir serviceobject = true; 1006cdf0e10cSrcweir 1007cdf0e10cSrcweir OString propertyhelper = checkPropertyHelper( 1008cdf0e10cSrcweir options, manager, services, interfaces, attributes, propinterfaces); 1009cdf0e10cSrcweir 1010cdf0e10cSrcweir checkDefaultInterfaces(interfaces, services, propertyhelper); 1011cdf0e10cSrcweir 1012cdf0e10cSrcweir if (interfaces.size() > 12) 1013cdf0e10cSrcweir throw CannotDumpException( 1014cdf0e10cSrcweir "the skeletonmaker supports components with 12 interfaces " 1015cdf0e10cSrcweir "only (limitation of the UNO implementation helpers)!"); 1016cdf0e10cSrcweir 1017cdf0e10cSrcweir 1018cdf0e10cSrcweir supportxcomponent = checkXComponentSupport(manager, interfaces); 1019cdf0e10cSrcweir 1020cdf0e10cSrcweir OString compFileName; 1021cdf0e10cSrcweir OString tmpFileName; 1022cdf0e10cSrcweir std::ostream* pofs = NULL; 1023cdf0e10cSrcweir bool standardout = getOutputStream(options, ".cxx", 1024cdf0e10cSrcweir &pofs, compFileName, tmpFileName); 1025cdf0e10cSrcweir 1026cdf0e10cSrcweir try { 1027cdf0e10cSrcweir if (!standardout && options.license) { 1028cdf0e10cSrcweir printLicenseHeader(*pofs, compFileName); 1029cdf0e10cSrcweir } 1030cdf0e10cSrcweir 1031cdf0e10cSrcweir generateIncludes(*pofs, interfaces, properties, propertyhelper, 1032cdf0e10cSrcweir serviceobject, supportxcomponent); 1033cdf0e10cSrcweir 1034cdf0e10cSrcweir if (options.componenttype == 3) { 1035cdf0e10cSrcweir *pofs << "#include \"com/sun/star/frame/XFrame.hpp\"\n"; 1036cdf0e10cSrcweir } 1037cdf0e10cSrcweir 1038cdf0e10cSrcweir // namespace 1039cdf0e10cSrcweir OString nmspace; 1040cdf0e10cSrcweir short nm = 0; 1041cdf0e10cSrcweir 1042cdf0e10cSrcweir if (serviceobject) { 1043cdf0e10cSrcweir nmspace = generateCompHelperDeclaration(*pofs, options.implname); 1044cdf0e10cSrcweir 1045cdf0e10cSrcweir *pofs << 1046cdf0e10cSrcweir "\n\n/// anonymous implementation namespace\nnamespace {\n\n" 1047cdf0e10cSrcweir "namespace css = ::com::sun::star;\n\n"; 1048cdf0e10cSrcweir } else { 1049cdf0e10cSrcweir nm = generateNamespace(*pofs, options.implname, false, nmspace); 1050cdf0e10cSrcweir *pofs << "namespace css = ::com::sun::star;\n\n"; 1051cdf0e10cSrcweir } 1052cdf0e10cSrcweir 1053cdf0e10cSrcweir sal_Int32 index = 0; 1054cdf0e10cSrcweir OString classname(options.implname); 1055cdf0e10cSrcweir if ((index = classname.lastIndexOf('.')) > 0) 1056cdf0e10cSrcweir classname = classname.copy(index+1); 1057cdf0e10cSrcweir 1058cdf0e10cSrcweir OString parentname( 1059cdf0e10cSrcweir generateClassDefinition(*pofs, 1060cdf0e10cSrcweir options, manager, classname, interfaces, properties, 1061cdf0e10cSrcweir attributes, propinterfaces, propertyhelper, supportxcomponent)); 1062cdf0e10cSrcweir 1063cdf0e10cSrcweir generateQueryInterface(*pofs, options, manager, interfaces, parentname, 1064cdf0e10cSrcweir classname, propertyhelper); 1065cdf0e10cSrcweir 1066cdf0e10cSrcweir generateMethodBodies(*pofs, options, manager, interfaces, classname, 1067cdf0e10cSrcweir nmspace, propertyhelper); 1068cdf0e10cSrcweir 1069cdf0e10cSrcweir if (serviceobject) { 1070*2814ae3cSJohn Bampton // close namespace 1071cdf0e10cSrcweir *pofs << "} // closing anonymous implementation namespace\n\n"; 1072cdf0e10cSrcweir 1073cdf0e10cSrcweir generateCompHelperDefinition(*pofs, options.implname, 1074cdf0e10cSrcweir classname, services); 1075cdf0e10cSrcweir generateCompFunctions(*pofs, nmspace); 1076cdf0e10cSrcweir } else { 1077*2814ae3cSJohn Bampton // close namespace 1078cdf0e10cSrcweir for (short i=0; i < nm; i++) 1079cdf0e10cSrcweir *pofs << "} "; 1080cdf0e10cSrcweir *pofs << (nm > 0 ? "// closing namespace\n\n" : "\n"); 1081cdf0e10cSrcweir } 1082cdf0e10cSrcweir 1083cdf0e10cSrcweir if ( !standardout && pofs && ((std::ofstream*)pofs)->is_open()) { 1084cdf0e10cSrcweir ((std::ofstream*)pofs)->close(); 1085cdf0e10cSrcweir delete pofs; 1086cdf0e10cSrcweir OSL_VERIFY(makeValidTypeFile(compFileName, tmpFileName, sal_False)); 1087cdf0e10cSrcweir } 1088cdf0e10cSrcweir } catch(CannotDumpException& e) { 1089cdf0e10cSrcweir 1090cdf0e10cSrcweir std::cerr << "ERROR: " << e.m_message.getStr() << "\n"; 1091cdf0e10cSrcweir if ( !standardout ) { 1092cdf0e10cSrcweir if (pofs && ((std::ofstream*)pofs)->is_open()) { 1093cdf0e10cSrcweir ((std::ofstream*)pofs)->close(); 1094cdf0e10cSrcweir delete pofs; 1095cdf0e10cSrcweir } 1096cdf0e10cSrcweir // remove existing type file if something goes wrong to ensure 1097cdf0e10cSrcweir // consistency 1098cdf0e10cSrcweir if (fileExists(compFileName)) 1099cdf0e10cSrcweir removeTypeFile(compFileName); 1100cdf0e10cSrcweir 1101cdf0e10cSrcweir // remove tmp file if something goes wrong 1102cdf0e10cSrcweir removeTypeFile(tmpFileName); 1103cdf0e10cSrcweir } 1104cdf0e10cSrcweir } 1105cdf0e10cSrcweir } 1106cdf0e10cSrcweir 1107cdf0e10cSrcweir void generateCalcAddin(ProgramOptions const & options, 1108cdf0e10cSrcweir TypeManager const & manager, 1109cdf0e10cSrcweir std::vector< OString > const & types) 1110cdf0e10cSrcweir { 1111cdf0e10cSrcweir std::hash_set< OString, OStringHash > interfaces; 1112cdf0e10cSrcweir std::hash_set< OString, OStringHash > services; 1113cdf0e10cSrcweir AttributeInfo properties; 1114cdf0e10cSrcweir AttributeInfo attributes; 1115cdf0e10cSrcweir std::hash_set< OString, OStringHash > propinterfaces; 1116cdf0e10cSrcweir bool serviceobject = false; 1117cdf0e10cSrcweir bool supportxcomponent = false; 1118cdf0e10cSrcweir 1119cdf0e10cSrcweir 1120cdf0e10cSrcweir std::vector< OString >::const_iterator iter = types.begin(); 1121cdf0e10cSrcweir while (iter != types.end()) { 1122cdf0e10cSrcweir checkType(manager, *iter, interfaces, services, properties); 1123cdf0e10cSrcweir iter++; 1124cdf0e10cSrcweir } 1125cdf0e10cSrcweir 1126cdf0e10cSrcweir OString sAddinService; 1127cdf0e10cSrcweir if (services.size() != 1) { 1128cdf0e10cSrcweir throw CannotDumpException( 1129cdf0e10cSrcweir "for calc add-in components one and only one service type is necessary!" 1130cdf0e10cSrcweir " Please reference a valid type with the '-t' option."); 1131cdf0e10cSrcweir } 1132cdf0e10cSrcweir 1133cdf0e10cSrcweir 1134cdf0e10cSrcweir // get the one and only add-in service for later use 1135cdf0e10cSrcweir std::hash_set< OString, OStringHash >::const_iterator iter2 = services.begin(); 1136cdf0e10cSrcweir sAddinService = (*iter2).replace('/', '.'); 1137cdf0e10cSrcweir if (sAddinService.equals("com.sun.star.sheet.AddIn")) { 1138cdf0e10cSrcweir sAddinService = (*(++iter2)).replace('/', '.'); 1139cdf0e10cSrcweir } 1140cdf0e10cSrcweir 1141cdf0e10cSrcweir // if backwardcompatible==true the AddIn service needs to be added to the 1142a8d869c0SJohn Bampton // supported service list, the necessary interfaces are mapped to the add-in 1143cdf0e10cSrcweir // configuration. Since OO.org 2.0.4 this is obsolete and the add-in is 1144a8d869c0SJohn Bampton // taken from the configuration from Calc directly, this simplifies the 1145cdf0e10cSrcweir // add-in code 1146cdf0e10cSrcweir if (options.backwardcompatible) { 1147cdf0e10cSrcweir checkType(manager, "com.sun.star.sheet.AddIn", 1148cdf0e10cSrcweir interfaces, services, properties); 1149cdf0e10cSrcweir } else { 1150cdf0e10cSrcweir // special case for the optional XLocalization interface. It should be 1151cdf0e10cSrcweir // implemented always. But it is parent of the XAddIn and we need it only 1152cdf0e10cSrcweir // if backwardcompatible is false. 1153cdf0e10cSrcweir if (interfaces.find("com.sun.star.lang.XLocalizable") == interfaces.end()) { 1154cdf0e10cSrcweir interfaces.insert("com.sun.star.lang.XLocalizable"); 1155cdf0e10cSrcweir } 1156cdf0e10cSrcweir } 1157cdf0e10cSrcweir 1158cdf0e10cSrcweir OString propertyhelper = checkPropertyHelper( 1159cdf0e10cSrcweir options, manager, services, interfaces, attributes, propinterfaces); 1160cdf0e10cSrcweir 1161cdf0e10cSrcweir if (propertyhelper.getLength() > 0) 1162cdf0e10cSrcweir std::cerr << "WARNING: interfaces specifying calc add-in functions " 1163cdf0e10cSrcweir "shouldn't support attributes!\n"; 1164cdf0e10cSrcweir 1165cdf0e10cSrcweir checkDefaultInterfaces(interfaces, services, propertyhelper); 1166cdf0e10cSrcweir 1167cdf0e10cSrcweir if (interfaces.size() > 12) { 1168cdf0e10cSrcweir throw CannotDumpException( 1169cdf0e10cSrcweir "the skeletonmaker supports components with 12 interfaces " 1170cdf0e10cSrcweir "only (limitation of the UNO implementation helpers)!"); 1171cdf0e10cSrcweir } 1172cdf0e10cSrcweir 1173cdf0e10cSrcweir // check if service object or simple UNO object 1174cdf0e10cSrcweir if (!services.empty()) 1175cdf0e10cSrcweir serviceobject = true; 1176cdf0e10cSrcweir 1177cdf0e10cSrcweir supportxcomponent = checkXComponentSupport(manager, interfaces); 1178cdf0e10cSrcweir if (supportxcomponent) 1179cdf0e10cSrcweir std::cerr << "WARNING: add-ins shouldn't support " 1180cdf0e10cSrcweir "com.sun.star.uno.XComponent!\n"; 1181cdf0e10cSrcweir 1182cdf0e10cSrcweir OString compFileName; 1183cdf0e10cSrcweir OString tmpFileName; 1184cdf0e10cSrcweir std::ostream* pofs = NULL; 1185cdf0e10cSrcweir bool standardout = getOutputStream(options, ".cxx", 1186cdf0e10cSrcweir &pofs, compFileName, tmpFileName); 1187cdf0e10cSrcweir 1188cdf0e10cSrcweir try { 1189cdf0e10cSrcweir if (!standardout && options.license) { 1190cdf0e10cSrcweir printLicenseHeader(*pofs, compFileName); 1191cdf0e10cSrcweir } 1192cdf0e10cSrcweir 1193cdf0e10cSrcweir generateIncludes(*pofs, interfaces, properties, propertyhelper, 1194cdf0e10cSrcweir serviceobject, supportxcomponent); 1195cdf0e10cSrcweir 1196cdf0e10cSrcweir *pofs << 1197cdf0e10cSrcweir "#include \"com/sun/star/beans/PropertyValue.hpp\"\n" 1198cdf0e10cSrcweir "#include \"com/sun/star/beans/XPropertySet.hpp\"\n" 1199cdf0e10cSrcweir "#include \"com/sun/star/container/XNameAccess.hpp\"\n" 1200cdf0e10cSrcweir "#include \"com/sun/star/container/XHierarchicalNameAccess.hpp\"\n\n" 1201cdf0e10cSrcweir "#include \"rtl/ustrbuf.hxx\"\n\n" 1202cdf0e10cSrcweir "#include <hash_map>\n" 1203cdf0e10cSrcweir "#include <set>\n"; 1204cdf0e10cSrcweir 1205cdf0e10cSrcweir // namespace 1206cdf0e10cSrcweir OString nmspace(generateCompHelperDeclaration(*pofs, options.implname)); 1207cdf0e10cSrcweir 1208cdf0e10cSrcweir *pofs << 1209cdf0e10cSrcweir "\n\n// anonymous implementation namespace\nnamespace {\n\n" 1210cdf0e10cSrcweir "namespace css = ::com::sun::star;\n\n"; 1211cdf0e10cSrcweir 1212cdf0e10cSrcweir sal_Int32 index = 0; 1213cdf0e10cSrcweir OString classname(options.implname); 1214cdf0e10cSrcweir if ((index = classname.lastIndexOf('.')) > 0) { 1215cdf0e10cSrcweir classname = classname.copy(index+1); 1216cdf0e10cSrcweir } 1217cdf0e10cSrcweir 1218cdf0e10cSrcweir if (options.backwardcompatible) { 1219cdf0e10cSrcweir *pofs << "static const char * sADDIN_SERVICENAME = \"" 1220cdf0e10cSrcweir << sAddinService << "\";\n\n"; 1221cdf0e10cSrcweir *pofs << "static const char * sDISPLAYNAME = \"DisplayName\";\n" 1222cdf0e10cSrcweir "static const char * sDESCRIPTION = \"Description\";\n" 1223cdf0e10cSrcweir "static const char * sCATEGORY = \"Category\";\n" 1224cdf0e10cSrcweir "static const char * sCATEGORYDISPLAYNAME = \"CategoryDisplayName\";" 1225cdf0e10cSrcweir "\n\n"; 1226cdf0e10cSrcweir } 1227cdf0e10cSrcweir 1228cdf0e10cSrcweir OString parentname( 1229cdf0e10cSrcweir generateClassDefinition(*pofs, 1230cdf0e10cSrcweir options, manager, classname, interfaces, properties, 1231cdf0e10cSrcweir attributes, propinterfaces, propertyhelper, supportxcomponent)); 1232cdf0e10cSrcweir 1233cdf0e10cSrcweir generateQueryInterface(*pofs, options, manager, interfaces, parentname, 1234cdf0e10cSrcweir classname, propertyhelper); 1235cdf0e10cSrcweir 1236cdf0e10cSrcweir generateMethodBodies(*pofs, options, manager, interfaces, classname, 1237cdf0e10cSrcweir nmspace, propertyhelper); 1238cdf0e10cSrcweir 1239*2814ae3cSJohn Bampton // close namespace 1240cdf0e10cSrcweir *pofs << "} // closing anonymous implementation namespace\n\n"; 1241cdf0e10cSrcweir 1242cdf0e10cSrcweir generateCompHelperDefinition(*pofs, options.implname, classname, 1243cdf0e10cSrcweir services); 1244cdf0e10cSrcweir 1245cdf0e10cSrcweir generateCompFunctions(*pofs, nmspace); 1246cdf0e10cSrcweir 1247cdf0e10cSrcweir if ( !standardout && pofs && ((std::ofstream*)pofs)->is_open()) { 1248cdf0e10cSrcweir ((std::ofstream*)pofs)->close(); 1249cdf0e10cSrcweir delete pofs; 1250cdf0e10cSrcweir OSL_VERIFY(makeValidTypeFile(compFileName, tmpFileName, sal_False)); 1251cdf0e10cSrcweir } 1252cdf0e10cSrcweir } catch(CannotDumpException& e) { 1253cdf0e10cSrcweir 1254cdf0e10cSrcweir std::cerr << "ERROR: " << e.m_message.getStr() << "\n"; 1255cdf0e10cSrcweir if ( !standardout ) { 1256cdf0e10cSrcweir if (pofs && ((std::ofstream*)pofs)->is_open()) { 1257cdf0e10cSrcweir ((std::ofstream*)pofs)->close(); 1258cdf0e10cSrcweir delete pofs; 1259cdf0e10cSrcweir } 1260cdf0e10cSrcweir // remove existing type file if something goes wrong to ensure 1261cdf0e10cSrcweir // consistency 1262cdf0e10cSrcweir if (fileExists(compFileName)) 1263cdf0e10cSrcweir removeTypeFile(compFileName); 1264cdf0e10cSrcweir 1265cdf0e10cSrcweir // remove tmp file if something goes wrong 1266cdf0e10cSrcweir removeTypeFile(tmpFileName); 1267cdf0e10cSrcweir } 1268cdf0e10cSrcweir } 1269cdf0e10cSrcweir } 1270cdf0e10cSrcweir 1271cdf0e10cSrcweir } } 1272