[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-5.0' - desktop/Library_sofficeapp.mk desktop/source

Henry Castro hcastro at collabora.com
Thu Aug 20 12:10:47 PDT 2015


 desktop/Library_sofficeapp.mk |    1 
 desktop/source/lib/init.cxx   |  137 +++++++++++++++++++++++++++++++++++-------
 2 files changed, 117 insertions(+), 21 deletions(-)

New commits:
commit 91dc9f3bde55627ca06993b710048fda9dacbf44
Author: Henry Castro <hcastro at collabora.com>
Date:   Thu Aug 20 15:09:46 2015 -0400

    lok: load component library
    
    Change-Id: I7fd048e9d3ccd1679bf4a3593be3efd61b5e3c3f

diff --git a/desktop/Library_sofficeapp.mk b/desktop/Library_sofficeapp.mk
index 467fecc..4093c3a 100644
--- a/desktop/Library_sofficeapp.mk
+++ b/desktop/Library_sofficeapp.mk
@@ -58,6 +58,7 @@ $(eval $(call gb_Library_use_libraries,sofficeapp,\
     ucbhelper \
     utl \
     vcl \
+    xmlreader \
 	$(gb_UWINAPI) \
 ))
 
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index a435b7ef..3bc5824 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -57,6 +57,7 @@
 #include <unotools/mediadescriptor.hxx>
 #include <osl/module.hxx>
 #include <comphelper/sequence.hxx>
+#include <xmlreader/xmlreader.hxx>
 
 #include <app.hxx>
 
@@ -966,31 +967,125 @@ static void lo_status_indicator_callback(void *data, comphelper::LibreOfficeKit:
     }
 }
 
+static void loadSharedLibrary(const OUString & aUriRdb)
+{
+    int nsId;
+    int nUcNsId;
+
+    OUString sAttrUri;
+    OUString sAttrLoader;
+
+    xmlreader::Span aName;
+    xmlreader::XmlReader::Result aItem = xmlreader::XmlReader::RESULT_BEGIN;
+
+    xmlreader::XmlReader aRdbReader(aUriRdb);
+    nUcNsId = aRdbReader.registerNamespaceIri(xmlreader::Span(RTL_CONSTASCII_STRINGPARAM("http://openoffice.org/2010/uno-components")));
+
+    while( aItem != xmlreader::XmlReader::RESULT_DONE )
+    {
+        aItem = aRdbReader.nextItem(xmlreader::XmlReader::TEXT_NONE, &aName, &nsId );
+        if (nsId == nUcNsId &&
+            aName.equals(RTL_CONSTASCII_STRINGPARAM("component")))
+        {
+            sAttrLoader = OUString();
+            sAttrUri = OUString();
+
+            while (aRdbReader.nextAttribute(&nsId, &aName))
+            {
+                if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
+                    aName.equals(RTL_CONSTASCII_STRINGPARAM("loader")))
+                    sAttrLoader = aRdbReader.getAttributeValue(false).convertFromUtf8();
+                else if (nsId == xmlreader::XmlReader::NAMESPACE_NONE &&
+                    aName.equals(RTL_CONSTASCII_STRINGPARAM("uri")))
+                    sAttrUri = aRdbReader.getAttributeValue(false).convertFromUtf8();
+            }
+
+            try
+            {
+                sAttrUri = cppu::bootstrap_expandUri(sAttrUri);
+            }
+            catch(css::lang::IllegalArgumentException)
+            {
+                fprintf(stderr, "Cannot expand URI '%s'\n",
+                    OUStringToOString(sAttrUri, RTL_TEXTENCODING_UTF8).getStr());
+            }
+
+            if (sAttrLoader == "com.sun.star.loader.SharedLibrary")
+            {
+                oslModule aModule = osl_loadModule( sAttrUri.pData, SAL_LOADMODULE_NOW | SAL_LOADMODULE_GLOBAL );
+                SAL_INFO("lok", "loaded component library " << sAttrUri << ( aModule ? " ok" : " no"));
+
+                // leak aModule
+                // osl_unloadModule(aModule);
+                aModule = 0;
+            }
+        }
+    }
+}
+
 /// pre-load all C++ component factories and leak references to them.
-static void forceLoadAllNativeComponents()
+static void forceLoadAllNativeComponents(const OUString & aAppURL)
 {
-    // FIXME: we need to inject RTLD_NOW into here, either by a
-    // putenv("LD_BIND_NOW=1") in parent process or ... (?).
+    sal_Int32 nIndex = 0;
 
-    try {
-        uno::Reference<container::XContentEnumerationAccess> xEnumAcc(
-            xContext->getServiceManager(), css::uno::UNO_QUERY_THROW);
-        uno::Reference<container::XHierarchicalNameAccess> xTypeMgr(
-            xContext->getValueByName(
-                "/singletons/com.sun.star.reflection.theTypeDescriptionManager"),
-            css::uno::UNO_QUERY_THROW);
-        uno::Sequence<OUString> aServiceNames(
-            xContext->getServiceManager()->getAvailableServiceNames());
-
-        for (sal_Int32 i = 0; i != aServiceNames.getLength(); ++i)
+    rtl::Bootstrap bs(aAppURL + "/" + SAL_CONFIGFILE("uno"));
+    if (bs.getHandle() == 0)
+    {
+        fprintf(stderr, "Cannot open uno ini '%s'\n",
+                 OUStringToOString(aAppURL + "/" + SAL_CONFIGFILE("uno"), RTL_TEXTENCODING_UTF8).getStr());
+        return;
+    }
+
+    OUString aRdbFiles;
+    if (!bs.getFrom("UNO_SERVICES", aRdbFiles))
+    {
+        fprintf(stderr, "Cannot obtain UNO_SERVICES from uno ini\n");
+        return;
+    }
+
+    while (nIndex != -1)
+    {
+        OUString aUriRdb(aRdbFiles.getToken(0, ' ', nIndex));
+
+        if (aUriRdb.isEmpty())
+            continue;
+
+        if (aUriRdb[0] == '?')
+            aUriRdb = aUriRdb.copy(1);
+
+        if (aUriRdb.startsWith("<") && aUriRdb.endsWith(">*"))
+        {
+            aUriRdb = aUriRdb.copy(1, aUriRdb.getLength() - 3);
+            osl::Directory aDir(aUriRdb);
+
+            if ( aDir.open() == osl::FileBase::E_None )
+            {
+                while(true)
+                {
+                    osl::DirectoryItem aDirItem;
+
+                    if ( aDir.getNextItem(aDirItem, SAL_MAX_UINT32) != osl::FileBase::E_None)
+                        break;
+
+                    osl::FileStatus stat(osl_FileStatus_Mask_Type |
+                                         osl_FileStatus_Mask_FileName |
+                                         osl_FileStatus_Mask_FileURL);
+
+                    if (aDirItem.getFileStatus(stat) == osl::FileBase::E_None)
+                        loadSharedLibrary(stat.getFileURL());
+                }
+            }
+            else
+            {
+                fprintf(stderr, "Cannot open directory '%s'\n",
+                    OUStringToOString(aUriRdb, RTL_TEXTENCODING_UTF8).getStr());
+            }
+
+        }
+        else
         {
-            css::uno::Reference<css::container::XEnumeration> xServiceImpls(
-                xEnumAcc->createContentEnumeration(aServiceNames[i]),
-                css::uno::UNO_SET_THROW);
-            SAL_INFO("lok", "service " << aServiceNames[i]);
-            // FIXME: need to actually load and link each native DSO.
+            loadSharedLibrary(aUriRdb);
         }
-    } catch (const uno::Exception &) {
     }
 }
 
@@ -1072,7 +1167,7 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath, const char
 
         if (eStage == PRE_INIT)
         {
-            forceLoadAllNativeComponents();
+            forceLoadAllNativeComponents(aAppURL);
             forceLoadFilterXML();
         }
 


More information about the Libreoffice-commits mailing list