diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2012-11-13 17:53:42 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2012-11-13 18:04:26 +0100 |
commit | 12fa9ece663f24eff44197befe546a92e6c90724 (patch) | |
tree | a09c9b7844a5c8298d81c9b4934acc36f9c8b28b | |
parent | 4be8c3205afd55fa7e1f578384d3c91ebd8b5ec3 (diff) |
Avoid global static data
...that (indirectly) allocates memory via rtl/alloc.h, thereby causing the
rtl_cache_wsupdate_init thread to be spawned before main, as on Mac OS X that
would interfere with the code in sal_detail_initialize to close all file
descriptors >= 3 -- on Mac OS X the pthreads implementation makes use of KQUEUE
file descriptors.
* This commit removes enough global static data to make ui-preview work again on
Mac OS X (where it crashed at startup when the main thread closed the KQUEUE fd
used by pthreads implementation threads). gengal uses further static data (at
least from module sb), so needs further clean-up.
* Avoiding global static instances derived from class Application required the
introduction of vcl/vclmain.hxx.
* That the vcl library was linked against the static vclmain library (which only
provides an implementation of main) appears to me to be a historic relic (all
executables should either include a SAL_IMPLEMENT_MAIN or link against vclmain),
so I removed that.
Change-Id: I048aa616208cb3a1b9bd8dcc3b729ba1665729bd
-rw-r--r-- | cppu/source/uno/EnvStack.cxx | 14 | ||||
-rw-r--r-- | padmin/source/pamain.cxx | 6 | ||||
-rw-r--r-- | svx/source/gengal/gengal.cxx | 6 | ||||
-rw-r--r-- | unotools/source/config/useroptions.cxx | 48 | ||||
-rw-r--r-- | vcl/Library_vcl.mk | 6 | ||||
-rw-r--r-- | vcl/Package_inc.mk | 1 | ||||
-rw-r--r-- | vcl/aqua/source/dtrans/DataFlavorMapping.cxx | 47 | ||||
-rw-r--r-- | vcl/aqua/source/dtrans/OSXTransferable.cxx | 7 | ||||
-rw-r--r-- | vcl/inc/vcl/vclmain.hxx | 27 | ||||
-rw-r--r-- | vcl/ios/source/dtrans/iOSTransferable.cxx | 7 | ||||
-rw-r--r-- | vcl/source/salmain/salmain.cxx | 2 | ||||
-rw-r--r-- | vcl/source/uipreviewer/previewer.cxx | 6 |
12 files changed, 101 insertions, 76 deletions
diff --git a/cppu/source/uno/EnvStack.cxx b/cppu/source/uno/EnvStack.cxx index f4521c3bdeda..cafd4fe23b75 100644 --- a/cppu/source/uno/EnvStack.cxx +++ b/cppu/source/uno/EnvStack.cxx @@ -67,8 +67,6 @@ namespace struct s_threadMap : public rtl::Static< ThreadMap, s_threadMap > {}; } -static rtl::OUString s_uno_envDcp(RTL_CONSTASCII_USTRINGPARAM(UNO_LB_UNO)); - static void s_setCurrent(uno_Environment * pEnv) { oslThreadIdentifier threadId = osl_getThreadIdentifier(NULL); @@ -128,8 +126,10 @@ extern "C" CPPU_DLLPUBLIC void SAL_CALL uno_getCurrentEnvironment(uno_Environmen (*ppEnv)->acquire(*ppEnv); } else - uno_getEnvironment(ppEnv, s_uno_envDcp.pData, NULL); - + { + rtl::OUString uno_envDcp(UNO_LB_UNO); + uno_getEnvironment(ppEnv, uno_envDcp.pData, NULL); + } } } @@ -196,7 +196,7 @@ static int s_getNextEnv(uno_Environment ** ppEnv, uno_Environment * pCurrEnv, un if (!nextPurpose.isEmpty()) { - rtl::OUString next_envDcp(s_uno_envDcp); + rtl::OUString next_envDcp(UNO_LB_UNO); next_envDcp += nextPurpose; uno_getEnvironment(ppEnv, next_envDcp.pData, NULL); @@ -355,7 +355,7 @@ CPPU_DLLPUBLIC int SAL_CALL uno_Environment_isValid(uno_Environment * pEnv, rtl_ int result = 1; rtl::OUString typeName(cppu::EnvDcp::getTypeName(pEnv->pTypeName)); - if (typeName.equals(s_uno_envDcp)) + if (typeName == UNO_LB_UNO) { cppu::Enterable * pEnterable = reinterpret_cast<cppu::Enterable *>(pEnv->pReserved); if (pEnterable) @@ -363,7 +363,7 @@ CPPU_DLLPUBLIC int SAL_CALL uno_Environment_isValid(uno_Environment * pEnv, rtl_ } else { - rtl::OUString envDcp(s_uno_envDcp); + rtl::OUString envDcp(UNO_LB_UNO); envDcp += cppu::EnvDcp::getPurpose(pEnv->pTypeName); uno::Environment env(envDcp); diff --git a/padmin/source/pamain.cxx b/padmin/source/pamain.cxx index 6f6e2e3e722e..70f9267bfdb3 100644 --- a/padmin/source/pamain.cxx +++ b/padmin/source/pamain.cxx @@ -21,6 +21,7 @@ #include <unistd.h> #include "vcl/svapp.hxx" +#include "vcl/vclmain.hxx" #include "vcl/wrkwin.hxx" #include "vcl/unowrap.hxx" @@ -53,7 +54,10 @@ public: static rtl::OUString ReadStringHook( const rtl::OUString& ); }; -MyApp aMyApp; +void vclmain::createApplication() +{ + static MyApp aMyApp; +} rtl::OUString MyApp::ReadStringHook( const rtl::OUString& rStr ) { diff --git a/svx/source/gengal/gengal.cxx b/svx/source/gengal/gengal.cxx index 21b86b874c51..6d296fc4876e 100644 --- a/svx/source/gengal/gengal.cxx +++ b/svx/source/gengal/gengal.cxx @@ -47,6 +47,7 @@ #include <tools/urlobj.hxx> #include <tools/fsys.hxx> +#include <vcl/vclmain.hxx> #include <vcl/window.hxx> #include <vcl/svapp.hxx> #include <vcl/font.hxx> @@ -261,6 +262,9 @@ int GalApp::Main() return EXIT_SUCCESS; } -GalApp aGalApp; +void vclmain::createApplication() +{ + static GalApp aGalApp; +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/unotools/source/config/useroptions.cxx b/unotools/source/config/useroptions.cxx index 8af1121f9e42..5da601831adb 100644 --- a/unotools/source/config/useroptions.cxx +++ b/unotools/source/config/useroptions.cxx @@ -51,29 +51,27 @@ using rtl::OUString; namespace { -OUString const sData = "org.openoffice.UserProfile/Data"; - // vOptionNames[] -- names of the user option entries // The order corresponds to the #define USER_OPT_* list in useroptions.hxx. -OUString const vOptionNames[] = { - OUString("l"), // USER_OPT_CITY - OUString("o"), // USER_OPT_COMPANY - OUString("c"), // USER_OPT_COUNTRY - OUString("mail"), // USER_OPT_EMAIL - OUString("facsimiletelephonenumber"), // USER_OPT_FAX - OUString("givenname"), // USER_OPT_FIRSTNAME - OUString("sn"), // USER_OPT_LASTNAME - OUString("position"), // USER_OPT_POSITION - OUString("st"), // USER_OPT_STATE - OUString("street"), // USER_OPT_STREET - OUString("homephone"), // USER_OPT_TELEPHONEHOME - OUString("telephonenumber"), // USER_OPT_TELEPHONEWORK - OUString("title"), // USER_OPT_TITLE - OUString("initials"), // USER_OPT_ID - OUString("postalcode"), // USER_OPT_ZIP - OUString("fathersname"), // USER_OPT_FATHERSNAME - OUString("apartment"), // USER_OPT_APARTMENT - OUString("customernumber") // USER_OPT_CUSTOMERNUMBER +char const * const vOptionNames[] = { + "l", // USER_OPT_CITY + "o", // USER_OPT_COMPANY + "c", // USER_OPT_COUNTRY + "mail", // USER_OPT_EMAIL + "facsimiletelephonenumber", // USER_OPT_FAX + "givenname", // USER_OPT_FIRSTNAME + "sn", // USER_OPT_LASTNAME + "position", // USER_OPT_POSITION + "st", // USER_OPT_STATE + "street", // USER_OPT_STREET + "homephone", // USER_OPT_TELEPHONEHOME + "telephonenumber", // USER_OPT_TELEPHONEWORK + "title", // USER_OPT_TITLE + "initials", // USER_OPT_ID + "postalcode", // USER_OPT_ZIP + "fathersname", // USER_OPT_FATHERSNAME + "apartment", // USER_OPT_APARTMENT + "customernumber" // USER_OPT_CUSTOMERNUMBER }; const sal_uInt16 nOptionNameCount = SAL_N_ELEMENTS(vOptionNames); @@ -147,7 +145,7 @@ SvtUserOptions::Impl::Impl() : m_xCfg = uno::Reference<container::XNameAccess>( comphelper::ConfigurationHelper::openConfig( comphelper::getProcessComponentContext(), - sData, + "org.openoffice.UserProfile/Data", comphelper::ConfigurationHelper::E_STANDARD ), uno::UNO_QUERY @@ -180,7 +178,7 @@ OUString SvtUserOptions::Impl::GetToken (sal_uInt16 nToken) const try { if (m_xData.is()) - m_xData->getPropertyValue(vOptionNames[nToken]) >>= sToken; + m_xData->getPropertyValue(OUString::createFromAscii(vOptionNames[nToken])) >>= sToken; } catch (uno::Exception const& ex) { @@ -201,7 +199,7 @@ void SvtUserOptions::Impl::SetToken (sal_uInt16 nToken, OUString const& sToken) try { if (m_xData.is()) - m_xData->setPropertyValue(vOptionNames[nToken], uno::makeAny(sToken)); + m_xData->setPropertyValue(OUString::createFromAscii(vOptionNames[nToken]), uno::makeAny(sToken)); comphelper::ConfigurationHelper::flush(m_xCfg); } catch (uno::Exception const& ex) @@ -240,7 +238,7 @@ sal_Bool SvtUserOptions::Impl::IsTokenReadonly (sal_uInt16 nToken) const { uno::Reference<beans::XPropertySet> xData(m_xCfg, uno::UNO_QUERY); uno::Reference<beans::XPropertySetInfo> xInfo = xData->getPropertySetInfo(); - beans::Property aProp = xInfo->getPropertyByName(vOptionNames[nToken]); + beans::Property aProp = xInfo->getPropertyByName(OUString::createFromAscii(vOptionNames[nToken])); return ((aProp.Attributes & beans::PropertyAttribute::READONLY) == beans::PropertyAttribute::READONLY); } diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index 004325af146f..18592d4e146d 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -661,12 +661,6 @@ $(eval $(call gb_Library_add_ldflags,vcl,\ endif endif -ifneq ($(OS),IOS) -$(eval $(call gb_Library_use_static_libraries,vcl,\ - vclmain \ -)) -endif - # Runtime dependency for unit-tests $(call gb_LinkTarget_get_target,$(call gb_Library_get_linktargetname,vcl)) :| \ $(call gb_AllLangResTarget_get_target,vcl) diff --git a/vcl/Package_inc.mk b/vcl/Package_inc.mk index 1c488bed8cb0..3f37b7442ad2 100644 --- a/vcl/Package_inc.mk +++ b/vcl/Package_inc.mk @@ -156,6 +156,7 @@ $(eval $(call gb_Package_add_file,vcl_inc,inc/vcl/unohelp.hxx,vcl/unohelp.hxx)) $(eval $(call gb_Package_add_file,vcl_inc,inc/vcl/unowrap.hxx,vcl/unowrap.hxx)) $(eval $(call gb_Package_add_file,vcl_inc,inc/vcl/vclenum.hxx,vcl/vclenum.hxx)) $(eval $(call gb_Package_add_file,vcl_inc,inc/vcl/vclevent.hxx,vcl/vclevent.hxx)) +$(eval $(call gb_Package_add_file,vcl_inc,inc/vcl/vclmain.hxx,vcl/vclmain.hxx)) $(eval $(call gb_Package_add_file,vcl_inc,inc/vcl/vclmedit.hxx,vcl/vclmedit.hxx)) $(eval $(call gb_Package_add_file,vcl_inc,inc/vcl/virdev.hxx,vcl/virdev.hxx)) $(eval $(call gb_Package_add_file,vcl_inc,inc/vcl/waitobj.hxx,vcl/waitobj.hxx)) diff --git a/vcl/aqua/source/dtrans/DataFlavorMapping.cxx b/vcl/aqua/source/dtrans/DataFlavorMapping.cxx index 47fad6bd38f3..80ec5c35a6eb 100644 --- a/vcl/aqua/source/dtrans/DataFlavorMapping.cxx +++ b/vcl/aqua/source/dtrans/DataFlavorMapping.cxx @@ -48,16 +48,13 @@ using ::rtl::OString; namespace // private { - const Type CPPUTYPE_SEQINT8 = getCppuType((Sequence<sal_Int8>*)0); - const Type CPPUTYPE_OUSTRING = getCppuType( (OUString*)0 ); - /* Determine whether or not a DataFlavor is valid. */ bool isValidFlavor(const DataFlavor& aFlavor) { size_t len = aFlavor.MimeType.getLength(); Type dtype = aFlavor.DataType; - return ((len > 0) && ((dtype == CPPUTYPE_SEQINT8) || (dtype == CPPUTYPE_OUSTRING))); + return ((len > 0) && ((dtype == getCppuType((Sequence<sal_Int8>*)0)) || (dtype == getCppuType( (OUString*)0 )))); } NSString* PBTYPE_SODX = @"application/x-openoffice-objectdescriptor-xml;windows_formatname=\"Star Object Descriptor (XML)\""; @@ -92,7 +89,7 @@ namespace // private NSString* SystemFlavor; const char* OOoFlavor; const char* HumanPresentableName; - Type DataType; + bool DataTypeOUString; // sequence<byte> otherwise }; // NSPICTPboardType is deprecated in 10.6 and later @@ -113,23 +110,23 @@ namespace // private */ FlavorMap flavorMap[] = { - { NSStringPboardType, "text/plain;charset=utf-16", "Unicode Text (UTF-16)", CPPUTYPE_OUSTRING }, - { NSRTFPboardType, "text/richtext", "Rich Text Format", CPPUTYPE_SEQINT8 }, - { NSTIFFPboardType, "image/bmp", "Windows Bitmap", CPPUTYPE_SEQINT8 }, - { NSPICTPboardType, "image/bmp", "Windows Bitmap", CPPUTYPE_SEQINT8 }, - { NSHTMLPboardType, "text/html", "Plain Html", CPPUTYPE_SEQINT8 }, - { NSFilenamesPboardType, "application/x-openoffice-filelist;windows_formatname=\"FileList\"", "FileList", CPPUTYPE_SEQINT8 }, - { PBTYPE_SESX, FLAVOR_SESX, "Star Embed Source (XML)", CPPUTYPE_SEQINT8 }, - { PBTYPE_SLSDX, FLAVOR_SLSDX, "Star Link Source Descriptor (XML)", CPPUTYPE_SEQINT8 }, - { PBTYPE_ESX, FLAVOR_ESX, "Star Embed Source (XML)", CPPUTYPE_SEQINT8 }, - { PBTYPE_LSX, FLAVOR_LSX, "Star Link Source (XML)", CPPUTYPE_SEQINT8 }, - { PBTYPE_EOX, FLAVOR_EOX, "Star Embedded Object (XML)", CPPUTYPE_SEQINT8 }, - { PBTYPE_SVXB, FLAVOR_SVXB, "SVXB (StarView Bitmap/Animation", CPPUTYPE_SEQINT8 }, - { PBTYPE_GDIMF, FLAVOR_GDIMF, "GDIMetaFile", CPPUTYPE_SEQINT8 }, - { PBTYPE_WMF, FLAVOR_WMF, "Windows MetaFile", CPPUTYPE_SEQINT8 }, - { PBTYPE_EMF, FLAVOR_EMF, "Windows Enhanced MetaFile", CPPUTYPE_SEQINT8 }, - { PBTYPE_SODX, FLAVOR_SODX, "Star Object Descriptor (XML)", CPPUTYPE_SEQINT8 }, - { PBTYPE_DUMMY_INTERNAL, FLAVOR_DUMMY_INTERNAL, "internal data",CPPUTYPE_SEQINT8 } + { NSStringPboardType, "text/plain;charset=utf-16", "Unicode Text (UTF-16)", true }, + { NSRTFPboardType, "text/richtext", "Rich Text Format", false }, + { NSTIFFPboardType, "image/bmp", "Windows Bitmap", false }, + { NSPICTPboardType, "image/bmp", "Windows Bitmap", false }, + { NSHTMLPboardType, "text/html", "Plain Html", false }, + { NSFilenamesPboardType, "application/x-openoffice-filelist;windows_formatname=\"FileList\"", "FileList", false }, + { PBTYPE_SESX, FLAVOR_SESX, "Star Embed Source (XML)", false }, + { PBTYPE_SLSDX, FLAVOR_SLSDX, "Star Link Source Descriptor (XML)", false }, + { PBTYPE_ESX, FLAVOR_ESX, "Star Embed Source (XML)", false }, + { PBTYPE_LSX, FLAVOR_LSX, "Star Link Source (XML)", false }, + { PBTYPE_EOX, FLAVOR_EOX, "Star Embedded Object (XML)", false }, + { PBTYPE_SVXB, FLAVOR_SVXB, "SVXB (StarView Bitmap/Animation", false }, + { PBTYPE_GDIMF, FLAVOR_GDIMF, "GDIMetaFile", false }, + { PBTYPE_WMF, FLAVOR_WMF, "Windows MetaFile", false }, + { PBTYPE_EMF, FLAVOR_EMF, "Windows Enhanced MetaFile", false }, + { PBTYPE_SODX, FLAVOR_SODX, "Star Object Descriptor (XML)", false }, + { PBTYPE_DUMMY_INTERNAL, FLAVOR_DUMMY_INTERNAL, "internal data",false } }; @@ -138,12 +135,12 @@ namespace // private inline bool isByteSequenceType(const Type& theType) { - return (theType == CPPUTYPE_SEQINT8); + return (theType == getCppuType((Sequence<sal_Int8>*)0)); } inline bool isOUStringType(const Type& theType) { - return (theType == CPPUTYPE_OUSTRING); + return (theType == getCppuType( (OUString*)0 )); } } // namespace private @@ -519,7 +516,7 @@ DataFlavor DataFlavorMapper::systemToOpenOfficeFlavor(NSString* systemDataFlavor { oOOFlavor.MimeType = OUString::createFromAscii(flavorMap[i].OOoFlavor); oOOFlavor.HumanPresentableName = OUString(RTL_CONSTASCII_USTRINGPARAM(flavorMap[i].HumanPresentableName)); - oOOFlavor.DataType = flavorMap[i].DataType; + oOOFlavor.DataType = flavorMap[i].DataTypeOUString ? getCppuType( (OUString*)0 ) : getCppuType((Sequence<sal_Int8>*)0); return oOOFlavor; } } // for diff --git a/vcl/aqua/source/dtrans/OSXTransferable.cxx b/vcl/aqua/source/dtrans/OSXTransferable.cxx index ec393b0d54cc..0f6c57d06ef7 100644 --- a/vcl/aqua/source/dtrans/OSXTransferable.cxx +++ b/vcl/aqua/source/dtrans/OSXTransferable.cxx @@ -34,16 +34,13 @@ using namespace com::sun::star::container; using ::rtl::OUString; -const Type CPPUTYPE_SEQINT8 = getCppuType((Sequence<sal_Int8>*)0); -const Type CPPUTYPE_OUSTRING = getCppuType((OUString*)0); - namespace // private { bool isValidFlavor( const DataFlavor& aFlavor ) { size_t len = aFlavor.MimeType.getLength(); Type dtype = aFlavor.DataType; - return ((len > 0) && ((dtype == CPPUTYPE_SEQINT8) || (dtype == CPPUTYPE_OUSTRING))); + return ((len > 0) && ((dtype == getCppuType((Sequence<sal_Int8>*)0)) || (dtype == getCppuType((OUString*)0)))); } } // namespace private @@ -106,7 +103,7 @@ Any SAL_CALL OSXTransferable::getTransferData( const DataFlavor& aFlavor ) bool OSXTransferable::isUnicodeText(const DataFlavor& flavor) { - return (flavor.DataType == CPPUTYPE_OUSTRING); + return (flavor.DataType == getCppuType((OUString*)0)); } diff --git a/vcl/inc/vcl/vclmain.hxx b/vcl/inc/vcl/vclmain.hxx new file mode 100644 index 000000000000..1b60cfba42ce --- /dev/null +++ b/vcl/inc/vcl/vclmain.hxx @@ -0,0 +1,27 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef INCLUDED_VCL_VCLMAIN_HXX +#define INCLUDED_VCL_VCLMAIN_HXX + +#include "sal/config.h" + +namespace vclmain { + +// Function called from vclmain's implementation of main, needs to be +// implemented by the application and needs to instantiate a (static, derived) +// instance of Application (where the Application constructor takes care to link +// that instance to ImplSVData.mpApp): +void createApplication(); + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/ios/source/dtrans/iOSTransferable.cxx b/vcl/ios/source/dtrans/iOSTransferable.cxx index 603b6b949f0d..1f335403d1ff 100644 --- a/vcl/ios/source/dtrans/iOSTransferable.cxx +++ b/vcl/ios/source/dtrans/iOSTransferable.cxx @@ -32,16 +32,13 @@ using namespace com::sun::star::container; using ::rtl::OUString; -const Type CPPUTYPE_SEQINT8 = getCppuType((Sequence<sal_Int8>*)0); -const Type CPPUTYPE_OUSTRING = getCppuType((OUString*)0); - namespace // private { bool isValidFlavor( const DataFlavor& aFlavor ) { size_t len = aFlavor.MimeType.getLength(); Type dtype = aFlavor.DataType; - return ((len > 0) && ((dtype == CPPUTYPE_SEQINT8) || (dtype == CPPUTYPE_OUSTRING))); + return ((len > 0) && ((dtype == getCppuType((Sequence<sal_Int8>*)0)) || (dtype == getCppuType((OUString*)0)))); } } // namespace private @@ -82,7 +79,7 @@ Any SAL_CALL iOSTransferable::getTransferData( const DataFlavor& aFlavor ) bool iOSTransferable::isUnicodeText(const DataFlavor& flavor) { - return (flavor.DataType == CPPUTYPE_OUSTRING); + return (flavor.DataType == getCppuType((OUString*)0)); } diff --git a/vcl/source/salmain/salmain.cxx b/vcl/source/salmain/salmain.cxx index 0718260e4e42..13cd13fe4f99 100644 --- a/vcl/source/salmain/salmain.cxx +++ b/vcl/source/salmain/salmain.cxx @@ -23,11 +23,13 @@ #include "sal/main.h" #include "tools/extendapplicationenvironment.hxx" +#include "vcl/vclmain.hxx" #include "salinst.hxx" SAL_IMPLEMENT_MAIN() { tools::extendApplicationEnvironment(); + vclmain::createApplication(); return SVMain(); } diff --git a/vcl/source/uipreviewer/previewer.cxx b/vcl/source/uipreviewer/previewer.cxx index 7abb9def5c3b..939c55342744 100644 --- a/vcl/source/uipreviewer/previewer.cxx +++ b/vcl/source/uipreviewer/previewer.cxx @@ -18,6 +18,7 @@ #include <vcl/dialog.hxx> #include <vcl/help.hxx> #include <vcl/svapp.hxx> +#include <vcl/vclmain.hxx> class UIPreviewApp : public Application { @@ -88,6 +89,9 @@ int UIPreviewApp::Main() return EXIT_SUCCESS; } -UIPreviewApp aApp; +void vclmain::createApplication() +{ + static UIPreviewApp aApp; +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |