[Libreoffice-commits] .: extensions/Library_pl.mk extensions/source

Matus Kukan mkukan at kemper.freedesktop.org
Mon Jan 9 03:43:43 PST 2012


 extensions/Library_pl.mk                 |    4 
 extensions/source/plugin/aqua/macmgr.cxx |  654 -------------------------------
 extensions/source/plugin/aqua/macmgr.mm  |  654 +++++++++++++++++++++++++++++++
 3 files changed, 655 insertions(+), 657 deletions(-)

New commits:
commit 29f897054d472746ce0cf59a39142ec5ec3114c1
Author: Matúš Kukan <matus.kukan at gmail.com>
Date:   Mon Jan 9 12:41:51 2012 +0100

    extensions/Library_pl: move macmgr.cxx -> macmgr.mm

diff --git a/extensions/Library_pl.mk b/extensions/Library_pl.mk
index cf74ce8..b6a3700 100644
--- a/extensions/Library_pl.mk
+++ b/extensions/Library_pl.mk
@@ -93,10 +93,8 @@ ifeq ($(GUI),UNX)
 
 ifeq ($(GUIBASE),aqua)
 
-$(eval $(call gb_Library_add_exception_objects,pl,\
-	extensions/source/plugin/aqua/macmgr \
-))
 $(eval $(call gb_Library_add_objcxxobjects,pl,\
+	extensions/source/plugin/aqua/macmgr \
 	extensions/source/plugin/aqua/sysplug \
 ))
 
diff --git a/extensions/source/plugin/aqua/macmgr.cxx b/extensions/source/plugin/aqua/macmgr.cxx
deleted file mode 100644
index 3b69845..0000000
--- a/extensions/source/plugin/aqua/macmgr.cxx
+++ /dev/null
@@ -1,654 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org.  If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include "rtl/ustrbuf.hxx"
-#include "rtl/strbuf.hxx"
-
-#include "plugin/impl.hxx"
-#include "osl/file.h"
-#include "osl/module.hxx"
-
-using namespace std;
-using namespace com::sun::star::uno;
-using namespace com::sun::star::plugin;
-
-using ::rtl::OUString;
-using ::rtl::OString;
-using ::rtl::OUStringBuffer;
-using ::rtl::OStringBuffer;
-using ::rtl::OUStringToOString;
-using ::rtl::OStringToOUString;
-
-namespace plugstringhelper
-{
-
-rtl::OUString getString( CFStringRef i_xString )
-{
-    rtl::OUStringBuffer aBuf;
-    if( i_xString )
-    {
-        CFIndex nChars = CFStringGetLength( i_xString );
-        CFRange aRange = { 0, nChars };
-        aBuf.setLength( nChars );
-        CFStringGetCharacters( i_xString, aRange, static_cast< UniChar* >(const_cast<sal_Unicode*>(aBuf.getStr())) );
-    }
-    return aBuf.makeStringAndClear();
-}
-
-rtl::OUString getString( CFURLRef i_xURL )
-{
-    CFStringRef xString = CFURLGetString( i_xURL );
-    return getString( xString );
-}
-
-CFMutableStringRef createString( const rtl::OUString& i_rString )
-{
-    CFMutableStringRef xString = CFStringCreateMutable( NULL, 0 );
-    if( xString )
-        CFStringAppendCharacters( xString, i_rString.getStr(), i_rString.getLength() );
-    return xString;
-}
-
-CFURLRef createURL( const rtl::OUString& i_rString )
-{
-
-    CFMutableStringRef xMutableString = createString( i_rString );
-    CFURLRef xURL = CFURLCreateWithString( NULL, xMutableString, NULL );
-    CFRelease( xMutableString );
-    return xURL;
-}
-
-rtl::OUString getURLFromPath( const rtl::OUString& i_rPath )
-{
-    CFMutableStringRef xMutableString = createString( i_rPath );
-    CFURLRef xURL = CFURLCreateWithFileSystemPath( NULL, xMutableString, kCFURLPOSIXPathStyle, true );
-    CFRelease( xMutableString );
-    CFStringRef xString = CFURLGetString( xURL );
-    rtl::OUString aRet = getString( xString );
-    CFRelease( xURL );
-    return aRet;
-}
-
-CFURLRef createURLFromPath( const rtl::OUString& i_rPath )
-{
-    CFMutableStringRef xMutableString = createString( i_rPath );
-    CFURLRef xURL = CFURLCreateWithFileSystemPath( NULL, xMutableString, kCFURLPOSIXPathStyle, true );
-    return xURL;
-}
-
-rtl::OUString CFURLtoOSLURL( CFURLRef i_xURL )
-{
-    // make URL absolute
-    CFURLRef xAbsURL = CFURLCopyAbsoluteURL( i_xURL );
-    // copy system path
-    CFStringRef xSysPath = CFURLCopyFileSystemPath( xAbsURL ? xAbsURL : i_xURL, kCFURLPOSIXPathStyle );
-    if( xAbsURL )
-        CFRelease( xAbsURL );
-    rtl::OUString aSysPath( getString( xSysPath ) );
-    CFRelease( xSysPath );
-    rtl::OUString aFileURL;
-    osl_getFileURLFromSystemPath( aSysPath.pData, &aFileURL.pData );
-    return aFileURL;
-}
-
-}
-
-using namespace plugstringhelper;
-
-static int parsePlist( CFBundleRef i_xBundle, const rtl::OUString& i_rBundleURL , list< PluginDescription* >& io_rDescriptions )
-{
-    CFTypeRef xMimeDict = CFBundleGetValueForInfoDictionaryKey( i_xBundle, CFSTR("WebPluginMIMETypes"));
-    int nMimetypes = 0;
-    if( xMimeDict == 0 ||
-        CFGetTypeID(xMimeDict) != CFDictionaryGetTypeID() ||
-        (nMimetypes = CFDictionaryGetCount( static_cast<CFDictionaryRef>(xMimeDict))) <= 0 )
-    {
-        return 0;
-    }
-
-    // prepare an array of key and value refs
-    std::vector< CFTypeRef > aKeys( nMimetypes, CFTypeRef(NULL) );
-    std::vector< CFTypeRef > aValues( nMimetypes, CFTypeRef(NULL) );
-    CFDictionaryGetKeysAndValues(static_cast<CFDictionaryRef>(xMimeDict), &aKeys[0], &aValues[0] );
-
-    int nAdded = 0;
-    for( int i = 0; i < nMimetypes; i++ )
-    {
-        // get the mimetype
-        CFTypeRef xKey = aKeys[i];
-        if( ! xKey || CFGetTypeID(xKey) != CFStringGetTypeID() )
-            continue;
-        rtl::OUString aMimetype = getString( (CFStringRef)xKey );
-
-        // the correspoding value should be a dictionary
-        CFTypeRef xDict = aValues[i];
-        if( ! xDict || CFGetTypeID( xDict ) != CFDictionaryGetTypeID() )
-            continue;
-
-        // get the extension list
-        CFTypeRef xExtArray = CFDictionaryGetValue( (CFDictionaryRef)xDict,  CFSTR("WebPluginExtensions" ) );
-        if( !xExtArray || CFGetTypeID( xExtArray ) != CFArrayGetTypeID() )
-            continue;
-
-        OUStringBuffer aExtBuf;
-        int nExtensions = CFArrayGetCount( (CFArrayRef)xExtArray );
-        for( int n = 0; n < nExtensions; n++ )
-        {
-            CFTypeRef xExt = CFArrayGetValueAtIndex( (CFArrayRef)xExtArray, n );
-            if( xExt && CFGetTypeID( xExt ) == CFStringGetTypeID() )
-            {
-                if( aExtBuf.getLength() > 0 )
-                    aExtBuf.append( sal_Unicode(';') );
-                OUString aExt( getString( (CFStringRef)xExt ) );
-                if( aExt.indexOfAsciiL( "*.", 2 ) != 0 )
-                    aExtBuf.appendAscii( "*." );
-                aExtBuf.append( aExt );
-            }
-        }
-
-        // get the description string
-        CFTypeRef xDescString = CFDictionaryGetValue( (CFDictionaryRef)xDict,  CFSTR("WebPluginTypeDescription" ) );
-        if( !xDescString || CFGetTypeID( xDescString ) != CFStringGetTypeID() )
-            continue;
-        rtl::OUString aDescription = getString( (CFStringRef)xDescString );
-
-        PluginDescription* pNew = new PluginDescription;
-        // set plugin name (path to library)
-        pNew->PluginName    = i_rBundleURL;
-        // set mimetype
-        pNew->Mimetype  = aMimetype;
-        // set extension line
-        pNew->Extension = aExtBuf.makeStringAndClear();
-        // set description
-        pNew->Description= aDescription;
-
-        io_rDescriptions.push_back( pNew );
-        nAdded++;
-
-#if OSL_DEBUG_LEVEL > 1
-        fprintf( stderr,
-                 "Inserting from PList:\n"
-                 "    Mimetype: %s\n"
-                 "    Extension: %s\n"
-                 "    Description: %s\n",
-                 OUStringToOString( pNew->Mimetype, RTL_TEXTENCODING_UTF8 ).getStr(),
-                 OUStringToOString( pNew->Extension, RTL_TEXTENCODING_UTF8 ).getStr(),
-                 OUStringToOString( pNew->Description, RTL_TEXTENCODING_UTF8 ).getStr()
-                 );
-#endif
-
-    }
-
-    return nAdded;
-}
-
-static int parseMimeString( const rtl::OUString& i_rBundleURL , list< PluginDescription* >& io_rDescriptions, const char* i_pMime )
-{
-    if( ! i_pMime )
-        return 0;
-
-    rtl_TextEncoding aEncoding = osl_getThreadTextEncoding();
-
-    OStringBuffer aMIME;
-    aMIME.append( i_pMime );
-
-    if( aMIME.getLength() < 1 )
-        return 0;
-
-    OString aLine = aMIME.makeStringAndClear();
-
-    int nAdded = 0;
-    sal_Int32 nIndex = 0;
-    while( nIndex != -1 )
-    {
-        OString aType = aLine.getToken( 0, ';', nIndex );
-
-        sal_Int32 nTypeIndex = 0;
-        OString aMimetype   = aType.getToken( 0, ':', nTypeIndex );
-        OString aExtLine    = aType.getToken( 0, ':', nTypeIndex );
-        if( nTypeIndex < 0 ) // ensure at least three tokens
-            continue;
-        OString aDesc       = aType.getToken( 0, ':', nTypeIndex );
-
-        // create extension list string
-        sal_Int32 nExtIndex = 0;
-        OStringBuffer aExtension;
-        while( nExtIndex != -1 )
-        {
-            OString aExt = aExtLine.getToken( 0, ',', nExtIndex);
-            if( aExt.indexOf( "*." ) != 0 )
-                aExtension.append( "*." );
-            aExtension.append( aExt );
-            if( nExtIndex != -1 )
-                aExtension.append( ';' );
-        }
-
-        PluginDescription* pNew = new PluginDescription;
-        // set plugin name (path to library)
-        pNew->PluginName    = i_rBundleURL;
-        // set mimetype
-        pNew->Mimetype  = OStringToOUString( aMimetype, aEncoding );
-        // set extension line
-        pNew->Extension = OStringToOUString( aExtension.makeStringAndClear(), aEncoding );
-        // set description
-        pNew->Description= OStringToOUString( aDesc, aEncoding );
-        io_rDescriptions.push_back( pNew );
-        nAdded++;
-
-#if OSL_DEBUG_LEVEL > 1
-        fprintf( stderr,
-                 "Inserting from mime string:\n"
-                 "    Mimetype: %s\n"
-                 "    Extension: %s\n"
-                 "    Description: %s\n",
-                 OUStringToOString( pNew->Mimetype, aEncoding ).getStr(),
-                 OUStringToOString( pNew->Extension, aEncoding ).getStr(),
-                 OUStringToOString( pNew->Description, aEncoding ).getStr()
-                 );
-#endif
-    }
-    return nAdded;
-}
-
-// this is so ugly it you want to tear your eyes out
-static rtl::OUString GetNextPluginStringFromHandle(Handle h, short *index)
-{
-    char* pPascalBytes = (*h + *index);
-    sal_uInt32 nLen = (unsigned char)pPascalBytes[0];
-    rtl::OStringBuffer aBuf( nLen );
-    aBuf.append( pPascalBytes+1, nLen );
-    *index += nLen + 1;
-    return rtl::OStringToOUString( aBuf.makeStringAndClear(), RTL_TEXTENCODING_UTF8 );
-}
-
-static int parseMimeResource( CFBundleRef i_xBundle,
-                              oslModule& i_rMod,
-                              const rtl::OUString& i_rBundleURL,
-                              list< PluginDescription* >& io_rDescriptions )
-{
-    int nAdded = 0;
-    // just to hurt our eyes more there is an alternative mimetype function plus the possibility
-    // of a resource fork. Must be a case of think different.
-    #if __LP64__
-    int
-    #else
-    SInt16
-    #endif
-    xRes = 0;
-    BPSupportedMIMETypes aMIMETypesStrangeStruct = {kBPSupportedMIMETypesStructVers_1, NULL, NULL};
-
-    BP_GetSupportedMIMETypesUPP pBPGetSupp = (BP_GetSupportedMIMETypesUPP)osl_getAsciiFunctionSymbol( i_rMod, "BP_GetSupportedMIMETypes" );
-    if( pBPGetSupp &&
-        noErr == pBPGetSupp( &aMIMETypesStrangeStruct, 0 ) &&
-        aMIMETypesStrangeStruct.typeStrings )
-    {
-        HLock( aMIMETypesStrangeStruct.typeStrings );
-        if( aMIMETypesStrangeStruct.infoStrings )  // it's possible some plugins have infoStrings missing
-            HLock( aMIMETypesStrangeStruct.infoStrings );
-    }
-    else // Try to get data from the resource fork
-    {
-        xRes = CFBundleOpenBundleResourceMap( i_xBundle );
-        if( xRes > 0 )
-        {
-            aMIMETypesStrangeStruct.typeStrings = Get1Resource('STR#', 128);
-            if( aMIMETypesStrangeStruct.typeStrings )
-            {
-                DetachResource( aMIMETypesStrangeStruct.typeStrings );
-                HLock( aMIMETypesStrangeStruct.typeStrings );
-                aMIMETypesStrangeStruct.infoStrings = Get1Resource('STR#', 127);
-                if( aMIMETypesStrangeStruct.infoStrings )
-                {
-                    DetachResource( aMIMETypesStrangeStruct.infoStrings );
-                    HLock( aMIMETypesStrangeStruct.infoStrings );
-                }
-            }
-        }
-    }
-
-    if( aMIMETypesStrangeStruct.typeStrings && aMIMETypesStrangeStruct.infoStrings )
-    {
-        short nVariantCount = (**(short**)aMIMETypesStrangeStruct.typeStrings) / 2;
-        // Fill in the info struct based on the data in the BPSupportedMIMETypes struct
-        // this is an array of pascal string of unknown (!) encoding
-        // whoever thought of this deserves a fair beating
-        short mimeIndex = 2;
-        short descriptionIndex = 2;
-        for( int i = 0; i < nVariantCount; i++ )
-        {
-            rtl::OUString aMimetype = GetNextPluginStringFromHandle( aMIMETypesStrangeStruct.typeStrings, &mimeIndex );
-            rtl::OUString aExtLine = GetNextPluginStringFromHandle( aMIMETypesStrangeStruct.typeStrings, &mimeIndex );
-            rtl::OUString aDescription;
-            if( aMIMETypesStrangeStruct.infoStrings )
-                aDescription = GetNextPluginStringFromHandle( aMIMETypesStrangeStruct.infoStrings, &descriptionIndex );
-
-            // create extension list string
-            sal_Int32 nExtIndex = 0;
-            OUStringBuffer aExtension;
-            while( nExtIndex != -1 )
-            {
-                OUString aExt = aExtLine.getToken( 0, ',', nExtIndex);
-                if( aExt.indexOfAsciiL( "*.", 2 ) != 0 )
-                    aExtension.appendAscii( "*." );
-                aExtension.append( aExt );
-                if( nExtIndex != -1 )
-                    aExtension.append( sal_Unicode(';') );
-            }
-
-            PluginDescription* pNew = new PluginDescription;
-            // set plugin name (path to library)
-            pNew->PluginName    = i_rBundleURL;
-            // set mimetype
-            pNew->Mimetype  = aMimetype;
-            // set extension line
-            pNew->Extension = aExtension.makeStringAndClear();
-            // set description
-            pNew->Description= aDescription;
-            io_rDescriptions.push_back( pNew );
-            nAdded++;
-
-            #if OSL_DEBUG_LEVEL > 1
-            fprintf( stderr,
-                     "Inserting from resource:\n"
-                     "    Mimetype: %s\n"
-                     "    Extension: %s\n"
-                     "    Description: %s\n",
-                     OUStringToOString( pNew->Mimetype, RTL_TEXTENCODING_UTF8 ).getStr(),
-                     OUStringToOString( pNew->Extension, RTL_TEXTENCODING_UTF8 ).getStr(),
-                     OUStringToOString( pNew->Description, RTL_TEXTENCODING_UTF8 ).getStr()
-                     );
-            #endif
-        }
-    }
-
-
-    // clean up
-    if( aMIMETypesStrangeStruct.typeStrings )
-    {
-        HUnlock( aMIMETypesStrangeStruct.typeStrings );
-        DisposeHandle( aMIMETypesStrangeStruct.typeStrings );
-    }
-    if( aMIMETypesStrangeStruct.infoStrings )
-    {
-        HUnlock( aMIMETypesStrangeStruct.infoStrings );
-        DisposeHandle( aMIMETypesStrangeStruct.infoStrings );
-    }
-    if( xRes )
-        CFBundleCloseBundleResourceMap( i_xBundle, xRes );
-
-    return nAdded;
-}
-
-// check some known bad plugins to avoid crashes
-static bool checkBlackList( CFBundleRef i_xBundle )
-{
-    rtl::OUString aBundleName;
-    CFTypeRef bundlename = CFBundleGetValueForInfoDictionaryKey( i_xBundle, CFSTR("CFBundleName"));
-    if( bundlename && CFGetTypeID(bundlename) == CFStringGetTypeID() )
-        aBundleName = getString( static_cast<CFStringRef>(bundlename) );
-
-    rtl::OUString aBundleVersion;
-    CFTypeRef bundleversion = CFBundleGetValueForInfoDictionaryKey( i_xBundle, CFSTR("CFBundleVersion"));
-    if( bundleversion && CFGetTypeID(bundleversion) == CFStringGetTypeID() )
-        aBundleVersion = getString( static_cast<CFStringRef>(bundleversion) );
-
-    bool bReject = false;
-    // #i102735# VLC plugin prior to 1.0 tends to crash
-    if( aBundleName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "VLC Plug-in" ) ) )
-    {
-        sal_Int32 nIndex = 0;
-        rtl::OUString aMajor( aBundleVersion.getToken( 0, '.', nIndex ) );
-        if( aMajor.toInt32() < 1 )
-        {
-            bReject = true;
-        }
-    }
-    // #i103674# Garmin Communicator Plugin crashes
-    else if( aBundleName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Garmin Communicator Plugin" ) ) )
-    {
-        bReject = true;
-    }
-
-    #if OSL_DEBUG_LEVEL > 1
-    if( bReject )
-        fprintf( stderr, "rejecting plugin \"%s\" version %s\n",
-                 rtl::OUStringToOString( aBundleName, RTL_TEXTENCODING_UTF8 ).getStr(),
-                 rtl::OUStringToOString( aBundleVersion, RTL_TEXTENCODING_UTF8 ).getStr()
-                 );
-    #endif
-
-    return bReject;
-}
-
-static int getPluginDescriptions( CFBundleRef i_xBundle , list< PluginDescription* >& io_rDescriptions )
-{
-    int nDescriptions = 0;
-    if( ! i_xBundle )
-        return nDescriptions;
-
-    if( checkBlackList( i_xBundle ) )
-        return 0;
-
-    rtl::OUString aPlugURL;
-    CFURLRef xURL = CFBundleCopyBundleURL( i_xBundle );
-    aPlugURL = getString( xURL );
-    CFRelease( xURL );
-
-    #if OSL_DEBUG_LEVEL > 1
-    rtl::OUString aPlugName, aPlugDescription;
-    CFTypeRef name = CFBundleGetValueForInfoDictionaryKey( i_xBundle, CFSTR("WebPluginName"));
-    if( name && CFGetTypeID(name) == CFStringGetTypeID() )
-      aPlugName = getString( static_cast<CFStringRef>(name) );
-
-    CFTypeRef description = CFBundleGetValueForInfoDictionaryKey( i_xBundle, CFSTR("WebPluginDescription"));
-    if( description && CFGetTypeID(description) == CFStringGetTypeID() )
-        aPlugDescription = getString( static_cast<CFStringRef>(description) );
-
-    fprintf( stderr, "URL: %s\nname: %s\ndescription: %s\n",
-        rtl::OUStringToOString( aPlugURL, RTL_TEXTENCODING_UTF8 ).getStr(),
-        rtl::OUStringToOString( aPlugName, RTL_TEXTENCODING_UTF8 ).getStr(),
-        rtl::OUStringToOString( aPlugDescription, RTL_TEXTENCODING_UTF8 ).getStr()
-        );
-    #endif
-
-
-    // get location of plugin library
-    CFURLRef xLibURL = CFBundleCopyExecutableURL( i_xBundle );
-    if( ! xLibURL )
-        return 0;
-    // get the file system path
-    rtl::OUString aModuleURL( CFURLtoOSLURL( xLibURL ) );
-    CFRelease( xLibURL );
-
-    #if OSL_DEBUG_LEVEL > 1
-    fprintf( stderr, "exec URL = %s\n", rtl::OUStringToOString( aModuleURL, RTL_TEXTENCODING_UTF8 ).getStr() );
-    #endif
-
-    /* TODO: originally the C++ wrapper for oslModule was used here, but that led to
-       mysterious crashes in the event loop (pointing to heap corruption). Why using
-       the C style oslModule should fix this is completely unknown. It may be that
-       we have just hidden the heap corruption a little more.
-    */
-    oslModule aMod = osl_loadModule( aModuleURL.pData, SAL_LOADMODULE_DEFAULT );
-    if( ! aMod )
-        return 0;
-
-    // check for at least the init function of a plugin
-    if( ! osl_getAsciiFunctionSymbol( aMod, "NP_Initialize") &&
-        ! osl_getAsciiFunctionSymbol( aMod, "NP_GetEntryPoints" ) )
-    {
-        return 0;
-    }
-
-    // ask the plist of the bundle for mimetypes
-    nDescriptions = parsePlist( i_xBundle, aPlugURL, io_rDescriptions );
-    if( nDescriptions )
-    {
-        osl_unloadModule( aMod );
-        return nDescriptions;
-    }
-
-    // resolve the symbol that might get us the mimetypes
-    const char* (*pGetMimeDescription)() = (const char*(*)())osl_getAsciiFunctionSymbol( aMod, "_NP_GetMIMEDescription" );
-    if( pGetMimeDescription )
-    {
-        const char* pMime = pGetMimeDescription();
-        if( pMime )
-        {
-            nDescriptions = parseMimeString( aPlugURL, io_rDescriptions, pMime );
-            if( nDescriptions )
-            {
-                osl_unloadModule( aMod );
-                return nDescriptions;
-            }
-        }
-    }
-
-    // and as last resort check the resource of the bundle
-    nDescriptions = parseMimeResource( i_xBundle, aMod, aPlugURL, io_rDescriptions );
-    osl_unloadModule( aMod );
-
-    return nDescriptions;
-}
-
-// Unix specific implementation
-static bool CheckPlugin( const rtl::OUString& rPath, list< PluginDescription* >& rDescriptions )
-{
-#if OSL_DEBUG_LEVEL > 1
-    fprintf( stderr, "Trying path %s ... ", rtl::OUStringToOString( rPath, RTL_TEXTENCODING_UTF8 ).getStr() );
-#endif
-    CFURLRef xURL = createURL( rPath );
-
-    CFArrayRef xBundles = CFBundleCreateBundlesFromDirectory( NULL, xURL, CFSTR("plugin") );
-    if( ! xBundles )
-        return false;
-
-    CFIndex nBundles = CFArrayGetCount( xBundles );
-
-#if OSL_DEBUG_LEVEL > 1
-    fprintf( stderr, "got %d bundles\n", (int)nBundles );
-#endif
-
-    int nDescriptions = 0;
-    for( CFIndex i = 0; i < nBundles; i++ )
-    {
-        CFBundleRef xBundle = (CFBundleRef)CFArrayGetValueAtIndex( xBundles, i );
-        nDescriptions += getPluginDescriptions( xBundle, rDescriptions );
-
-        CFRelease( xBundle );
-    }
-    CFRelease( xBundles );
-
-
-    return nDescriptions > 0;
-}
-
-static rtl::OUString FindFolderURL(  FSVolumeRefNum vRefNum, OSType folderType )
-{
-    rtl::OUString aRet;
-
-    FSRef aFSRef;
-    OSErr err = FSFindFolder( vRefNum, folderType, kDontCreateFolder, &aFSRef );
-    if( err == noErr )
-    {
-        CFURLRef xURL = CFURLCreateFromFSRef( NULL, &aFSRef );
-        aRet = getString( xURL );
-        CFRelease( xURL );
-    }
-
-    return aRet;
-}
-
-Sequence<PluginDescription> XPluginManager_Impl::impl_getPluginDescriptions() throw()
-{
-    static Sequence<PluginDescription> aDescriptions;
-    static sal_Bool bHavePlugins = sal_False;
-    if( ! bHavePlugins )
-    {
-        std::list<PluginDescription*> aPlugins;
-
-        static const char* pNPXPluginPath = getenv( "MOZ_PLUGIN_PATH" );
-
-        // get directories
-        std::list< rtl::OUString > aPaths;
-        if( pNPXPluginPath )
-        {
-            CFMutableStringRef xMutableString = CFStringCreateMutable( NULL, 0 );
-            CFStringAppendCString( xMutableString, pNPXPluginPath, kCFStringEncodingUTF8 );
-            CFURLRef xURL = CFURLCreateWithFileSystemPath( NULL, xMutableString, kCFURLPOSIXPathStyle, true );
-            CFRelease( xMutableString );
-            aPaths.push_back( getString( xURL ) );
-            CFRelease( xURL );
-        }
-
-        rtl::OUString aPath = FindFolderURL( kUserDomain, kInternetPlugInFolderType );
-        if( aPath.getLength() )
-            aPaths.push_back( aPath );
-        aPath = FindFolderURL( kLocalDomain, kInternetPlugInFolderType );
-        if( aPath.getLength() )
-            aPaths.push_back( aPath );
-        aPath = FindFolderURL( kOnAppropriateDisk, kInternetPlugInFolderType );
-        if( aPath.getLength() )
-            aPaths.push_back( aPath );
-
-
-        const Sequence< ::rtl::OUString >& rPaths( PluginManager::getAdditionalSearchPaths() );
-        for( sal_Int32 i = 0; i < rPaths.getLength(); i++ )
-        {
-            aPaths.push_back( getURLFromPath( rPaths.getConstArray()[i] ) );
-        }
-
-        for( std::list< rtl::OUString >::const_iterator it = aPaths.begin(); it != aPaths.end(); ++it )
-        {
-            rtl::OUString aPath( *it );
-#if OSL_DEBUG_LEVEL > 1
-            fprintf( stderr, "check path %s\n", rtl::OUStringToOString( *it, RTL_TEXTENCODING_UTF8 ).getStr() );
-#endif
-            CheckPlugin( aPath, aPlugins );
-        }
-
-
-        // create return value
-        aDescriptions = Sequence<PluginDescription>( aPlugins.size() );
-#if OSL_DEBUG_LEVEL > 1
-        fprintf( stderr, "found %d plugins\n", (int)aPlugins.size() );
-#endif
-        list<PluginDescription*>::iterator iter;
-        sal_Int32 nPlug = 0;
-        for( iter = aPlugins.begin(); iter != aPlugins.end(); ++iter )
-        {
-            aDescriptions.getArray()[ nPlug++ ] = **iter;
-            delete *iter;
-        }
-        aPlugins.clear();
-        bHavePlugins = sal_True;
-    }
-    return aDescriptions;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/plugin/aqua/macmgr.mm b/extensions/source/plugin/aqua/macmgr.mm
new file mode 100644
index 0000000..3b69845
--- /dev/null
+++ b/extensions/source/plugin/aqua/macmgr.mm
@@ -0,0 +1,654 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "rtl/ustrbuf.hxx"
+#include "rtl/strbuf.hxx"
+
+#include "plugin/impl.hxx"
+#include "osl/file.h"
+#include "osl/module.hxx"
+
+using namespace std;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::plugin;
+
+using ::rtl::OUString;
+using ::rtl::OString;
+using ::rtl::OUStringBuffer;
+using ::rtl::OStringBuffer;
+using ::rtl::OUStringToOString;
+using ::rtl::OStringToOUString;
+
+namespace plugstringhelper
+{
+
+rtl::OUString getString( CFStringRef i_xString )
+{
+    rtl::OUStringBuffer aBuf;
+    if( i_xString )
+    {
+        CFIndex nChars = CFStringGetLength( i_xString );
+        CFRange aRange = { 0, nChars };
+        aBuf.setLength( nChars );
+        CFStringGetCharacters( i_xString, aRange, static_cast< UniChar* >(const_cast<sal_Unicode*>(aBuf.getStr())) );
+    }
+    return aBuf.makeStringAndClear();
+}
+
+rtl::OUString getString( CFURLRef i_xURL )
+{
+    CFStringRef xString = CFURLGetString( i_xURL );
+    return getString( xString );
+}
+
+CFMutableStringRef createString( const rtl::OUString& i_rString )
+{
+    CFMutableStringRef xString = CFStringCreateMutable( NULL, 0 );
+    if( xString )
+        CFStringAppendCharacters( xString, i_rString.getStr(), i_rString.getLength() );
+    return xString;
+}
+
+CFURLRef createURL( const rtl::OUString& i_rString )
+{
+
+    CFMutableStringRef xMutableString = createString( i_rString );
+    CFURLRef xURL = CFURLCreateWithString( NULL, xMutableString, NULL );
+    CFRelease( xMutableString );
+    return xURL;
+}
+
+rtl::OUString getURLFromPath( const rtl::OUString& i_rPath )
+{
+    CFMutableStringRef xMutableString = createString( i_rPath );
+    CFURLRef xURL = CFURLCreateWithFileSystemPath( NULL, xMutableString, kCFURLPOSIXPathStyle, true );
+    CFRelease( xMutableString );
+    CFStringRef xString = CFURLGetString( xURL );
+    rtl::OUString aRet = getString( xString );
+    CFRelease( xURL );
+    return aRet;
+}
+
+CFURLRef createURLFromPath( const rtl::OUString& i_rPath )
+{
+    CFMutableStringRef xMutableString = createString( i_rPath );
+    CFURLRef xURL = CFURLCreateWithFileSystemPath( NULL, xMutableString, kCFURLPOSIXPathStyle, true );
+    return xURL;
+}
+
+rtl::OUString CFURLtoOSLURL( CFURLRef i_xURL )
+{
+    // make URL absolute
+    CFURLRef xAbsURL = CFURLCopyAbsoluteURL( i_xURL );
+    // copy system path
+    CFStringRef xSysPath = CFURLCopyFileSystemPath( xAbsURL ? xAbsURL : i_xURL, kCFURLPOSIXPathStyle );
+    if( xAbsURL )
+        CFRelease( xAbsURL );
+    rtl::OUString aSysPath( getString( xSysPath ) );
+    CFRelease( xSysPath );
+    rtl::OUString aFileURL;
+    osl_getFileURLFromSystemPath( aSysPath.pData, &aFileURL.pData );
+    return aFileURL;
+}
+
+}
+
+using namespace plugstringhelper;
+
+static int parsePlist( CFBundleRef i_xBundle, const rtl::OUString& i_rBundleURL , list< PluginDescription* >& io_rDescriptions )
+{
+    CFTypeRef xMimeDict = CFBundleGetValueForInfoDictionaryKey( i_xBundle, CFSTR("WebPluginMIMETypes"));
+    int nMimetypes = 0;
+    if( xMimeDict == 0 ||
+        CFGetTypeID(xMimeDict) != CFDictionaryGetTypeID() ||
+        (nMimetypes = CFDictionaryGetCount( static_cast<CFDictionaryRef>(xMimeDict))) <= 0 )
+    {
+        return 0;
+    }
+
+    // prepare an array of key and value refs
+    std::vector< CFTypeRef > aKeys( nMimetypes, CFTypeRef(NULL) );
+    std::vector< CFTypeRef > aValues( nMimetypes, CFTypeRef(NULL) );
+    CFDictionaryGetKeysAndValues(static_cast<CFDictionaryRef>(xMimeDict), &aKeys[0], &aValues[0] );
+
+    int nAdded = 0;
+    for( int i = 0; i < nMimetypes; i++ )
+    {
+        // get the mimetype
+        CFTypeRef xKey = aKeys[i];
+        if( ! xKey || CFGetTypeID(xKey) != CFStringGetTypeID() )
+            continue;
+        rtl::OUString aMimetype = getString( (CFStringRef)xKey );
+
+        // the correspoding value should be a dictionary
+        CFTypeRef xDict = aValues[i];
+        if( ! xDict || CFGetTypeID( xDict ) != CFDictionaryGetTypeID() )
+            continue;
+
+        // get the extension list
+        CFTypeRef xExtArray = CFDictionaryGetValue( (CFDictionaryRef)xDict,  CFSTR("WebPluginExtensions" ) );
+        if( !xExtArray || CFGetTypeID( xExtArray ) != CFArrayGetTypeID() )
+            continue;
+
+        OUStringBuffer aExtBuf;
+        int nExtensions = CFArrayGetCount( (CFArrayRef)xExtArray );
+        for( int n = 0; n < nExtensions; n++ )
+        {
+            CFTypeRef xExt = CFArrayGetValueAtIndex( (CFArrayRef)xExtArray, n );
+            if( xExt && CFGetTypeID( xExt ) == CFStringGetTypeID() )
+            {
+                if( aExtBuf.getLength() > 0 )
+                    aExtBuf.append( sal_Unicode(';') );
+                OUString aExt( getString( (CFStringRef)xExt ) );
+                if( aExt.indexOfAsciiL( "*.", 2 ) != 0 )
+                    aExtBuf.appendAscii( "*." );
+                aExtBuf.append( aExt );
+            }
+        }
+
+        // get the description string
+        CFTypeRef xDescString = CFDictionaryGetValue( (CFDictionaryRef)xDict,  CFSTR("WebPluginTypeDescription" ) );
+        if( !xDescString || CFGetTypeID( xDescString ) != CFStringGetTypeID() )
+            continue;
+        rtl::OUString aDescription = getString( (CFStringRef)xDescString );
+
+        PluginDescription* pNew = new PluginDescription;
+        // set plugin name (path to library)
+        pNew->PluginName    = i_rBundleURL;
+        // set mimetype
+        pNew->Mimetype  = aMimetype;
+        // set extension line
+        pNew->Extension = aExtBuf.makeStringAndClear();
+        // set description
+        pNew->Description= aDescription;
+
+        io_rDescriptions.push_back( pNew );
+        nAdded++;
+
+#if OSL_DEBUG_LEVEL > 1
+        fprintf( stderr,
+                 "Inserting from PList:\n"
+                 "    Mimetype: %s\n"
+                 "    Extension: %s\n"
+                 "    Description: %s\n",
+                 OUStringToOString( pNew->Mimetype, RTL_TEXTENCODING_UTF8 ).getStr(),
+                 OUStringToOString( pNew->Extension, RTL_TEXTENCODING_UTF8 ).getStr(),
+                 OUStringToOString( pNew->Description, RTL_TEXTENCODING_UTF8 ).getStr()
+                 );
+#endif
+
+    }
+
+    return nAdded;
+}
+
+static int parseMimeString( const rtl::OUString& i_rBundleURL , list< PluginDescription* >& io_rDescriptions, const char* i_pMime )
+{
+    if( ! i_pMime )
+        return 0;
+
+    rtl_TextEncoding aEncoding = osl_getThreadTextEncoding();
+
+    OStringBuffer aMIME;
+    aMIME.append( i_pMime );
+
+    if( aMIME.getLength() < 1 )
+        return 0;
+
+    OString aLine = aMIME.makeStringAndClear();
+
+    int nAdded = 0;
+    sal_Int32 nIndex = 0;
+    while( nIndex != -1 )
+    {
+        OString aType = aLine.getToken( 0, ';', nIndex );
+
+        sal_Int32 nTypeIndex = 0;
+        OString aMimetype   = aType.getToken( 0, ':', nTypeIndex );
+        OString aExtLine    = aType.getToken( 0, ':', nTypeIndex );
+        if( nTypeIndex < 0 ) // ensure at least three tokens
+            continue;
+        OString aDesc       = aType.getToken( 0, ':', nTypeIndex );
+
+        // create extension list string
+        sal_Int32 nExtIndex = 0;
+        OStringBuffer aExtension;
+        while( nExtIndex != -1 )
+        {
+            OString aExt = aExtLine.getToken( 0, ',', nExtIndex);
+            if( aExt.indexOf( "*." ) != 0 )
+                aExtension.append( "*." );
+            aExtension.append( aExt );
+            if( nExtIndex != -1 )
+                aExtension.append( ';' );
+        }
+
+        PluginDescription* pNew = new PluginDescription;
+        // set plugin name (path to library)
+        pNew->PluginName    = i_rBundleURL;
+        // set mimetype
+        pNew->Mimetype  = OStringToOUString( aMimetype, aEncoding );
+        // set extension line
+        pNew->Extension = OStringToOUString( aExtension.makeStringAndClear(), aEncoding );
+        // set description
+        pNew->Description= OStringToOUString( aDesc, aEncoding );
+        io_rDescriptions.push_back( pNew );
+        nAdded++;
+
+#if OSL_DEBUG_LEVEL > 1
+        fprintf( stderr,
+                 "Inserting from mime string:\n"
+                 "    Mimetype: %s\n"
+                 "    Extension: %s\n"
+                 "    Description: %s\n",
+                 OUStringToOString( pNew->Mimetype, aEncoding ).getStr(),
+                 OUStringToOString( pNew->Extension, aEncoding ).getStr(),
+                 OUStringToOString( pNew->Description, aEncoding ).getStr()
+                 );
+#endif
+    }
+    return nAdded;
+}
+
+// this is so ugly it you want to tear your eyes out
+static rtl::OUString GetNextPluginStringFromHandle(Handle h, short *index)
+{
+    char* pPascalBytes = (*h + *index);
+    sal_uInt32 nLen = (unsigned char)pPascalBytes[0];
+    rtl::OStringBuffer aBuf( nLen );
+    aBuf.append( pPascalBytes+1, nLen );
+    *index += nLen + 1;
+    return rtl::OStringToOUString( aBuf.makeStringAndClear(), RTL_TEXTENCODING_UTF8 );
+}
+
+static int parseMimeResource( CFBundleRef i_xBundle,
+                              oslModule& i_rMod,
+                              const rtl::OUString& i_rBundleURL,
+                              list< PluginDescription* >& io_rDescriptions )
+{
+    int nAdded = 0;
+    // just to hurt our eyes more there is an alternative mimetype function plus the possibility
+    // of a resource fork. Must be a case of think different.
+    #if __LP64__
+    int
+    #else
+    SInt16
+    #endif
+    xRes = 0;
+    BPSupportedMIMETypes aMIMETypesStrangeStruct = {kBPSupportedMIMETypesStructVers_1, NULL, NULL};
+
+    BP_GetSupportedMIMETypesUPP pBPGetSupp = (BP_GetSupportedMIMETypesUPP)osl_getAsciiFunctionSymbol( i_rMod, "BP_GetSupportedMIMETypes" );
+    if( pBPGetSupp &&
+        noErr == pBPGetSupp( &aMIMETypesStrangeStruct, 0 ) &&
+        aMIMETypesStrangeStruct.typeStrings )
+    {
+        HLock( aMIMETypesStrangeStruct.typeStrings );
+        if( aMIMETypesStrangeStruct.infoStrings )  // it's possible some plugins have infoStrings missing
+            HLock( aMIMETypesStrangeStruct.infoStrings );
+    }
+    else // Try to get data from the resource fork
+    {
+        xRes = CFBundleOpenBundleResourceMap( i_xBundle );
+        if( xRes > 0 )
+        {
+            aMIMETypesStrangeStruct.typeStrings = Get1Resource('STR#', 128);
+            if( aMIMETypesStrangeStruct.typeStrings )
+            {
+                DetachResource( aMIMETypesStrangeStruct.typeStrings );
+                HLock( aMIMETypesStrangeStruct.typeStrings );
+                aMIMETypesStrangeStruct.infoStrings = Get1Resource('STR#', 127);
+                if( aMIMETypesStrangeStruct.infoStrings )
+                {
+                    DetachResource( aMIMETypesStrangeStruct.infoStrings );
+                    HLock( aMIMETypesStrangeStruct.infoStrings );
+                }
+            }
+        }
+    }
+
+    if( aMIMETypesStrangeStruct.typeStrings && aMIMETypesStrangeStruct.infoStrings )
+    {
+        short nVariantCount = (**(short**)aMIMETypesStrangeStruct.typeStrings) / 2;
+        // Fill in the info struct based on the data in the BPSupportedMIMETypes struct
+        // this is an array of pascal string of unknown (!) encoding
+        // whoever thought of this deserves a fair beating
+        short mimeIndex = 2;
+        short descriptionIndex = 2;
+        for( int i = 0; i < nVariantCount; i++ )
+        {
+            rtl::OUString aMimetype = GetNextPluginStringFromHandle( aMIMETypesStrangeStruct.typeStrings, &mimeIndex );
+            rtl::OUString aExtLine = GetNextPluginStringFromHandle( aMIMETypesStrangeStruct.typeStrings, &mimeIndex );
+            rtl::OUString aDescription;
+            if( aMIMETypesStrangeStruct.infoStrings )
+                aDescription = GetNextPluginStringFromHandle( aMIMETypesStrangeStruct.infoStrings, &descriptionIndex );
+
+            // create extension list string
+            sal_Int32 nExtIndex = 0;
+            OUStringBuffer aExtension;
+            while( nExtIndex != -1 )
+            {
+                OUString aExt = aExtLine.getToken( 0, ',', nExtIndex);
+                if( aExt.indexOfAsciiL( "*.", 2 ) != 0 )
+                    aExtension.appendAscii( "*." );
+                aExtension.append( aExt );
+                if( nExtIndex != -1 )
+                    aExtension.append( sal_Unicode(';') );
+            }
+
+            PluginDescription* pNew = new PluginDescription;
+            // set plugin name (path to library)
+            pNew->PluginName    = i_rBundleURL;
+            // set mimetype
+            pNew->Mimetype  = aMimetype;
+            // set extension line
+            pNew->Extension = aExtension.makeStringAndClear();
+            // set description
+            pNew->Description= aDescription;
+            io_rDescriptions.push_back( pNew );
+            nAdded++;
+
+            #if OSL_DEBUG_LEVEL > 1
+            fprintf( stderr,
+                     "Inserting from resource:\n"
+                     "    Mimetype: %s\n"
+                     "    Extension: %s\n"
+                     "    Description: %s\n",
+                     OUStringToOString( pNew->Mimetype, RTL_TEXTENCODING_UTF8 ).getStr(),
+                     OUStringToOString( pNew->Extension, RTL_TEXTENCODING_UTF8 ).getStr(),
+                     OUStringToOString( pNew->Description, RTL_TEXTENCODING_UTF8 ).getStr()
+                     );
+            #endif
+        }
+    }
+
+
+    // clean up
+    if( aMIMETypesStrangeStruct.typeStrings )
+    {
+        HUnlock( aMIMETypesStrangeStruct.typeStrings );
+        DisposeHandle( aMIMETypesStrangeStruct.typeStrings );
+    }
+    if( aMIMETypesStrangeStruct.infoStrings )
+    {
+        HUnlock( aMIMETypesStrangeStruct.infoStrings );
+        DisposeHandle( aMIMETypesStrangeStruct.infoStrings );
+    }
+    if( xRes )
+        CFBundleCloseBundleResourceMap( i_xBundle, xRes );
+
+    return nAdded;
+}
+
+// check some known bad plugins to avoid crashes
+static bool checkBlackList( CFBundleRef i_xBundle )
+{
+    rtl::OUString aBundleName;
+    CFTypeRef bundlename = CFBundleGetValueForInfoDictionaryKey( i_xBundle, CFSTR("CFBundleName"));
+    if( bundlename && CFGetTypeID(bundlename) == CFStringGetTypeID() )
+        aBundleName = getString( static_cast<CFStringRef>(bundlename) );
+
+    rtl::OUString aBundleVersion;
+    CFTypeRef bundleversion = CFBundleGetValueForInfoDictionaryKey( i_xBundle, CFSTR("CFBundleVersion"));
+    if( bundleversion && CFGetTypeID(bundleversion) == CFStringGetTypeID() )
+        aBundleVersion = getString( static_cast<CFStringRef>(bundleversion) );
+
+    bool bReject = false;
+    // #i102735# VLC plugin prior to 1.0 tends to crash
+    if( aBundleName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "VLC Plug-in" ) ) )
+    {
+        sal_Int32 nIndex = 0;
+        rtl::OUString aMajor( aBundleVersion.getToken( 0, '.', nIndex ) );
+        if( aMajor.toInt32() < 1 )
+        {
+            bReject = true;
+        }
+    }
+    // #i103674# Garmin Communicator Plugin crashes
+    else if( aBundleName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Garmin Communicator Plugin" ) ) )
+    {
+        bReject = true;
+    }
+
+    #if OSL_DEBUG_LEVEL > 1
+    if( bReject )
+        fprintf( stderr, "rejecting plugin \"%s\" version %s\n",
+                 rtl::OUStringToOString( aBundleName, RTL_TEXTENCODING_UTF8 ).getStr(),
+                 rtl::OUStringToOString( aBundleVersion, RTL_TEXTENCODING_UTF8 ).getStr()
+                 );
+    #endif
+
+    return bReject;
+}
+
+static int getPluginDescriptions( CFBundleRef i_xBundle , list< PluginDescription* >& io_rDescriptions )
+{
+    int nDescriptions = 0;
+    if( ! i_xBundle )
+        return nDescriptions;
+
+    if( checkBlackList( i_xBundle ) )
+        return 0;
+
+    rtl::OUString aPlugURL;
+    CFURLRef xURL = CFBundleCopyBundleURL( i_xBundle );
+    aPlugURL = getString( xURL );
+    CFRelease( xURL );
+
+    #if OSL_DEBUG_LEVEL > 1
+    rtl::OUString aPlugName, aPlugDescription;
+    CFTypeRef name = CFBundleGetValueForInfoDictionaryKey( i_xBundle, CFSTR("WebPluginName"));
+    if( name && CFGetTypeID(name) == CFStringGetTypeID() )
+      aPlugName = getString( static_cast<CFStringRef>(name) );
+
+    CFTypeRef description = CFBundleGetValueForInfoDictionaryKey( i_xBundle, CFSTR("WebPluginDescription"));
+    if( description && CFGetTypeID(description) == CFStringGetTypeID() )
+        aPlugDescription = getString( static_cast<CFStringRef>(description) );
+
+    fprintf( stderr, "URL: %s\nname: %s\ndescription: %s\n",
+        rtl::OUStringToOString( aPlugURL, RTL_TEXTENCODING_UTF8 ).getStr(),
+        rtl::OUStringToOString( aPlugName, RTL_TEXTENCODING_UTF8 ).getStr(),
+        rtl::OUStringToOString( aPlugDescription, RTL_TEXTENCODING_UTF8 ).getStr()
+        );
+    #endif
+
+
+    // get location of plugin library
+    CFURLRef xLibURL = CFBundleCopyExecutableURL( i_xBundle );
+    if( ! xLibURL )
+        return 0;
+    // get the file system path
+    rtl::OUString aModuleURL( CFURLtoOSLURL( xLibURL ) );
+    CFRelease( xLibURL );
+
+    #if OSL_DEBUG_LEVEL > 1
+    fprintf( stderr, "exec URL = %s\n", rtl::OUStringToOString( aModuleURL, RTL_TEXTENCODING_UTF8 ).getStr() );
+    #endif
+
+    /* TODO: originally the C++ wrapper for oslModule was used here, but that led to
+       mysterious crashes in the event loop (pointing to heap corruption). Why using
+       the C style oslModule should fix this is completely unknown. It may be that
+       we have just hidden the heap corruption a little more.
+    */
+    oslModule aMod = osl_loadModule( aModuleURL.pData, SAL_LOADMODULE_DEFAULT );
+    if( ! aMod )
+        return 0;
+
+    // check for at least the init function of a plugin
+    if( ! osl_getAsciiFunctionSymbol( aMod, "NP_Initialize") &&
+        ! osl_getAsciiFunctionSymbol( aMod, "NP_GetEntryPoints" ) )
+    {
+        return 0;
+    }
+
+    // ask the plist of the bundle for mimetypes
+    nDescriptions = parsePlist( i_xBundle, aPlugURL, io_rDescriptions );
+    if( nDescriptions )
+    {
+        osl_unloadModule( aMod );
+        return nDescriptions;
+    }
+
+    // resolve the symbol that might get us the mimetypes
+    const char* (*pGetMimeDescription)() = (const char*(*)())osl_getAsciiFunctionSymbol( aMod, "_NP_GetMIMEDescription" );
+    if( pGetMimeDescription )
+    {
+        const char* pMime = pGetMimeDescription();
+        if( pMime )
+        {
+            nDescriptions = parseMimeString( aPlugURL, io_rDescriptions, pMime );
+            if( nDescriptions )
+            {
+                osl_unloadModule( aMod );
+                return nDescriptions;
+            }
+        }
+    }
+
+    // and as last resort check the resource of the bundle
+    nDescriptions = parseMimeResource( i_xBundle, aMod, aPlugURL, io_rDescriptions );
+    osl_unloadModule( aMod );
+
+    return nDescriptions;
+}
+
+// Unix specific implementation
+static bool CheckPlugin( const rtl::OUString& rPath, list< PluginDescription* >& rDescriptions )
+{
+#if OSL_DEBUG_LEVEL > 1
+    fprintf( stderr, "Trying path %s ... ", rtl::OUStringToOString( rPath, RTL_TEXTENCODING_UTF8 ).getStr() );
+#endif
+    CFURLRef xURL = createURL( rPath );
+
+    CFArrayRef xBundles = CFBundleCreateBundlesFromDirectory( NULL, xURL, CFSTR("plugin") );
+    if( ! xBundles )
+        return false;
+
+    CFIndex nBundles = CFArrayGetCount( xBundles );
+
+#if OSL_DEBUG_LEVEL > 1
+    fprintf( stderr, "got %d bundles\n", (int)nBundles );
+#endif
+
+    int nDescriptions = 0;
+    for( CFIndex i = 0; i < nBundles; i++ )
+    {
+        CFBundleRef xBundle = (CFBundleRef)CFArrayGetValueAtIndex( xBundles, i );
+        nDescriptions += getPluginDescriptions( xBundle, rDescriptions );
+
+        CFRelease( xBundle );
+    }
+    CFRelease( xBundles );
+
+
+    return nDescriptions > 0;
+}
+
+static rtl::OUString FindFolderURL(  FSVolumeRefNum vRefNum, OSType folderType )
+{
+    rtl::OUString aRet;
+
+    FSRef aFSRef;
+    OSErr err = FSFindFolder( vRefNum, folderType, kDontCreateFolder, &aFSRef );
+    if( err == noErr )
+    {
+        CFURLRef xURL = CFURLCreateFromFSRef( NULL, &aFSRef );
+        aRet = getString( xURL );
+        CFRelease( xURL );
+    }
+
+    return aRet;
+}
+
+Sequence<PluginDescription> XPluginManager_Impl::impl_getPluginDescriptions() throw()
+{
+    static Sequence<PluginDescription> aDescriptions;
+    static sal_Bool bHavePlugins = sal_False;
+    if( ! bHavePlugins )
+    {
+        std::list<PluginDescription*> aPlugins;
+
+        static const char* pNPXPluginPath = getenv( "MOZ_PLUGIN_PATH" );
+
+        // get directories
+        std::list< rtl::OUString > aPaths;
+        if( pNPXPluginPath )
+        {
+            CFMutableStringRef xMutableString = CFStringCreateMutable( NULL, 0 );
+            CFStringAppendCString( xMutableString, pNPXPluginPath, kCFStringEncodingUTF8 );
+            CFURLRef xURL = CFURLCreateWithFileSystemPath( NULL, xMutableString, kCFURLPOSIXPathStyle, true );
+            CFRelease( xMutableString );
+            aPaths.push_back( getString( xURL ) );
+            CFRelease( xURL );
+        }
+
+        rtl::OUString aPath = FindFolderURL( kUserDomain, kInternetPlugInFolderType );
+        if( aPath.getLength() )
+            aPaths.push_back( aPath );
+        aPath = FindFolderURL( kLocalDomain, kInternetPlugInFolderType );
+        if( aPath.getLength() )
+            aPaths.push_back( aPath );
+        aPath = FindFolderURL( kOnAppropriateDisk, kInternetPlugInFolderType );
+        if( aPath.getLength() )
+            aPaths.push_back( aPath );
+
+
+        const Sequence< ::rtl::OUString >& rPaths( PluginManager::getAdditionalSearchPaths() );
+        for( sal_Int32 i = 0; i < rPaths.getLength(); i++ )
+        {
+            aPaths.push_back( getURLFromPath( rPaths.getConstArray()[i] ) );
+        }
+
+        for( std::list< rtl::OUString >::const_iterator it = aPaths.begin(); it != aPaths.end(); ++it )
+        {
+            rtl::OUString aPath( *it );
+#if OSL_DEBUG_LEVEL > 1
+            fprintf( stderr, "check path %s\n", rtl::OUStringToOString( *it, RTL_TEXTENCODING_UTF8 ).getStr() );
+#endif
+            CheckPlugin( aPath, aPlugins );
+        }
+
+
+        // create return value
+        aDescriptions = Sequence<PluginDescription>( aPlugins.size() );
+#if OSL_DEBUG_LEVEL > 1
+        fprintf( stderr, "found %d plugins\n", (int)aPlugins.size() );
+#endif
+        list<PluginDescription*>::iterator iter;
+        sal_Int32 nPlug = 0;
+        for( iter = aPlugins.begin(); iter != aPlugins.end(); ++iter )
+        {
+            aDescriptions.getArray()[ nPlug++ ] = **iter;
+            delete *iter;
+        }
+        aPlugins.clear();
+        bHavePlugins = sal_True;
+    }
+    return aDescriptions;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list