tdf#96398 kill remaining NPAPI support for plugins _inside_ LO

- probably out of date
- links against Gtk2 and thus causes a GTk2 dependency in core packages
- the only serious usecase (Flash) is doomed anyway

Change-Id: I7264ab5eb04c2f4b6c31a815e45b9818209e5ae2
Reviewed-on: https://gerrit.libreoffice.org/20658
Reviewed-by: David Ostrovsky <david@ostrovsky.org>
Reviewed-by: Bryan Quigley <gquigs@gmail.com>
Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
This commit is contained in:
Rene Engelhard
2015-12-12 11:36:25 +01:00
committed by Thorsten Behrens
parent 57b1cf5862
commit 4c18af27bf
69 changed files with 0 additions and 17936 deletions

View File

@@ -145,7 +145,6 @@ $(eval $(call gb_Helper_register_executables_for_install,OOO,writer_brand, \
$(eval $(call gb_Helper_register_executables_for_install,OOO,ooo, \
gengal \
$(if $(filter TRUE-TRUE,$(USING_X11)-$(ENABLE_NPAPI_FROM_BROWSER)),pluginapp.bin) \
$(if $(filter WNT,$(OS)),,uri-encode) \
ui-previewer \
$(if $(filter WNT,$(OS)), \
@@ -360,7 +359,6 @@ $(eval $(call gb_Helper_register_libraries_for_install,OOOLIBS,ooo, \
$(call gb_Helper_optional,OPENCL,opencl) \
passwordcontainer \
pcr \
$(if $(ENABLE_NPAPI_FROM_BROWSER),pl) \
pdffilter \
$(call gb_Helper_optional,SCRIPTING,protocolhandler) \
res \

View File

@@ -151,7 +151,6 @@ export ENABLE_LWP=@ENABLE_LWP@
export ENABLE_MACOSX_SANDBOX=@ENABLE_MACOSX_SANDBOX@
export ENABLE_MEDIAWIKI=@ENABLE_MEDIAWIKI@
export ENABLE_MARIADBC=@ENABLE_MARIADBC@
export ENABLE_NPAPI_FROM_BROWSER=@ENABLE_NPAPI_FROM_BROWSER@
export ENABLE_ONLINE_UPDATE=@ENABLE_ONLINE_UPDATE@
export ENABLE_ONLINE_UPDATE_MAR=@ENABLE_ONLINE_UPDATE_MAR@
export ENABLE_EXTENSION_UPDATE=@ENABLE_EXTENSION_UPDATE@
@@ -416,7 +415,6 @@ export NEON_CFLAGS=$(gb_SPACE)@NEON_CFLAGS@
export NEON_LIBS=$(gb_SPACE)@NEON_LIBS@
export NEON_VERSION=@NEON_VERSION@
export NM=@NM@
export NPAPI_HEADERS_CFLAGS=$(gb_SPACE)@NPAPI_HEADERS_CFLAGS@
export NSS_CFLAGS=$(gb_SPACE)@NSS_CFLAGS@
export NSS_LIBS=$(gb_SPACE)@NSS_LIBS@
export NUMBERTEXT_EXTENSION_PACK=@NUMBERTEXT_EXTENSION_PACK@
@@ -561,7 +559,6 @@ export SYSTEM_MWAW=@SYSTEM_MWAW@
export SYSTEM_MYSQL_CPPCONN=@SYSTEM_MYSQL_CPPCONN@
export SYSTEM_MYTHES=@SYSTEM_MYTHES@
export SYSTEM_NEON=@SYSTEM_NEON@
export SYSTEM_NPAPI_HEADERS=@SYSTEM_NPAPI_HEADERS@
export SYSTEM_NSS=@SYSTEM_NSS@
export SYSTEM_ODBC_HEADERS=@SYSTEM_ODBC_HEADERS@
export SYSTEM_ODFGEN=@SYSTEM_ODFGEN@

View File

@@ -1951,13 +1951,6 @@ AC_ARG_WITH(system-liblangtag,
[Use liblangtag library already on system.]),,
[with_system_liblangtag="$with_system_libs"])
AC_ARG_WITH(system-npapi-headers,
AS_HELP_STRING([--with-system-npapi-headers],
[Use NPAPI headers provided by system instead of bundled ones. Used in
extensions/source/plugin (ENABLE_NPAPI_FROM_BROWSER=TRUE)]),,
[with_system_npapi_headers="$with_system_headers"]
)
AC_ARG_WITH(jpeg-turbo,
AS_HELP_STRING([--with-jpeg-turbo],
[Use internal libjpeg-turbo library.]),,
@@ -8952,56 +8945,6 @@ if test $_os = WINNT -a -z "$ENABLE_RELEASE_BUILD" -a "$with_prebuilt_openssl" =
BUILD_TYPE="$BUILD_TYPE PREBUILT_OPENSSL"
fi
dnl ===================================================================
dnl Check for system mozilla headers
dnl ===================================================================
HAVE_NON_CONST_NPP_GETMIMEDESCRIPTION=
AC_MSG_CHECKING([which NPAPI headers to use])
if test "$with_system_npapi_headers" = "yes"; then
AC_MSG_RESULT([external])
SYSTEM_NPAPI_HEADERS=TRUE
# First try npapi-sdk:
PKG_CHECK_MODULES(NPAPI_HEADERS, npapi-sdk, [LOCATED=yes], [LOCATED=no])
# Then go with libxul:
if test "x$LOCATED" != "xyes"; then
PKG_CHECK_MODULES(NPAPI_HEADERS, libxul, [LOCATED=yes], [LOCATED=no])
fi
if test "x$LOCATED" != "xyes"; then
PKG_CHECK_MODULES(NPAPI_HEADERS, mozilla-plugin, [LOCATED=yes], [LOCATED=no])
fi
# if still not found bail out
if test "x$LOCATED" != "xyes"; then
AC_MSG_ERROR([npapi.h header file not found])
fi
AC_LANG_PUSH([C])
save_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS $NPAPI_HEADERS_CFLAGS"
AC_MSG_CHECKING([for NPP_GetMIMEDescription return type])
AC_COMPILE_IFELSE(
[AC_LANG_SOURCE([[
#define XP_UNIX
#include <npapi.h>
const char* NPP_GetMIMEDescription(void) { return "foo"; }
]])],
[AC_MSG_RESULT([const char*])],
[
AC_MSG_RESULT([char*])
HAVE_NON_CONST_NPP_GETMIMEDESCRIPTION=TRUE
])
CFLAGS=$save_CFLAGS
AC_LANG_POP([C])
NPAPI_HEADERS_CFLAGS=$(printf '%s' "$NPAPI_HEADERS_CFLAGS" | sed -e "s/-I/${ISYSTEM?}/g")
else
AC_MSG_RESULT([internal])
dnl ...but will not be built/used unless ENABLE_NPAPI_FROM_BROWSER
SYSTEM_NPAPI_HEADERS=
fi
AC_SUBST(NPAPI_HEADERS_CFLAGS)
AC_SUBST(SYSTEM_NPAPI_HEADERS)
AC_SUBST(HAVE_NON_CONST_NPP_GETMIMEDESCRIPTION)
dnl ===================================================================
dnl Check for system sane
dnl ===================================================================
@@ -9211,23 +9154,6 @@ else
fi
AC_SUBST(ENABLE_HARFBUZZ)
dnl ===================================================================
dnl Check for NPAPI interface to plug browser plugins into LibreOffice documents
dnl ===================================================================
AC_MSG_CHECKING([whether to plug browser plugins into LibreOffice documents])
# Obviously no such thing on iOS or Android. Also not possible when building
# 64-bit OS X code as the plugin code uses QuickTime and Carbon.
if test "$_os" != Android -a "$_os" != iOS -a $_os != Darwin -a \
"$with_x" != "no" -a "$enable_mpl_subset" != yes
then
AC_MSG_RESULT([yes])
ENABLE_NPAPI_FROM_BROWSER=TRUE
else
AC_MSG_RESULT([no])
ENABLE_NPAPI_FROM_BROWSER=
fi
AC_SUBST(ENABLE_NPAPI_FROM_BROWSER)
AC_MSG_CHECKING([whether to use X11])
dnl ***************************************
dnl testing for X libraries and includes...
@@ -9263,10 +9189,6 @@ if test "$USING_X11" = TRUE; then
AC_CHECK_HEADERS(X11/Composite.h,[],[AC_MSG_ERROR([Xt headers not found])],
[#include <X11/Intrinsic.h>])
# ENABLE_NPAPI_FROM_BROWSER requires Xt library
AC_CHECK_LIB([Xt], [XtToolkitInitialize], [:],
[AC_MSG_ERROR(Xt library not found)])
dnl ===================================================================
dnl Check for extension headers
dnl ===================================================================

View File

@@ -1,69 +0,0 @@
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
#
#
# 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/.
#
#
$(eval $(call gb_Executable_Executable,pluginapp.bin))
$(eval $(call gb_Executable_use_external,pluginapp.bin,npapi_headers))
$(eval $(call gb_Executable_set_include,pluginapp.bin,\
$$(INCLUDE) \
-I$(SRCDIR)/extensions/source/plugin/inc \
))
$(eval $(call gb_Executable_use_sdk_api,pluginapp.bin))
$(eval $(call gb_Executable_add_exception_objects,pluginapp.bin,\
extensions/source/plugin/unx/npwrap \
extensions/source/plugin/unx/npnapi \
))
$(eval $(call gb_Executable_use_static_libraries,pluginapp.bin,\
plugcon \
))
$(eval $(call gb_Executable_use_libraries,pluginapp.bin,\
sal \
))
ifeq ($(filter-out FREEBSD NETBSD OPENBSD DRAGONFLY,$(OS)),)
$(eval $(call gb_Executable_add_libs,pluginapp.bin,\
-lXt \
-lXext \
-lX11 \
))
else ifeq ($(OS),AIX)
$(eval $(call gb_Executable_add_libs,pluginapp.bin,\
-lXpm \
-lXmu \
-lXt \
-lXext \
-lX11 \
-ldl \
))
else
$(eval $(call gb_Executable_add_libs,pluginapp.bin,\
-lXt \
-lXext \
-lX11 \
-ldl \
))
endif
ifeq ($(ENABLE_GTK),TRUE)
$(eval $(call gb_Executable_use_externals,pluginapp.bin,\
gthread \
gtk \
))
endif
# vim:set noet sw=4 ts=4:

View File

@@ -1,120 +0,0 @@
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
#
#
# 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/.
#
#
$(eval $(call gb_Library_Library,pl))
$(eval $(call gb_Library_set_componentfile,pl,extensions/source/plugin/pl))
$(eval $(call gb_Library_use_externals,pl,\
boost_headers \
npapi_headers \
))
$(eval $(call gb_Library_set_include,pl,\
$$(INCLUDE) \
-I$(SRCDIR)/extensions/source/plugin/inc \
))
$(eval $(call gb_Library_use_sdk_api,pl))
ifeq ($(ENABLE_JAVA),TRUE)
$(eval $(call gb_Library_add_defs,pl,\
-DOJI \
))
endif # ENABLE_JAVA=YES
ifeq ($(OS),SOLARIS)
$(eval $(call gb_Library_add_libs,pl,\
-lsocket \
))
endif # OS=SOLARIS
ifeq ($(OS),WNT)
$(eval $(call gb_Library_use_system_win32_libs,pl,\
advapi32 \
ole32 \
version \
))
$(eval $(call gb_Library_add_exception_objects,pl,\
extensions/source/plugin/win/winmgr \
extensions/source/plugin/win/sysplug \
))
else ifeq ($(OS),MACOSX)
$(eval $(call gb_Library_add_objcxxobjects,pl,\
extensions/source/plugin/aqua/macmgr \
extensions/source/plugin/aqua/sysplug \
))
$(eval $(call gb_Library_use_system_darwin_frameworks,pl,\
Cocoa \
Carbon \
CoreFoundation \
))
else
ifeq ($(ENABLE_GTK),TRUE)
$(eval $(call gb_Library_add_defs,pl,\
-DENABLE_GTK \
))
$(eval $(call gb_Library_use_external,pl,gtk))
endif # ENABLE_GTK=TRUE
$(eval $(call gb_Library_add_exception_objects,pl,\
extensions/source/plugin/unx/nppapi \
extensions/source/plugin/unx/sysplug \
extensions/source/plugin/unx/unxmgr \
))
$(eval $(call gb_Library_use_static_libraries,pl,\
plugcon \
))
$(eval $(call gb_Library_add_libs,pl,\
-lX11 \
))
endif
$(eval $(call gb_Library_use_libraries,pl,\
tk \
vcl \
svl \
utl \
tl \
comphelper \
ucbhelper \
cppuhelper \
cppu \
sal \
salhelper \
$(gb_UWINAPI) \
))
$(eval $(call gb_Library_add_exception_objects,pl,\
extensions/source/plugin/base/context \
extensions/source/plugin/base/evtlstnr \
extensions/source/plugin/base/manager \
extensions/source/plugin/base/multiplx \
extensions/source/plugin/base/nfuncs \
extensions/source/plugin/base/plcom \
extensions/source/plugin/base/plctrl \
extensions/source/plugin/base/plmodel \
extensions/source/plugin/base/service \
extensions/source/plugin/base/xplugin \
))
# vim:set noet sw=4 ts=4:

View File

@@ -94,23 +94,6 @@ endif # DISABLE_ATL
endif # WNT
ifeq ($(ENABLE_NPAPI_FROM_BROWSER),TRUE)
$(eval $(call gb_Module_add_targets,extensions,\
Library_pl \
))
ifneq ($(OS),WNT)
ifneq ($(OS),MACOSX)
$(eval $(call gb_Module_add_targets,extensions,\
StaticLibrary_plugcon \
Executable_pluginapp.bin \
))
endif
endif
endif # ENABLE_NPAPI_FROM_BROWSER=TRUE
ifeq ($(OS),MACOSX)
$(eval $(call gb_Module_add_targets,extensions,\
Library_OOoSpotlightImporter \

View File

@@ -1,61 +0,0 @@
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
#
#
# 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/.
#
ifeq ($(OS),WNT)
$(error only for UNX)
endif
$(eval $(call gb_StaticLibrary_StaticLibrary,plugcon))
$(eval $(call gb_StaticLibrary_use_externals,plugcon,\
boost_headers \
npapi_headers \
))
$(eval $(call gb_StaticLibrary_set_include,plugcon,\
$$(INCLUDE) \
-I$(SRCDIR)/extensions/source/plugin/inc \
))
$(eval $(call gb_StaticLibrary_use_api,plugcon,\
offapi \
udkapi \
))
ifeq ($(ENABLE_JAVA),TRUE)
$(eval $(call gb_StaticLibrary_add_defs,plugcon,\
-DOJI \
))
endif # ENABLE_JAVA=YES
ifeq ($(ENABLE_GTK),TRUE)
$(eval $(call gb_StaticLibrary_add_defs,plugcon,\
-DENABLE_GTK \
))
$(eval $(call gb_StaticLibrary_use_external,plugcon,gtk))
# Gtk uses cairo, and if we build internal cairo, the linker could
# pick up our cairo libs before they're fully ready, causing problems
# (e.g. using our libpixman and system libcairo). Depend on cairo
# to delay build until cairo is done.
ifeq ($(SYSTEM_CAIRO),)
$(eval $(call gb_StaticLibrary_use_external,plugcon,cairo))
endif
endif # ENABLE_GTK=TRUE
$(eval $(call gb_StaticLibrary_add_exception_objects,plugcon,\
extensions/source/plugin/unx/mediator \
extensions/source/plugin/unx/plugcon \
))
# vim:set noet sw=4 ts=4:

View File

@@ -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 defined __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(css::uno::RuntimeException, std::exception)
{
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: */

View File

@@ -1,882 +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 <config_lgpl.h>
#include <cstdarg>
#include <sys/types.h>
#include <signal.h>
#include <sys/wait.h>
#include "premac.h"
#include <Cocoa/Cocoa.h>
#include "postmac.h"
#include <osl/thread.h>
#include <plugin/impl.hxx>
extern NPNetscapeFuncs aNPNFuncs;
#include <tools/debug.hxx>
using namespace plugstringhelper;
using ::rtl::OUString;
using ::rtl::OUStringToOString;
#if OSL_DEBUG_LEVEL > 1
void TRACE( char const * s );
void TRACEN( char const * s, long n );
#else
#define TRACE(x)
#define TRACEN(x,n)
#endif
struct SysPlugData
{
MacPluginComm::NP_CGContext m_aCGContext;
NP_Port m_aNPPort;
NSView* m_pParentView;
NSView* m_pPlugView;
int m_nDrawingModel;
NSPoint m_aLastPlugViewOrigin;
bool m_bSetWindowOnDraw;
SysPlugData()
{
memset( this, 0, sizeof(*this) );
}
};
std::shared_ptr<SysPlugData> CreateSysPlugData()
{
return std::shared_ptr<SysPlugData>(new SysPlugData);
}
void XPlugin_Impl::SetSysPlugDataParentView(SystemEnvData const& rEnvData)
{
m_pSysPlugData->m_pParentView = rEnvData.mpNSView;
}
extern "C" {
void /*SAL_CALL NP_LOADDS*/ NPN_ForceRedraw_Impl(NPP instance)
{
TRACE( "NPN_ForceRedraw_Impl" );
XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
if( pImpl )
{
SysPlugData& rPlugData( pImpl->getSysPlugData() );
if( rPlugData.m_pPlugView )
[rPlugData.m_pPlugView setNeedsDisplay: YES];
}
}
NPError /*SAL_CALL NP_LOADDS*/ NPN_SetValue_Impl( NPP instance,
NPPVariable variable,
void* value )
{
TRACE( "NPN_SetValue_Impl" );
switch( variable )
{
case (NPPVariable)1000: // NPNVpluginDrawingModel
{
// ugly, but that's the way we need to do it
int nDrawingModel = (int)value;
TRACEN( "drawing model: ", nDrawingModel );
XPlugin_Impl* pImpl =
XPluginManager_Impl::getXPluginFromNPP( instance );
if (pImpl)
pImpl->getSysPlugData().m_nDrawingModel = nDrawingModel;
}
break;
default:
break;
}
return NPERR_NO_ERROR;
}
} // extern "C"
struct FakeEventRecord : public EventRecord
{
FakeEventRecord()
{
memset( this, 0, sizeof(EventRecord) );
::GetGlobalMouse( &where );
when = ::TickCount();
modifiers = ::GetCurrentEventKeyModifiers();
}
};
@interface OOoPluginView : NSView
{
XPlugin_Impl* m_pImpl;
MacPluginComm* m_pCom;
}
-(id)initWithInstance: (XPlugin_Impl*)i_pImpl pluginComm: (MacPluginComm*)i_pCom frame: (NSRect)i_aRect;
-(void)drawRect: (NSRect)i_aRect;
-(BOOL)isOpaque;
-(BOOL)isFlipped;
// NSResponder
-(void)mouseMoved: (NSEvent*)i_pEvent;
-(void)mouseDown: (NSEvent*)i_pEvent;
-(void)mouseDragged: (NSEvent*)i_pEvent;
-(void)mouseUp: (NSEvent*)i_pEvent;
-(void)rightMouseDown: (NSEvent*)i_pEvent;
-(void)rightMouseDragged: (NSEvent*)i_pEvent;
-(void)rightMouseUp: (NSEvent*)i_pEvent;
-(void)otherMouseDown: (NSEvent*)i_pEvent;
-(void)otherMouseDragged: (NSEvent*)i_pEvent;
-(void)otherMouseUp: (NSEvent*)i_pEvent;
-(void)mouseEntered: (NSEvent*)i_pEvent;
-(void)mouseExited: (NSEvent*)i_pEvent;
@end
@implementation OOoPluginView
-(id)initWithInstance: (XPlugin_Impl*)i_pImpl pluginComm: (MacPluginComm*)i_pCom frame: (NSRect) i_aRect
{
if( (self = [super initWithFrame: i_aRect]) )
{
m_pImpl = i_pImpl;
m_pCom = i_pCom;
}
return self;
}
-(void)drawRect: (NSRect) i_aRect
{
(void) i_aRect; // unused
m_pCom->drawView( m_pImpl );
}
-(BOOL)isOpaque
{
return NO;
}
-(BOOL)isFlipped
{
return YES;
}
// NSResponder
-(void)mouseMoved: (NSEvent*)i_pEvent
{
(void) i_pEvent; // unused
FakeEventRecord aRec;
aRec.what = osEvt + 18; // NPEventType_AdjustCursorEvent
m_pCom->NPP_HandleEvent( &m_pImpl->getNPPInstance(), &aRec );
}
-(void)mouseDown: (NSEvent*)i_pEvent
{
(void) i_pEvent; // unused
FakeEventRecord aRec;
aRec.what = mouseDown;
m_pCom->NPP_HandleEvent( &m_pImpl->getNPPInstance(), &aRec );
}
-(void)mouseDragged: (NSEvent*)i_pEvent
{
(void) i_pEvent; // unused
FakeEventRecord aRec;
aRec.what = aRec.what = osEvt + 18; // NPEventType_AdjustCursorEvent
m_pCom->NPP_HandleEvent( &m_pImpl->getNPPInstance(), &aRec );
}
-(void)mouseUp: (NSEvent*)i_pEvent
{
(void) i_pEvent; // unused
FakeEventRecord aRec;
aRec.what = mouseUp;
m_pCom->NPP_HandleEvent( &m_pImpl->getNPPInstance(), &aRec );
}
-(void)rightMouseDown: (NSEvent*)i_pEvent
{
(void) i_pEvent; // unused
FakeEventRecord aRec;
aRec.what = mouseDown;
m_pCom->NPP_HandleEvent( &m_pImpl->getNPPInstance(), &aRec );
}
-(void)rightMouseDragged: (NSEvent*)i_pEvent
{
(void) i_pEvent; // unused
FakeEventRecord aRec;
aRec.what = aRec.what = osEvt + 18; // NPEventType_AdjustCursorEvent
m_pCom->NPP_HandleEvent( &m_pImpl->getNPPInstance(), &aRec );
}
-(void)rightMouseUp: (NSEvent*)i_pEvent
{
(void) i_pEvent; // unused
FakeEventRecord aRec;
aRec.what = mouseUp;
m_pCom->NPP_HandleEvent( &m_pImpl->getNPPInstance(), &aRec );
}
-(void)otherMouseDown: (NSEvent*)i_pEvent
{
(void) i_pEvent; // unused
FakeEventRecord aRec;
aRec.what = mouseDown;
m_pCom->NPP_HandleEvent( &m_pImpl->getNPPInstance(), &aRec );
}
-(void)otherMouseDragged: (NSEvent*)i_pEvent
{
(void) i_pEvent; // unused
FakeEventRecord aRec;
aRec.what = aRec.what = osEvt + 18; // NPEventType_AdjustCursorEvent
m_pCom->NPP_HandleEvent( &m_pImpl->getNPPInstance(), &aRec );
}
-(void)otherMouseUp: (NSEvent*)i_pEvent
{
(void) i_pEvent; // unused
FakeEventRecord aRec;
aRec.what = mouseUp;
m_pCom->NPP_HandleEvent( &m_pImpl->getNPPInstance(), &aRec );
}
-(void)mouseEntered: (NSEvent*)i_pEvent
{
(void) i_pEvent; // unused
FakeEventRecord aRec;
aRec.what = aRec.what = osEvt + 18; // NPEventType_AdjustCursorEvent
m_pCom->NPP_HandleEvent( &m_pImpl->getNPPInstance(), &aRec );
}
-(void)mouseExited: (NSEvent*)i_pEvent
{
(void) i_pEvent; // unused
FakeEventRecord aRec;
aRec.what = aRec.what = osEvt + 18; // NPEventType_AdjustCursorEvent
m_pCom->NPP_HandleEvent( &m_pImpl->getNPPInstance(), &aRec );
}
@end
MacPluginComm::MacPluginComm( const rtl::OUString& i_rMimetype, const rtl::OUString& i_rBundle, NSView* i_pParent )
: PluginComm( OUStringToOString( i_rBundle, RTL_TEXTENCODING_UTF8 ) ),
m_xBundle( NULL ),
m_hPlugLib( NULL ),
m_pNullTimer( NULL )
{
(void) i_rMimetype; // unused
(void) i_pParent; // unused
// initialize plugin function table
memset( &m_aNPPfuncs, 0, sizeof( m_aNPPfuncs ) );
// load the bundle
CFURLRef xURL = createURL( i_rBundle );
m_xBundle = CFBundleCreate( NULL, xURL );
CFRelease( xURL );
if( m_xBundle )
{
// ask the plugin library
// first get its location
CFURLRef xLibURL = CFBundleCopyExecutableURL( m_xBundle );
if( xLibURL )
{
// get the file system path
rtl::OUString aModuleURL( CFURLtoOSLURL( xLibURL ) );
CFRelease( xLibURL );
m_hPlugLib = osl_loadModule( aModuleURL.pData, SAL_LOADMODULE_DEFAULT );
#if OSL_DEBUG_LEVEL > 1
if( ! m_hPlugLib )
fprintf( stderr, "module %s could not be loaded\n", OUStringToOString( aModuleURL, RTL_TEXTENCODING_UTF8 ).getStr() );
#endif
}
#if OSL_DEBUG_LEVEL > 1
else
fprintf( stderr, "bundle %s has no exectutable URL\n", OUStringToOString( i_rBundle, RTL_TEXTENCODING_UTF8 ).getStr() );
#endif
}
else
{
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "bundle %s could not be loaded\n", OUStringToOString( i_rBundle, RTL_TEXTENCODING_UTF8 ).getStr() );
#endif
}
DBG_ASSERT( m_xBundle && m_hPlugLib, "loading plugin bundle failed!" );
m_aNPPfuncs.size = sizeof( m_aNPPfuncs );
m_aNPPfuncs.version = 0;
m_eCall = eNP_Initialize;
execute();
}
MacPluginComm::~MacPluginComm()
{
if( m_hPlugLib )
{
// NPP_Shutdown();
NPError (*pShutdown)();
if( retrieveFunction( "NP_Shutdown", (void**)&pShutdown ) )
{
NPError nErr = (*pShutdown)(); (void)nErr;
DBG_ASSERT( nErr == NPERR_NO_ERROR, "NP_Shutdown() failed!" );
}
osl_unloadModule( m_hPlugLib );
}
if( m_xBundle )
CFRelease( m_xBundle );
}
sal_Bool MacPluginComm::retrieveFunction( const char* i_pName, void** o_ppFunc ) const
{
if( ! m_hPlugLib || ! o_ppFunc )
return sal_False;
*o_ppFunc = (void*)osl_getAsciiFunctionSymbol( m_hPlugLib, i_pName );
if( ! *o_ppFunc && m_xBundle )
{
rtl::OUString aName( OUString::createFromAscii( *i_pName == '_' ? i_pName+1 : i_pName ) );
CFStringRef xName = createString( aName );
if( xName )
{
*o_ppFunc = CFBundleGetFunctionPointerForName( m_xBundle, xName );
CFRelease( xName );
}
}
return (*o_ppFunc != NULL);
}
IMPL_LINK_NOARG_TYPED(MacPluginComm, NullTimerHdl, Timer*, void)
{
// note: this is a Timer handler, we are already protected by the SolarMutex
FakeEventRecord aRec;
aRec.what = nullEvent;
aRec.where.h = aRec.where.v = 20000;
for( std::list< XPlugin_Impl* >::iterator it = m_aNullEventClients.begin();
it != m_aNullEventClients.end(); ++it )
{
SysPlugData& rPlugData( (*it)->getSysPlugData() );
if( rPlugData.m_pPlugView ) // for safety do not dispatch null events before first NPP_SetWindow
(*m_aNPPfuncs.event)( &(*it)->getNPPInstance(), &aRec );
}
}
long MacPluginComm::doIt()
{
long nRet = 0;
switch( m_eCall )
{
case eNP_Initialize:
{
TRACE( "eNP_Initialize" );
NPError (*pInit)( NPNetscapeFuncs* );
if( retrieveFunction( "NP_Initialize", (void**)&pInit ) )
{
nRet = (*pInit)( &aNPNFuncs );
NPError nErr = NPERR_NO_ERROR;
NPError (*pEntry)( NPPluginFuncs* );
retrieveFunction( "NP_GetEntryPoints", (void**)&pEntry );
nErr = (*pEntry)( &m_aNPPfuncs );
DBG_ASSERT( nErr == NPERR_NO_ERROR, "NP_GetEntryPoints() failed!" );
}
else
{
nRet = NPERR_GENERIC_ERROR;
}
DBG_ASSERT( nRet == NPERR_NO_ERROR, "### NP_Initialize() failed!" );
}
break;
case eNPP_Destroy:
if( m_aNullEventClients.empty() )
delete m_pNullTimer, m_pNullTimer = NULL;
TRACE( "eNPP_Destroy" );
nRet = (m_aNPPfuncs.destroy
? (*m_aNPPfuncs.destroy)(
(NPP)m_aArgs[0],
(NPSavedData**)m_aArgs[1] )
: NPERR_GENERIC_ERROR);
break;
case eNPP_DestroyStream:
TRACE( "eNPP_DestroyStream" );
nRet = (m_aNPPfuncs.destroystream
? (*m_aNPPfuncs.destroystream)(
(NPP)m_aArgs[0],
(NPStream*)m_aArgs[1],
(NPError)(sal_IntPtr)m_aArgs[2] )
: NPERR_GENERIC_ERROR);
break;
case eNPP_New:
TRACE( "eNPP_New" );
nRet = (m_aNPPfuncs.newp
? (*m_aNPPfuncs.newp)(
(NPMIMEType)m_aArgs[0],
(NPP)m_aArgs[1],
(uint16_t)(sal_IntPtr)m_aArgs[2],
(int16_t)(sal_IntPtr)m_aArgs[3],
(char**)m_aArgs[4],
(char**)m_aArgs[5],
(NPSavedData*)m_aArgs[6] )
: NPERR_GENERIC_ERROR);
if( ! m_pNullTimer && m_aNPPfuncs.event )
{
m_pNullTimer = new AutoTimer();
m_pNullTimer->SetTimeout( 50 );
m_pNullTimer->SetTimeoutHdl( LINK( this, MacPluginComm, NullTimerHdl ) );
m_pNullTimer->Start();
}
break;
case eNPP_NewStream:
TRACE( "eNPP_NewStream" );
nRet = (m_aNPPfuncs.newstream
? (*m_aNPPfuncs.newstream)(
(NPP)m_aArgs[0],
(NPMIMEType)m_aArgs[1],
(NPStream*)m_aArgs[2],
(NPBool)(sal_IntPtr)m_aArgs[3],
(uint16_t*)m_aArgs[4] )
: NPERR_GENERIC_ERROR);
break;
case eNPP_Print:
TRACE( "eNPP_Print" );
if (m_aNPPfuncs.print)
(*m_aNPPfuncs.print)(
(NPP)m_aArgs[0],
(NPPrint*)m_aArgs[1] );
break;
case eNPP_SetWindow:
{
TRACE( "eNPP_SetWindow" );
nRet = (m_aNPPfuncs.setwindow
? (*m_aNPPfuncs.setwindow)(
(NPP)m_aArgs[0],
(NPWindow*)m_aArgs[1] )
: NPERR_GENERIC_ERROR);
break;
}
case eNPP_HandleEvent:
{
TRACE( "eNPP_HandleEvent" );
nRet = (m_aNPPfuncs.event
? (*m_aNPPfuncs.event)(
(NPP)m_aArgs[0],
m_aArgs[1] )
: NPERR_GENERIC_ERROR);
break;
}
case eNPP_StreamAsFile:
TRACE( "eNPP_StreamAsFile" );
if (m_aNPPfuncs.asfile)
(*m_aNPPfuncs.asfile)(
(NPP)m_aArgs[0],
(NPStream*)m_aArgs[1],
(char*)m_aArgs[2] );
break;
case eNPP_URLNotify:
TRACE( "eNPP_URLNotify" );
if (m_aNPPfuncs.urlnotify)
(*m_aNPPfuncs.urlnotify)(
(NPP)m_aArgs[0],
(char*)m_aArgs[1],
(NPReason)(sal_IntPtr)m_aArgs[2],
m_aArgs[3] );
break;
case eNPP_Write:
TRACEN( "eNPP_Write n=", (int32_t)m_aArgs[3] );
nRet = (m_aNPPfuncs.write
? (*m_aNPPfuncs.write)(
(NPP)m_aArgs[0],
(NPStream*)m_aArgs[1],
(int32_t)m_aArgs[2],
(int32_t)m_aArgs[3],
m_aArgs[4] )
: 0);
break;
case eNPP_WriteReady:
TRACE( "eNPP_WriteReady" );
nRet = (m_aNPPfuncs.writeready
? (*m_aNPPfuncs.writeready)(
(NPP)m_aArgs[0],
(NPStream*)m_aArgs[1] )
: 0);
break;
case eNPP_GetValue:
TRACE( "eNPP_GetValue" );
nRet = (m_aNPPfuncs.getvalue
? (*m_aNPPfuncs.getvalue)(
(NPP)m_aArgs[0],
(NPPVariable)(int)m_aArgs[1],
m_aArgs[2] )
: NPERR_GENERIC_ERROR);
break;
case eNPP_SetValue:
TRACE( "eNPP_SetValue" );
nRet = (m_aNPPfuncs.setvalue
? (*m_aNPPfuncs.setvalue)(
(NPP)m_aArgs[0],
(NPNVariable)(int)m_aArgs[1],
m_aArgs[2] )
: NPERR_GENERIC_ERROR);
break;
case eNPP_Shutdown:
{
TRACE( "eNPP_Shutdown" );
NPP_ShutdownUPP pFunc;
if (retrieveFunction( "NPP_Shutdown", (void**)&pFunc ))
(*pFunc)();
}
break;
case eNPP_Initialize:
TRACE( "eNPP_Initialize" );
OSL_FAIL( "NPP_Initialize: not implemented!" );
break;
case eNPP_GetJavaClass:
TRACE( "eNPP_GetJavaClass" );
OSL_FAIL( "NPP_GetJavaClass: not implemented!" );
break;
}
return nRet;
}
NPError MacPluginComm::NPP_Destroy( XPlugin_Impl* i_pImpl, NPSavedData** save )
{
// remove from NullEvent timer
m_aNullEventClients.remove( i_pImpl );
NPError nErr = NPP_Destroy( &i_pImpl->getNPPInstance(), save );
// release plugin view
SysPlugData& rPlugData( i_pImpl->getSysPlugData() );
if( rPlugData.m_pPlugView )
{
[rPlugData.m_pPlugView removeFromSuperview];
[rPlugData.m_pPlugView release];
rPlugData.m_pPlugView = nil;
}
return nErr;
}
NPError MacPluginComm::NPP_Destroy( NPP instance, NPSavedData** save )
{
DBG_ASSERT( m_aNPPfuncs.destroy, "### NPP_Destroy(): null pointer in NPP functions table!" );
m_eCall = eNPP_Destroy;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)save;
return (NPError)execute();
}
NPError MacPluginComm::NPP_DestroyStream( NPP instance, NPStream* stream, NPError reason )
{
DBG_ASSERT( m_aNPPfuncs.destroystream, "### NPP_DestroyStream(): null pointer in NPP functions table!" );
m_eCall = eNPP_DestroyStream;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)stream;
m_aArgs[2] = (void*)(intptr_t)reason;
return (NPError)execute();
}
NPError MacPluginComm::NPP_New( NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc,
char* argn[], char* argv[], NPSavedData *saved )
{
XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
DBG_ASSERT( pImpl, "no instance found" );
if( pImpl ) // sanity check
m_aNullEventClients.push_back( pImpl );
DBG_ASSERT( m_aNPPfuncs.newp, "### NPP_New(): null pointer in NPP functions table!" );
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "NPP_New( %s. %p, %d, %d",
pluginType, instance, (int)mode, (int)argc );
for( int16_t i = 0; i < argc; i++ )
fprintf( stderr, "\n%s = %s", argn[i], argv[i] );
fprintf( stderr, ", %p )\n", saved );
#endif
m_eCall = eNPP_New;
m_aArgs[0] = (void*)pluginType;
m_aArgs[1] = (void*)instance;
m_aArgs[2] = (void*)(intptr_t)mode;
m_aArgs[3] = (void*)(intptr_t)argc;
m_aArgs[4] = (void*)argn;
m_aArgs[5] = (void*)argv;
m_aArgs[6] = (void*)saved;
return (NPError)execute();
}
NPError MacPluginComm::NPP_NewStream( NPP instance, NPMIMEType type, NPStream* stream,
NPBool seekable, uint16_t* stype )
{
DBG_ASSERT( m_aNPPfuncs.newstream, "### NPP_NewStream(): null pointer in NPP functions table!" );
m_eCall = eNPP_NewStream;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)type;
m_aArgs[2] = (void*)stream;
m_aArgs[3] = (void*)(intptr_t)seekable;
m_aArgs[4] = (void*)stype;
return (NPError)execute();
}
void MacPluginComm::NPP_Print( NPP instance, NPPrint* platformPrint )
{
DBG_ASSERT( m_aNPPfuncs.print, "### NPP_Print(): null pointer in NPP functions table!" );
m_eCall = eNPP_Print;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)platformPrint;
execute();
}
NPError MacPluginComm::NPP_SetWindow( NPP instance, NPWindow* window )
{
DBG_ASSERT( m_aNPPfuncs.setwindow, "### NPP_SetWindow(): null pointer in NPP functions table!" );
m_eCall = eNPP_SetWindow;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)window;
return (NPError)execute();
}
NPError MacPluginComm::NPP_HandleEvent( NPP instance, void* event )
{
DBG_ASSERT( m_aNPPfuncs.event, "### NPP_HandleEvent(): null pointer in NPP functions table!" );
m_eCall = eNPP_HandleEvent;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = event;
return (NPError)execute();
}
void MacPluginComm::NPP_StreamAsFile( NPP instance, NPStream* stream, const char* fname )
{
DBG_ASSERT( m_aNPPfuncs.asfile, "### NPP_StreamAsFile(): null pointer in NPP functions table!" );
m_eCall = eNPP_StreamAsFile;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)stream;
m_aArgs[2] = (void*)fname;
execute();
}
void MacPluginComm::NPP_URLNotify( NPP instance, const char* url, NPReason reason, void* notifyData )
{
DBG_ASSERT( m_aNPPfuncs.urlnotify, "### NPP_URLNotify(): null pointer in NPP functions table!" );
m_eCall = eNPP_URLNotify;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)url;
m_aArgs[2] = (void*)(intptr_t)reason;
m_aArgs[3] = notifyData;
execute();
}
int32_t MacPluginComm::NPP_Write( NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer )
{
DBG_ASSERT( m_aNPPfuncs.write, "### NPP_Write(): null pointer in NPP functions table!" );
m_eCall = eNPP_Write;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)stream;
m_aArgs[2] = (void*)offset;
m_aArgs[3] = (void*)len;
m_aArgs[4] = buffer;
return (NPError)execute();
}
int32_t MacPluginComm::NPP_WriteReady( NPP instance, NPStream* stream )
{
DBG_ASSERT( m_aNPPfuncs.writeready, "### NPP_WriteReady(): null pointer in NPP functions table!" );
m_eCall = eNPP_WriteReady;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)stream;
return execute();
}
NPError MacPluginComm::NPP_GetValue( NPP instance, NPPVariable variable, void *ret_value )
{
DBG_ASSERT( m_aNPPfuncs.getvalue, "### NPP_GetValue(): null pointer in NPP functions table!" );
m_eCall = eNPP_GetValue;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)variable;
m_aArgs[2] = ret_value;
return (NPError)execute();
}
NPError MacPluginComm::NPP_Initialize()
{
return NPERR_NO_ERROR;
}
void MacPluginComm::NPP_Shutdown()
{
m_eCall = eNPP_Shutdown;
execute();
}
NPError MacPluginComm::NPP_SetWindow( XPlugin_Impl* i_pImpl )
{
// update window NPWindow from view
SysPlugData& rPlugData( i_pImpl->getSysPlugData() );
// update plug view
NSRect aPlugRect = [rPlugData.m_pParentView frame];
aPlugRect.origin.x = aPlugRect.origin.y = 0;
if( ! rPlugData.m_pPlugView )
{
rPlugData.m_pPlugView = [[OOoPluginView alloc] initWithInstance: i_pImpl pluginComm: this frame: aPlugRect];
[rPlugData.m_pParentView addSubview: rPlugData.m_pPlugView];
}
else
[rPlugData.m_pPlugView setFrame: aPlugRect];
NPWindow* pNPWin = &i_pImpl->getNPWindow();
NSWindow* pWin = [rPlugData.m_pPlugView window];
NSRect aWinRect = [pWin frame];
NSRect aBounds = [rPlugData.m_pPlugView frame];
NSRect aVisibleBounds = [rPlugData.m_pPlugView visibleRect];
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "visible bounds = %d+%d+%dx%d\n",
(int)aVisibleBounds.origin.x, (int)aVisibleBounds.origin.y,
(int)aVisibleBounds.size.width, (int)aVisibleBounds.size.height );
#endif
NSPoint aViewOrigin = [rPlugData.m_pPlugView convertPoint: NSZeroPoint toView: nil];
// save view origin so we can notice movement of the view in drawView
// in case of a moved view we need to reset the port/context
rPlugData.m_aLastPlugViewOrigin = aViewOrigin;
// convert view origin to topdown coordinates
aViewOrigin.y = aWinRect.size.height - aViewOrigin.y;
// same for clipping
NSPoint aClipOrigin = [rPlugData.m_pPlugView convertPoint: aVisibleBounds.origin toView: nil];
aClipOrigin.y = aWinRect.size.height - aClipOrigin.y;
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "view origin: %d+%d, clip origin = %d+%d\n",
(int)aViewOrigin.x, (int)aViewOrigin.y,
(int)aClipOrigin.x, (int)aClipOrigin.y );
#endif
pNPWin->x = aViewOrigin.x;
pNPWin->y = aViewOrigin.y;
pNPWin->width = aBounds.size.width;
pNPWin->height = aBounds.size.height;
pNPWin->clipRect.left = aClipOrigin.x;
pNPWin->clipRect.top = aClipOrigin.y;
pNPWin->clipRect.right = aClipOrigin.x + aVisibleBounds.size.width;
pNPWin->clipRect.bottom = aClipOrigin.y + aVisibleBounds.size.height;
if( rPlugData.m_nDrawingModel == 1 )
{
rPlugData.m_aCGContext.window = reinterpret_cast<WindowRef>([pWin windowRef]);
pNPWin->window = &rPlugData.m_aCGContext;
rPlugData.m_aCGContext.context = reinterpret_cast<CGContextRef>([[pWin graphicsContext] graphicsPort]);
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "window is %p, context is %p\n",
rPlugData.m_aCGContext.window, rPlugData.m_aCGContext.context );
#endif
}
else
{
rPlugData.m_aNPPort.port = GetWindowPort( reinterpret_cast<WindowRef>([pWin windowRef]) );
rPlugData.m_aNPPort.portx = aClipOrigin.x;
rPlugData.m_aNPPort.porty = aClipOrigin.y;
pNPWin->window = &rPlugData.m_aNPPort;
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "port is %p at (%d,%d)\n",
rPlugData.m_aNPPort.port, (int)rPlugData.m_aNPPort.portx, (int)rPlugData.m_aNPPort.porty );
#endif
}
if( pNPWin->width == 0 || pNPWin->height == 0 || [rPlugData.m_pPlugView isHiddenOrHasHiddenAncestor] )
rPlugData.m_bSetWindowOnDraw = true;
NPError nErr = NPP_SetWindow( &i_pImpl->getNPPInstance(), &i_pImpl->getNPWindow() );
return nErr;
}
void MacPluginComm::drawView( XPlugin_Impl* i_pImpl )
{
SysPlugData& rPlugData( i_pImpl->getSysPlugData() );
// check if the view was moved since the last SetWindow
NSPoint aViewOrigin = [rPlugData.m_pPlugView convertPoint: NSZeroPoint toView: nil];
if( rPlugData.m_bSetWindowOnDraw ||
aViewOrigin.x != rPlugData.m_aLastPlugViewOrigin.x ||
aViewOrigin.y != rPlugData.m_aLastPlugViewOrigin.y )
{
NPP_SetWindow( i_pImpl );
rPlugData.m_bSetWindowOnDraw = false;
}
// send a paint event
NSWindow* pWin = [rPlugData.m_pPlugView window];
FakeEventRecord aRec;
aRec.what = updateEvt;
aRec.message = (uint32_t)[pWin windowRef];
this->NPP_HandleEvent( &i_pImpl->getNPPInstance(), &aRec );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,345 +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.
*
************************************************************************/
#ifdef AIX
#define _LINUX_SOURCE_COMPAT
#include <sys/timer.h>
#undef _LINUX_SOURCE_COMPAT
#endif
#ifdef WNT
#include <prewin.h>
#include <postwin.h>
#endif
#include <cstdarg>
#include <cstdio>
#include <plugin/impl.hxx>
#include <sal/log.hxx>
#include <com/sun/star/frame/FrameSearchFlag.hpp>
#include <com/sun/star/frame/XComponentLoader.hpp>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <com/sun/star/frame/Desktop.hpp>
#include <comphelper/fileurl.hxx>
#include <tools/urlobj.hxx>
#include <osl/file.hxx>
#include <cppuhelper/implbase1.hxx>
using namespace com::sun::star::io;
using namespace com::sun::star::frame;
namespace ext_plug {
class FileSink : public ::cppu::WeakAggImplHelper1< css::io::XOutputStream >
{
private:
Reference< css::uno::XComponentContext > m_xContext;
FILE* fp;
Reference< css::plugin::XPlugin > m_xPlugin;
OUString m_aTarget;
OUString m_aFileName;
public:
FileSink( const Reference< css::uno::XComponentContext > &,
const Reference< css::plugin::XPlugin > & plugin,
const OUString& target,
const Reference< css::io::XActiveDataSource > & source );
virtual ~FileSink();
// css::io::XOutputStream
virtual void SAL_CALL writeBytes( const Sequence<sal_Int8>& ) throw(std::exception) override;
virtual void SAL_CALL flush() throw(std::exception) override;
virtual void SAL_CALL closeOutput() throw (RuntimeException, std::exception) override;
};
}
using namespace ext_plug;
class XPluginContext_Impl : public ::cppu::WeakAggImplHelper1< css::plugin::XPluginContext >
{
Reference< css::uno::XComponentContext > m_xContext;
rtl_TextEncoding m_aEncoding;
public:
XPluginContext_Impl( const Reference< css::uno::XComponentContext > & );
virtual ~XPluginContext_Impl();
virtual OUString SAL_CALL getValue(const Reference< css::plugin::XPlugin > & plugin, css::plugin::PluginVariable variable) throw( css::plugin::PluginException, RuntimeException, std::exception ) override;
virtual void SAL_CALL getURLNotify(const Reference< css::plugin::XPlugin > & plugin, const OUString& url, const OUString& target, const Reference< css::lang::XEventListener > & listener) throw( css::plugin::PluginException, RuntimeException, std::exception ) override;
virtual void SAL_CALL getURL(const Reference< css::plugin::XPlugin > & plugin, const OUString& url, const OUString& target) throw( css::plugin::PluginException, RuntimeException, std::exception ) override;
virtual void SAL_CALL postURLNotify(const Reference< css::plugin::XPlugin > & plugin, const OUString& url, const OUString& target, const Sequence< sal_Int8 >& buf, sal_Bool file, const Reference< css::lang::XEventListener > & listener) throw( css::plugin::PluginException, RuntimeException, std::exception ) override;
virtual void SAL_CALL postURL(const Reference< css::plugin::XPlugin > & plugin, const OUString& url, const OUString& target, const Sequence< sal_Int8 >& buf, sal_Bool file) throw( css::plugin::PluginException, RuntimeException, std::exception ) override;
virtual void SAL_CALL newStream(const Reference< css::plugin::XPlugin > & plugin, const OUString& mimetype, const OUString& target, const Reference< css::io::XActiveDataSource > & source) throw( css::plugin::PluginException, RuntimeException, std::exception ) override;
virtual void SAL_CALL displayStatusText(const Reference< css::plugin::XPlugin > & plugin, const OUString& message) throw( css::plugin::PluginException, RuntimeException, std::exception ) override;
virtual OUString SAL_CALL getUserAgent(const Reference< css::plugin::XPlugin > & plugin) throw( css::plugin::PluginException, RuntimeException, std::exception ) override;
};
Reference< css::plugin::XPluginContext > XPluginManager_Impl::createPluginContext() throw(std::exception)
{
return new XPluginContext_Impl( m_xContext );
}
XPluginContext_Impl::XPluginContext_Impl( const Reference< css::uno::XComponentContext > & rxContext )
: m_xContext( rxContext ),
m_aEncoding( osl_getThreadTextEncoding() )
{
}
XPluginContext_Impl::~XPluginContext_Impl()
{
}
OUString XPluginContext_Impl::getValue( const Reference< css::plugin::XPlugin > & /*plugin*/, css::plugin::PluginVariable /*variable*/ )
throw( css::plugin::PluginException, RuntimeException, std::exception )
{
return OUString();
}
void XPluginContext_Impl::getURL(const Reference< css::plugin::XPlugin > & plugin, const OUString& url, const OUString& target) throw( css::plugin::PluginException, RuntimeException, std::exception )
{
Reference< XDesktop2 > xDesktop = Desktop::create(m_xContext);
if( target.isEmpty() )
{
INetURLObject aURL;
aURL.SetSmartProtocol( INetProtocol::File );
aURL.SetSmartURL( url );
OUString aUrl = aURL.GetMainURL(INetURLObject::DECODE_TO_IURI);
// the mimetype cannot be specified
plugin->provideNewStream( OUString(),
Reference< XActiveDataSource >(),
aUrl,
0, 0, comphelper::isFileUrl(aUrl) );
return;
}
XPlugin_Impl* pPlugin = XPluginManager_Impl::getPluginImplementation( plugin );
if( pPlugin )
{
try
{
css::beans::PropertyValue aValue;
aValue.Name = "Referer";
aValue.Value <<= pPlugin->getRefererURL();
Sequence< css::beans::PropertyValue > aArgs( &aValue, 1 );
Reference< css::lang::XComponent > xComp =
xDesktop->loadComponentFromURL(
url,
target,
css::frame::FrameSearchFlag::PARENT |
css::frame::FrameSearchFlag::SELF |
css::frame::FrameSearchFlag::CHILDREN |
css::frame::FrameSearchFlag::SIBLINGS |
css::frame::FrameSearchFlag::TASKS |
css::frame::FrameSearchFlag::CREATE,
aArgs
);
}
catch(...)
{
throw css::plugin::PluginException();
}
}
}
void XPluginContext_Impl::getURLNotify(const Reference< css::plugin::XPlugin > & plugin, const OUString& url, const OUString& target, const Reference< css::lang::XEventListener > & listener )
throw( css::plugin::PluginException, RuntimeException, std::exception )
{
getURL( plugin, url, target );
if( listener.is() )
listener->disposing( css::lang::EventObject() );
}
OUString XPluginContext_Impl::getUserAgent(const Reference< css::plugin::XPlugin > & /*plugin*/)
throw( css::plugin::PluginException, RuntimeException, std::exception )
{
return OUString("Mozilla 3.0");
}
void XPluginContext_Impl::displayStatusText(const Reference< css::plugin::XPlugin > & /*plugin*/, const OUString& /*message*/)
throw( css::plugin::PluginException, RuntimeException, std::exception )
{
}
void XPluginContext_Impl::postURL(const Reference< css::plugin::XPlugin > & plugin, const OUString& url, const OUString& target, const Sequence< sal_Int8 >& buf, sal_Bool file)
throw( css::plugin::PluginException, RuntimeException, std::exception )
{
Sequence< sal_Int8 > aBuf;
if( file )
{
OUString aFileName( reinterpret_cast<char const *>(buf.getConstArray()), strlen(reinterpret_cast<char const *>(buf.getConstArray())), m_aEncoding );
INetURLObject aFilePath( aFileName );
aFileName = aFilePath.PathToFileName();
SvFileStream aStream( aFileName, StreamMode::READ );
if( aStream.IsOpen() )
{
sal_Int64 const nBytes = aStream.remainingSize();
aBuf = Sequence<sal_Int8>( nBytes );
aStream.Read( aBuf.getArray(), nBytes );
aStream.Close();
osl::FileBase::getFileURLFromSystemPath( aFileName, aFileName );
osl::File::remove( aFileName );
}
}
Reference< XDesktop2 > xDesktop = Desktop::create(m_xContext);
XPlugin_Impl* pPlugin = XPluginManager_Impl::getPluginImplementation( plugin );
if( pPlugin )
{
try
{
css::beans::PropertyValue aValues[2];
aValues[0].Name = "Referer";
aValues[0].Value <<= pPlugin->getRefererURL();
aValues[1].Name = "PostString";
aValues[1].Value <<= OStringToOUString( reinterpret_cast<char const *>(( file ? aBuf : buf ).getConstArray()), m_aEncoding );
Sequence< css::beans::PropertyValue > aArgs( aValues, 2 );
Reference< css::lang::XComponent > xComp =
xDesktop->loadComponentFromURL(
url,
target,
css::frame::FrameSearchFlag::PARENT |
css::frame::FrameSearchFlag::SELF |
css::frame::FrameSearchFlag::CHILDREN |
css::frame::FrameSearchFlag::SIBLINGS |
css::frame::FrameSearchFlag::TASKS |
css::frame::FrameSearchFlag::CREATE,
aArgs
);
}
catch( ... )
{
throw css::plugin::PluginException();
}
}
}
void XPluginContext_Impl::postURLNotify(const Reference< css::plugin::XPlugin > & plugin, const OUString& url, const OUString& target, const Sequence< sal_Int8 >& buf, sal_Bool file, const Reference< css::lang::XEventListener > & listener )
throw( css::plugin::PluginException, RuntimeException, std::exception )
{
postURL( plugin, url, target, buf, file );
if( listener.is() )
listener->disposing( css::lang::EventObject() );
}
void XPluginContext_Impl::newStream( const Reference< css::plugin::XPlugin > & plugin, const OUString&, const OUString& target, const Reference< css::io::XActiveDataSource > & source )
throw( css::plugin::PluginException, RuntimeException, std::exception )
{
FileSink* pNewSink = new FileSink( m_xContext, plugin, target, source );
pNewSink->acquire();
}
FileSink::FileSink( const Reference< css::uno::XComponentContext > & rxContext, const Reference< css::plugin::XPlugin > & plugin,
const OUString& target, const Reference< css::io::XActiveDataSource > & source ) :
m_xContext( rxContext ),
m_xPlugin( plugin ),
m_aTarget( target )
{
osl::FileBase::createTempFile( nullptr, nullptr, &m_aFileName );
OString aFile = OUStringToOString( m_aFileName, osl_getThreadTextEncoding() );
fp = fopen( aFile.getStr() , "wb" );
Reference< css::io::XActiveDataControl > xControl( source, UNO_QUERY );
source->setOutputStream( Reference< css::io::XOutputStream > ( this ) );
if( xControl.is() )
xControl->start();
}
FileSink::~FileSink()
{
osl::File::remove( m_aFileName );
}
void FileSink::closeOutput() throw (RuntimeException, std::exception)
{
if( fp )
fclose( fp );
Reference< XDesktop2 > xDesktop = Desktop::create(m_xContext);
XPlugin_Impl* pPlugin = XPluginManager_Impl::getPluginImplementation( m_xPlugin );
if( pPlugin )
{
try
{
css::beans::PropertyValue aValue;
aValue.Name = "Referer";
aValue.Value <<= pPlugin->getRefererURL();
Sequence< css::beans::PropertyValue > aArgs( &aValue, 1 );
Reference< css::lang::XComponent > xComp =
xDesktop->loadComponentFromURL(
m_aFileName,
m_aTarget,
css::frame::FrameSearchFlag::PARENT |
css::frame::FrameSearchFlag::SELF |
css::frame::FrameSearchFlag::CHILDREN |
css::frame::FrameSearchFlag::SIBLINGS |
css::frame::FrameSearchFlag::TASKS |
css::frame::FrameSearchFlag::CREATE,
aArgs
);
}
catch( ... )
{
}
}
release();
}
void FileSink::writeBytes( const Sequence<sal_Int8>& Buffer ) throw(std::exception)
{
if( fp )
{
size_t nItems = Buffer.getLength();
bool bSuccess = (fwrite(Buffer.getConstArray(), 1, nItems, fp) == nItems);
SAL_WARN_IF( !bSuccess, "extensions.plugin", "short write");
}
}
void FileSink::flush() throw(std::exception)
{
if( fp )
fflush( fp );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,74 +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.
*
************************************************************************/
#ifdef AIX
#define _LINUX_SOURCE_COMPAT
#include <sys/timer.h>
#undef _LINUX_SOURCE_COMPAT
#endif
#ifdef WNT
#include <prewin.h>
#include <postwin.h>
#endif
#include <cstdarg>
#include <plugin/impl.hxx>
PluginEventListener::PluginEventListener( XPlugin_Impl* pPlugin,
const char* url,
const char* normurl,
void* notifyData ) :
m_pPlugin( pPlugin ),
m_xPlugin( pPlugin ),
m_pUrl( strdup( url ) ),
m_pNormalizedUrl( strdup( normurl ) ),
m_pNotifyData( notifyData )
{
}
PluginEventListener::~PluginEventListener()
{
if( m_pUrl )
free( m_pUrl );
if( m_pNormalizedUrl )
free( m_pNormalizedUrl );
}
void PluginEventListener::disposing( const css::lang::EventObject& /*rEvt*/ ) throw(std::exception)
{
m_pPlugin->getPluginComm()->
NPP_URLNotify( &m_pPlugin->getNPPInstance(),
m_pUrl,
NPRES_DONE,
m_pNotifyData );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,234 +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.
*
************************************************************************/
#ifdef AIX
#define _LINUX_SOURCE_COMPAT
#include <sys/timer.h>
#undef _LINUX_SOURCE_COMPAT
#endif
#ifdef WNT
#include <prewin.h>
#include <postwin.h>
#endif
#include <cstdarg>
#include <comphelper/fileurl.hxx>
#include <comphelper/string.hxx>
#include <comphelper/processfactory.hxx>
#include "plugin/impl.hxx"
#include "osl/mutex.hxx"
#include "unotools/pathoptions.hxx"
#include "vcl/configsettings.hxx"
#include "com/sun/star/container/XEnumerationAccess.hpp"
#include "com/sun/star/container/XNameAccess.hpp"
#include "com/sun/star/container/XEnumeration.hpp"
#include "com/sun/star/container/XElementAccess.hpp"
#include "com/sun/star/container/XIndexAccess.hpp"
#include "com/sun/star/loader/XImplementationLoader.hpp"
#include <cppuhelper/supportsservice.hxx>
PluginManager* PluginManager::pManager = nullptr;
PluginManager& PluginManager::get()
{
if( ! pManager )
pManager = new PluginManager();
return *pManager;
}
void PluginManager::setServiceFactory( const Reference< css::lang::XMultiServiceFactory >& xFactory )
{
PluginManager& rManager = get();
if( ! rManager.m_xSMgr.is() )
rManager.m_xSMgr = xFactory;
}
PluginManager::PluginManager()
{
}
const Sequence< OUString >& PluginManager::getAdditionalSearchPaths()
{
static Sequence< OUString > aPaths;
if( ! aPaths.getLength() )
{
SvtPathOptions aOptions;
OUString aPluginPath( aOptions.GetPluginPath() );
if( !aPluginPath.isEmpty() )
{
sal_Int32 nPaths = comphelper::string::getTokenCount(aPluginPath, ';');
aPaths.realloc( nPaths );
for( sal_Int32 i = 0; i < nPaths; i++ )
aPaths.getArray()[i] = aPluginPath.getToken(i, ';');
}
}
return aPaths;
}
Reference< XInterface > SAL_CALL PluginManager_CreateInstance( const Reference< css::lang::XMultiServiceFactory > & rSMgr ) throw( Exception )
{
Reference< XInterface > xService = *new XPluginManager_Impl( comphelper::getComponentContext(rSMgr) );
return xService;
}
// css::lang::XServiceInfo
OUString XPluginManager_Impl::getImplementationName() throw( )
{
return getImplementationName_Static();
}
// css::lang::XServiceInfo
sal_Bool XPluginManager_Impl::supportsService(const OUString& ServiceName) throw( )
{
return cppu::supportsService(this, ServiceName);
}
// css::lang::XServiceInfo
Sequence< OUString > XPluginManager_Impl::getSupportedServiceNames() throw( )
{
return getSupportedServiceNames_Static();
}
// XPluginManager_Impl
Sequence< OUString > XPluginManager_Impl::getSupportedServiceNames_Static() throw( )
{
Sequence<OUString> aSNS { "com.sun.star.plugin.PluginManager" };
return aSNS;
}
XPluginManager_Impl::XPluginManager_Impl( const Reference< css::uno::XComponentContext > & rxContext )
: m_xContext( rxContext )
{
PluginManager::setServiceFactory( Reference< css::lang::XMultiServiceFactory>(rxContext->getServiceManager(), UNO_QUERY_THROW) );
}
XPluginManager_Impl::~XPluginManager_Impl()
{
}
XPlugin_Impl* XPluginManager_Impl::getXPluginFromNPP( NPP instance )
{
::std::list<XPlugin_Impl*>::iterator iter;
for( iter = PluginManager::get().getPlugins().begin();
iter != PluginManager::get().getPlugins().end(); ++iter )
{
if( &(*iter)->getNPPInstance() == instance )
return *iter;
}
return nullptr;
}
XPlugin_Impl* XPluginManager_Impl::getPluginImplementation( const Reference< css::plugin::XPlugin >& plugin )
{
::std::list<XPlugin_Impl*>::iterator iter;
for( iter = PluginManager::get().getPlugins().begin();
iter != PluginManager::get().getPlugins().end(); ++iter )
{
if( plugin == Reference< css::plugin::XPlugin >((*iter)) )
return *iter;
}
return nullptr;
}
Sequence<css::plugin::PluginDescription> XPluginManager_Impl::getPluginDescriptions()
throw (RuntimeException, std::exception)
{
Sequence<css::plugin::PluginDescription> aRet;
vcl::SettingsConfigItem* pCfg = vcl::SettingsConfigItem::get();
OUString aVal( pCfg->getValue( "BrowserPlugins",
"Disabled" ) );
if( ! aVal.toBoolean() )
{
aRet = impl_getPluginDescriptions();
}
return aRet;
}
Reference< css::plugin::XPlugin > XPluginManager_Impl::createPlugin( const Reference< css::plugin::XPluginContext >& acontext, sal_Int16 mode, const Sequence< OUString >& argn, const Sequence< OUString >& argv, const css::plugin::PluginDescription& plugintype)
throw( RuntimeException,css::plugin::PluginException, std::exception )
{
XPlugin_Impl* pImpl = new XPlugin_Impl( Reference< css::lang::XMultiServiceFactory>(m_xContext->getServiceManager(), UNO_QUERY_THROW) );
pImpl->setPluginContext( acontext );
PluginManager::get().getPlugins().push_back( pImpl );
pImpl->initInstance( plugintype,
argn,
argv,
mode );
return pImpl;
}
Reference< css::plugin::XPlugin > XPluginManager_Impl::createPluginFromURL( const Reference< css::plugin::XPluginContext > & acontext, sal_Int16 mode, const Sequence< OUString >& argn, const Sequence< OUString >& argv, const Reference< css::awt::XToolkit > & toolkit, const Reference< css::awt::XWindowPeer > & parent, const OUString& url ) throw (RuntimeException, std::exception)
{
XPlugin_Impl* pImpl = new XPlugin_Impl( Reference< css::lang::XMultiServiceFactory>(m_xContext->getServiceManager(), UNO_QUERY_THROW) );
Reference< css::plugin::XPlugin > xRef = pImpl;
pImpl->setPluginContext( acontext );
PluginManager::get().getPlugins().push_back( pImpl );
pImpl->initInstance( url,
argn,
argv,
mode );
pImpl->createPeer( toolkit, parent );
pImpl->provideNewStream( pImpl->getDescription().Mimetype,
Reference< css::io::XActiveDataSource >(),
url,
0, 0, comphelper::isFileUrl(url) );
if( ! pImpl->getPluginComm() )
{
pImpl->dispose();
xRef = nullptr;
}
return xRef;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,333 +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 <osl/diagnose.h>
#include <plugin/multiplx.hxx>
// class MRCListenerMultiplexerHelper
MRCListenerMultiplexerHelper::MRCListenerMultiplexerHelper
(
const Reference< css::awt::XWindow > & rControl
, const Reference< css::awt::XWindow > & rPeer
)
: xPeer( rPeer )
, xControl( Reference< css::awt::XControl >( rControl, UNO_QUERY ) )
, aListenerHolder( aMutex )
{
}
void MRCListenerMultiplexerHelper::setPeer( const Reference< css::awt::XWindow > & rPeer )
{
::osl::Guard< ::osl::Mutex > aGuard( aMutex );
if( xPeer != rPeer )
{
if( xPeer.is() )
{
// get all uiks from the listener added to the peer
Sequence<Type> aContainedTypes = aListenerHolder.getContainedTypes();
const Type* pArray = aContainedTypes.getConstArray();
sal_Int32 nCount = aContainedTypes.getLength();
// loop over all listener types and remove the listeners from the peer
for( sal_Int32 i = 0; i < nCount; i++ )
unadviseFromPeer( xPeer, pArray[i] );
}
xPeer = rPeer;
if( xPeer.is() )
{
// get all uiks from the listener added to the peer
Sequence<Type> aContainedTypes = aListenerHolder.getContainedTypes();
const Type * pArray = aContainedTypes.getConstArray();
sal_Int32 nCount = aContainedTypes.getLength();
// loop over all listener types and add the listeners to the peer
for( sal_Int32 i = 0; i < nCount; i++ )
adviseToPeer( xPeer, pArray[i] );
}
}
}
// MRCListenerMultiplexerHelper
void MRCListenerMultiplexerHelper::disposeAndClear()
{
css::lang::EventObject aEvt;
aEvt.Source = xControl;
aListenerHolder.disposeAndClear( aEvt );
}
// MRCListenerMultiplexerHelper
void MRCListenerMultiplexerHelper::adviseToPeer( const Reference< css::awt::XWindow > & rPeer, const Type & type )
{
// add a listener to the source (peer)
if( type == cppu::UnoType<css::awt::XWindowListener>::get())
rPeer->addWindowListener( this );
else if( type == cppu::UnoType<css::awt::XKeyListener>::get())
rPeer->addKeyListener( this );
else if( type == cppu::UnoType<css::awt::XFocusListener>::get())
rPeer->addFocusListener( this );
else if( type == cppu::UnoType<css::awt::XMouseListener>::get())
rPeer->addMouseListener( this );
else if( type == cppu::UnoType<css::awt::XMouseMotionListener>::get())
rPeer->addMouseMotionListener( this );
else if( type == cppu::UnoType<css::awt::XPaintListener>::get())
rPeer->addPaintListener( this );
else if( type == cppu::UnoType<css::awt::XTopWindowListener>::get())
{
Reference< css::awt::XTopWindow > xTop( rPeer, UNO_QUERY );
if( xTop.is() )
xTop->addTopWindowListener( this );
}
else
{
OSL_FAIL( "unknown listener" );
}
}
// MRCListenerMultiplexerHelper
void MRCListenerMultiplexerHelper::unadviseFromPeer( const Reference< css::awt::XWindow > & rPeer, const Type & type )
{
// the last listener is removed, remove the listener from the source (peer)
if( type == cppu::UnoType<css::awt::XWindowListener>::get())
rPeer->removeWindowListener( this );
else if( type == cppu::UnoType<css::awt::XKeyListener>::get())
rPeer->removeKeyListener( this );
else if( type == cppu::UnoType<css::awt::XFocusListener>::get())
rPeer->removeFocusListener( this );
else if( type == cppu::UnoType<css::awt::XMouseListener>::get())
rPeer->removeMouseListener( this );
else if( type == cppu::UnoType<css::awt::XMouseMotionListener>::get())
rPeer->removeMouseMotionListener( this );
else if( type == cppu::UnoType<css::awt::XPaintListener>::get())
rPeer->removePaintListener( this );
else if( type == cppu::UnoType<css::awt::XTopWindowListener>::get())
{
Reference< css::awt::XTopWindow > xTop( rPeer, UNO_QUERY );
if( xTop.is() )
xTop->removeTopWindowListener( this );
}
else
{
OSL_FAIL( "unknown listener" );
}
}
// MRCListenerMultiplexerHelper
void MRCListenerMultiplexerHelper::advise( const Type & type, const Reference< XInterface > & listener)
{
::osl::Guard< ::osl::Mutex > aGuard( aMutex );
if( 1 == aListenerHolder.addInterface( type, listener ) )
{
// the first listener is added
if( xPeer.is() )
adviseToPeer( xPeer, type );
}
}
// MRCListenerMultiplexerHelper
void MRCListenerMultiplexerHelper::unadvise(const Type & type, const Reference< XInterface > & listener)
{
::osl::Guard< ::osl::Mutex > aGuard( aMutex );
::cppu::OInterfaceContainerHelper * pCont = aListenerHolder.getContainer( type );
if( pCont )
{
if( 0 == pCont->removeInterface( listener ) && xPeer.is() )
// the last listener is removed
unadviseFromPeer( xPeer, type );
}
}
// css::lang::XEventListener
void MRCListenerMultiplexerHelper::disposing(const css::lang::EventObject& ) throw(std::exception)
{
::osl::Guard< ::osl::Mutex > aGuard( aMutex );
// peer is disposed, clear the reference
xPeer.clear();
}
#define MULTIPLEX( InterfaceName, MethodName, EventName ) \
::cppu::OInterfaceContainerHelper * pCont; \
pCont = aListenerHolder.getContainer( cppu::UnoType< InterfaceName >::get()); \
if( pCont ) \
{ \
::cppu::OInterfaceIteratorHelper aIt( *pCont ); \
EventName aEvt = e; \
/* Remark: The control is the event source not the peer. We must change */ \
/* the source of the event */ \
aEvt.Source = xControl;\
/*.is the control not destroyed */ \
if( aEvt.Source.is() ) \
{ \
if( aIt.hasMoreElements() ) \
{ \
InterfaceName * pListener = static_cast<InterfaceName *>(aIt.next()); \
try \
{ \
pListener->MethodName( aEvt ); \
} \
catch(const RuntimeException&) \
{ \
/* ignore all usr system exceptions from the listener */ \
} \
} \
} \
}
// css::awt::XFocusListener
void MRCListenerMultiplexerHelper::focusGained(const css::awt::FocusEvent& e) throw(std::exception)
{
MULTIPLEX( css::awt::XFocusListener, focusGained, css::awt::FocusEvent )
}
// css::awt::XFocusListener
void MRCListenerMultiplexerHelper::focusLost(const css::awt::FocusEvent& e) throw(std::exception)
{
MULTIPLEX( css::awt::XFocusListener, focusLost, css::awt::FocusEvent )
}
// css::awt::XWindowListener
void MRCListenerMultiplexerHelper::windowResized(const css::awt::WindowEvent& e) throw(std::exception)
{
MULTIPLEX( css::awt::XWindowListener, windowResized, css::awt::WindowEvent )
}
// css::awt::XWindowListener
void MRCListenerMultiplexerHelper::windowMoved(const css::awt::WindowEvent& e) throw(std::exception)
{
MULTIPLEX( css::awt::XWindowListener, windowMoved, css::awt::WindowEvent )
}
// css::awt::XWindowListener
void MRCListenerMultiplexerHelper::windowShown(const css::lang::EventObject& e) throw(std::exception)
{
MULTIPLEX( css::awt::XWindowListener, windowShown, css::lang::EventObject )
}
// css::awt::XWindowListener
void MRCListenerMultiplexerHelper::windowHidden(const css::lang::EventObject& e) throw(std::exception)
{
MULTIPLEX( css::awt::XWindowListener, windowHidden, css::lang::EventObject )
}
// css::awt::XKeyListener
void MRCListenerMultiplexerHelper::keyPressed(const css::awt::KeyEvent& e) throw(std::exception)
{
MULTIPLEX( css::awt::XKeyListener, keyPressed, css::awt::KeyEvent )
}
// css::awt::XKeyListener
void MRCListenerMultiplexerHelper::keyReleased(const css::awt::KeyEvent& e) throw(std::exception)
{
MULTIPLEX( css::awt::XKeyListener, keyReleased, css::awt::KeyEvent )
}
// css::awt::XMouseListener
void MRCListenerMultiplexerHelper::mousePressed(const css::awt::MouseEvent& e) throw(std::exception)
{
MULTIPLEX( css::awt::XMouseListener, mousePressed, css::awt::MouseEvent )
}
// css::awt::XMouseListener
void MRCListenerMultiplexerHelper::mouseReleased(const css::awt::MouseEvent& e) throw(std::exception)
{
MULTIPLEX( css::awt::XMouseListener, mouseReleased, css::awt::MouseEvent )
}
// css::awt::XMouseListener
void MRCListenerMultiplexerHelper::mouseEntered(const css::awt::MouseEvent& e) throw(std::exception)
{
MULTIPLEX( css::awt::XMouseListener, mouseEntered, css::awt::MouseEvent )
}
// css::awt::XMouseListener
void MRCListenerMultiplexerHelper::mouseExited(const css::awt::MouseEvent& e) throw(std::exception)
{
MULTIPLEX( css::awt::XMouseListener, mouseExited, css::awt::MouseEvent )
}
// css::awt::XMouseMotionListener
void MRCListenerMultiplexerHelper::mouseDragged(const css::awt::MouseEvent& e) throw(std::exception)
{
MULTIPLEX( css::awt::XMouseMotionListener, mouseDragged, css::awt::MouseEvent )
}
// css::awt::XMouseMotionListener
void MRCListenerMultiplexerHelper::mouseMoved(const css::awt::MouseEvent& e) throw(std::exception)
{
MULTIPLEX( css::awt::XMouseMotionListener, mouseMoved, css::awt::MouseEvent )
}
// css::awt::XPaintListener
void MRCListenerMultiplexerHelper::windowPaint(const css::awt::PaintEvent& e) throw(std::exception)
{
MULTIPLEX( css::awt::XPaintListener, windowPaint, css::awt::PaintEvent )
}
// css::awt::XTopWindowListener
void MRCListenerMultiplexerHelper::windowOpened(const css::lang::EventObject& e) throw(std::exception)
{
MULTIPLEX( css::awt::XTopWindowListener, windowOpened, css::lang::EventObject )
}
// css::awt::XTopWindowListener
void MRCListenerMultiplexerHelper::windowClosing( const css::lang::EventObject& e ) throw(std::exception)
{
MULTIPLEX( css::awt::XTopWindowListener, windowClosing, css::lang::EventObject )
}
// css::awt::XTopWindowListener
void MRCListenerMultiplexerHelper::windowClosed( const css::lang::EventObject& e ) throw(std::exception)
{
MULTIPLEX( css::awt::XTopWindowListener, windowClosed, css::lang::EventObject )
}
// css::awt::XTopWindowListener
void MRCListenerMultiplexerHelper::windowMinimized( const css::lang::EventObject& e ) throw(std::exception)
{
MULTIPLEX( css::awt::XTopWindowListener, windowMinimized, css::lang::EventObject )
}
// css::awt::XTopWindowListener
void MRCListenerMultiplexerHelper::windowNormalized( const css::lang::EventObject& e ) throw(std::exception)
{
MULTIPLEX( css::awt::XTopWindowListener, windowNormalized, css::lang::EventObject )
}
// css::awt::XTopWindowListener
void MRCListenerMultiplexerHelper::windowActivated( const css::lang::EventObject& e ) throw(std::exception)
{
MULTIPLEX( css::awt::XTopWindowListener, windowActivated, css::lang::EventObject )
}
// css::awt::XTopWindowListener
void MRCListenerMultiplexerHelper::windowDeactivated( const css::lang::EventObject& e ) throw(std::exception)
{
MULTIPLEX( css::awt::XTopWindowListener, windowDeactivated, css::lang::EventObject )
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,644 +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.
*
************************************************************************/
#ifdef AIX
#define _LINUX_SOURCE_COMPAT
#include <sys/timer.h>
#undef _LINUX_SOURCE_COMPAT
#endif
#ifdef WNT
#include <prewin.h>
#include <postwin.h>
#endif
#include <cstdarg>
#include <list>
#include <plugin/impl.hxx>
#include <vcl/svapp.hxx>
#include <memory>
#if OSL_DEBUG_LEVEL > 1
#include <osl/thread.h>
#include <osl/thread.hxx>
#include <stdio.h>
static FILE * s_file = 0;
void TRACE( char const * s )
{
if (! s_file)
s_file = stderr;
if (s_file)
{
oslThreadIdentifier t = osl::Thread::getCurrentIdentifier();
fprintf( s_file, "log [t_id=%" SAL_PRIuUINT32 "]: %s\n", t, s );
fflush( s_file );
}
}
void TRACEN( char const * s, long n )
{
if (! s_file)
s_file = stderr;
if (s_file)
{
oslThreadIdentifier t = osl::Thread::getCurrentIdentifier();
fprintf( s_file, "log [t_id=%" SAL_PRIuUINT32 "]: %s%ld\n", t, s, n );
fflush( s_file );
}
}
void TRACES( char const* s, char const* s2 )
{
if (! s_file)
s_file = stderr;
if (s_file)
{
oslThreadIdentifier t = osl::Thread::getCurrentIdentifier();
fprintf( s_file, "log [t_id=%" SAL_PRIuUINT32 "]: %s %s\n", t, s, s2 );
fflush( s_file );
}
}
#else
#define TRACE(x)
#define TRACEN(x,n)
#define TRACES(x,s)
#endif
using namespace com::sun::star::lang;
// Move deprecated functions which no longer appear in npapi.h before
// their use to avoid errors that they're undeclared at point of use
extern "C"
{
const JRIEnvInterface** SAL_CALL NP_LOADDS NPN_GetJavaEnv()
{
TRACE( "NPN_GetJavaEnv" );
// no java in this program
return nullptr;
}
jref SAL_CALL NP_LOADDS NPN_GetJavaPeer( NPP /*instance*/ )
{
TRACE( "NPN_GetJavaPeer" );
return nullptr;
}
}
NPNetscapeFuncs aNPNFuncs =
{
sizeof( NPNetscapeFuncs ),
(NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR,
NPN_GetURL,
NPN_PostURL,
NPN_RequestRead,
NPN_NewStream,
NPN_Write,
NPN_DestroyStream,
NPN_Status,
NPN_UserAgent,
NPN_MemAlloc,
NPN_MemFree,
NPN_MemFlush,
NPN_ReloadPlugins,
NPN_GetJavaEnv,
NPN_GetJavaPeer,
NPN_GetURLNotify,
NPN_PostURLNotify,
NPN_GetValue,
NPN_SetValue,
NPN_InvalidateRect,
NPN_InvalidateRegion,
NPN_ForceRedraw
};
static OString normalizeURL( XPlugin_Impl* plugin, const OString& url )
{
OString aLoadURL;
if( url.indexOf( ':' ) == -1 )
{
aLoadURL = OUStringToOString( plugin->getCreationURL(), plugin->getTextEncoding() );
int nPos;
if( ( nPos = aLoadURL.indexOf( "://" ) ) != -1 )
{
if( url.indexOf( '/' ) != -1 )
{
// this means same server but new path
nPos = aLoadURL.indexOf( '/', nPos+3 );
if( nPos != -1 )
aLoadURL = aLoadURL.copy( 0, url.startsWith("/") ? nPos : nPos+1 );
}
else
{
// same server but new file
nPos = aLoadURL.lastIndexOf( '/' );
aLoadURL = aLoadURL.copy( 0, nPos+1 );
}
aLoadURL += url;
}
else
aLoadURL = url;
}
else if( url.indexOf( ":/" ) != -1 )
aLoadURL = url;
return aLoadURL;
}
struct AsynchronousGetURL
{
OUString aUrl;
OUString aTarget;
Reference< XEventListener > xListener;
DECL_LINK_TYPED( getURL, void*, void );
};
IMPL_LINK_TYPED( AsynchronousGetURL, getURL, void*, p, void )
{
XPlugin_Impl* pImpl = static_cast<XPlugin_Impl*>(p);
try
{
pImpl->enterPluginCallback();
if( xListener.is() )
pImpl->getPluginContext()->
getURLNotify( pImpl,
aUrl,
aTarget,
xListener );
else
pImpl->getPluginContext()->
getURL( pImpl,
aUrl,
aTarget );
}
catch(const css::plugin::PluginException&)
{
}
pImpl->leavePluginCallback();
delete this;
}
extern "C" {
void* SAL_CALL NP_LOADDS NPN_MemAlloc( uint32_t nBytes )
{
TRACE( "NPN_MemAlloc" );
void* pMem = malloc( nBytes );
return pMem;
}
void SAL_CALL NP_LOADDS NPN_MemFree( void* pMem )
{
TRACE( "NPN_MemFree" );
free( pMem );
}
uint32_t SAL_CALL NP_LOADDS NPN_MemFlush( uint32_t /*nSize*/ )
{
TRACE( "NPN_MemFlush" );
return 0;
}
NPError SAL_CALL NP_LOADDS NPN_DestroyStream( NPP instance, NPStream* stream, NPError /*reason*/ )
{
TRACE( "NPN_DestroyStream" );
XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
if( ! pImpl )
return NPERR_INVALID_INSTANCE_ERROR;
PluginStream* pStream = pImpl->getStreamFromNPStream( stream );
if( pStream )
{
if( pStream->getStreamType() == InputStream )
static_cast<PluginInputStream*>(pStream)->releaseSelf();
else
delete pStream;
}
return NPERR_NO_ERROR;
}
NPError SAL_CALL NP_LOADDS NPN_GetURL( NPP instance, const char* url, const char* window )
{
TRACES( "NPN_GetURL", url );
XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
if( ! pImpl )
return NPERR_INVALID_INSTANCE_ERROR;
AsynchronousGetURL* pAsync = new AsynchronousGetURL();
OString aLoadURL = normalizeURL( pImpl, url );
TRACES( "NPN_GetURL", aLoadURL.getStr() );
pAsync->aUrl = OStringToOUString( aLoadURL, pImpl->getTextEncoding() );
pAsync->aTarget = OStringToOUString( window, pImpl->getTextEncoding() );
pImpl->setLastGetUrl( aLoadURL );
Application::PostUserEvent( LINK( pAsync, AsynchronousGetURL, getURL ), pImpl );
return NPERR_NO_ERROR;
}
NPError SAL_CALL NP_LOADDS NPN_GetURLNotify( NPP instance, const char* url, const char* target,
void* notifyData )
{
TRACES( "NPN_GetURLNotify", url );
XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
if( ! pImpl )
return NPERR_INVALID_INSTANCE_ERROR;
OString aLoadURL = normalizeURL( pImpl, url );
if( aLoadURL.isEmpty() )
return NPERR_INVALID_URL;
AsynchronousGetURL* pAsync = new AsynchronousGetURL();
PluginEventListener* pListener =
new PluginEventListener( pImpl, url, aLoadURL.getStr(), notifyData );
if( ! target || ! *target )
{
// stream will be fed back to plugin,
// notify immediately after destruction of stream
pImpl->addPluginEventListener( pListener );
pListener = nullptr;
}
pAsync->aUrl = OStringToOUString( aLoadURL, pImpl->getTextEncoding() );
pAsync->aTarget = OStringToOUString( target, pImpl->getTextEncoding() );
pAsync->xListener = pListener;
pImpl->setLastGetUrl( aLoadURL );
Application::PostUserEvent( LINK( pAsync, AsynchronousGetURL, getURL ), pImpl );
return NPERR_NO_ERROR;
}
NPError SAL_CALL NP_LOADDS NPN_NewStream( NPP instance, NPMIMEType type, const char* target,
NPStream** stream )
// stream is a return value
{
TRACE( "NPN_NewStream" );
XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
if( ! pImpl )
return NPERR_INVALID_INSTANCE_ERROR;
PluginOutputStream* pStream = new PluginOutputStream( pImpl,
"", 0, 0 );
*stream = &pStream->getStream();
try
{
pImpl->enterPluginCallback();
pImpl->getPluginContext()->
newStream(
pImpl,
OStringToOUString( type, pImpl->getTextEncoding () ),
OStringToOUString( target, pImpl->getTextEncoding() ),
css::uno::Reference< css::io::XActiveDataSource > ( pStream->getOutputStream(), UNO_QUERY )
);
pImpl->leavePluginCallback();
}
catch( const css::plugin::PluginException& e )
{
pImpl->leavePluginCallback();
return e.ErrorCode;
}
return NPERR_NO_ERROR;
}
NPError SAL_CALL NP_LOADDS NPN_PostURLNotify( NPP instance, const char* url, const char* target, uint32_t len, const char* buf, NPBool file, void* notifyData )
{
TRACE( "NPN_PostURLNotify" );
XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
if( ! pImpl )
return NPERR_INVALID_INSTANCE_ERROR;
css::uno::Sequence<sal_Int8> Bytes( reinterpret_cast<sal_Int8 const *>(buf), len );
OString aPostURL = normalizeURL( pImpl, url );
PluginEventListener* pListener =
new PluginEventListener( pImpl, url, aPostURL.getStr(), notifyData );
if( ! target || ! *target )
{
// stream will be fed back to plugin,
// notify immediately after destruction of stream
pImpl->addPluginEventListener( pListener );
pListener = nullptr;
}
try
{
pImpl->enterPluginCallback();
pImpl->getPluginContext()->
postURLNotify( pImpl,
OStringToOUString( aPostURL, pImpl->getTextEncoding() ),
OStringToOUString( target, pImpl->getTextEncoding() ),
Bytes,
file,
css::uno::Reference< css::lang::XEventListener > ( pListener ) );
pImpl->leavePluginCallback();
}
catch( const css::plugin::PluginException& e )
{
pImpl->leavePluginCallback();
return e.ErrorCode;
}
return NPERR_NO_ERROR;
}
NPError SAL_CALL NP_LOADDS NPN_PostURL( NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file )
{
TRACE( "NPN_PostURL" );
XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
if( ! pImpl )
return NPERR_INVALID_INSTANCE_ERROR;
css::uno::Sequence<sal_Int8> Bytes( reinterpret_cast<sal_Int8 const *>(buf), len );
OString aPostURL = normalizeURL( pImpl, url );
try
{
pImpl->enterPluginCallback();
pImpl->getPluginContext()->
postURL( pImpl,
OStringToOUString( aPostURL, pImpl->getTextEncoding() ),
OStringToOUString( window, pImpl->getTextEncoding () ),
Bytes,
file );
pImpl->leavePluginCallback();
}
catch( const css::plugin::PluginException& e )
{
pImpl->leavePluginCallback();
return e.ErrorCode;
}
return NPERR_NO_ERROR;
}
NPError SAL_CALL NP_LOADDS NPN_RequestRead( NPStream* stream, NPByteRange* rangeList )
{
TRACE( "NPN_RequestRead" );
if( ! rangeList )
return NPERR_NO_ERROR;
::std::list<XPlugin_Impl*>& rList = PluginManager::get().getPlugins();
::std::list<XPlugin_Impl*>::iterator iter;
XPlugin_Impl* pPlugin = nullptr;
PluginStream* pStream = nullptr;
for( iter = rList.begin(); iter!= rList.end(); ++iter )
{
pStream = (*iter)->getStreamFromNPStream( stream );
if( pStream )
{
pPlugin = *iter;
break;
}
}
if( ! pPlugin )
return NPERR_INVALID_INSTANCE_ERROR;
if( ! pStream || pStream->getStreamType() != InputStream )
return NPERR_FILE_NOT_FOUND;
PluginInputStream* pInputStream = static_cast<PluginInputStream*>(pStream);
std::unique_ptr<sal_Int8[]> pBytes;
int nBytes = 0;
pPlugin->enterPluginCallback();
while( rangeList )
{
if( pBytes && nBytes < (int)rangeList->length )
pBytes.reset();
if( ! pBytes ) {
nBytes = rangeList->length;
pBytes.reset(new sal_Int8[ nBytes ]);
}
int nRead =
pInputStream->read( rangeList->offset, pBytes.get(), rangeList->length );
int nPos = 0;
int nNow;
do
{
nNow = pPlugin->getPluginComm()->
NPP_WriteReady( &pPlugin->getNPPInstance(),
stream );
nNow = pPlugin->getPluginComm()->
NPP_Write( &pPlugin->getNPPInstance(),
stream,
rangeList->offset + nPos,
nNow,
pBytes.get()+nPos );
nPos += nNow;
nRead -= nNow;
} while( nRead > 0 && nNow );
rangeList = rangeList->next;
}
pPlugin->leavePluginCallback();
return NPERR_NO_ERROR;
}
void SAL_CALL NP_LOADDS NPN_Status( NPP instance, const char* message )
{
TRACE( "NPN_Status" );
XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
if( ! pImpl )
return;
try
{
pImpl->enterPluginCallback();
pImpl->getPluginContext()->
displayStatusText( pImpl, OStringToOUString( message, pImpl->getTextEncoding() ) );
pImpl->leavePluginCallback();
}
catch( const css::plugin::PluginException& )
{
pImpl->leavePluginCallback();
return;
}
}
const char* SAL_CALL NP_LOADDS NPN_UserAgent( NPP instance )
{
static char* pAgent = strdup( "Mozilla 3.0" );
XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
if( pImpl )
{
OUString UserAgent;
try
{
pImpl->enterPluginCallback();
UserAgent = pImpl->getPluginContext()->
getUserAgent( pImpl );
pImpl->leavePluginCallback();
if( pAgent )
free( pAgent );
pAgent = strdup( OUStringToOString( UserAgent, pImpl->getTextEncoding() ).getStr() );
}
catch( const css::plugin::PluginException& )
{
pImpl->leavePluginCallback();
}
}
TRACES( "NPN_UserAgent: returning", pAgent );
return pAgent;
}
void SAL_CALL NP_LOADDS NPN_Version( int* major, int* minor, int* net_major, int* net_minor )
{
TRACE( "NPN_Version" );
*major = 4;
*minor = 0;
*net_major = 4;
*net_minor = 5;
}
int32_t SAL_CALL NP_LOADDS NPN_Write( NPP instance, NPStream* stream, int32_t len,
void* buffer )
{
TRACE( "NPN_Write" );
XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
if( ! pImpl )
return 0;
PluginStream* pStream = pImpl->getStreamFromNPStream( stream );
if( ! pStream || pStream->getStreamType() != OutputStream )
return 0;
pImpl->enterPluginCallback();
css::uno::Sequence<sal_Int8> Bytes( static_cast<sal_Int8*>(buffer), len );
static_cast<PluginOutputStream*>(pStream)->getOutputStream()->writeBytes( Bytes );
pImpl->leavePluginCallback();
return len;
}
NPError SAL_CALL NP_LOADDS NPN_GetValue( NPP instance, NPNVariable variable, void* value )
{
TRACEN( "NPN_GetValue: ", variable );
XPlugin_Impl* pImpl = XPluginManager_Impl::getXPluginFromNPP( instance );
if( ! pImpl )
return 0;
NPError aResult( NPERR_NO_ERROR );
switch( variable )
{
case NPNVxDisplay:
// Unix only, handled in sysdep part
case NPNVxtAppContext:
// Unix only, handled in sysdep part
default:
aResult = NPERR_INVALID_PARAM;
break;
#ifdef MACOSX
case 2000: // NPNVsupportsQuickDrawBool
*(NPBool*)value = false;
break;
case 2001: // NPNVsupportsCoreGraphicsBool
*(NPBool*)value = true;
break;
#endif
case NPNVjavascriptEnabledBool:
// no javascript
*static_cast<NPBool*>(value) = false;
break;
case NPNVasdEnabledBool:
// no SmartUpdate
*static_cast<NPBool*>(value) = false;
break;
case NPNVisOfflineBool:
// no offline browsing
*static_cast<NPBool*>(value) = false;
break;
}
return aResult;
}
void SAL_CALL NP_LOADDS NPN_ReloadPlugins(NPBool /*reloadPages*/)
{
TRACE( "NPN_ReloadPlugins" );
}
NPError SAL_CALL NP_LOADDS NPN_SetValue( NPP instance,
NPPVariable variable,
void* value )
{
NPError nError = NPERR_NO_ERROR;
TRACEN( "NPN_SetValue ", variable );
#ifdef MACOSX
NPN_SetValue_Impl(instance, variable, value);
#else
(void)instance;
(void)variable;
(void)value;
#endif
return nError;
}
void SAL_CALL NP_LOADDS NPN_InvalidateRect(NPP instance, NPRect* /*invalidRect*/)
{
TRACE( "NPN_InvalidateRect" );
#ifdef MACOSX
NPN_ForceRedraw( instance );
#else
(void)instance;
#endif
}
void SAL_CALL NP_LOADDS NPN_InvalidateRegion(NPP instance, NPRegion /*invalidRegion*/)
{
TRACE( "NPN_InvalidateRegion" );
#ifdef MACOSX
NPN_ForceRedraw( instance );
#else
(void)instance;
#endif
}
void SAL_CALL NP_LOADDS NPN_ForceRedraw(NPP instance)
{
TRACE( "NPN_ForceRedraw" );
#ifdef MACOSX
NPN_ForceRedraw_Impl(instance);
#else
(void)instance;
#endif
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,80 +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.
*
************************************************************************/
#ifdef AIX
#define _LINUX_SOURCE_COMPAT
#include <sys/timer.h>
#undef _LINUX_SOURCE_COMPAT
#endif
#ifdef WNT
#include <prewin.h>
#include <postwin.h>
#endif
#ifdef SOLARIS
#include <limits>
#endif
#include <cstdarg>
#include <osl/file.hxx>
#include <plugin/impl.hxx>
PluginComm::PluginComm( const OString& rLibName, bool bReusable ) :
m_nRefCount( 0 ),
m_aLibName( rLibName )
{
if( bReusable )
PluginManager::get().getPluginComms().push_back( this );
}
PluginComm::~PluginComm()
{
PluginManager::get().getPluginComms().remove( this );
while( m_aFilesToDelete.size() )
{
OUString aFile( m_aFilesToDelete.front() );
m_aFilesToDelete.pop_front();
osl::FileBase::getFileURLFromSystemPath( aFile, aFile );
osl::File::remove( aFile );
}
}
NPError PluginComm::NPP_SetWindow( XPlugin_Impl* i_pImpl )
{
return NPP_SetWindow( &i_pImpl->getNPPInstance(), &i_pImpl->getNPWindow() );
}
NPError PluginComm::NPP_Destroy( XPlugin_Impl* i_pImpl, NPSavedData** save )
{
return NPP_Destroy( &i_pImpl->getNPPInstance(), save );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,322 +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 <com/sun/star/awt/XAdjustmentListener.hpp>
#include <com/sun/star/awt/XActionListener.hpp>
#include <com/sun/star/awt/XTextListener.hpp>
#include <com/sun/star/awt/XSpinListener.hpp>
#include <com/sun/star/awt/XItemListener.hpp>
#include <com/sun/star/awt/XVclContainerListener.hpp>
#include <com/sun/star/awt/PosSize.hpp>
#include <plugin/plctrl.hxx>
#include <vcl/syschild.hxx>
#include <toolkit/helper/vclunohelper.hxx>
PluginControl_Impl::PluginControl_Impl()
: _pMultiplexer( nullptr )
, _nX( 0 )
, _nY( 0 )
, _nWidth( 100 )
, _nHeight( 100 )
, _nFlags( css::awt::PosSize::POSSIZE )
, _bVisible(false)
, _bInDesignMode(false)
, _bEnable(true)
, _pSysChild(nullptr)
{
}
PluginControl_Impl::~PluginControl_Impl()
{
}
MRCListenerMultiplexerHelper* PluginControl_Impl::getMultiplexer()
{
if( ! _pMultiplexer )
_pMultiplexer = new MRCListenerMultiplexerHelper( this, _xPeerWindow );
return _pMultiplexer;
}
void PluginControl_Impl::addEventListener( const Reference< css::lang::XEventListener > & l )
throw( RuntimeException, std::exception )
{
_aDisposeListeners.push_back( l );
}
//---- css::lang::XComponent ----------------------------------------------------------------------------------
void PluginControl_Impl::removeEventListener( const Reference< css::lang::XEventListener > & l )
throw( RuntimeException, std::exception )
{
_aDisposeListeners.remove( l );
}
//---- css::lang::XComponent ----------------------------------------------------------------------------------
void PluginControl_Impl::dispose()
throw( RuntimeException, std::exception )
{
// send disposing events
css::lang::EventObject aEvt;
if( getMultiplexer() )
getMultiplexer()->disposeAndClear();
// release context
_xContext.clear();
releasePeer();
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::setPosSize( sal_Int32 nX_, sal_Int32 nY_, sal_Int32 nWidth_, sal_Int32 nHeight_, sal_Int16 nFlags )
throw( RuntimeException, std::exception )
{
_nX = nX_ >=0 ? nX_ : 0;
_nY = nY_ >=0 ? nY_ : 0;
_nWidth = nWidth_ >=0 ? nWidth_ : 0;
_nHeight = nHeight_ >=0 ? nHeight_ : 0;
_nFlags = nFlags;
if (_xPeerWindow.is())
_xPeerWindow->setPosSize( _nX, _nY, _nWidth, _nHeight, nFlags );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
css::awt::Rectangle PluginControl_Impl::getPosSize()
throw( RuntimeException, std::exception )
{
return _xPeerWindow->getPosSize();
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::setVisible( sal_Bool bVisible )
throw( RuntimeException, std::exception )
{
_bVisible = bVisible;
if (_xPeerWindow.is())
_xPeerWindow->setVisible( _bVisible && !_bInDesignMode );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::setEnable( sal_Bool bEnable )
throw( RuntimeException, std::exception )
{
_bEnable = bEnable;
if (_xPeerWindow.is())
_xPeerWindow->setEnable( _bEnable );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::setFocus() throw( RuntimeException, std::exception )
{
if (_xPeerWindow.is())
_xPeerWindow->setFocus();
}
void PluginControl_Impl::releasePeer()
{
if (_xPeer.is())
{
_xParentWindow->removeFocusListener( this );
_xPeerWindow->dispose();
_pSysChild = nullptr;
_xPeerWindow.clear();
_xPeer.clear();
getMultiplexer()->setPeer( Reference< css::awt::XWindow > () );
}
}
//---- css::awt::XControl ------------------------------------------------------------------------------------
void PluginControl_Impl::createPeer( const Reference< css::awt::XToolkit > & /*xToolkit*/, const Reference< css::awt::XWindowPeer > & xParentPeer )
throw( RuntimeException, std::exception )
{
if (_xPeer.is())
{
OSL_FAIL( "### Peer is already set!" );
return;
}
_xParentPeer = xParentPeer;
_xParentWindow.set( xParentPeer, UNO_QUERY );
DBG_ASSERT( _xParentWindow.is(), "### no parent peer window!" );
vcl::Window* pImpl = VCLUnoHelper::GetWindow( xParentPeer );
if (pImpl)
{
_pSysChild = VclPtr<SystemChildWindow>::Create( pImpl, WB_CLIPCHILDREN );
if (pImpl->HasFocus())
_pSysChild->GrabFocus();
// get peer
_xPeer.set( _pSysChild->GetComponentInterface() );
_xPeerWindow.set( _xPeer, UNO_QUERY );
// !_BOTH_ MUST BE VALID!
DBG_ASSERT( (_xPeer.is() && _xPeerWindow.is()), "### no peer!" );
_xParentWindow->addFocusListener( this );
_xPeerWindow->setPosSize( _nX, _nY, _nWidth, _nHeight, _nFlags );
_xPeerWindow->setEnable( _bEnable );
_xPeerWindow->setVisible( _bVisible && !_bInDesignMode );
}
else
{
OSL_FAIL( "### cannot get implementation of parent peer!" );
}
getMultiplexer()->setPeer( _xPeerWindow );
}
//---- css::awt::XControl ------------------------------------------------------------------------------------
void PluginControl_Impl::setDesignMode( sal_Bool bOn )
throw( RuntimeException, std::exception )
{
_bInDesignMode = bOn;
if (_xPeerWindow.is())
_xPeerWindow->setVisible( _bVisible && !_bInDesignMode );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::addPaintListener( const Reference< css::awt::XPaintListener > & l )
throw( RuntimeException, std::exception )
{
getMultiplexer()->advise( cppu::UnoType<css::awt::XPaintListener>::get(), l );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::removePaintListener( const Reference< css::awt::XPaintListener > & l )
throw( RuntimeException, std::exception )
{
getMultiplexer()->unadvise( cppu::UnoType<css::awt::XPaintListener>::get(), l );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::addWindowListener( const Reference< css::awt::XWindowListener > & l )
throw( RuntimeException, std::exception )
{
getMultiplexer()->advise( cppu::UnoType<css::awt::XWindowListener>::get(), l );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::removeWindowListener( const Reference< css::awt::XWindowListener > & l )
throw( RuntimeException, std::exception )
{
getMultiplexer()->unadvise( cppu::UnoType<css::awt::XWindowListener>::get(), l );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::addFocusListener( const Reference< css::awt::XFocusListener > & l )
throw( RuntimeException, std::exception )
{
getMultiplexer()->advise( cppu::UnoType<css::awt::XFocusListener>::get(), l );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::removeFocusListener( const Reference< css::awt::XFocusListener > & l )
throw( RuntimeException, std::exception )
{
getMultiplexer()->unadvise( cppu::UnoType<css::awt::XFocusListener>::get(), l );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::addKeyListener( const Reference< css::awt::XKeyListener > & l )
throw( RuntimeException, std::exception )
{
getMultiplexer()->advise( cppu::UnoType<css::awt::XKeyListener>::get(), l );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::removeKeyListener( const Reference< css::awt::XKeyListener > & l )
throw( RuntimeException, std::exception )
{
getMultiplexer()->unadvise( cppu::UnoType<css::awt::XKeyListener>::get(), l );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::addMouseListener( const Reference< css::awt::XMouseListener > & l )
throw( RuntimeException, std::exception )
{
getMultiplexer()->advise( cppu::UnoType<css::awt::XMouseListener>::get(), l );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::removeMouseListener( const Reference< css::awt::XMouseListener > & l )
throw( RuntimeException, std::exception )
{
getMultiplexer()->unadvise( cppu::UnoType<css::awt::XMouseListener>::get(), l );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::addMouseMotionListener( const Reference< css::awt::XMouseMotionListener > & l )
throw( RuntimeException, std::exception )
{
getMultiplexer()->advise( cppu::UnoType<css::awt::XMouseMotionListener>::get(), l );
}
//---- css::awt::XWindow -------------------------------------------------------------------------------------
void PluginControl_Impl::removeMouseMotionListener( const Reference< css::awt::XMouseMotionListener > & l )
throw( RuntimeException, std::exception )
{
getMultiplexer()->unadvise( cppu::UnoType<css::awt::XMouseMotionListener>::get(), l );
}
//---- css::awt::XView ---------------------------------------------------------------------------------------
void PluginControl_Impl::draw( sal_Int32 /*x*/, sal_Int32 /*y*/ )
throw( RuntimeException, std::exception )
{
// has to be done by further implementation of control
}
//---- css::awt::XView ---------------------------------------------------------------------------------------
void PluginControl_Impl::setZoom( float /*ZoomX*/, float /*ZoomY*/ )
throw( RuntimeException, std::exception )
{
// has to be done by further implementation of control
}
//---- css::lang::XEventListener ------------------------------------------------------------------------------
void PluginControl_Impl::disposing( const css::lang::EventObject & /*rSource*/ )
throw( RuntimeException, std::exception )
{
}
//---- css::awt::XFocusListener ------------------------------------------------------------------------------
void PluginControl_Impl::focusGained( const css::awt::FocusEvent & /*rEvt*/ )
throw( RuntimeException, std::exception )
{
if (_xPeerWindow.is())
_xPeerWindow->setFocus();
}
//---- css::awt::XFocusListener ------------------------------------------------------------------------------
void PluginControl_Impl::focusLost( const css::awt::FocusEvent & /*rEvt*/ )
throw( RuntimeException, std::exception )
{
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,204 +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 <plugin/model.hxx>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <cppuhelper/queryinterface.hxx>
using namespace com::sun::star::uno;
Reference< XInterface > SAL_CALL PluginModel_CreateInstance( const Reference< css::lang::XMultiServiceFactory > & ) throw( Exception )
{
Reference< XInterface > xService = *new PluginModel();
return xService;
}
Any PluginModel::queryAggregation( const Type& type ) throw( RuntimeException, std::exception )
{
Any aRet( ::cppu::queryInterface( type,
static_cast< css::lang::XComponent* >(this),
static_cast< css::io::XPersistObject* >(this ),
static_cast< css::awt::XControlModel* >(this),
static_cast< css::beans::XPropertySet* >(this),
static_cast< css::beans::XMultiPropertySet* >(this),
static_cast< css::beans::XFastPropertySet* >(this)
) );
return aRet.hasValue() ? aRet : OWeakAggObject::queryAggregation( type );
}
// XPluginManager_Impl
Sequence< OUString > PluginModel::getSupportedServiceNames_Static() throw()
{
Sequence<OUString> aSNS { "com.sun.star.plugin.PluginModel" };
return aSNS;
}
static const char* aCreationURL = "URL";
static const char* aMime = "TYPE";
static ::osl::Mutex aPropertyMutex;
static css::beans::Property aProps[] =
{
css::beans::Property(
OUString::createFromAscii( aMime ),
1,
::cppu::UnoType<OUString>::get(),
css::beans::PropertyAttribute::BOUND ),
css::beans::Property(
OUString::createFromAscii( aCreationURL ),
2,
::cppu::UnoType<OUString>::get(),
css::beans::PropertyAttribute::BOUND )
};
PluginModel::PluginModel() :
BroadcasterHelperHolder( aPropertyMutex ),
OPropertySetHelper( m_aHelper ),
OPropertyArrayHelper( aProps, 2 )
{
}
PluginModel::PluginModel(const OUString& rURL, const OUString& rMimeType ) :
BroadcasterHelperHolder( aPropertyMutex ),
OPropertySetHelper( m_aHelper ),
OPropertyArrayHelper( aProps, 2 ),
m_aCreationURL( rURL ),
m_aMimeType( rMimeType )
{
}
PluginModel::~PluginModel()
{
}
Reference< css::beans::XPropertySetInfo > PluginModel::getPropertySetInfo() throw(std::exception)
{
static Reference< css::beans::XPropertySetInfo > aInfo =
createPropertySetInfo( *this );
return aInfo;
}
::cppu::IPropertyArrayHelper& PluginModel::getInfoHelper()
{
return *this;
}
sal_Bool PluginModel::convertFastPropertyValue( Any & rConvertedValue,
Any & rOldValue,
sal_Int32 nHandle,
const Any& rValue ) throw()
{
if( nHandle == 1 || nHandle == 2 )
{
if( rValue.getValueTypeClass() == TypeClass_STRING )
{
rConvertedValue = rValue;
if( nHandle == 2 )
rOldValue <<= m_aCreationURL;
else if( nHandle == 1 )
rOldValue <<= m_aMimeType;
return sal_True;
}
}
return sal_False;
}
void PluginModel::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle,
const Any& rValue )
throw(css::uno::Exception, std::exception)
{
if( rValue.getValueTypeClass() == TypeClass_STRING ) // FIXME wrong type!
{
if( nHandle == 2 )
rValue >>= m_aCreationURL;
else if( nHandle == 1 )
rValue >>= m_aMimeType;
}
else
throw css::lang::IllegalArgumentException();
}
void PluginModel::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const throw()
{
if( nHandle == 2 )
rValue <<= m_aCreationURL;
else if( nHandle == 1 )
rValue <<= m_aMimeType;
}
//---- css::lang::XComponent ----------------------------------------------------------------------------------
void PluginModel::addEventListener( const Reference< css::lang::XEventListener > & l ) throw(std::exception)
{
m_aDisposeListeners.push_back( l );
}
//---- css::lang::XComponent ----------------------------------------------------------------------------------
void PluginModel::removeEventListener( const Reference< css::lang::XEventListener > & l ) throw(std::exception)
{
m_aDisposeListeners.remove( l );
}
//---- css::lang::XComponent ----------------------------------------------------------------------------------
void PluginModel::dispose() throw(std::exception)
{
// send disposing events
css::lang::EventObject aEvt;
aEvt.Source = static_cast<cppu::OWeakObject*>(this);
::std::list< Reference< css::lang::XEventListener > > aLocalListeners = m_aDisposeListeners;
for( ::std::list< Reference< css::lang::XEventListener > >::iterator it = aLocalListeners.begin();
it != aLocalListeners.end(); ++it )
(*it)->disposing( aEvt );
m_aDisposeListeners.clear();
disposing();
}
// css::io::XPersistObject
OUString PluginModel::getServiceName() throw(std::exception)
{
return OUString("com.sun.star.plugin.PluginModel");
}
void PluginModel::write(const Reference< css::io::XObjectOutputStream > & OutStream) throw(std::exception)
{
OutStream->writeUTF( m_aCreationURL );
}
void PluginModel::read(const Reference< css::io::XObjectInputStream > & InStream) throw(std::exception)
{
m_aCreationURL = InStream->readUTF();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,95 +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.
*
************************************************************************/
#ifdef AIX
#define _LINUX_SOURCE_COMPAT
#include <sys/timer.h>
#undef _LINUX_SOURCE_COMPAT
#endif
#ifdef WNT
#include <prewin.h>
#include <postwin.h>
#endif
#include <cstdarg>
#include <plugin/impl.hxx>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/lang/XSingleServiceFactory.hpp>
#include <com/sun/star/container/XSet.hpp>
#include <com/sun/star/registry/XRegistryKey.hpp>
#include <uno/dispatcher.h>
#include <uno/mapping.hxx>
#include <cppuhelper/factory.hxx>
using namespace cppu;
extern "C" {
SAL_DLLPUBLIC_EXPORT void* SAL_CALL pl_component_getFactory(
const sal_Char* pImplementationName,
void* pXUnoSMgr,
void* /*pXUnoKey*/
)
{
void* pRet = nullptr;
OUString aImplName( OUString::createFromAscii( pImplementationName ) );
if( pXUnoSMgr )
{
Reference< css::lang::XMultiServiceFactory > xMgr(
static_cast< css::lang::XMultiServiceFactory* >( pXUnoSMgr )
);
Reference< css::lang::XSingleServiceFactory > xFactory;
if( aImplName.equals( XPluginManager_Impl::getImplementationName_Static() ) )
{
xFactory = ::cppu::createSingleFactory(
xMgr, aImplName, PluginManager_CreateInstance,
XPluginManager_Impl::getSupportedServiceNames_Static() );
}
else if( aImplName.equals( PluginModel::getImplementationName_Static() ) )
{
xFactory = ::cppu::createSingleFactory(
xMgr, aImplName, PluginModel_CreateInstance,
PluginModel::getSupportedServiceNames_Static() );
}
if( xFactory.is() )
{
xFactory->acquire();
pRet = xFactory.get();
}
}
return pRet;
}
} /* extern "C" */
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

File diff suppressed because it is too large Load Diff

View File

@@ -1,156 +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.
*
************************************************************************/
#ifndef INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_AQUA_SYSPLUG_HXX
#define INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_AQUA_SYSPLUG_HXX
#include <unistd.h>
#include <list>
#include <map>
#include <algorithm>
#include "premac.h"
#include <Carbon/Carbon.h>
#include <Security/cssmconfig.h>
#include "postmac.h"
#undef uint32
#define XP_MAC
#include "npapi.h"
#include "npsdk/npupp.h"
#include "plugin/plcom.hxx"
#include "vcl/sysdata.hxx"
#include "vcl/threadex.hxx"
#include "vcl/timer.hxx"
#include "osl/module.h"
#ifdef __OBJC__
@class NSView;
#else
class NSView;
#endif
class XPlugin_Impl;
namespace plugstringhelper
{
OUString getString( CFStringRef i_xString );
OUString getString( CFURLRef i_xURL );
CFMutableStringRef createString( const OUString& i_rString );
CFURLRef createURL( const OUString& i_rString );
OUString getURLFromPath( const OUString& i_rPath );
CFURLRef createURLFromPath( const OUString& i_rPath );
OUString CFURLtoOSLURL( CFURLRef i_xURL );
}
class MacPluginComm :
public PluginComm,
public vcl::SolarThreadExecutor
{
enum CallType {
eNPP_Destroy,
eNPP_DestroyStream,
eNPP_GetJavaClass,
eNPP_Initialize,
eNPP_New,
eNPP_NewStream,
eNPP_Print,
eNPP_SetWindow,
eNPP_Shutdown,
eNPP_StreamAsFile,
eNPP_URLNotify,
eNPP_Write,
eNPP_WriteReady,
eNPP_GetValue,
eNPP_SetValue,
eNPP_HandleEvent,
eNP_Initialize
};
void* m_aArgs[ 8 ];
CallType m_eCall;
virtual long doIt();
public:
MacPluginComm( const OUString& rMIME, const OUString& rName, NSView* pView );
virtual ~MacPluginComm();
// FIXME:
// this actually should be from the NP headers
// but currently we have too old a version
// changes this when we have updated our headers
typedef struct NP_CGContext
{
CGContextRef context;
WindowRef window;
} NP_CGContext;
public:
virtual NPError NPP_Destroy( NPP instance, NPSavedData** save );
virtual NPError NPP_DestroyStream( NPP instance, NPStream* stream, NPError reason );
virtual NPError NPP_Initialize();
virtual NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc,
char* argn[], char* argv[], NPSavedData *saved );
virtual NPError NPP_NewStream( NPP instance, NPMIMEType type, NPStream* stream,
NPBool seekable, uint16_t* stype );
virtual void NPP_Print( NPP instance, NPPrint* platformPrint );
virtual NPError NPP_SetWindow( NPP instance, NPWindow* window );
virtual void NPP_Shutdown();
virtual void NPP_StreamAsFile( NPP instance, NPStream* stream, const char* fname );
virtual void NPP_URLNotify( NPP instance, const char* url,
NPReason reason, void* notifyData );
virtual int32_t NPP_Write( NPP instance, NPStream* stream, int32_t offset,
int32_t len, void* buffer );
virtual int32_t NPP_WriteReady( NPP instance, NPStream* stream );
virtual NPError NPP_GetValue( NPP instance, NPPVariable variable, void *ret_value );
virtual int16_t NPP_HandleEvent( NPP instance, void* event );
virtual NPError NPP_SetWindow( XPlugin_Impl* );
virtual NPError NPP_Destroy( XPlugin_Impl*, NPSavedData** save );
void drawView( XPlugin_Impl* );
private:
sal_Bool retrieveFunction( const char* i_pName, void** i_ppFunc ) const;
DECL_LINK_TYPED( NullTimerHdl, Timer*, void );
private:
CFBundleRef m_xBundle;
oslModule m_hPlugLib;
NPPluginFuncs m_aNPPfuncs;
// timer for sending nullEvents
AutoTimer* m_pNullTimer;
std::list< XPlugin_Impl* > m_aNullEventClients;
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,437 +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.
*
************************************************************************/
#ifndef INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_IMPL_HXX
#define INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_IMPL_HXX
#include <config_lgpl.h>
#include <limits>
#include <memory>
#include "cppuhelper/weak.hxx"
#include "com/sun/star/awt/Key.hpp"
#include "com/sun/star/awt/KeyFunction.hpp"
#include "com/sun/star/beans/PropertyAttribute.hpp"
#include "com/sun/star/plugin/PluginMode.hpp"
#include "com/sun/star/plugin/PluginDescription.hpp"
#include "com/sun/star/plugin/PluginException.hpp"
#include "com/sun/star/plugin/PluginVariable.hpp"
#include "com/sun/star/plugin/XPlugin.hpp"
#include "com/sun/star/plugin/XPluginManager.hpp"
#include "com/sun/star/plugin/XPluginContext.hpp"
#include "com/sun/star/io/XConnectable.hpp"
#include "com/sun/star/io/XOutputStream.hpp"
#include "com/sun/star/io/XDataOutputStream.hpp"
#include "com/sun/star/io/XActiveDataControl.hpp"
#include "com/sun/star/io/XDataInputStream.hpp"
#include "com/sun/star/io/XMarkableStream.hpp"
#include "com/sun/star/io/XInputStream.hpp"
#include "com/sun/star/io/XStreamListener.hpp"
#include "com/sun/star/io/XActiveDataSink.hpp"
#include "com/sun/star/io/XActiveDataSource.hpp"
#include "com/sun/star/lang/XServiceName.hpp"
#include "com/sun/star/lang/XServiceInfo.hpp"
#include "com/sun/star/lang/XMultiServiceFactory.hpp"
#include "com/sun/star/lang/XSingleServiceFactory.hpp"
#include "com/sun/star/awt/GradientStyle.hpp"
#include "com/sun/star/awt/RasterOperation.hpp"
#include "com/sun/star/awt/Gradient.hpp"
#include "com/sun/star/awt/XGraphics.hpp"
#include <com/sun/star/uno/XComponentContext.hpp>
#include "cppuhelper/implbase2.hxx"
#include "cppuhelper/implbase1.hxx"
#include <list>
#ifdef WNT
#include <plugin/win/sysplug.hxx>
#elif defined(MACOSX)
#include "plugin/aqua/sysplug.hxx"
#elif defined(UNX)
#include "plugin/unx/sysplug.hxx"
#endif
struct SysPlugData;
std::shared_ptr<SysPlugData> CreateSysPlugData();
extern "C" {
void /*SAL_CALL NP_LOADDS*/ NPN_ForceRedraw_Impl(NPP instance);
NPError /*SAL_CALL NP_LOADDS*/ NPN_SetValue_Impl( NPP instance,
NPPVariable variable,
void* value );
} // extern "C"
#include "plugin/plctrl.hxx"
#include "plugin/model.hxx"
#include "vcl/sysdata.hxx"
#include "vcl/syschild.hxx"
#include "tools/link.hxx"
#include "tools/stream.hxx"
using namespace com::sun::star::uno;
#define PROVIDING_NONE 0
#define PROVIDING_NOW 1
#define PROVIDING_MODEL_UPDATE 2
// forwards
namespace ucbhelper { class Content; }
class PluginStream;
class PluginInputStream;
class PluginOutputStream;
class XPlugin_Impl;
class PluginDisposer;
class PluginEventListener;
class XPlugin_Impl : public css::plugin::XPlugin,
public PluginControl_Impl,
public css::beans::XPropertyChangeListener
{
private:
::osl::Mutex m_aMutex;
Reference< css::lang::XMultiServiceFactory > m_xSMgr;
Reference< css::plugin::XPluginContext > m_rBrowserContext;
PluginComm* m_pPluginComm;
NPP_t m_aInstance;
NPWindow m_aNPWindow;
std::shared_ptr<SysPlugData> m_pSysPlugData;
rtl_TextEncoding m_aEncoding;
const char** m_pArgv;
const char** m_pArgn;
int m_nArgs;
OString m_aLastGetUrl;
Reference< css::awt::XControlModel > m_xModel;
css::plugin::PluginDescription m_aDescription;
sal_Int16 m_aPluginMode;
int m_nProvidingState;
int m_nCalledFromPlugin;
PluginDisposer* m_pDisposer;
::std::list<PluginInputStream*> m_aInputStreams;
::std::list<PluginOutputStream*> m_aOutputStreams;
::std::list<PluginEventListener*> m_aPEventListeners;
OUString m_aURL;
bool m_bIsDisposed;
#ifdef MACOSX
void SetSysPlugDataParentView(SystemEnvData const& rEnvData);
#endif
void prependArg( const char* pName, const char* pValue ); // arguments will be strdup'ed
void initArgs( const Sequence< OUString >& argn,
const Sequence< OUString >& argv,
sal_Int16 mode );
void freeArgs();
void handleSpecialArgs();
void loadPlugin();
void destroyInstance();
void modelChanged();
public:
XPlugin_Impl( const Reference< css::lang::XMultiServiceFactory > & rSMgr );
virtual ~XPlugin_Impl();
::osl::Mutex& getMutex() { return m_aMutex; }
void destroyStreams();
void setLastGetUrl( const OString& rUrl ) { m_aLastGetUrl = rUrl; }
css::plugin::PluginDescription fitDescription( const OUString& rURL );
::std::list<PluginInputStream*>& getInputStreams() { return m_aInputStreams; }
::std::list<PluginOutputStream*>& getOutputStreams() { return m_aOutputStreams; }
PluginComm* getPluginComm() { return m_pPluginComm; }
void setPluginComm( PluginComm* comm )
{
if( ! m_pPluginComm )
{
m_pPluginComm = comm;
m_pPluginComm->addRef();
}
}
Reference< css::lang::XMultiServiceFactory > getServiceManager() { return m_xSMgr; }
const css::plugin::PluginDescription& getDescription() const { return m_aDescription; }
rtl_TextEncoding getTextEncoding() { return m_aEncoding; }
NPP_t& getNPPInstance() { return m_aInstance; }
NPWindow& getNPWindow() { return m_aNPWindow; }
void enterPluginCallback() { m_nCalledFromPlugin++; }
void leavePluginCallback() { m_nCalledFromPlugin--; }
bool isDisposable() { return m_nCalledFromPlugin < 1; }
DECL_LINK_TYPED( secondLevelDispose, void*, void );
void addPluginEventListener( PluginEventListener* pListener )
{ m_aPEventListeners.push_back( pListener ); }
void checkListeners( const char* normalizedURL );
void initInstance(
const css::plugin::PluginDescription& rDescription,
const Sequence< OUString >& argn,
const Sequence< OUString >& argv,
sal_Int16 mode );
void initInstance(
const OUString& rURL,
const Sequence< OUString >& argn,
const Sequence< OUString >& argv,
sal_Int16 mode );
const OUString& getRefererURL() { return m_aURL; }
OUString getCreationURL();
PluginStream* getStreamFromNPStream( NPStream* );
const SystemEnvData* getSysChildSysData()
{ return _pSysChild->GetSystemData(); }
const Reference< css::plugin::XPluginContext > & getPluginContext() const
{ return m_rBrowserContext; }
void setPluginContext( const Reference< css::plugin::XPluginContext > & );
// XInterface
virtual Any SAL_CALL queryInterface( const Type& ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL acquire() throw() override
{ OWeakAggObject::acquire(); }
virtual void SAL_CALL release() throw() override
{ OWeakAggObject::release(); }
// OWeakAggObject
virtual Any SAL_CALL queryAggregation( const Type& )
throw( css::uno::RuntimeException, std::exception ) override;
// PluginContol_Impl
virtual void SAL_CALL dispose() throw(std::exception) override;
virtual void SAL_CALL createPeer( const Reference< css::awt::XToolkit > & xToolkit, const Reference< css::awt::XWindowPeer > & Parent) throw( RuntimeException, std::exception ) override;
virtual sal_Bool SAL_CALL setModel( const Reference< css::awt::XControlModel > & Model ) throw( RuntimeException, std::exception ) override;
virtual Reference< css::awt::XControlModel > SAL_CALL getModel()throw( RuntimeException, std::exception ) override
{ return m_xModel; }
virtual void SAL_CALL setPosSize( sal_Int32 nX_, sal_Int32 nY_, sal_Int32 nWidth_, sal_Int32 nHeight_, sal_Int16 nFlags ) throw( RuntimeException, std::exception ) override;
// css::plugin::XPlugin
virtual sal_Bool SAL_CALL provideNewStream(const OUString& mimetype, const Reference< css::io::XActiveDataSource > & stream, const OUString& url, sal_Int32 length, sal_Int32 lastmodified, sal_Bool isfile) throw(std::exception) override;
// css::beans::XPropertyChangeListener
virtual void SAL_CALL disposing( const css::lang::EventObject& rSource ) throw(std::exception) override;
virtual void SAL_CALL propertyChange(const css::beans::PropertyChangeEvent& rEvent)
throw (css::uno::RuntimeException, std::exception) override;
};
class PluginManager
{
private:
Reference< css::lang::XMultiServiceFactory > m_xSMgr;
::std::list<PluginComm*> m_aPluginComms;
::std::list<XPlugin_Impl*> m_aAllPlugins;
::osl::Mutex m_aPluginMutex;
static PluginManager* pManager;
PluginManager();
public:
static PluginManager& get();
static void setServiceFactory( const Reference< css::lang::XMultiServiceFactory >& xFactory );
static const Sequence< OUString >& getAdditionalSearchPaths();
::std::list<PluginComm*>& getPluginComms() { return m_aPluginComms; }
::std::list<XPlugin_Impl*>& getPlugins() { return m_aAllPlugins; }
::osl::Mutex& getPluginMutex() { return m_aPluginMutex; }
};
class XPluginManager_Impl :
public cppu::WeakAggImplHelper2< css::plugin::XPluginManager,
css::lang::XServiceInfo >
{
Reference< css::uno::XComponentContext > m_xContext;
public:
XPluginManager_Impl( const Reference< css::uno::XComponentContext > & );
virtual ~XPluginManager_Impl();
static XPlugin_Impl* getXPluginFromNPP( NPP );
static XPlugin_Impl* getPluginImplementation( const Reference< css::plugin::XPlugin >& plugin );
virtual Reference< css::plugin::XPluginContext > SAL_CALL createPluginContext() throw(std::exception) override;
// has to be implemented per system
static Sequence< css::plugin::PluginDescription > SAL_CALL impl_getPluginDescriptions() throw(css::uno::RuntimeException, std::exception);
// calls system specific impl_getPluginDescriptions
// checks whether plugins are disabled
virtual Sequence< css::plugin::PluginDescription > SAL_CALL getPluginDescriptions()
throw (css::uno::RuntimeException, std::exception) override;
virtual Reference< css::plugin::XPlugin > SAL_CALL createPlugin( const Reference< css::plugin::XPluginContext > & acontext, sal_Int16 mode, const Sequence< OUString >& argn, const Sequence< OUString >& argv, const css::plugin::PluginDescription& plugintype) throw( RuntimeException,css::plugin::PluginException, std::exception ) override;
virtual Reference< css::plugin::XPlugin > SAL_CALL createPluginFromURL( const Reference< css::plugin::XPluginContext > & acontext, sal_Int16 mode, const Sequence< OUString >& argn, const Sequence< OUString >& argv, const Reference< css::awt::XToolkit > & toolkit, const Reference< css::awt::XWindowPeer > & parent, const OUString& url ) throw (css::uno::RuntimeException, std::exception) override;
virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw() override;
virtual OUString SAL_CALL getImplementationName() throw() override;
Sequence< OUString > SAL_CALL getSupportedServiceNames() throw( ) override;
static Sequence< OUString > getSupportedServiceNames_Static() throw( );
static OUString getImplementationName_Static() throw( )
{
/** the soplayer uses this name in its source! maybe not after 5.2 */
return OUString( "com.sun.star.extensions.PluginManager" );
}
};
Reference< XInterface > SAL_CALL PluginManager_CreateInstance( const Reference< css::lang::XMultiServiceFactory > & ) throw( Exception );
enum PluginStreamType { InputStream, OutputStream };
class PluginStream
{
protected:
css::uno::WeakReference<css::uno::XInterface> m_wPlugin;
XPlugin_Impl* m_pPlugin;
NPStream m_aNPStream;
public:
PluginStream( XPlugin_Impl* pPlugin,
const char* url, sal_uInt32 len, sal_uInt32 lastmod );
virtual ~PluginStream();
NPStream& getStream() { return m_aNPStream; }
virtual PluginStreamType getStreamType() = 0;
};
class PluginInputStream :
public PluginStream,
public cppu::WeakAggImplHelper2<
css::io::XOutputStream,
css::io::XConnectable
>
{
private:
::ucbhelper::Content* m_pContent;
sal_Int32 m_nMode;
sal_uInt32 m_nWritePos;
Reference< css::io::XActiveDataSource > m_xSource;
// hold a reference on input until closeOutput is called
Reference< css::io::XConnectable > m_xPredecessor;
Reference< css::io::XConnectable > m_xSuccessor;
// needed to hold a reference to self in NP_SEEK mode
Reference< css::io::XOutputStream > m_xSelf;
SvFileStream m_aFileStream;
public:
PluginInputStream( XPlugin_Impl* pPlugin,
const char* url, sal_uInt32 len, sal_uInt32 lastmod );
PluginInputStream() : PluginStream( nullptr, nullptr, 0, 0 ) {}
virtual ~PluginInputStream();
virtual PluginStreamType getStreamType() override;
void setMode( sal_Int32 nMode );
sal_uInt32 read( sal_uInt32 offset, sal_Int8* buffer, sal_uInt32 size );
void setSource( const Reference< css::io::XActiveDataSource >& xSource ) { m_xSource = xSource; }
// get contents ot url via ucbhelper::Content
void load();
// clear reference
bool releaseSelf()
{ bool bRet = m_xSelf.is(); m_xSelf.clear(); return bRet; }
// XOutputStream
virtual void SAL_CALL writeBytes( const Sequence<sal_Int8>& ) throw(std::exception) override;
virtual void SAL_CALL flush() throw(std::exception) override;
virtual void SAL_CALL closeOutput() throw(std::exception) override;
// XConnectable
virtual void SAL_CALL setPredecessor( const Reference< css::io::XConnectable >& xPredecessor ) throw(std::exception) override
{ m_xPredecessor = xPredecessor; }
virtual Reference< css::io::XConnectable > SAL_CALL getPredecessor() throw(std::exception) override
{ return m_xPredecessor; }
virtual void SAL_CALL setSuccessor( const Reference< css::io::XConnectable >& xSuccessor ) throw(std::exception) override
{ m_xSuccessor = xSuccessor; }
virtual Reference< css::io::XConnectable > SAL_CALL getSuccessor() throw(std::exception) override
{ return m_xSuccessor; }
};
class PluginOutputStream : public PluginStream
{
private:
Reference< css::io::XOutputStream > m_xStream;
public:
PluginOutputStream( XPlugin_Impl* pPlugin, const char* url,
sal_uInt32 len, sal_uInt32 lastmod );
virtual ~PluginOutputStream();
virtual PluginStreamType getStreamType() override;
Reference< css::io::XOutputStream > & getOutputStream() { return m_xStream; }
};
class PluginEventListener :
public cppu::WeakAggImplHelper1< css::lang::XEventListener >
{
private:
XPlugin_Impl* m_pPlugin;
Reference< css::plugin::XPlugin > m_xPlugin; // just to hold the plugin
char* m_pUrl;
char* m_pNormalizedUrl;
void* m_pNotifyData;
public:
PluginEventListener( XPlugin_Impl*,
const char* url,
const char* normurl,
void* notifyData );
virtual ~PluginEventListener();
const char* getURL() { return m_pUrl; }
const char* getNormalizedURL() { return m_pNormalizedUrl; }
void* getNotifyData() { return m_pNotifyData; }
// css::lang::XEventListener
virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) throw(std::exception) override;
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,132 +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.
*
************************************************************************/
#ifndef INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_MODEL_HXX
#define INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_MODEL_HXX
#include <com/sun/star/io/XObjectInputStream.hpp>
#include <com/sun/star/io/XPersistObject.hpp>
#include <com/sun/star/io/XObjectOutputStream.hpp>
#include <com/sun/star/lang/XServiceName.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/lang/XSingleServiceFactory.hpp>
#include <com/sun/star/awt/XControlModel.hpp>
#include <com/sun/star/awt/XControl.hpp>
#include <cppuhelper/propshlp.hxx>
#include <cppuhelper/weakagg.hxx>
#include <rtl/alloc.h>
#include <list>
using namespace com::sun::star::uno;
class BroadcasterHelperHolder
{
protected:
::cppu::OBroadcastHelper m_aHelper;
public:
BroadcasterHelperHolder( osl::Mutex& rMutex ) :
m_aHelper( rMutex ) {}
~BroadcasterHelperHolder() {}
};
class PluginModel : public BroadcasterHelperHolder,
public cppu::OPropertySetHelper,
public cppu::OPropertyArrayHelper,
public cppu::OWeakAggObject,
public css::lang::XComponent,
public css::io::XPersistObject,
public css::awt::XControlModel
{
private:
OUString m_aCreationURL;
OUString m_aMimeType;
std::list< Reference< css::lang::XEventListener > >
m_aDisposeListeners;
public:
// these are here to force memory de/allocation to sal lib.
static void * SAL_CALL operator new( size_t nSize ) throw()
{ return rtl_allocateMemory( nSize ); }
static void SAL_CALL operator delete( void * pMem ) throw()
{ rtl_freeMemory( pMem ); }
PluginModel();
PluginModel( const OUString& rURL, const OUString& rMimeType );
virtual ~PluginModel();
// XInterface
virtual Any SAL_CALL queryInterface( const Type& rType ) throw( css::uno::RuntimeException, std::exception ) override
{ return OWeakAggObject::queryInterface( rType ); }
virtual void SAL_CALL acquire() throw() override
{ OWeakAggObject::acquire(); }
virtual void SAL_CALL release() throw() override
{ OWeakAggObject::release(); }
virtual Any SAL_CALL queryAggregation( const Type& ) throw( css::uno::RuntimeException, std::exception ) override;
// css::lang::XTypeProvider
static Sequence< OUString > SAL_CALL getSupportedServiceNames_Static() throw( );
static OUString SAL_CALL getImplementationName_Static() throw( )
{
/** the soplayer uses this name in its source! maybe not after 5.2 */
return OUString( "com.sun.star.extensions.PluginModel" );
}
// OPropertySetHelper
virtual cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper() override;
virtual sal_Bool SAL_CALL convertFastPropertyValue( Any & rConvertedValue,
Any & rOldValue,
sal_Int32 nHandle,
const Any& rValue ) throw() override;
virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle,
const Any& rValue )
throw(css::uno::Exception, std::exception) override;
virtual void SAL_CALL getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const throw() override;
virtual Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() throw(std::exception) override;
// css::io::XPersistObject
virtual OUString SAL_CALL getServiceName() throw(std::exception) override;
virtual void SAL_CALL write(const Reference< css::io::XObjectOutputStream > & OutStream) throw(std::exception) override;
virtual void SAL_CALL read(const Reference< css::io::XObjectInputStream > & InStream) throw(std::exception) override;
// css::lang::XComponent
virtual void SAL_CALL addEventListener( const Reference< css::lang::XEventListener > & l ) throw(std::exception) override;
virtual void SAL_CALL removeEventListener( const Reference< css::lang::XEventListener > & l ) throw(std::exception) override;
virtual void SAL_CALL dispose() throw(std::exception) override;
private:
using cppu::OPropertySetHelper::getFastPropertyValue;
};
Reference< XInterface > SAL_CALL PluginModel_CreateInstance( const Reference< css::lang::XMultiServiceFactory > & ) throw( Exception );
#endif // INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_MODEL_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,169 +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.
*
************************************************************************/
#ifndef INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_MULTIPLX_HXX
#define INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_MULTIPLX_HXX
#include <com/sun/star/awt/XControl.hpp>
#include <com/sun/star/awt/XKeyListener.hpp>
#include <com/sun/star/awt/XPaintListener.hpp>
#include <com/sun/star/awt/KeyEvent.hpp>
#include <com/sun/star/awt/KeyModifier.hpp>
#include <com/sun/star/awt/XMouseMotionListener.hpp>
#include <com/sun/star/awt/FocusEvent.hpp>
#include <com/sun/star/awt/XWindowListener.hpp>
#include <com/sun/star/awt/XActivateListener.hpp>
#include <com/sun/star/awt/MouseEvent.hpp>
#include <com/sun/star/awt/XTopWindowListener.hpp>
#include <com/sun/star/awt/PaintEvent.hpp>
#include <com/sun/star/awt/InputEvent.hpp>
#include <com/sun/star/awt/KeyGroup.hpp>
#include <com/sun/star/awt/Key.hpp>
#include <com/sun/star/awt/WindowEvent.hpp>
#include <com/sun/star/awt/XMouseListener.hpp>
#include <com/sun/star/awt/KeyFunction.hpp>
#include <com/sun/star/awt/FocusChangeReason.hpp>
#include <com/sun/star/awt/MouseButton.hpp>
#include <com/sun/star/awt/XFocusListener.hpp>
#include <com/sun/star/awt/XTopWindow.hpp>
#include <com/sun/star/awt/XWindow.hpp>
#include <com/sun/star/awt/PosSize.hpp>
#include <cppuhelper/implbase7.hxx>
#include <cppuhelper/interfacecontainer.hxx>
using namespace com::sun::star::uno;
struct MRCListenerMultiplexerHelper_Mutex
{
::osl::Mutex aMutex;
};
class MRCListenerMultiplexerHelper :
public MRCListenerMultiplexerHelper_Mutex,
public ::cppu::WeakAggImplHelper7<
css::awt::XFocusListener,
css::awt::XWindowListener,
css::awt::XKeyListener,
css::awt::XMouseListener,
css::awt::XMouseMotionListener,
css::awt::XPaintListener,
css::awt::XTopWindowListener >
{
public:
/**
* Create a Multiplexer of XWindowEvents.
*
* @param rControl The control. All listeners think that this is the original
* broadcaster.
* @param rPeer The peer from which the original events are dispatched. Null is
* allowed.
*/
MRCListenerMultiplexerHelper( const Reference< css::awt::XWindow > & rControl, const Reference< css::awt::XWindow > & rPeer );
/**
* Remove all listeners from the previous set peer and add the needed listeners to rPeer.
* @param rPeer The peer from which the original events are dispatched. Null is
* allowed.
*/
void setPeer( const Reference< css::awt::XWindow > & rPeer );
/**
* Remove all listeners and send a disposing message.
*/
void disposeAndClear();
/**
* Add the specified listener to the source.
*/
void advise( const Type& type, const Reference< XInterface > & listener);
/**
* Remove the specified listener from the source.
*/
void unadvise(const Type& type, const Reference< XInterface > & listener);
// css::lang::XEventListener
void SAL_CALL disposing(const css::lang::EventObject& Source) throw(std::exception) override;
// css::awt::XFocusListener
void SAL_CALL focusGained(const css::awt::FocusEvent& e) throw(std::exception) override;
void SAL_CALL focusLost(const css::awt::FocusEvent& e) throw(std::exception) override;
// css::awt::XWindowListener
void SAL_CALL windowResized(const css::awt::WindowEvent& e) throw(std::exception) override;
void SAL_CALL windowMoved(const css::awt::WindowEvent& e) throw(std::exception) override;
void SAL_CALL windowShown(const css::lang::EventObject& e) throw(std::exception) override;
void SAL_CALL windowHidden(const css::lang::EventObject& e) throw(std::exception) override;
// css::awt::XKeyListener
void SAL_CALL keyPressed( const css::awt::KeyEvent& e ) throw(std::exception) override;
void SAL_CALL keyReleased( const css::awt::KeyEvent& e ) throw(std::exception) override;
// css::awt::XMouseListener
void SAL_CALL mousePressed(const css::awt::MouseEvent& e) throw(std::exception) override;
void SAL_CALL mouseReleased(const css::awt::MouseEvent& e) throw(std::exception) override;
void SAL_CALL mouseEntered(const css::awt::MouseEvent& e) throw(std::exception) override;
void SAL_CALL mouseExited(const css::awt::MouseEvent& e) throw(std::exception) override;
// css::awt::XMouseMotionListener
void SAL_CALL mouseDragged(const css::awt::MouseEvent& e) throw(std::exception) override;
void SAL_CALL mouseMoved(const css::awt::MouseEvent& e) throw(std::exception) override;
// css::awt::XPaintListener
void SAL_CALL windowPaint(const css::awt::PaintEvent& e) throw(std::exception) override;
// css::awt::XTopWindowListener
void SAL_CALL windowOpened( const css::lang::EventObject& e ) throw(std::exception) override;
void SAL_CALL windowClosing( const css::lang::EventObject& e ) throw(std::exception) override;
void SAL_CALL windowClosed( const css::lang::EventObject& e ) throw(std::exception) override;
void SAL_CALL windowMinimized( const css::lang::EventObject& e ) throw(std::exception) override;
void SAL_CALL windowNormalized( const css::lang::EventObject& e ) throw(std::exception) override;
void SAL_CALL windowActivated( const css::lang::EventObject& e ) throw(std::exception) override;
void SAL_CALL windowDeactivated( const css::lang::EventObject& e ) throw(std::exception) override;
protected:
/**
* Remove the listener with the uik rUik from the peer rPeer.
* @param rPeer the peer from which the listener is removed.
* @param rUik the listener uik, which specify the type of the listener.
*/
void adviseToPeer( const Reference< css::awt::XWindow > & rPeer, const Type & type );
/**
* Add the listener with the uik rUik to the peer rPeer.
* @param rPeer the peer to which the listener is added.
* @param rUik the listener uik, which specify the type of the listener.
*/
void unadviseFromPeer( const Reference< css::awt::XWindow > & rPeer, const Type & type );
private:
/** The source of the events. Normally this is the peer object.*/
Reference< css::awt::XWindow > xPeer;
WeakReference< css::awt::XControl > xControl;
::cppu::OMultiTypeInterfaceContainerHelper aListenerHolder;
MRCListenerMultiplexerHelper( const MRCListenerMultiplexerHelper & ) = delete;
MRCListenerMultiplexerHelper & operator = ( const MRCListenerMultiplexerHelper & ) = delete;
};
#endif // INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_MULTIPLX_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,80 +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.
*
************************************************************************/
#ifndef INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_PLCOM_HXX
#define INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_PLCOM_HXX
#include <list>
class XPlugin_Impl;
class PluginComm
{
protected:
int m_nRefCount;
OString m_aLibName;
std::list< OUString > m_aFilesToDelete;
public:
PluginComm( const OString& rLibName, bool bReusable = true );
virtual ~PluginComm();
void addRef() { m_nRefCount++; }
void decRef() { m_nRefCount--; if( ! m_nRefCount ) delete this; }
const OString& getLibName() { return m_aLibName; }
void addFileToDelete( const OUString& filename )
{ m_aFilesToDelete.push_back( filename ); }
virtual NPError NPP_Destroy( NPP instance, NPSavedData** save ) = 0;
virtual NPError NPP_DestroyStream( NPP instance, NPStream* stream,
NPError reason ) = 0;
virtual NPError NPP_Initialize() = 0;
virtual NPError NPP_New( NPMIMEType pluginType, NPP instance,
uint16_t mode, int16_t argc,
char* argn[], char* argv[],
NPSavedData *saved ) = 0;
virtual NPError NPP_NewStream( NPP instance, NPMIMEType type,
NPStream* stream,
NPBool seekable, uint16_t* stype ) = 0;
virtual NPError NPP_SetWindow( NPP instance, NPWindow* window ) = 0;
virtual void NPP_Shutdown() = 0;
virtual void NPP_StreamAsFile( NPP instance, NPStream* stream,
const char* fname ) = 0;
virtual void NPP_URLNotify( NPP instance, const char* url,
NPReason reason, void* notifyData ) = 0;
virtual int32_t NPP_Write( NPP instance, NPStream* stream, int32_t offset,
int32_t len, void* buffer ) = 0;
virtual int32_t NPP_WriteReady( NPP instance, NPStream* stream ) = 0;
NPError NPP_SetWindow( XPlugin_Impl* );
NPError NPP_Destroy( XPlugin_Impl*, NPSavedData** save );
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,181 +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.
*
************************************************************************/
#ifndef INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_PLCTRL_HXX
#define INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_PLCTRL_HXX
#include <cppuhelper/weak.hxx>
#include <plugin/multiplx.hxx>
#include <com/sun/star/beans/PropertyValues.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/beans/PropertyState.hpp>
#include <com/sun/star/beans/XPropertySetInfo.hpp>
#include <com/sun/star/beans/XMultiPropertySet.hpp>
#include <com/sun/star/beans/XFastPropertySet.hpp>
#include <com/sun/star/beans/XVetoableChangeListener.hpp>
#include <com/sun/star/beans/XPropertyState.hpp>
#include <com/sun/star/beans/XPropertyStateChangeListener.hpp>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/beans/XPropertiesChangeListener.hpp>
#include <com/sun/star/beans/XPropertyChangeListener.hpp>
#include <com/sun/star/beans/XPropertyAccess.hpp>
#include <com/sun/star/beans/XPropertyContainer.hpp>
#include <com/sun/star/beans/PropertyStateChangeEvent.hpp>
#include <com/sun/star/beans/PropertyChangeEvent.hpp>
#include <com/sun/star/awt/XVclContainerPeer.hpp>
#include <com/sun/star/awt/XVclWindowPeer.hpp>
#include <com/sun/star/awt/XControlModel.hpp>
#include <com/sun/star/awt/XUnoControlContainer.hpp>
#include <com/sun/star/awt/XControlContainer.hpp>
#include <com/sun/star/awt/VclWindowPeerAttribute.hpp>
#include <com/sun/star/awt/XVclContainer.hpp>
#include <com/sun/star/awt/XControl.hpp>
#include <com/sun/star/awt/XTopWindow.hpp>
#include <com/sun/star/awt/XWindow.hpp>
#include <com/sun/star/awt/PosSize.hpp>
#include <cppuhelper/implbase4.hxx>
#include <vcl/vclptr.hxx>
#include <list>
class SystemChildWindow;
class PluginControl_Impl : public ::cppu::WeakAggImplHelper4<
css::awt::XControl,
css::awt::XWindow,
css::awt::XFocusListener,
css::awt::XView >
{
public:
// css::awt::XControl
virtual void SAL_CALL setContext( const css::uno::Reference< css::uno::XInterface > & xContext ) throw( css::uno::RuntimeException, std::exception ) override
{ _xContext = xContext; }
virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getContext() throw( css::uno::RuntimeException, std::exception ) override
{ return _xContext; }
virtual sal_Bool SAL_CALL setModel( const css::uno::Reference< css::awt::XControlModel > & Model ) throw( css::uno::RuntimeException, std::exception ) override = 0;
virtual css::uno::Reference< css::awt::XControlModel > SAL_CALL getModel() throw( css::uno::RuntimeException, std::exception ) override = 0;
virtual css::uno::Reference< css::awt::XView > SAL_CALL getView() throw( css::uno::RuntimeException, std::exception ) override
{ return static_cast<css::awt::XView*>(this); }
virtual sal_Bool SAL_CALL isTransparent() throw( css::uno::RuntimeException, std::exception ) override
{ return sal_False; }
virtual void SAL_CALL setDesignMode( sal_Bool bOn ) throw( css::uno::RuntimeException, std::exception ) override;
virtual sal_Bool SAL_CALL isDesignMode() throw( css::uno::RuntimeException, std::exception ) override
{ return _bInDesignMode; }
virtual void SAL_CALL createPeer( const css::uno::Reference< css::awt::XToolkit > & xToolkit, const css::uno::Reference< css::awt::XWindowPeer > & Parent) throw( css::uno::RuntimeException, std::exception ) override;
virtual css::uno::Reference< css::awt::XWindowPeer > SAL_CALL getPeer() throw( css::uno::RuntimeException, std::exception ) override
{ return _xPeer; }
// css::awt::XWindow
virtual void SAL_CALL setVisible( sal_Bool bVisible ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL setEnable( sal_Bool bEnable ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL setFocus() throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL setPosSize( sal_Int32 nX_, sal_Int32 nY_, sal_Int32 nWidth_, sal_Int32 nHeight_, sal_Int16 nFlags ) throw( css::uno::RuntimeException, std::exception ) override;
virtual css::awt::Rectangle SAL_CALL getPosSize() throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL addWindowListener( const css::uno::Reference< css::awt::XWindowListener > & l ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL removeWindowListener( const css::uno::Reference< css::awt::XWindowListener > & l ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL addFocusListener( const css::uno::Reference< css::awt::XFocusListener > & l ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL removeFocusListener( const css::uno::Reference< css::awt::XFocusListener > & l ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL addKeyListener( const css::uno::Reference< css::awt::XKeyListener > & l ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL removeKeyListener( const css::uno::Reference< css::awt::XKeyListener > & l ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL addMouseListener( const css::uno::Reference< css::awt::XMouseListener > & l ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL removeMouseListener( const css::uno::Reference< css::awt::XMouseListener > & l ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL addMouseMotionListener( const Reference< css::awt::XMouseMotionListener > & l ) throw( RuntimeException, std::exception ) override;
virtual void SAL_CALL removeMouseMotionListener( const css::uno::Reference< css::awt::XMouseMotionListener > & l ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL addPaintListener( const css::uno::Reference< css::awt::XPaintListener > & l ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL removePaintListener( const css::uno::Reference< css::awt::XPaintListener > & l ) throw( css::uno::RuntimeException, std::exception ) override;
// css::lang::XEventListener
virtual void SAL_CALL disposing( const css::lang::EventObject & rSource ) throw( css::uno::RuntimeException, std::exception ) override;
// css::awt::XFocusListener
virtual void SAL_CALL focusGained( const css::awt::FocusEvent & rEvt ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL focusLost( const css::awt::FocusEvent & rEvt ) throw( css::uno::RuntimeException, std::exception ) override;
// css::lang::XComponent
virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener > & l ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener > & l ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL dispose() throw( css::uno::RuntimeException, std::exception ) override;
// css::awt::XView
virtual sal_Bool SAL_CALL setGraphics( const css::uno::Reference< css::awt::XGraphics > & /*aDevice*/ ) throw( css::uno::RuntimeException, std::exception ) override
{ return sal_False; }
virtual css::uno::Reference< css::awt::XGraphics > SAL_CALL getGraphics() throw( css::uno::RuntimeException, std::exception ) override
{ return css::uno::Reference< css::awt::XGraphics > (); }
virtual css::awt::Size SAL_CALL getSize() throw( css::uno::RuntimeException, std::exception ) override
{ return css::awt::Size(_nWidth, _nHeight); }
virtual void SAL_CALL draw( sal_Int32 x, sal_Int32 y ) throw( css::uno::RuntimeException, std::exception ) override;
virtual void SAL_CALL setZoom( float ZoomX, float ZoomY ) throw( css::uno::RuntimeException, std::exception ) override;
public:
PluginControl_Impl();
virtual ~PluginControl_Impl();
MRCListenerMultiplexerHelper* getMultiplexer();
protected:
void releasePeer();
protected:
::std::list< Reference< css::lang::XEventListener > > _aDisposeListeners;
MRCListenerMultiplexerHelper* _pMultiplexer;
Reference< XInterface > _xContext;
sal_Int32 _nX;
sal_Int32 _nY;
sal_Int32 _nWidth;
sal_Int32 _nHeight;
sal_Int16 _nFlags;
bool _bVisible;
bool _bInDesignMode;
bool _bEnable;
VclPtr<SystemChildWindow> _pSysChild;
css::uno::Reference< css::awt::XWindowPeer > _xPeer;
css::uno::Reference< css::awt::XWindow > _xPeerWindow;
css::uno::Reference< css::awt::XWindow > _xParentWindow;
css::uno::Reference< css::awt::XWindowPeer > _xParentPeer;
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,147 +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.
*
************************************************************************/
#ifndef INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_UNX_MEDIATOR_HXX
#define INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_UNX_MEDIATOR_HXX
#include <string.h>
#include <tools/link.hxx>
#include <tools/solar.h>
#include <osl/pipe.hxx>
#include <osl/mutex.hxx>
#include <osl/conditn.hxx>
#include <osl/thread.hxx>
#include <vector>
struct MediatorMessage
{
sal_uLong m_nID;
sal_uLong m_nBytes;
char* m_pBytes;
char* m_pRun;
MediatorMessage() : m_nID( 0 ), m_nBytes( 0 ),
m_pBytes( nullptr ), m_pRun( nullptr ) {}
MediatorMessage( sal_uLong nID, sal_uLong nBytes, char* pBytes ) :
m_nID( nID ),m_nBytes( nBytes ), m_pRun( nullptr )
{
m_pBytes = new char[ m_nBytes ];
memcpy( m_pBytes, pBytes, (size_t)m_nBytes );
}
~MediatorMessage()
{
if( m_pBytes )
delete [] m_pBytes;
}
sal_uLong ExtractULONG();
char* GetString();
sal_uInt32 GetUINT32();
void* GetBytes( sal_uLong& );
void* GetBytes() { sal_uLong nBytes; return GetBytes( nBytes ); }
};
class MediatorListener;
class Mediator
{
friend class MediatorListener;
protected:
int m_nSocket;
std::vector<MediatorMessage*> m_aMessageQueue;
osl::Mutex m_aQueueMutex;
osl::Mutex m_aSendMutex;
// only one thread can send a message at any given time
osl::Condition m_aNewMessageCdtn;
MediatorListener* m_pListener;
// thread to fill the queue
sal_uLong m_nCurrentID;
// will be constantly increased with each message sent
bool m_bValid;
Link<Mediator*,void> m_aConnectionLostHdl;
Link<Mediator*,void> m_aNewMessageHdl;
public:
Mediator( int nSocket );
virtual ~Mediator();
// mark mediator as invalid. No more messages will be processed,
// SendMessage, WaitForMessage, TransactMessage will return immediately
// with error
void invalidate() { m_bValid = false; }
sal_uLong SendMessage( sal_uLong nBytes, const char* pBytes, sal_uLong nMessageID = 0 );
bool WaitForMessage( sal_uLong nTimeOut = 5000 );
// timeout in ms
// TRUE: Message came in
// FALSE: timed out
// if timeout is set, WaitForMessage will wait even if there are messages
// in the queue
virtual MediatorMessage* WaitForAnswer( sal_uLong nMessageID );
// wait for an answer message ( ID >= 1 << 24 )
// the message will be removed from the queue and returned
MediatorMessage* TransactMessage( sal_uLong nBytes, char* pBytes );
// sends a message and waits for an answer
MediatorMessage* GetNextMessage( bool bWait = false );
void SetConnectionLostHdl( const Link<Mediator*,void>& rLink )
{
m_aConnectionLostHdl = rLink;
}
void SetNewMessageHdl( const Link<Mediator*,void>& rLink )
{
m_aNewMessageHdl = rLink;
}
};
class MediatorListener : public osl::Thread
{
friend class Mediator;
private:
Mediator* m_pMediator;
::osl::Mutex m_aMutex;
MediatorListener( Mediator* );
virtual ~MediatorListener();
virtual void run() override;
virtual void onTerminated() override;
};
#endif // INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_UNX_MEDIATOR_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,206 +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.
*
************************************************************************/
#ifndef INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_UNX_PLUGCON_HXX
#define INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_UNX_PLUGCON_HXX
#include <stdarg.h>
#include <string.h>
#include <list>
#include <vector>
#include <plugin/unx/mediator.hxx>
#include <prex.h>
#include <X11/Xlib.h>
extern "C" {
#include <X11/Intrinsic.h>
}
#include <X11/Shell.h>
#include <X11/IntrinsicP.h> /* Intrinsics Definitions*/
#include <X11/StringDefs.h> /* Standard Name-String definitions*/
#if defined USE_MOTIF
#include <Xm/DrawingA.h>
#else
#include <X11/Composite.h>
#endif
#include <X11/Xatom.h>
#ifndef XP_UNIX
# define XP_UNIX
#endif
#define MOZ_X11
#include <stdio.h>
#if ! defined ( _NPAPI_H_) && ! defined (npapi_h_)
extern "C" {
#include <npsdk/npupp.h>
}
#include "npapi.h"
#if NP_VERSION_MINOR < 17
// compatibility hack: compile with older NPN api header, but define
// some later introduced constants
// for gcc 3
#define NP_ABI_MASK 0x10000000
#define NPNVSupportsXEmbedBool ((NPNVariable)14)
#define NPPVpluginNeedsXEmbed ((NPPVariable)14)
#define NPNVToolkit ((int)(13 | NP_ABI_MASK))
#define NPNVGtk12 1
#define NPNVGtk2 2
#endif
#endif
#include <config_vclplug.h>
#if ENABLE_GTK
#define GLIB_DISABLE_DEPRECATION_WARNINGS
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#else
#define GtkWidget void
#endif
#include <postx.h>
#include <tools/solar.h>
class ConnectorInstance
{
public:
NPP instance;
NPWindow window;
NPSetWindowCallbackStruct ws_info;
char* pMimeType;
void* pShell;
void* pWidget;
GtkWidget* pGtkWindow;
GtkWidget* pGtkWidget;
bool bShouldUseXEmbed;
int nArg;
char** argn;
char** argv;
char* pArgnBuf;
char* pArgvBuf;
NPSavedData aData;
ConnectorInstance( NPP inst, char* type,
int args, char* pargnbuf, sal_uLong nargnbytes,
char* pargvbuf, sal_uLong nargvbytes,
char* savedata, sal_uLong savebytes );
~ConnectorInstance();
};
class PluginConnector : public Mediator
{
protected:
osl::Mutex m_aUserEventMutex;
static std::vector<PluginConnector*> allConnectors;
DECL_LINK_TYPED( NewMessageHdl, Mediator*, void );
DECL_LINK_TYPED( WorkOnNewMessageHdl, void*, void );
std::vector<NPStream*> m_aNPWrapStreams;
std::vector<ConnectorInstance*> m_aInstances;
static sal_uLong FillBuffer( char*&, const char*, sal_uLong, va_list );
public:
PluginConnector( int nSocket );
virtual ~PluginConnector();
virtual MediatorMessage* WaitForAnswer( sal_uLong nMessageID ) override;
MediatorMessage* Transact( const char*, sal_uLong, ... );
MediatorMessage* Transact( sal_uInt32, ... );
void Respond( sal_uLong nID, char*, sal_uLong, ... );
sal_uLong Send( sal_uInt32, ... );
static const sal_uInt32 UnknownStreamID = 0xffffffff;
static const sal_uInt32 UnknownNPPID = 0xffffffff;
sal_uInt32 GetStreamID( NPStream* pStream );
sal_uInt32 GetNPPID( NPP );
std::vector<NPStream*>& getStreamList() { return m_aNPWrapStreams; }
static NPError GetNPError( MediatorMessage* pMes )
{
NPError* pErr = static_cast<NPError*>(pMes->GetBytes());
NPError aErr = *pErr;
delete [] pErr;
return aErr;
}
void CallWorkHandler()
{
LINK( this, PluginConnector, WorkOnNewMessageHdl ).
Call( static_cast<Mediator*>(this) );
}
};
enum CommandAtoms
{
eNPN_GetURL,
eNPN_GetURLNotify,
eNPN_DestroyStream,
eNPN_NewStream,
eNPN_PostURLNotify,
eNPN_PostURL,
eNPN_RequestRead,
eNPN_Status,
eNPN_Version,
eNPN_Write,
eNPN_UserAgent,
eNPP_DestroyStream,
eNPP_Destroy,
eNPP_DestroyPhase2,
eNPP_NewStream,
eNPP_New,
eNPP_SetWindow,
eNPP_StreamAsFile,
eNPP_URLNotify,
eNPP_WriteReady,
eNPP_Write,
eNPP_GetMIMEDescription,
eNPP_Initialize,
eNPP_Shutdown,
eMaxCommand
};
const char* GetCommandName( CommandAtoms );
#define POST_NONCONST_STRING( x ) x ? x : const_cast<char*>(""), x ? strlen(x) : 1
#define POST_STRING( x ) x ? x : "", x ? strlen(x) : 1
#endif // INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_UNX_PLUGCON_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,78 +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.
*
************************************************************************/
#ifndef INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_UNX_SYSPLUG_HXX
#define INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_UNX_SYSPLUG_HXX
#include <unistd.h>
#include <plugin/unx/plugcon.hxx>
#include <plugin/plcom.hxx>
#include <vcl/sysdata.hxx>
class UnxPluginComm : public PluginComm, public PluginConnector
{
private:
pid_t m_nCommPID;
public:
UnxPluginComm( const OUString& mimetype,
const OUString& library,
Window aParent,
int nDescriptor1,
int nDescriptor2
);
virtual ~UnxPluginComm();
using PluginComm::NPP_Destroy;
virtual NPError NPP_Destroy( NPP instance, NPSavedData** save ) override;
virtual NPError NPP_DestroyStream( NPP instance, NPStream* stream,
NPError reason ) override;
virtual NPError NPP_Initialize() override;
virtual NPError NPP_New( NPMIMEType pluginType, NPP instance,
uint16_t mode, int16_t argc,
char* argn[], char* argv[], NPSavedData *saved ) override;
virtual NPError NPP_NewStream( NPP instance, NPMIMEType type,
NPStream* stream,
NPBool seekable, uint16_t* stype ) override;
using PluginComm::NPP_SetWindow;
virtual NPError NPP_SetWindow( NPP instance, NPWindow* window ) override;
virtual void NPP_Shutdown() override;
virtual void NPP_StreamAsFile( NPP instance, NPStream* stream,
const char* fname ) override;
virtual void NPP_URLNotify( NPP instance, const char* url, NPReason reason,
void* notifyData ) override;
virtual int32_t NPP_Write( NPP instance, NPStream* stream, int32_t offset,
int32_t len, void* buffer ) override;
virtual int32_t NPP_WriteReady( NPP instance, NPStream* stream ) override;
static bool getPluginappPath(OString * path);
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,130 +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.
*
************************************************************************/
#ifndef INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_WIN_SYSPLUG_HXX
#define INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_WIN_SYSPLUG_HXX
#if defined _MSC_VER
#pragma warning (push,1)
#pragma warning (disable:4005)
#endif
#include <tchar.h>
#if defined _MSC_VER
#pragma pack( push, 8 )
#endif
#include "npapi.h"
#include <npsdk/npupp.h>
#if defined _MSC_VER
#pragma pack( pop )
#endif
#if defined _MSC_VER
#pragma warning (pop)
#endif
#include <list>
#include <map>
#include <algorithm>
#include <plugin/plcom.hxx>
#include <vcl/threadex.hxx>
class PluginComm_Impl :
public PluginComm,
public vcl::SolarThreadExecutor
{
enum CallType {
eNPP_Destroy,
eNPP_DestroyStream,
eNPP_GetJavaClass,
eNPP_Initialize,
eNPP_New,
eNPP_NewStream,
eNPP_Print,
eNPP_SetWindow,
eNPP_Shutdown,
eNPP_StreamAsFile,
eNPP_URLNotify,
eNPP_Write,
eNPP_WriteReady,
eNPP_GetValue,
eNPP_SetValue,
eNP_Initialize
};
void* m_aArgs[ 8 ];
CallType m_eCall;
virtual long doIt();
public:
struct CannotInitializeException {};
PluginComm_Impl( const OUString& rMIME, const OUString& rName, HWND hWnd );
virtual ~PluginComm_Impl();
public:
using PluginComm::NPP_Destroy;
virtual NPError NPP_Destroy( NPP instance, NPSavedData** save );
virtual NPError NPP_DestroyStream( NPP instance, NPStream* stream, NPError reason );
virtual NPError NPP_Initialize();
virtual NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc,
char* argn[], char* argv[], NPSavedData *saved );
virtual NPError NPP_NewStream( NPP instance, NPMIMEType type, NPStream* stream,
NPBool seekable, uint16_t* stype );
virtual void NPP_Print( NPP instance, NPPrint* platformPrint );
using PluginComm::NPP_SetWindow;
virtual NPError NPP_SetWindow( NPP instance, NPWindow* window );
virtual void NPP_Shutdown();
virtual void NPP_StreamAsFile( NPP instance, NPStream* stream, const char* fname );
virtual void NPP_URLNotify( NPP instance, const char* url,
NPReason reason, void* notifyData );
virtual int32_t NPP_Write( NPP instance, NPStream* stream, int32_t offset,
int32_t len, void* buffer );
virtual int32_t NPP_WriteReady( NPP instance, NPStream* stream );
virtual NPError NPP_GetValue( NPP instance, NPPVariable variable, void *ret_alue );
private:
void shutdown();
BOOL retrieveFunction( TCHAR const * pName, void** ppFunc ) const;
private:
HINSTANCE _plDLL;
NPPluginFuncs _NPPfuncs;
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--**********************************************************************
*
* 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.
*
**********************************************************************-->
<component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@"
prefix="pl" xmlns="http://openoffice.org/2010/uno-components">
<implementation name="com.sun.star.extensions.PluginManager">
<service name="com.sun.star.plugin.PluginManager"/>
</implementation>
<implementation name="com.sun.star.extensions.PluginModel">
<service name="com.sun.star.plugin.PluginModel"/>
</implementation>
</component>

View File

@@ -1,337 +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 <errno.h>
#include <unistd.h>
#include <plugin/unx/mediator.hxx>
#include <sal/log.hxx>
#include <vcl/svapp.hxx>
#include <memory>
#define MEDIATOR_MAGIC 0xf7a8d2f4
Mediator::Mediator( int nSocket ) :
m_nSocket( nSocket ),
m_pListener( nullptr ),
m_nCurrentID( 1 ),
m_bValid( true )
{
m_pListener = new MediatorListener( this );
m_pListener->create();
}
Mediator::~Mediator()
{
if( m_pListener )
{
{
::osl::MutexGuard aGuard( m_pListener->m_aMutex );
m_pListener->m_pMediator = nullptr;
}
m_pListener = nullptr;
if( m_bValid )
{
sal_uLong aHeader[3];
aHeader[0] = 0;
aHeader[1] = 0;
aHeader[2] = MEDIATOR_MAGIC;
ssize_t nToWrite = sizeof(aHeader);
bool bSuccess = (nToWrite == write(m_nSocket, aHeader, nToWrite));
SAL_WARN_IF(!bSuccess, "extensions.plugin", "short write");
}
// kick the thread out of its run method; it deletes itself
close( m_nSocket );
}
else
close( m_nSocket );
for( std::vector< MediatorMessage* >::iterator it = m_aMessageQueue.begin();
it != m_aMessageQueue.end(); ++it )
{
delete *it;
}
}
sal_uLong Mediator::SendMessage( sal_uLong nBytes, const char* pBytes, sal_uLong nMessageID )
{
if( ! m_pListener )
return 0;
osl::MutexGuard aGuard( m_aSendMutex );
if( ! nMessageID )
nMessageID = m_nCurrentID;
m_nCurrentID++;
if( m_nCurrentID >= 1 << 24 ) // protection against overflow
m_nCurrentID = 1;
if( ! m_bValid )
return nMessageID;
std::unique_ptr<sal_uLong[]> pBuffer(new sal_uLong[ (nBytes/sizeof(sal_uLong)) + 4 ]);
pBuffer[ 0 ] = nMessageID;
pBuffer[ 1 ] = nBytes;
pBuffer[ 2 ] = MEDIATOR_MAGIC;
memcpy( &pBuffer[3], pBytes, (size_t)nBytes );
ssize_t nToWrite = nBytes + 3*sizeof( sal_uLong );
bool bSuccess = (nToWrite == write( m_nSocket, pBuffer.get(), nToWrite ));
SAL_WARN_IF(!bSuccess, "extensions.plugin", "short write");
return nMessageID;
}
bool Mediator::WaitForMessage( sal_uLong nTimeOut )
{
if( ! m_pListener )
return false;
size_t nItems = m_aMessageQueue.size();
if( ! nTimeOut && nItems > 0 )
return true;
TimeValue aValue;
aValue.Seconds = nTimeOut/1000;
aValue.Nanosec = ( nTimeOut % 1000 ) * 1000;
while( m_aMessageQueue.size() == nItems )
{
m_aNewMessageCdtn.wait( & aValue );
m_aNewMessageCdtn.reset();
if( nTimeOut && m_aMessageQueue.size() == nItems )
return false;
}
return true;
}
MediatorMessage* Mediator::WaitForAnswer( sal_uLong nMessageID )
{
nMessageID &= 0x00ffffff;
while( m_pListener )
{
{
osl::MutexGuard aGuard( m_aQueueMutex );
for( size_t i = 0; i < m_aMessageQueue.size(); i++ )
{
MediatorMessage* pMessage = m_aMessageQueue[ i ];
sal_uLong nID = pMessage->m_nID;
if( ( nID & 0xff000000 ) &&
( ( nID & 0x00ffffff ) == nMessageID ) )
{
m_aMessageQueue.erase( m_aMessageQueue.begin() + i );
return pMessage;
}
}
}
WaitForMessage( 10 );
}
return nullptr;
}
MediatorMessage* Mediator::GetNextMessage( bool bWait )
{
while( m_pListener )
{
{
// guard must be after WaitForMessage, else the listener
// cannot insert a new one -> deadlock
osl::MutexGuard aGuard( m_aQueueMutex );
for( size_t i = 0; i < m_aMessageQueue.size(); i++ )
{
MediatorMessage* pMessage = m_aMessageQueue[ i ];
if( ! ( pMessage->m_nID & 0xff000000 ) )
{
m_aMessageQueue.erase( m_aMessageQueue.begin() + i );
return pMessage;
}
}
if( ! bWait )
return nullptr;
}
WaitForMessage();
}
return nullptr;
}
MediatorMessage* Mediator::TransactMessage( sal_uLong nBytes, char* pBytes )
{
sal_uLong nID = SendMessage( nBytes, pBytes );
return WaitForAnswer( nID );
}
MediatorListener::MediatorListener( Mediator* pMediator ) :
m_pMediator( pMediator )
{
}
MediatorListener::~MediatorListener()
{
}
void MediatorListener::run()
{
osl_setThreadName("MediatorListener");
bool bRun = true;
while( schedule() && m_pMediator && bRun )
{
sal_uLong nHeader[ 3 ];
int nBytes;
if( ( nBytes = read( m_pMediator->m_nSocket, nHeader, sizeof( nHeader ) ) ) == sizeof( nHeader ) && nHeader[2] == MEDIATOR_MAGIC)
{
if( nHeader[ 0 ] == 0 && nHeader[ 1 ] == 0 )
return;
std::unique_ptr<char[]> pBuffer(new char[ nHeader[ 1 ] ]);
if( m_pMediator && (sal_uLong)read( m_pMediator->m_nSocket, pBuffer.get(), nHeader[ 1 ] ) == nHeader[ 1 ] )
{
::osl::MutexGuard aMyGuard( m_aMutex );
{
osl::MutexGuard
aGuard( m_pMediator->m_aQueueMutex );
MediatorMessage* pMessage =
new MediatorMessage( nHeader[ 0 ], nHeader[ 1 ], pBuffer.get() );
m_pMediator->m_aMessageQueue.push_back( pMessage );
}
m_pMediator->m_aNewMessageCdtn.set();
m_pMediator->m_aNewMessageHdl.Call( m_pMediator );
}
else
{
SAL_WARN(
"extensions.plugin",
"got incomplete MediatorMessage: { " << nHeader[0] << ", "
<< nHeader[1] << ", ... }");
bRun = false;
}
}
else
{
SAL_WARN(
"extensions.plugin",
"got incomplete message header of " << nBytes
<< " bytes (nHeader = [" << nHeader[0] << ", " << nHeader[1]
<< "]), errno is " << errno);
bRun = false;
}
}
}
void MediatorListener::onTerminated()
{
if( m_pMediator )
{
m_pMediator->m_aConnectionLostHdl.Call( m_pMediator );
m_pMediator->m_pListener = nullptr;
}
delete this;
}
sal_uLong MediatorMessage::ExtractULONG()
{
if( ! m_pRun )
m_pRun = m_pBytes;
SAL_WARN_IF(
(sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "extensions.plugin",
"overflow in MediatorMessage::ExtractULONG");
sal_uLong nCount;
memcpy( &nCount, m_pRun, sizeof( sal_uLong ) );
m_pRun += sizeof( sal_uLong );
return nCount;
}
void* MediatorMessage::GetBytes( sal_uLong& rBytes )
{
if( ! m_pRun )
m_pRun = m_pBytes;
SAL_WARN_IF(
(sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "extensions.plugin",
"overflow in MediatorMessage::GetBytes");
sal_uLong nBytes = ExtractULONG();
if( nBytes == 0 )
return nullptr;
SAL_WARN_IF(
(sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "extensions.plugin",
"overflow in MediatorMessage::GetBytes");
char* pBuffer = new char[ nBytes ];
memcpy( pBuffer, m_pRun, nBytes );
m_pRun += nBytes;
rBytes = nBytes;
return pBuffer;
}
char* MediatorMessage::GetString()
{
if( ! m_pRun )
m_pRun = m_pBytes;
SAL_WARN_IF(
(sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "extensions.plugin",
"overflow in MediatorMessage::GetString");
sal_uLong nBytes = ExtractULONG();
if( nBytes == 0 )
return nullptr;
SAL_WARN_IF(
(sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "extensions.plugin",
"overflow in MediatorMessage::GetString");
char* pBuffer = new char[ nBytes+1 ];
memcpy( pBuffer, m_pRun, nBytes );
pBuffer[ nBytes ] = 0;
m_pRun += nBytes;
return pBuffer;
}
sal_uInt32 MediatorMessage::GetUINT32()
{
if( ! m_pRun )
m_pRun = m_pBytes;
SAL_WARN_IF(
(sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "extensions.plugin",
"overflow in MediatorMessage::GetUINT32");
sal_uLong nBytes = ExtractULONG();
SAL_WARN_IF(
nBytes != sizeof( sal_uInt32 ), "extensions.plugin",
"no sal_uInt32 in MediatorMessage::GetUINT32");
SAL_WARN_IF(
(sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "extensions.plugin",
"overflow in MediatorMessage::GetUINT32");
sal_uInt32 nRet;
memcpy( &nRet, m_pRun, sizeof( nRet ) );
m_pRun += sizeof( sal_uInt32 );
return nRet;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,949 +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.
*
************************************************************************/
#ifdef AIX
#define _LINUX_SOURCE_COMPAT
#include <sys/timer.h>
#undef _LINUX_SOURCE_COMPAT
#endif
#include <plugin/unx/plugcon.hxx>
#include <unistd.h>
#include <dlfcn.h>
#include <osl/module.h>
#include <sal/log.hxx>
#include <config_vclplug.h>
#include <npwrap.hxx>
#include <memory>
extern PluginConnector* pConnector;
extern XtAppContext app_context;
extern int wakeup_fd[];
extern Widget topLevel, topBox;
extern Display* pAppDisplay;
extern Display* pXtAppDisplay;
extern int nAppArguments;
extern char** pAppArguments;
// begin Netscape plugin api calls
extern "C" {
static void* l_NPN_MemAlloc( uint32_t nBytes )
{
void* pMem = new char[nBytes];
return pMem;
}
static void l_NPN_MemFree( void* pMem )
{
delete [] static_cast<char*>(pMem);
}
static uint32_t l_NPN_MemFlush( uint32_t /*nSize*/ )
{
return 0;
}
static NPError l_NPN_DestroyStream( NPP instance, NPStream* stream, NPError reason )
{
sal_uInt32 nInstance = pConnector->GetNPPID( instance );
if( nInstance == PluginConnector::UnknownNPPID )
return NPERR_GENERIC_ERROR;
sal_uInt32 nFileID = pConnector->GetStreamID( stream );
MediatorMessage* pMes=
pConnector->
Transact( eNPN_DestroyStream,
&nInstance, sizeof( nInstance ),
&nFileID, sizeof( nFileID ),
POST_STRING( stream->url ),
&reason, sizeof( reason ),
nullptr );
if( ! pMes )
return NPERR_GENERIC_ERROR;
for( std::vector< NPStream* >::iterator it = pConnector->getStreamList().begin();
it != pConnector->getStreamList().end(); ++it )
{
if( *it == stream )
{
pConnector->getStreamList().erase( it );
break;
}
}
delete [] stream->url;
delete stream;
// returns NPError
NPError aRet = PluginConnector::GetNPError( pMes );
delete pMes;
return aRet;
}
#ifdef OJI
static JRIEnv* l_NPN_GetJavaEnv()
{
// no java in this program
SAL_INFO("extensions.plugin", "SNI: NPN_GetJavaEnv");
return NULL;
}
static jref l_NPN_GetJavaPeer( NPP /*instance*/ )
{
SAL_INFO("extensions.plugin", "SNI: NPN_GetJavaPeer");
return NULL;
}
#endif
static NPError l_NPN_GetURL( NPP instance, const char* url, const char* window )
{
sal_uInt32 nInstance = pConnector->GetNPPID( instance );
if( nInstance == PluginConnector::UnknownNPPID )
return NPERR_GENERIC_ERROR;
MediatorMessage* pMes=
pConnector->
Transact( eNPN_GetURL,
&nInstance, sizeof( nInstance ),
POST_STRING(url),
POST_STRING(window),
nullptr );
SAL_WARN_IF(!pMes, "extensions.plugin", "geturl: message unanswered");
if( ! pMes )
return NPERR_GENERIC_ERROR;
// returns NPError
NPError aRet = PluginConnector::GetNPError( pMes );
SAL_WARN_IF(aRet, "extensions.plugin", "geturl returns " << aRet);
delete pMes;
return aRet;
}
static NPError l_NPN_GetURLNotify( NPP instance, const char* url, const char* target,
void* notifyData )
{
sal_uInt32 nInstance = pConnector->GetNPPID( instance );
if( nInstance == PluginConnector::UnknownNPPID )
return NPERR_GENERIC_ERROR;
MediatorMessage* pMes=
pConnector->
Transact( eNPN_GetURLNotify,
&nInstance, sizeof( nInstance ),
POST_STRING(url),
POST_STRING(target),
&notifyData, sizeof( void* ), // transmit the actual pointer
// since it is a pointer to private data fed back
// by NPP_URLNotify; this can be thought of as an ID
nullptr );
if( ! pMes )
return NPERR_GENERIC_ERROR;
// returns NPError
NPError aRet = PluginConnector::GetNPError( pMes );
delete pMes;
return aRet;
}
static NPError l_NPN_NewStream( NPP instance, NPMIMEType type, const char* target,
NPStream** stream )
// stream is a return value
{
sal_uInt32 nInstance = pConnector->GetNPPID( instance );
if( nInstance == PluginConnector::UnknownNPPID )
return NPERR_GENERIC_ERROR;
MediatorMessage* pMes=
pConnector->
Transact( eNPN_NewStream,
&nInstance, sizeof( nInstance ),
POST_STRING(type),
POST_STRING(target),
nullptr );
if( ! pMes )
return NPERR_GENERIC_ERROR;
// returns a new NPStream and an error
NPError aRet = PluginConnector::GetNPError( pMes );
if( ! aRet )
{
NPStream* pStream = new NPStream;
pStream->url = pMes->GetString();
pStream->end = pMes->GetUINT32();
pStream->lastmodified = pMes->GetUINT32();
pStream->ndata = pStream->pdata = pStream->notifyData = nullptr;
pConnector->getStreamList().push_back( pStream );
*stream = pStream;
}
delete pMes;
return aRet;
}
static NPError l_NPN_PostURLNotify( NPP instance, const char* url, const char* target, uint32_t len, const char* buf, NPBool file, void* notifyData )
{
sal_uInt32 nInstance = pConnector->GetNPPID( instance );
if( nInstance == PluginConnector::UnknownNPPID )
return NPERR_GENERIC_ERROR;
MediatorMessage* pMes = pConnector->
Transact( eNPN_PostURLNotify,
&nInstance, sizeof( nInstance ),
POST_STRING( url ),
POST_STRING( target ),
&len, sizeof( len ),
buf, len,
&file, sizeof( NPBool ),
&notifyData, sizeof( void* ), // send the real pointer
nullptr );
if( ! pMes )
return NPERR_GENERIC_ERROR;
NPError aRet = PluginConnector::GetNPError( pMes );
delete pMes;
return aRet;
}
static NPError l_NPN_PostURL( NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file )
{
sal_uInt32 nInstance = pConnector->GetNPPID( instance );
if( nInstance == PluginConnector::UnknownNPPID )
return NPERR_GENERIC_ERROR;
MediatorMessage* pMes = pConnector->
Transact( eNPN_PostURL,
&nInstance, sizeof( nInstance ),
POST_STRING( url ),
POST_STRING( window ),
&len, sizeof( len ),
buf, len,
&file, sizeof( NPBool ),
nullptr );
if( ! pMes )
return NPERR_GENERIC_ERROR;
NPError aRet = PluginConnector::GetNPError( pMes );
delete pMes;
return aRet;
}
static NPError l_NPN_RequestRead( NPStream* stream, NPByteRange* rangeList )
{
SAL_INFO("extensions.plugin", "pluginapp: NPN_RequestRead");
NPByteRange* pRange = rangeList;
sal_uInt32 nRanges = 0;
while( pRange )
{
nRanges++;
pRange = pRange->next;
}
std::unique_ptr<sal_uInt32[]> pArray(new sal_uInt32[ 2 * nRanges ]);
pRange = rangeList;
sal_uInt32 n = 0;
while( pRange )
{
pArray[ 2*n ] = (sal_uInt32)pRange->offset;
pArray[ 2*n + 1] = (sal_uInt32)pRange->length;
n++;
pRange = pRange->next;
}
sal_uInt32 nFileID = pConnector->GetStreamID( stream );
MediatorMessage* pMes = pConnector->
Transact( eNPN_RequestRead,
&nFileID, sizeof( nFileID ),
&nRanges, sizeof( nRanges ),
pArray.get(), sizeof( sal_uInt32 ) * 2 * nRanges,
nullptr );
if( ! pMes )
{
return NPERR_GENERIC_ERROR;
}
NPError aRet = PluginConnector::GetNPError( pMes );
delete pMes;
return aRet;
}
static void l_NPN_Status( NPP instance, const char* message )
{
sal_uInt32 nInstance = pConnector->GetNPPID( instance );
if( nInstance == PluginConnector::UnknownNPPID )
return;
pConnector->Send( eNPN_Status,
&nInstance, sizeof( nInstance ),
POST_STRING( message ),
nullptr );
}
static const char* l_NPN_UserAgent( NPP instance )
{
static char* pAgent = nullptr;
sal_uInt32 nInstance = pConnector->GetNPPID( instance );
if( nInstance == PluginConnector::UnknownNPPID )
{
if( instance )
return "Mozilla 3.0";
else // e.g. flashplayer calls NPN_UserAgent with NULL
nInstance = 0;
}
MediatorMessage* pMes = pConnector->
Transact( eNPN_UserAgent,
&nInstance, sizeof( nInstance ),
nullptr );
if( ! pMes )
return pAgent;
if( pAgent )
delete [] pAgent;
pAgent = pMes->GetString();
delete pMes;
SAL_INFO("extensions.plugin", "NPN_UserAgent returns " << pAgent);
return pAgent;
}
static int32_t l_NPN_Write( NPP instance, NPStream* stream, int32_t len, void* buffer )
{
sal_uInt32 nFileID = pConnector->GetStreamID( stream );
if( nFileID == PluginConnector::UnknownStreamID )
return NPERR_GENERIC_ERROR;
sal_uInt32 nInstance = pConnector->GetNPPID( instance );
if( nInstance == PluginConnector::UnknownNPPID )
return NPERR_GENERIC_ERROR;
MediatorMessage* pMes = pConnector->
Transact( eNPN_Write,
&nInstance, sizeof( nInstance ),
&nFileID, sizeof( nFileID ),
&len, sizeof( len ),
buffer, len,
nullptr );
if( ! pMes )
return 0;
sal_Int32 nRet = pMes->GetUINT32();
return nRet;
}
static void l_NPN_ReloadPlugins( NPBool /*reloadPages*/ )
{
SAL_INFO("extensions.plugin", "NPN_ReloadPlugins: SNI");
}
static NPError l_NPN_GetValue( NPP, NPNVariable variable, void* value )
{
/*
* We want to handle values injected into a NPNVariable which aren't in
* the old enum we build against, but that we know are in the new enum
* we want to support
*/
switch( (int)variable )
{
case NPNVxDisplay:
*static_cast<Display**>(value) = pXtAppDisplay;
SAL_INFO("extensions.plugin", "Display requested");
break;
case NPNVxtAppContext:
*static_cast<XtAppContext*>(value) = app_context;
SAL_INFO("extensions.plugin", "AppContext requested");
break;
case NPNVjavascriptEnabledBool:
// no javascript
*static_cast<NPBool*>(value) = false;
SAL_INFO("extensions.plugin", "javascript enabled requested");
break;
case NPNVasdEnabledBool:
// no SmartUpdate
*static_cast<NPBool*>(value) = false;
SAL_INFO("extensions.plugin", "smart update enabled requested");
break;
case NPNVisOfflineBool:
// no offline browsing
*static_cast<NPBool*>(value) = false;
SAL_INFO("extensions.plugin", "offline browsing requested");
break;
case NPNVSupportsXEmbedBool:
// asking xembed
*static_cast<int*>(value) = int(true);
SAL_INFO("extensions.plugin", "xembed requested");
break;
case NPNVToolkit:
# if ENABLE_GTK
*static_cast<int*>(value) = NPNVGtk2;
# else
*(int*)value = 0;
# endif
SAL_INFO("extensions.plugin", "toolkit requested");
break;
default:
SAL_WARN(
"extensions.plugin",
"unknown NPNVariable " << +variable << " requested");
return NPERR_INVALID_PARAM;
}
return NPERR_NO_ERROR;
}
static NPError l_NPN_SetValue(NPP /*instance*/, NPPVariable variable, void *value)
{
SAL_INFO("extensions.plugin", "NPN_SetValue " << +variable << "=" << value);
return 0;
}
static void l_NPN_InvalidateRect(NPP /*instance*/, NPRect* /*invalidRect*/)
{
SAL_INFO("extensions.plugin", "NPN_InvalidateRect");
}
static void l_NPN_InvalidateRegion(NPP /*instance*/, NPRegion /*invalidRegion*/)
{
SAL_INFO("extensions.plugin", "NPN_InvalidateRegion");
}
static void l_NPN_ForceRedraw(NPP /*instance*/)
{
SAL_INFO("extensions.plugin", "NPN_ForceRedraw");
}
}
static NPNetscapeFuncs aNetscapeFuncs =
{
sizeof(aNetscapeFuncs),
(NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR,
l_NPN_GetURL,
l_NPN_PostURL,
l_NPN_RequestRead,
l_NPN_NewStream,
l_NPN_Write,
l_NPN_DestroyStream,
l_NPN_Status,
l_NPN_UserAgent,
l_NPN_MemAlloc,
l_NPN_MemFree,
l_NPN_MemFlush,
l_NPN_ReloadPlugins,
# ifdef OJI
l_NPN_GetJavaEnv,
l_NPN_GetJavaPeer,
# else
nullptr,
nullptr,
# endif
l_NPN_GetURLNotify,
l_NPN_PostURLNotify,
l_NPN_GetValue,
l_NPN_SetValue,
l_NPN_InvalidateRect,
l_NPN_InvalidateRegion,
l_NPN_ForceRedraw
};
static NPPluginFuncs aPluginFuncs =
{
sizeof(aPluginFuncs),
(NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr
};
oslModule pPluginLib = nullptr;
char*(*pNPP_GetMIMEDescription)() = nullptr;
NPError (*pNP_Initialize)(NPNetscapeFuncs*,NPPluginFuncs*) = nullptr;
NPError (*pNP_Shutdown)() = nullptr;
std::vector< PluginConnector* > PluginConnector::allConnectors;
PluginConnector::PluginConnector( int nSocket ) :
Mediator( nSocket )
{
SetNewMessageHdl( LINK( this, PluginConnector, NewMessageHdl ) );
}
PluginConnector::~PluginConnector()
{
}
IMPL_LINK_NOARG_TYPED( PluginConnector, WorkOnNewMessageHdl, void*, void )
{
MediatorMessage* pMessage;
CommandAtoms nCommand;
while( (pMessage = GetNextMessage()) )
{
nCommand = (CommandAtoms)pMessage->GetUINT32();
SAL_INFO(
"extensions.plugin", "pluginapp: " << GetCommandName(nCommand));
switch( nCommand )
{
case eNPP_DestroyStream:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
sal_uInt32 nFileID = pMessage->GetUINT32();
NPStream* pStream = m_aNPWrapStreams[ nFileID ];
NPError aReason = GetNPError( pMessage );
m_aNPWrapStreams.erase( m_aNPWrapStreams.begin() + nFileID );
aReason = aPluginFuncs.destroystream( instance, pStream, aReason );
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&aReason), sizeof( aReason ),
nullptr );
delete [] pStream->url;
delete pStream;
}
break;
case eNPP_Destroy:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
ConnectorInstance* pInst= m_aInstances[ nInstance ];
// some plugin rely on old netscapes behaviour
// to first destroy the widget and then destroy
// the instance, so mimic that behaviour here
if( pInst->pShell )
XtDestroyWidget( static_cast<Widget>(pInst->pShell) );
pInst->pWidget = pInst->pShell = nullptr;
// the other side will call eNPP_DestroyPhase2 after this
NPError aReason = NPERR_NO_ERROR;
Respond( pMessage->m_nID, reinterpret_cast<char*>(&aReason), sizeof( aReason ), nullptr );
}
break;
case eNPP_DestroyPhase2:
{
// now really destroy the instance
sal_uInt32 nInstance = pMessage->GetUINT32();
ConnectorInstance* pInst= m_aInstances[ nInstance ];
NPP instance = pInst->instance;
NPSavedData* pSave = nullptr;
NPError aRet = aPluginFuncs.destroy( instance, &pSave );
if( pSave )
{
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&aRet), sizeof( aRet ),
pSave->buf, pSave->len,
nullptr );
delete [] static_cast<char*>(pSave->buf);
}
else
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&aRet), sizeof( aRet ),
"0000", 4,
nullptr );
#if ENABLE_GTK
if( pInst->pGtkWindow )
g_object_unref( G_OBJECT(pInst->pGtkWindow) );
if( pInst->pGtkWidget )
g_object_unref( G_OBJECT(pInst->pGtkWidget) );
#endif
m_aInstances.erase( m_aInstances.begin() + nInstance );
delete pInst;
delete instance;
SAL_INFO(
"extensions.plugin",
"destroyed instance (returning " << aRet << ")");
}
break;
case eNPP_NewStream:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
char* pType = pMessage->GetString();
NPStream* pStream = new NPStream;
pStream->url = pMessage->GetString();
pStream->end = pMessage->GetUINT32();
pStream->lastmodified = pMessage->GetUINT32();
pStream->pdata = pStream->ndata = pStream->notifyData = nullptr;
NPBool* pSeekable = static_cast<NPBool*>(pMessage->GetBytes());
m_aNPWrapStreams.push_back( pStream );
uint16_t nStype = NP_ASFILE;
NPError aRet = aPluginFuncs.newstream( instance, pType, pStream,
*pSeekable, &nStype );
SAL_INFO(
"extensions.plugin",
"pluginapp: NPP_NewStream(" << instance << ", " << pType
<< ", " << pStream << ", "
<< (*pSeekable ? "seekable" : "not seekable") << ", "
<< &nStype << ") returns " << aRet
<< "; stream = { pdata = " << pStream->pdata
<< ", ndata = " << pStream->ndata << ", url = "
<< pStream->url << ", end = " << pStream->end
<< ", lastmodified = " << pStream->lastmodified
<< ", notifyData = " << pStream->notifyData << " }");
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&aRet), sizeof( aRet ),
&nStype, sizeof( nStype ),
nullptr );
delete [] pType;
delete [] pSeekable;
}
break;
case eNPP_New:
{
char* pType = pMessage->GetString();
uint16_t* pMode = static_cast<uint16_t*>(pMessage->GetBytes());
int16_t* pArgc = static_cast<int16_t*>(pMessage->GetBytes());
NPP instance = new NPP_t;
instance->pdata = instance->ndata = nullptr;
sal_uLong nArgnBytes, nArgvBytes;
char* pArgn = static_cast<char*>(pMessage->GetBytes( nArgnBytes ));
char* pArgv = static_cast<char*>(pMessage->GetBytes( nArgvBytes ));
sal_uLong nSaveBytes;
char* pSavedData = static_cast<char*>(pMessage->GetBytes( nSaveBytes ));
ConnectorInstance* pInst =
new ConnectorInstance( instance, pType,
*pArgc,
pArgn, nArgnBytes,
pArgv, nArgvBytes,
pSavedData, nSaveBytes );
m_aInstances.push_back( pInst );
NPError aRet;
aRet = aPluginFuncs.newp( pInst->pMimeType, instance, *pMode, *pArgc,
pInst->nArg ? pInst->argn : nullptr,
pInst->nArg ? pInst->argv : nullptr,
( nSaveBytes == 4 && *reinterpret_cast<sal_uInt32*>(pSavedData) == 0 ) ?
&(pInst->aData) : nullptr );
SAL_INFO(
"extensions.plugin",
"pluginapp: NPP_New( " << pInst->pMimeType << ", "
<< instance << ", " << *pMode << ", " << pInst->nArg
<< ", " << pInst->argn << ", " << pInst->argv << ", "
<< &pInst->aData << ") returns" << aRet);
for( int i = 0; i < pInst->nArg; i++ )
SAL_INFO(
"extensions.plugin",
" \"" << pInst->argn[i] << "\"=\"" << pInst->argv[i]
<< "\"");
#if ENABLE_GTK
// check if XEMBED is to be used
// ask for Bool. there seems to be no clear definition whether the
// return value should be an int or unsigned char
// int can hold both and will be nonzero in case of "true"
if( aPluginFuncs.getvalue )
{
int bNeedsXEmbed = 0;
NPError error = aPluginFuncs.getvalue( instance, NPPVpluginNeedsXEmbed, static_cast<void *>(&bNeedsXEmbed) );
if( error == NPERR_NO_ERROR )
pInst->bShouldUseXEmbed = (bNeedsXEmbed != 0);
SAL_INFO(
"extensions.plugin",
"should use xembed = "
<< (pInst->bShouldUseXEmbed ? "true" : "false"));
}
#endif
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&aRet), sizeof( aRet ),
nullptr );
delete [] pMode;
delete [] pArgc;
delete [] pType;
}
break;
case eNPP_SetWindow:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
ConnectorInstance* pInst= m_aInstances[ nInstance ];
NPWindow* pWindow = static_cast<NPWindow*>(pMessage->GetBytes());
if( pWindow->width < 1 )
pWindow->width = 1;
if( pWindow->height < 1 )
pWindow->height = 1;
#if ENABLE_GTK
if( pInst->bShouldUseXEmbed )
{
if( ! pInst->pGtkWidget )
{
SAL_INFO(
"extensions.plugin",
"creating gtk plug and socket");
pInst->pGtkWindow = gtk_plug_new((GdkNativeWindow)reinterpret_cast<sal_uIntPtr>(pWindow->window));
gtk_widget_show( pInst->pGtkWindow );
pInst->pGtkWidget = gtk_socket_new();
gtk_widget_show( pInst->pGtkWidget );
gtk_container_add( GTK_CONTAINER(pInst->pGtkWindow), pInst->pGtkWidget );
gtk_widget_show_all( pInst->pGtkWindow );
pInst->window.window = reinterpret_cast<void *>(gtk_socket_get_id( GTK_SOCKET(pInst->pGtkWidget ) ));
XSync( pAppDisplay, False );
XMapWindow( pAppDisplay, GDK_WINDOW_XWINDOW(pInst->pGtkWindow->window) );
XSync( pAppDisplay, False );
}
// update widget size; alas out parent is not yet really XEMBED conformant
gtk_widget_set_size_request( pInst->pGtkWidget, pWindow->width, pWindow->height );
gtk_window_resize( GTK_WINDOW(pInst->pGtkWindow), pWindow->width, pWindow->height );
GdkScreen* pGdkScreen = gtk_widget_get_screen( pInst->pGtkWidget );
Screen* pScreen = ScreenOfDisplay( pAppDisplay, gdk_screen_get_number( pGdkScreen ) );
pInst->window.x = 0;
pInst->window.y = 0;
pInst->window.width = pWindow->width;
pInst->window.height = pWindow->height;
pInst->window.clipRect.left = 0;
pInst->window.clipRect.top = 0;
pInst->window.clipRect.right = pWindow->width;
pInst->window.clipRect.bottom = pWindow->height;
pInst->window.ws_info = &pInst->ws_info;
pInst->window.type = NPWindowTypeWindow;
pInst->ws_info.type = NP_SETWINDOW;
pInst->ws_info.display = pAppDisplay;
pInst->ws_info.visual = DefaultVisualOfScreen( pScreen );
pInst->ws_info.colormap = DefaultColormapOfScreen( pScreen );
pInst->ws_info.depth = DefaultDepthOfScreen( pScreen );
}
else
#endif
{
if( ! pInst->pWidget )
{
pInst->pWidget = CreateNewShell( &(pInst->pShell), reinterpret_cast<Window>(pWindow->window) );
}
// fill in NPWindow and NPCallbackStruct
pInst->window.window = reinterpret_cast<void*>(XtWindow( static_cast<Widget>(pInst->pWidget) ));
pInst->window.x = 0;
pInst->window.y = 0;
pInst->window.width = pWindow->width;
pInst->window.height = pWindow->height;
pInst->window.clipRect.left = 0;
pInst->window.clipRect.top = 0;
pInst->window.clipRect.right = pWindow->width;
pInst->window.clipRect.bottom = pWindow->height;
pInst->window.ws_info = &pInst->ws_info;
pInst->window.type = NPWindowTypeWindow;
pInst->ws_info.type = NP_SETWINDOW;
pInst->ws_info.display = XtDisplay( static_cast<Widget>(pInst->pWidget) );
pInst->ws_info.visual = DefaultVisualOfScreen( XtScreen( static_cast<Widget>(pInst->pWidget) ) );
pInst->ws_info.colormap = DefaultColormapOfScreen( XtScreen( static_cast<Widget>(pInst->pWidget) ) );
pInst->ws_info.depth = DefaultDepthOfScreen( XtScreen( static_cast<Widget>(pInst->pWidget) ) );
XtResizeWidget( static_cast<Widget>(pInst->pShell),
pInst->window.width,
pInst->window.height,
0 );
XtResizeWidget( static_cast<Widget>(pInst->pWidget),
pInst->window.width,
pInst->window.height,
0 );
}
NPError aRet = aPluginFuncs.setwindow( pInst->instance, &pInst->window );
SAL_INFO(
"extensions.plugin",
"pluginapp: NPP_SetWindow returns " << aRet);
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&aRet), sizeof( aRet ),
nullptr );
delete [] reinterpret_cast<char*>(pWindow);
}
break;
case eNPP_StreamAsFile:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
sal_uInt32 nFileID = pMessage->GetUINT32();
NPStream* pStream = m_aNPWrapStreams[ nFileID ];
char* fname = pMessage->GetString();
SAL_INFO(
"extensions.plugin",
"pluginapp: NPP_StreamAsFile " << fname);
aPluginFuncs.asfile( instance, pStream, fname );
delete [] fname;
}
break;
case eNPP_URLNotify:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
char* url = pMessage->GetString();
NPReason* pReason = static_cast<NPReason*>(pMessage->GetBytes());
void** notifyData = static_cast<void**>(pMessage->GetBytes());
aPluginFuncs.urlnotify( instance, url, *pReason, *notifyData );
delete [] url;
delete [] pReason;
delete [] notifyData;
}
break;
case eNPP_WriteReady:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
sal_uInt32 nFileID = pMessage->GetUINT32();
NPStream* pStream = m_aNPWrapStreams[ nFileID ];
int32_t nRet = aPluginFuncs.writeready( instance, pStream );
SAL_INFO(
"extensions.plugin",
"pluginapp: NPP_WriteReady(" << instance << ", " << pStream
<< ") (stream id = " << nFileID << ") returns "
<< nRet);
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&nRet), sizeof( nRet ),
nullptr );
}
break;
case eNPP_Write:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
sal_uInt32 nFileID = pMessage->GetUINT32();
NPStream* pStream = m_aNPWrapStreams[ nFileID ];
int32_t offset = pMessage->GetUINT32();
sal_uLong len;
char* buffer = static_cast<char*>(pMessage->GetBytes( len ));
int32_t nRet = aPluginFuncs.write( instance, pStream, offset, len, buffer );
SAL_INFO(
"extensions.plugin",
"pluginapp: NPP_Write(" << instance << ", " << pStream
<< ", " << offset << ", " << len << ", " << buffer
<< ") returns " << nRet << "; stream = { pdata = "
<< pStream->pdata << ", ndata = " << pStream->ndata
<< ", url = " << pStream->url << ", end = "
<< pStream->end << ", lastmodified = "
<< pStream->lastmodified << ", notifyData = "
<< pStream->notifyData << " }");
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&nRet), sizeof( nRet ),
nullptr );
delete [] buffer;
}
break;
case eNPP_GetMIMEDescription:
{
if( ! pNPP_GetMIMEDescription )
pNPP_GetMIMEDescription = reinterpret_cast<char*(*)()>(
osl_getAsciiFunctionSymbol( pPluginLib, "NPP_GetMIMEDescription" ));
char* pMIME = pNPP_GetMIMEDescription();
Respond( pMessage->m_nID,
POST_NONCONST_STRING( pMIME ),
nullptr );
}
break;
case eNPP_Initialize:
{
pNP_Initialize =
reinterpret_cast<NPError(*)(NPNetscapeFuncs*, NPPluginFuncs*)>(
osl_getAsciiFunctionSymbol( pPluginLib, "NP_Initialize" ));
SAL_WARN_IF(
!pNP_Initialize, "extensions.plugin",
"no NP_Initialize, " << dlerror());
pNP_Shutdown = reinterpret_cast<NPError(*)()>(
osl_getAsciiFunctionSymbol( pPluginLib, "NP_Shutdown" ));
SAL_WARN_IF(
!pNP_Initialize, "extensions.plugin",
"no NP_Shutdown, " << dlerror());
SAL_INFO("extensions.plugin", "entering NP_Initialize");
NPError aRet = pNP_Initialize( &aNetscapeFuncs, &aPluginFuncs );
SAL_INFO(
"extensions.plugin",
"pluginapp: NP_Initialize returns " << aRet);
Respond( pMessage->m_nID, reinterpret_cast<char*>(&aRet), sizeof( aRet ), nullptr );
}
break;
case eNPP_Shutdown:
{
bool bSuccess = (4 == write(wakeup_fd[1], "xxxx", 4));
SAL_WARN_IF(!bSuccess, "extensions.plugin", "short write");
}
break;
default:
SAL_WARN(
"extensions.plugin",
"caught unknown NPP request " << +nCommand);
break;
}
delete pMessage;
}
}
void LoadAdditionalLibs( const char* _pPluginLib )
{
SAL_INFO("extensions.plugin", "LoadAdditionalLibs " << _pPluginLib);
if( ! strncmp( _pPluginLib, "libflashplayer.so", 17 ) )
{
/* #b4951312# flash 7 implicitly assumes a gtk application
* if the API version is greater or equal to 12 (probably
* because they think they run in mozilla then). In that
* case they try to find gtk within the process and crash
* when they don't find it.
*/
aNetscapeFuncs.version = 11;
aPluginFuncs.version = 11;
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,593 +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.
*
************************************************************************/
#ifdef AIX
#define _LINUX_SOURCE_COMPAT
#include <sys/timer.h>
#undef _LINUX_SOURCE_COMPAT
#endif
#include <cstdarg>
#include <sal/log.hxx>
#include <vcl/svapp.hxx>
#include <plugin/unx/plugcon.hxx>
#include <plugin/impl.hxx>
std::vector<PluginConnector*> PluginConnector::allConnectors;
PluginConnector::PluginConnector( int nSocket ) :
Mediator( nSocket )
{
allConnectors.push_back( this );
SetNewMessageHdl( LINK( this, PluginConnector, NewMessageHdl ) );
}
PluginConnector::~PluginConnector()
{
osl::MutexGuard aGuard( m_aUserEventMutex );
for( std::vector< PluginConnector* >::iterator it = allConnectors.begin();
it != allConnectors.end(); ++it )
{
if( *it == this )
{
allConnectors.erase( it );
break;
}
}
}
IMPL_LINK_NOARG_TYPED( PluginConnector, NewMessageHdl, Mediator*, void )
{
osl::MutexGuard aGuard( m_aUserEventMutex );
bool bFound = false;
for( std::vector< PluginConnector* >::iterator it = allConnectors.begin();
it != allConnectors.end() && !bFound; ++it )
{
if( *it == this )
bFound = true;
}
if( ! bFound )
return;
Application::PostUserEvent( LINK( this, PluginConnector, WorkOnNewMessageHdl ) );
}
IMPL_LINK_NOARG_TYPED( PluginConnector, WorkOnNewMessageHdl, void*, void )
{
bool bFound = false;
for( std::vector< PluginConnector* >::iterator it = allConnectors.begin();
it != allConnectors.end() && !bFound; ++it )
{
if( *it == this )
bFound = true;
}
if( ! bFound )
return;
MediatorMessage* pMessage;
CommandAtoms nCommand;
while( (pMessage = GetNextMessage()) )
{
nCommand = (CommandAtoms)pMessage->GetUINT32();
SAL_INFO("extensions.plugin", GetCommandName(nCommand));
switch( nCommand )
{
case eNPN_GetURL:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
char* pUrl = pMessage->GetString();
char* pWindow = pMessage->GetString();
NPError aRet = NPN_GetURL( instance, pUrl, pWindow );
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&aRet), sizeof( NPError ), nullptr );
delete [] pUrl;
delete [] pWindow;
}
break;
case eNPN_GetURLNotify:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
char* pUrl = pMessage->GetString();
char* pWindow = pMessage->GetString();
void** pNotifyData = static_cast<void**>(pMessage->GetBytes());
NPError aRet = NPN_GetURLNotify( instance, pUrl, pWindow,
*pNotifyData );
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&aRet), sizeof( NPError ), nullptr );
delete [] pUrl;
delete [] pWindow;
delete [] pNotifyData;
}
break;
case eNPN_DestroyStream:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
sal_uInt32 nFileID = pMessage->GetUINT32();
char* pUrl = pMessage->GetString();
NPError* pReason = static_cast<NPError*>(pMessage->GetBytes());
NPError aRet = NPERR_FILE_NOT_FOUND;
if( nFileID < static_cast<sal_uInt32>(m_aNPWrapStreams.size()) )
{
if( ! strcmp( m_aNPWrapStreams[ nFileID ]->url, pUrl ) )
{
aRet =
NPN_DestroyStream( instance, m_aNPWrapStreams[ nFileID ],
*pReason );
m_aNPWrapStreams.erase( m_aNPWrapStreams.begin() + nFileID );
}
else
SAL_WARN(
"extensions.plugin",
"StreamID " << nFileID << " has incoherent urls "
<< pUrl << " and "
<< m_aNPWrapStreams[nFileID]->url);
}
else
SAL_WARN(
"extensions.plugin",
"nonexistent StreamID " << nFileID);
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&aRet), sizeof( NPError ), nullptr );
delete [] pUrl;
delete [] pReason;
}
break;
case eNPN_NewStream:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
NPMIMEType pType = pMessage->GetString();
char* pTarget = pMessage->GetString();
NPStream* pStream = nullptr;
NPError aRet = NPN_NewStream( instance, pType, pTarget, &pStream );
if( aRet != NPERR_NO_ERROR )
{
sal_uInt32 nDummy = 0;
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&aRet), sizeof( aRet ),
"", 0,
&nDummy, sizeof(sal_uInt32),
&nDummy, sizeof(sal_uInt32),
nullptr );
}
else
{
m_aNPWrapStreams.push_back( pStream );
sal_uLong nLen = strlen( pStream->url );
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&aRet), sizeof( aRet ),
pStream->url, nLen,
&pStream->end, sizeof(sal_uInt32),
&pStream->lastmodified, sizeof(sal_uInt32),
nullptr );
}
delete [] pTarget;
delete [] pType;
}
break;
case eNPN_PostURLNotify:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
char* pUrl = pMessage->GetString();
char* pTarget = pMessage->GetString();
sal_uInt32 nLen = pMessage->GetUINT32();
char* pBuf = static_cast<char*>(pMessage->GetBytes());
NPBool* pFile = static_cast<NPBool*>(pMessage->GetBytes());
void** pNData = static_cast<void**>(pMessage->GetBytes());
NPError aRet =
NPN_PostURLNotify( instance, pUrl, pTarget, nLen, pBuf, *pFile, *pNData );
Respond( pMessage->m_nID, reinterpret_cast<char*>(&aRet), sizeof( aRet ), nullptr );
delete [] pUrl;
delete [] pTarget;
delete [] pBuf;
delete [] pFile;
delete [] pNData;
}
break;
case eNPN_PostURL:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
char* pUrl = pMessage->GetString();
char* pWindow = pMessage->GetString();
sal_uInt32 nLen = pMessage->GetUINT32();
char* pBuf = static_cast<char*>(pMessage->GetBytes());
NPBool* pFile = static_cast<NPBool*>(pMessage->GetBytes());
NPError aRet =
NPN_PostURL( instance, pUrl, pWindow, nLen, pBuf, *pFile );
Respond( pMessage->m_nID, reinterpret_cast<char*>(&aRet), sizeof( aRet ), nullptr );
delete [] pUrl;
delete [] pWindow;
delete [] pBuf;
delete [] pFile;
}
break;
case eNPN_RequestRead:
{
sal_uInt32 nFileID = pMessage->GetUINT32();
NPStream* pStream = m_aNPWrapStreams[ nFileID ];
sal_uInt32 nRanges = pMessage->GetUINT32();
sal_uInt32* pArray = static_cast<sal_uInt32*>(pMessage->GetBytes());
// build ranges table
NPByteRange* pFirst = new NPByteRange;
NPByteRange* pRun = pFirst;
for( sal_uInt32 n = 0; n < nRanges; n++ )
{
pRun->offset = pArray[ 2*n ];
pRun->length = pArray[ 2*n+1 ];
pRun->next = n < nRanges-1 ? new NPByteRange : nullptr;
pRun = pRun->next;
}
NPError aRet = NPN_RequestRead( pStream, pFirst );
Respond( pMessage->m_nID, reinterpret_cast<char*>(&aRet), sizeof( aRet ), nullptr );
while( pFirst )
{
pRun = pFirst->next;
delete pFirst;
pFirst = pRun;
}
delete [] pArray;
}
break;
case eNPN_Status:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
char* pString = pMessage->GetString();
NPN_Status( instance, pString );
delete [] pString;
}
break;
case eNPN_Version:
{
int major, minor, net_major, net_minor;
NPN_Version( &major, &minor, &net_major, &net_minor );
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&major), sizeof( int ),
&minor, sizeof( int ),
&net_major, sizeof( int ),
&net_minor, sizeof( int ),
nullptr );
}
break;
case eNPN_Write:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
sal_uInt32 nFileID = pMessage->GetUINT32();
NPStream* pStream = m_aNPWrapStreams[ nFileID ];
sal_Int32 nLen = pMessage->GetUINT32();
void* pBuffer = pMessage->GetBytes();
sal_Int32 nRet = NPN_Write( instance, pStream, nLen, pBuffer );
Respond( pMessage->m_nID,
reinterpret_cast<char*>(&nRet), sizeof( nRet ),
nullptr );
delete [] static_cast<char*>(pBuffer);
delete instance;
}
break;
case eNPN_UserAgent:
{
sal_uInt32 nInstance = pMessage->GetUINT32();
NPP instance = m_aInstances[ nInstance ]->instance;
const char* pAnswer = NPN_UserAgent( instance );
Respond( pMessage->m_nID,
const_cast<char*>(pAnswer), strlen( pAnswer ),
nullptr );
}
break;
default:
SAL_WARN(
"extensions.plugin",
"caught unknown NPN request " << +nCommand);
}
delete pMessage;
}
}
#define GET_INSTANCE() \
sal_uInt32 nInstance; \
nInstance = GetNPPID( instance );
#define GET_INSTANCE_RET( err ) \
GET_INSTANCE() \
if( nInstance == PluginConnector::UnknownNPPID ) \
return err
#define POST_INSTANCE() reinterpret_cast<char*>(&nInstance), sizeof( nInstance )
NPError UnxPluginComm::NPP_Destroy( NPP instance, NPSavedData** save )
{
NPError aRet = NPERR_GENERIC_ERROR;
GET_INSTANCE_RET( aRet );
MediatorMessage* pMes =
Transact( eNPP_Destroy,
POST_INSTANCE(),
nullptr );
if( ! pMes )
return NPERR_GENERIC_ERROR;
delete pMes;
pMes = Transact( eNPP_DestroyPhase2,
POST_INSTANCE(),
nullptr );
if( ! pMes )
return NPERR_GENERIC_ERROR;
aRet = GetNPError( pMes );
sal_uLong nSaveBytes;
void* pSaveData = pMes->GetBytes( nSaveBytes );
if( nSaveBytes == 4 && *static_cast<sal_uInt32*>(pSaveData) == 0 )
*save = nullptr;
else
{
*save = new NPSavedData;
(*save)->len = nSaveBytes;
(*save)->buf = pSaveData;
}
delete pMes;
return aRet;
}
NPError UnxPluginComm::NPP_DestroyStream( NPP instance, NPStream* stream, NPError reason )
{
NPError aRet = NPERR_GENERIC_ERROR;
GET_INSTANCE_RET( aRet );
sal_uInt32 nFileID = GetStreamID( stream );
if( nFileID == PluginConnector::UnknownStreamID )
return NPERR_GENERIC_ERROR;
MediatorMessage* pMes =
Transact( eNPP_DestroyStream,
POST_INSTANCE(),
&nFileID, sizeof( nFileID ),
&reason, sizeof( reason ),
nullptr );
m_aNPWrapStreams.erase( m_aNPWrapStreams.begin() + nFileID );
if( ! pMes )
return NPERR_GENERIC_ERROR;
aRet = GetNPError( pMes );
delete pMes;
return aRet;
}
NPError UnxPluginComm::NPP_Initialize()
{
MediatorMessage* pMes =
Transact( eNPP_Initialize,
nullptr );
if( ! pMes )
return NPERR_GENERIC_ERROR;
NPError aRet = GetNPError( pMes );
delete pMes;
return aRet;
}
NPError UnxPluginComm::NPP_New( NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc,
char* argn[], char* argv[], NPSavedData *saved )
{
m_aInstances.push_back(
new ConnectorInstance( instance, pluginType, 0,
nullptr, 0, nullptr, 0,
saved ? static_cast<char*>(saved->buf) : nullptr,
saved ? saved->len : 0 ) );
char *pArgnBuf, *pArgvBuf;
size_t nArgnLen = 0, nArgvLen = 0;
int i;
for( i = 0; i < argc; i++ )
{
nArgnLen += strlen( argn[i] ) +1;
nArgvLen += strlen( argv[i] ) +1;
}
pArgnBuf = new char[ nArgnLen ];
pArgvBuf = new char[ nArgvLen ];
char* pRunArgn = pArgnBuf;
char* pRunArgv = pArgvBuf;
for( i = 0; i < argc; i++ )
{
strcpy( pRunArgn, argn[i] );
strcpy( pRunArgv, argv[i] );
pRunArgn += strlen( argn[i] ) +1;
pRunArgv += strlen( argv[i] ) +1;
}
MediatorMessage* pMes;
if( saved )
pMes =
Transact( eNPP_New,
pluginType, strlen( pluginType ),
&mode, sizeof( mode ),
&argc, sizeof( argc ),
pArgnBuf, nArgnLen,
pArgvBuf, nArgvLen,
saved->buf, static_cast<size_t>(saved->len),
nullptr );
else
pMes =
Transact( eNPP_New,
pluginType, strlen( pluginType ),
&mode, sizeof( mode ),
&argc, sizeof( argc ),
pArgnBuf, nArgnLen,
pArgvBuf, nArgvLen,
"0000", size_t(4),
nullptr );
delete [] pArgnBuf;
delete [] pArgvBuf;
if( ! pMes )
return NPERR_GENERIC_ERROR;
NPError aRet = GetNPError( pMes );
delete pMes;
return aRet;
}
NPError UnxPluginComm::NPP_NewStream( NPP instance, NPMIMEType type, NPStream* stream,
NPBool seekable, uint16_t* stype )
{
NPError aRet = NPERR_GENERIC_ERROR;
GET_INSTANCE_RET( aRet );
m_aNPWrapStreams.push_back( stream );
MediatorMessage* pMes =
Transact( eNPP_NewStream,
POST_INSTANCE(),
type, strlen( type ),
stream->url, strlen( stream->url ),
&stream->end, sizeof( stream->end ),
&stream->lastmodified, sizeof( stream->lastmodified ),
&seekable, sizeof( seekable ),
nullptr );
if( ! pMes )
return NPERR_GENERIC_ERROR;
aRet = GetNPError( pMes );
uint16_t* pSType = static_cast<uint16_t*>(pMes->GetBytes());
*stype = *pSType;
delete [] pSType;
delete pMes;
return aRet;
}
NPError UnxPluginComm::NPP_SetWindow( NPP instance, NPWindow* window )
{
NPError aRet = NPERR_GENERIC_ERROR;
GET_INSTANCE_RET( aRet );
MediatorMessage* pMes =
Transact( eNPP_SetWindow,
POST_INSTANCE(),
window, sizeof( NPWindow ),
nullptr );
if( ! pMes )
return NPERR_GENERIC_ERROR;
aRet = GetNPError( pMes );
delete pMes;
return aRet;
}
void UnxPluginComm::NPP_Shutdown()
{
Send( eNPP_Shutdown, nullptr );
}
void UnxPluginComm::NPP_StreamAsFile( NPP instance, NPStream* stream, const char* fname )
{
GET_INSTANCE();
sal_uInt32 nFileID = GetStreamID( stream );
if( nFileID == PluginConnector::UnknownStreamID )
return;
Send( eNPP_StreamAsFile,
POST_INSTANCE(),
&nFileID, sizeof( nFileID ),
fname, strlen( fname ),
nullptr );
}
void UnxPluginComm::NPP_URLNotify( NPP instance, const char* url, NPReason reason, void* notifyData )
{
GET_INSTANCE();
Send( eNPP_URLNotify,
POST_INSTANCE(),
url, strlen( url ),
&reason, sizeof( reason ),
&notifyData, sizeof( void* ),
nullptr );
}
int32_t UnxPluginComm::NPP_Write( NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer )
{
GET_INSTANCE_RET( -1 );
sal_uInt32 nFileID = GetStreamID( stream );
if( nFileID == PluginConnector::UnknownStreamID )
return -1;
MediatorMessage* pMes =
Transact( eNPP_Write,
POST_INSTANCE(),
&nFileID, sizeof( nFileID ),
&offset, sizeof( offset ),
buffer, static_cast<size_t>(len),
nullptr );
if( ! pMes )
return 0;
int32_t aRet = pMes->GetUINT32();
delete pMes;
return aRet;
}
int32_t UnxPluginComm::NPP_WriteReady( NPP instance, NPStream* stream )
{
GET_INSTANCE_RET( -1 );
sal_uInt32 nFileID = GetStreamID( stream );
if( nFileID == PluginConnector::UnknownStreamID )
return -1;
MediatorMessage* pMes =
Transact( eNPP_WriteReady,
POST_INSTANCE(),
&nFileID, sizeof( nFileID ),
nullptr );
if( ! pMes )
return 0;
int32_t aRet = pMes->GetUINT32();
delete pMes;
return aRet;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,495 +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.
*
************************************************************************/
#ifdef AIX
#define _LINUX_SOURCE_COMPAT
#include <sys/timer.h>
#undef _LINUX_SOURCE_COMPAT
#endif
#include <errno.h>
#include <dlfcn.h>
#include <unistd.h>
#include <sys/poll.h>
#include <fcntl.h>
#include <signal.h>
#include <plugin/unx/plugcon.hxx>
#include <osl/file.h>
#include <osl/module.h>
#include <sal/log.hxx>
#include <config_vclplug.h>
#include <npwrap.hxx>
PluginConnector* pConnector = nullptr;
int nAppArguments = 0;
char** pAppArguments = nullptr;
Display* pAppDisplay = nullptr;
Display* pXtAppDisplay = nullptr;
extern oslModule pPluginLib;
extern NPError (*pNP_Shutdown)();
XtAppContext app_context;
Widget topLevel = nullptr, topBox = nullptr;
int wakeup_fd[2] = { 0, 0 };
static bool bPluginAppQuit = false;
static void GlobalConnectionLostHdl( void* /*pInst*/, Mediator* /*pArg*/ )
{
SAL_WARN("extensions.plugin", "pluginapp exiting due to connection lost");
bool bSuccess = (4 == write(wakeup_fd[1], "xxxx", 4 ));
SAL_WARN_IF(!bSuccess, "extensions.plugin", "short write");
}
extern "C"
{
static int plugin_x_error_handler( Display*, XErrorEvent* )
{
return 0;
}
#if ! ENABLE_GTK
static void ThreadEventHandler( XtPointer /*client_data*/, int* /*source*/, XtInputId* id )
{
char buf[256];
// clear pipe
int len, nLast = -1;
while( (len = read( wakeup_fd[0], buf, sizeof( buf ) ) ) > 0 )
nLast = len-1;
if( ! bPluginAppQuit ) {
if( ( nLast == -1 || buf[nLast] != 'x' ) && pConnector )
pConnector->CallWorkHandler();
else {
// it seems you can use XtRemoveInput only
// safely from within the callback
// why is that ?
SAL_INFO("extensions.plugin", "removing wakeup pipe");
XtRemoveInput( *id );
XtAppSetExitFlag( app_context );
bPluginAppQuit = true;
delete pConnector;
pConnector = NULL;
}
}
}
#endif
}
IMPL_LINK_NOARG_TYPED( PluginConnector, NewMessageHdl, Mediator*, void )
{
(void) this; // loplugin:staticmethods
SAL_INFO("extensions.plugin", "new message handler");
bool bSuccess = (4 == write(wakeup_fd[1], "cccc", 4));
SAL_WARN_IF(!bSuccess, "extensions.plugin", "short write");
}
Widget createSubWidget( char* /*pPluginText*/, Widget shell, Window aParentWindow )
{
Widget newWidget = XtVaCreateManagedWidget(
#if defined USE_MOTIF
"drawingArea",
xmDrawingAreaWidgetClass,
#else
"",
compositeWidgetClass,
#endif
shell,
XtNwidth, 200,
XtNheight, 200,
nullptr );
XtRealizeWidget( shell );
XtRealizeWidget( newWidget );
SAL_INFO(
"extensions.plugin",
"reparenting new widget " << XtWindow( newWidget ) << " to "
<< aParentWindow);
XReparentWindow( pXtAppDisplay,
XtWindow( shell ),
aParentWindow,
0, 0 );
XtMapWidget( shell );
XtMapWidget( newWidget );
XRaiseWindow( pXtAppDisplay, XtWindow( shell ) );
XSync( pXtAppDisplay, False );
return newWidget;
}
void* CreateNewShell( void** pShellReturn, Window aParentWindow )
{
String n, c;
XtGetApplicationNameAndClass(pXtAppDisplay, &n, &c);
Widget newShell =
XtVaAppCreateShell( "pane", c,
topLevelShellWidgetClass,
pXtAppDisplay,
XtNwidth, 200,
XtNheight, 200,
XtNoverrideRedirect, True,
nullptr );
*pShellReturn = newShell;
char pText[1024];
sprintf( pText, "starting plugin %s ...", pAppArguments[2] );
Widget newWidget = createSubWidget( pText, newShell, aParentWindow );
return newWidget;
}
static oslModule LoadModule( const char* pPath )
{
OUString sSystemPath( OUString::createFromAscii( pPath ) );
OUString sFileURL;
osl_getFileURLFromSystemPath( sSystemPath.pData, &sFileURL.pData );
oslModule pLib = osl_loadModule( sFileURL.pData, SAL_LOADMODULE_LAZY );
SAL_INFO_IF(!pLib, "extensions.plugin", "could not open " << pPath);
return pLib;
}
// Unix specific implementation
static void CheckPlugin( const char* pPath )
{
oslModule pLib = LoadModule( pPath );
if (pLib != nullptr) {
char*(*pNP_GetMIMEDescription)() = reinterpret_cast<char*(*)()>(
osl_getAsciiFunctionSymbol( pLib, "NP_GetMIMEDescription" ));
if( pNP_GetMIMEDescription )
printf( "%s\n", pNP_GetMIMEDescription() );
else
SAL_WARN(
"extensions.plugin",
"could not get symbol NP_GetMIMEDescription " << dlerror());
osl_unloadModule( pLib );
}
}
#if OSL_DEBUG_LEVEL > 1 && defined LINUX
#include <execinfo.h>
#endif
extern "C" {
static void signal_handler( int nSig )
{
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "caught signal %d, exiting\n", nSig );
#ifdef LINUX
void* pStack[64];
int nStackLevels = backtrace( pStack, SAL_N_ELEMENTS(pStack) );
backtrace_symbols_fd( pStack, nStackLevels, STDERR_FILENO );
#endif
#endif
if( pConnector ) {
// ensure that a read on the other side will wakeup
delete pConnector;
pConnector = nullptr;
}
_exit(nSig);
}
#if ENABLE_GTK
static gboolean noClosure( gpointer )
{
return sal_True;
}
// Xt events
static gboolean prepareXtEvent( GSource*, gint* )
{
int nMask = XtAppPending( app_context );
return (nMask & XtIMAll) != 0;
}
static gboolean checkXtEvent( GSource* )
{
int nMask = XtAppPending( app_context );
return (nMask & XtIMAll) != 0;
}
static gboolean dispatchXtEvent( GSource*, GSourceFunc, gpointer )
{
XtAppProcessEvent( app_context, XtIMAll );
return sal_True;
}
static GSourceFuncs aXtEventFuncs = {
prepareXtEvent,
checkXtEvent,
dispatchXtEvent,
nullptr,
noClosure,
nullptr
};
static gboolean pollXtTimerCallback(gpointer)
{
for(int i = 0; i < 5; i++) {
if( (XtAppPending(app_context) & (XtIMAll & ~XtIMXEvent)) == 0 )
break;
XtAppProcessEvent(app_context, XtIMAll & ~XtIMXEvent);
}
return sal_True;
}
static gboolean prepareWakeupEvent( GSource*, gint* )
{
struct pollfd aPoll = { wakeup_fd[0], POLLIN, 0 };
(void)poll(&aPoll, 1, 0);
return (aPoll.revents & POLLIN ) != 0;
}
static gboolean checkWakeupEvent( GSource* pSource )
{
gint nDum = 0;
return prepareWakeupEvent( pSource, &nDum );
}
static gboolean dispatchWakeupEvent( GSource*, GSourceFunc, gpointer )
{
char buf[256];
// clear pipe
int len, nLast = -1;
while( (len = read( wakeup_fd[0], buf, sizeof( buf ) ) ) > 0 )
nLast = len-1;
if( ( nLast == -1 || buf[nLast] != 'x' ) && pConnector )
pConnector->CallWorkHandler();
else {
XtAppSetExitFlag( app_context );
bPluginAppQuit = true;
delete pConnector;
pConnector = nullptr;
}
return sal_True;
}
static GSourceFuncs aWakeupEventFuncs = {
prepareWakeupEvent,
checkWakeupEvent,
dispatchWakeupEvent,
nullptr,
noClosure,
nullptr
};
#endif // GTK
}
int main( int argc, char **argv)
{
try
{
struct sigaction aSigAction;
aSigAction.sa_handler = signal_handler;
sigemptyset( &aSigAction.sa_mask );
aSigAction.sa_flags = SA_NOCLDSTOP;
sigaction( SIGSEGV, &aSigAction, nullptr );
sigaction( SIGBUS, &aSigAction, nullptr );
sigaction( SIGABRT, &aSigAction, nullptr );
sigaction( SIGTERM, &aSigAction, nullptr );
sigaction( SIGILL, &aSigAction, nullptr );
int nArg = (argc < 3) ? 1 : 2;
char* pBaseName = argv[nArg] + strlen(argv[nArg]);
while( pBaseName > argv[nArg] && pBaseName[-1] != '/' )
pBaseName--;
LoadAdditionalLibs( pBaseName );
if( argc == 2 ) {
CheckPlugin(argv[1]);
exit(0);
}
nAppArguments = argc;
pAppArguments = argv;
XSetErrorHandler( plugin_x_error_handler );
if( pipe( wakeup_fd ) ) {
SAL_WARN("extensions.plugin", "could not pipe()");
return 1;
}
// initialize 'wakeup' pipe.
int flags;
// set close-on-exec descriptor flag.
if ((flags = fcntl (wakeup_fd[0], F_GETFD)) != -1) {
flags |= FD_CLOEXEC;
(void)fcntl(wakeup_fd[0], F_SETFD, flags);
}
if ((flags = fcntl (wakeup_fd[1], F_GETFD)) != -1) {
flags |= FD_CLOEXEC;
(void)fcntl(wakeup_fd[1], F_SETFD, flags);
}
// set non-blocking I/O flag.
if ((flags = fcntl (wakeup_fd[0], F_GETFL)) != -1) {
flags |= O_NONBLOCK;
(void)fcntl(wakeup_fd[0], F_SETFL, flags);
}
if ((flags = fcntl (wakeup_fd[1], F_GETFL)) != -1) {
flags |= O_NONBLOCK;
(void)fcntl(wakeup_fd[1], F_SETFL, flags);
}
pPluginLib = LoadModule( argv[2] );
if( ! pPluginLib ) {
exit(255);
}
int nSocket = atol( argv[1] );
#if ENABLE_GTK
g_thread_init(nullptr);
gtk_init(&argc, &argv);
#endif
pConnector = new PluginConnector( nSocket );
pConnector->SetConnectionLostHdl( Link<Mediator*,void>( nullptr, GlobalConnectionLostHdl ) );
XtSetLanguageProc( nullptr, nullptr, nullptr );
XtToolkitInitialize();
app_context = XtCreateApplicationContext();
pXtAppDisplay = XtOpenDisplay( app_context, nullptr, "SOPlugin", "SOPlugin", nullptr, 0, &argc, argv );
#if ENABLE_GTK
// integrate Xt events into GTK event loop
GPollFD aXtPollDesc, aWakeupPollDesc;
GSource* pXTSource = g_source_new( &aXtEventFuncs, sizeof(GSource) );
if( !pXTSource ) {
SAL_WARN("extensions.plugin", "could not get Xt GSource");
return 1;
}
g_source_set_priority( pXTSource, GDK_PRIORITY_EVENTS );
g_source_set_can_recurse( pXTSource, sal_True );
g_source_attach( pXTSource, nullptr );
aXtPollDesc.fd = ConnectionNumber( pXtAppDisplay );
aXtPollDesc.events = G_IO_IN;
aXtPollDesc.revents = 0;
g_source_add_poll( pXTSource, &aXtPollDesc );
gint xt_polling_timer_id = g_timeout_add( 25, pollXtTimerCallback, nullptr);
// Initialize wakeup events listener
GSource *pWakeupSource = g_source_new( &aWakeupEventFuncs, sizeof(GSource) );
if ( pWakeupSource == nullptr ) {
SAL_WARN("extensions.plugin", "could not get wakeup source");
return 1;
}
g_source_set_priority( pWakeupSource, GDK_PRIORITY_EVENTS);
g_source_attach( pWakeupSource, nullptr );
aWakeupPollDesc.fd = wakeup_fd[0];
aWakeupPollDesc.events = G_IO_IN;
aWakeupPollDesc.revents = 0;
g_source_add_poll( pWakeupSource, &aWakeupPollDesc );
pAppDisplay = gdk_x11_display_get_xdisplay( gdk_display_get_default() );
#else
pAppDisplay = pXtAppDisplay;
XtAppAddInput( app_context,
wakeup_fd[0],
(XtPointer)XtInputReadMask,
ThreadEventHandler, NULL );
#endif
// send that we are ready to go
MediatorMessage* pMessage =
pConnector->Transact( "init req", 8,
nullptr );
delete pMessage;
#if OSL_DEBUG_LEVEL > 3
int nPID = getpid();
int nChild = fork();
if( nChild == 0 ) {
char pidbuf[16];
char* pArgs[] = { "xterm", "-sl", "2000", "-sb", "-e", "gdb", "pluginapp.bin", pidbuf, NULL };
sprintf( pidbuf, "%d", nPID );
execvp( pArgs[0], pArgs );
_exit(255);
} else
sleep( 10 );
#endif
/*
* Loop for events.
*/
// for some reason XtAppSetExitFlag won't quit the application
// in ThreadEventHandler most of times; Xt will hang in select
// (hat is in XtAppNextEvent). Have our own mainloop instead
// of XtAppMainLoop
do {
#if ENABLE_GTK
g_main_context_iteration( nullptr, sal_True );
#else
XtAppProcessEvent( app_context, XtIMAll );
#endif
} while( ! XtAppGetExitFlag( app_context ) && ! bPluginAppQuit );
SAL_INFO("extensions.plugin", "left plugin app main loop");
#if ENABLE_GTK
g_source_remove(xt_polling_timer_id);
#endif
pNP_Shutdown();
SAL_INFO("extensions.plugin", "NP_Shutdown done");
osl_unloadModule( pPluginLib );
SAL_INFO("extensions.plugin", "plugin close");
close( wakeup_fd[0] );
close( wakeup_fd[1] );
return 0;
}
catch (std::exception& e)
{
SAL_WARN("extensions.plugin", "exception: " << e.what());
return 255;
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,31 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_EXTENSIONS_SOURCE_PLUGIN_UNX_NPWRAP_HXX
#define INCLUDED_EXTENSIONS_SOURCE_PLUGIN_UNX_NPWRAP_HXX
#include <sal/config.h>
void* CreateNewShell( void** pShellReturn, Window aParentWindow );
void LoadAdditionalLibs(const char*);
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,281 +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.
*
************************************************************************/
#ifdef AIX
#define _LINUX_SOURCE_COMPAT
#include <sys/timer.h>
#undef _LINUX_SOURCE_COMPAT
#endif
#include <sal/log.hxx>
#include <plugin/unx/plugcon.hxx>
#include <cstdarg>
#include <vector>
sal_uInt32 PluginConnector::GetStreamID( NPStream* pStream )
{
size_t nLen = m_aNPWrapStreams.size();
for( size_t i = 0; i < nLen; i++ )
if( m_aNPWrapStreams[ i ] == pStream )
return static_cast<sal_uInt32>(i);
SAL_WARN("extensions.plugin", "NPStream has no ID");
return UnknownStreamID;
}
sal_uInt32 PluginConnector::GetNPPID( NPP instance )
{
size_t nLen = m_aInstances.size();
for( size_t i=0; i <nLen; i++ )
if( m_aInstances[ i ]->instance == instance )
return static_cast<sal_uInt32>(i);
SAL_WARN("extensions.plugin", "NPP has no ID");
return UnknownNPPID;
}
struct PtrStruct
{
char* pData;
sal_uLong nBytes;
PtrStruct( char* i_pData, sal_uLong i_nBytes )
: pData( i_pData ), nBytes( i_nBytes ) {}
};
sal_uLong PluginConnector::FillBuffer( char*& rpBuffer,
const char* pFunction,
sal_uLong nFunctionLen,
va_list ap )
{
std::vector< PtrStruct > aList;
aList.reserve( 5 );
sal_uLong nDataSize = nFunctionLen + sizeof( sal_uLong );
char* pNext;
do {
pNext = va_arg( ap, char* );
if( pNext )
{
aList.push_back( PtrStruct( pNext, va_arg( ap, sal_uLong ) ) );
nDataSize += aList.back().nBytes + sizeof(sal_uLong);
}
} while( pNext );
rpBuffer = new char[ nDataSize ];
char* pRun = rpBuffer;
memcpy( pRun, &nFunctionLen, sizeof( nFunctionLen ) );
pRun += sizeof( nFunctionLen );
memcpy( pRun, pFunction, nFunctionLen );
pRun += nFunctionLen;
for( std::vector<PtrStruct>::const_iterator it = aList.begin(); it != aList.end(); ++it )
{
memcpy( pRun, &it->nBytes, sizeof( sal_uLong ) );
pRun += sizeof( sal_uLong );
memcpy( pRun, it->pData, it->nBytes );
pRun += it->nBytes;
}
return nDataSize;
}
MediatorMessage* PluginConnector::Transact( const char* pFunction,
sal_uLong nFunctionLen, ... )
{
va_list ap;
char* pBuffer;
va_start( ap, nFunctionLen );
sal_uLong nSize = FillBuffer( pBuffer, pFunction, nFunctionLen, ap );
va_end( ap );
MediatorMessage* pRet = TransactMessage( nSize, pBuffer );
delete[] pBuffer;
return pRet;
}
MediatorMessage* PluginConnector::Transact( sal_uInt32 nFunction, ... )
{
va_list ap;
char* pBuffer;
va_start( ap, nFunction );
sal_uLong nSize = FillBuffer( pBuffer, reinterpret_cast<char*>(&nFunction), sizeof( nFunction ), ap );
va_end( ap );
MediatorMessage* pRet = TransactMessage( nSize, pBuffer );
delete[] pBuffer;
return pRet;
}
sal_uLong PluginConnector::Send( sal_uInt32 nFunction, ... )
{
va_list ap;
char* pBuffer;
va_start( ap, nFunction );
sal_uLong nSize = FillBuffer( pBuffer, reinterpret_cast<char*>(&nFunction), sizeof( nFunction ), ap );
va_end( ap );
sal_uLong nRet = SendMessage( nSize, pBuffer );
delete[] pBuffer;
return nRet;
}
void PluginConnector::Respond( sal_uLong nID,
char* pFunction,
sal_uLong nFunctionLen, ... )
{
va_list ap;
char* pBuffer;
va_start( ap, nFunctionLen );
sal_uLong nSize = FillBuffer( pBuffer, pFunction, nFunctionLen, ap );
va_end( ap );
SendMessage( nSize, pBuffer, nID | ( 1 << 24 ) );
delete[] pBuffer;
}
MediatorMessage* PluginConnector::WaitForAnswer( sal_uLong nMessageID )
{
if( ! m_bValid )
return nullptr;
nMessageID &= 0x00ffffff;
while( m_pListener )
{
{
osl::MutexGuard aGuard( m_aQueueMutex );
for( size_t i = 0; i < m_aMessageQueue.size(); i++ )
{
MediatorMessage* pMessage = m_aMessageQueue[ i ];
sal_uLong nID = pMessage->m_nID;
if( ( nID & 0xff000000 ) &&
( ( nID & 0x00ffffff ) == nMessageID ) )
{
m_aMessageQueue.erase( m_aMessageQueue.begin() + i );
return pMessage;
}
}
}
if( ! m_aMessageQueue.empty() )
CallWorkHandler();
WaitForMessage( 2000 );
}
return nullptr;
}
ConnectorInstance::ConnectorInstance( NPP inst, char* type,
int args, char* pargnbuf, sal_uLong nargnbytes,
char* pargvbuf, sal_uLong nargvbytes,
char* savedata, sal_uLong savebytes ) :
instance( inst ),
pShell( nullptr ),
pWidget( nullptr ),
pGtkWindow( nullptr ),
pGtkWidget( nullptr ),
bShouldUseXEmbed( false ),
nArg( args ),
pArgnBuf( pargnbuf ),
pArgvBuf( pargvbuf )
{
memset( &window, 0, sizeof(window) );
pMimeType = new char[ strlen( type ) + 1 ];
strcpy( pMimeType, type );
aData.len = savebytes;
aData.buf = savedata;
argn = new char*[ nArg ];
argv = new char*[ nArg ];
int i;
char* pRun = pArgnBuf;
for( i = 0; i < nArg; i++ )
{
argn[i] = pRun;
while( *pRun != 0 && (sal_uLong)(pRun - pArgnBuf) < nargnbytes )
pRun++;
if( (sal_uLong)(pRun - pArgnBuf) < nargnbytes )
pRun++;
}
pRun = pArgvBuf;
for( i = 0; i < nArg; i++ )
{
argv[i] = pRun;
while( *pRun != 0 && (sal_uLong)(pRun - pArgvBuf) < nargvbytes )
pRun++;
if( (sal_uLong)(pRun - pArgvBuf) < nargvbytes )
pRun++;
}
}
ConnectorInstance::~ConnectorInstance()
{
delete [] pMimeType;
delete [] argn;
delete [] argv;
delete [] pArgnBuf;
delete [] pArgvBuf;
delete [] static_cast<char*>(aData.buf);
}
const char* GetCommandName( CommandAtoms eCommand )
{
switch( eCommand )
{
case eNPN_GetURL: return "NPN_GetURL";
case eNPN_GetURLNotify: return "NPN_GetURLNotify";
case eNPN_DestroyStream: return "NPN_DestroyStream";
case eNPN_NewStream: return "NPN_NewStream";
case eNPN_PostURLNotify: return "NPN_PostURLNotify";
case eNPN_PostURL: return "NPN_PostURL";
case eNPN_RequestRead: return "NPN_RequestRead";
case eNPN_Status: return "NPN_Status";
case eNPN_Version: return "NPN_Version";
case eNPN_Write: return "NPN_Write";
case eNPN_UserAgent: return "NPN_UserAgent";
case eNPP_DestroyStream: return "NPP_DestroyStream";
case eNPP_Destroy: return "NPP_Destroy";
case eNPP_DestroyPhase2: return "NPP_DestroyPhase2";
case eNPP_NewStream: return "NPP_NewStream";
case eNPP_New: return "NPP_New";
case eNPP_SetWindow: return "NPP_SetWindow";
case eNPP_StreamAsFile: return "NPP_StreamAsFile";
case eNPP_URLNotify: return "NPP_URLNotify";
case eNPP_WriteReady: return "NPP_WriteReady";
case eNPP_Write: return "NPP_Write";
case eNPP_GetMIMEDescription: return "NPP_GetMIMEDescription";
case eNPP_Initialize: return "NPP_Initialize";
case eNPP_Shutdown: return "NPP_Shutdown";
case eMaxCommand: return "eMaxCommand";
default: return "unknown command";
}
return nullptr;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,152 +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 <config_folders.h>
#ifdef AIX
#define _LINUX_SOURCE_COMPAT
#include <sys/timer.h>
#undef _LINUX_SOURCE_COMPAT
#endif
#include <sys/types.h>
#include <signal.h>
#include <sys/wait.h>
#include <osl/file.hxx>
#include <osl/thread.h>
#include <rtl/bootstrap.hxx>
#include <sal/log.hxx>
#include <plugin/impl.hxx>
std::shared_ptr<SysPlugData> CreateSysPlugData()
{
return std::shared_ptr<SysPlugData>();
}
UnxPluginComm::UnxPluginComm(
const OUString& /*mimetype*/,
const OUString& library,
Window aParent,
int nDescriptor1,
int nDescriptor2
) :
PluginComm( OUStringToOString( library, osl_getThreadTextEncoding() ), false ),
PluginConnector( nDescriptor2 ),
m_nCommPID( 0 )
{
OString path;
if (!getPluginappPath(&path))
{
SAL_WARN("extensions.plugin", "cannot construct path to pluginapp.bin");
return;
}
char pDesc[32];
char pWindow[32];
sprintf( pWindow, "%d", (int)aParent );
sprintf( pDesc, "%d", nDescriptor1 );
OString aLib(OUStringToOString(library, osl_getThreadTextEncoding()));
char const* pArgs[5];
pArgs[0] = path.getStr();
pArgs[1] = pDesc;
pArgs[2] = aLib.getStr();
pArgs[3] = pWindow;
pArgs[4] = nullptr;
SAL_INFO(
"extensions.plugin",
"try to launch: " << pArgs[0] << " " << pArgs[1] << " " << pArgs[2]
<< " " << pArgs[3] << ", descriptors are " << nDescriptor1 << ", "
<< nDescriptor2);
pid_t pid = fork();
if( pid == 0 )
{
execvp( pArgs[0], const_cast< char ** >(pArgs) );
SAL_WARN("extensions.plugin", "could not exec " << pArgs[0]);
_exit(255);
}
if( pid == -1 )
{
SAL_WARN("extensions.plugin", "fork failed");
return;
}
m_nCommPID = pid;
// wait for pluginapp.bin to start up
if( ! WaitForMessage() )
{
SAL_WARN(
"extensions.plugin",
"timeout on command: " << pArgs[0] << " " << pArgs[1] << " "
<< pArgs[2] << " " << pArgs[3]);
invalidate();
}
else
{
MediatorMessage* pMessage = GetNextMessage( true );
Respond( pMessage->m_nID,
const_cast<char*>("init ack"),8,
nullptr );
delete pMessage;
NPP_Initialize();
}
}
UnxPluginComm::~UnxPluginComm()
{
NPP_Shutdown();
if( m_nCommPID != 0 )
{
int status = 16777216;
pid_t nExit = waitpid( m_nCommPID, &status, WUNTRACED );
SAL_INFO(
"extensions.plugin",
"child " << nExit << " (plugin app child " << m_nCommPID
<< ") exited with status " << WEXITSTATUS(status));
}
}
bool UnxPluginComm::getPluginappPath(OString * path) {
OSL_ASSERT(path != nullptr);
OUString p("$BRAND_BASE_DIR/" LIBO_LIBEXEC_FOLDER "/pluginapp.bin");
rtl::Bootstrap::expandMacros(p);
return
(osl::FileBase::getSystemPathFromFileURL(p, p) ==
osl::FileBase::E_None) &&
p.convertToString(
path, osl_getThreadTextEncoding(),
(RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR));
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,313 +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.
*
************************************************************************/
#ifdef AIX
#define _LINUX_SOURCE_COMPAT
#include <sys/timer.h>
#undef _LINUX_SOURCE_COMPAT
#endif
#include <cstdarg>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <osl/thread.h>
#include <rtl/strbuf.hxx>
#include <tools/appendunixshellword.hxx>
#include <vcl/svapp.hxx>
#include <plugin/impl.hxx>
using namespace std;
using namespace com::sun::star::uno;
using namespace com::sun::star::plugin;
// Unix specific implementation
static bool CheckPlugin( const OString& rPath, list< PluginDescription* >& rDescriptions )
{
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "Trying plugin %s ... ", rPath.getStr() );
#endif
sal_Int32 nPos = rPath.lastIndexOf('/');
if (nPos == -1)
{
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "no absolute path to plugin\n" );
#endif
return false;
}
OString aBaseName = rPath.copy(nPos+1);
if (aBaseName == "libnullplugin.so")
{
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "don't like %s\n", aBaseName.getStr() );
#endif
return false;
}
struct stat aStat;
if (stat(rPath.getStr(), &aStat) || !S_ISREG(aStat.st_mode))
{
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "%s is not a regular file\n", rPath.getStr() );
#endif
return false;
}
rtl_TextEncoding aEncoding = osl_getThreadTextEncoding();
OString path;
if (!UnxPluginComm::getPluginappPath(&path))
{
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "cannot construct path to pluginapp.bin\n" );
#endif
return false;
}
OStringBuffer cmd;
tools::appendUnixShellWord(&cmd, path);
cmd.append(' ');
tools::appendUnixShellWord(&cmd, rPath);
OString aCommand(cmd.makeStringAndClear());
FILE* pResult = popen( aCommand.getStr(), "r" );
int nDescriptions = 0;
if( pResult )
{
OStringBuffer aMIME;
char buf[256];
while( fgets( buf, sizeof( buf ), pResult ) )
{
for( size_t i = 0; i < sizeof(buf) && buf[i]; ++i )
{
if( buf[i] == '\n' )
buf[i] = ';';
}
aMIME.append( buf );
}
pclose( pResult );
if( !aMIME.isEmpty() )
{
OString aLine = aMIME.makeStringAndClear();
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 = OStringToOUString( rPath, aEncoding );
// set mimetype
pNew->Mimetype = OStringToOUString( aMimetype, aEncoding );
// set extension line
pNew->Extension = OStringToOUString( aExtension.makeStringAndClear(), aEncoding );
// set description
pNew->Description= OStringToOUString( aDesc, aEncoding );
rDescriptions.push_back( pNew );
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "Mimetype: %s\nExtension: %s\n"
"Description: %s\n",
OUStringToOString( pNew->Mimetype, aEncoding ).getStr(),
OUStringToOString( pNew->Extension, aEncoding ).getStr(),
OUStringToOString( pNew->Description, aEncoding ).getStr()
);
#endif
}
}
#if OSL_DEBUG_LEVEL > 1
else
fprintf( stderr, "result of \"%s\" contains no mimtype\n",
aCommand.getStr() );
#endif
}
#if OSL_DEBUG_LEVEL > 1
else
fprintf( stderr, "command \"%s\" failed\n", aCommand.getStr() );
#endif
return nDescriptions > 0;
}
static void CheckPluginRegistryFiles( const OString& rPath, list< PluginDescription* >& rDescriptions )
{
OStringBuffer aPath( 1024 );
aPath.append( rPath );
aPath.append( "/pluginreg.dat" );
FILE* fp = fopen( aPath.getStr(), "r" );
if( fp )
{
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "parsing %s\n", aPath.getStr() );
#endif
char aLine[1024];
while( fgets( aLine, sizeof( aLine ), fp ) )
{
int nLineLen = strlen( aLine );
int nDotPos;
for( nDotPos = nLineLen-1; nDotPos > 0 && aLine[nDotPos] != ':'; nDotPos-- )
;
if( aLine[0] == '/' && aLine[nDotPos] == ':' && aLine[nDotPos+1] == '$' )
CheckPlugin( OString(aLine, nDotPos), rDescriptions );
}
fclose( fp );
}
// check subdirectories
DIR* pDIR = opendir( rPath.getStr() );
struct dirent* pDirEnt = nullptr;
struct stat aStat;
struct dirent u;
while( pDIR && ! readdir_r( pDIR, &u, &pDirEnt ) && pDirEnt )
{
char* pBaseName = u.d_name;
if( rtl_str_compare( ".", pBaseName ) && rtl_str_compare( "..", pBaseName ) )
{
OStringBuffer aBuf( 1024 );
aBuf.append( rPath );
aBuf.append( '/' );
aBuf.append( pBaseName );
if( ! stat( aBuf.getStr(), &aStat ) )
{
if( S_ISDIR( aStat.st_mode ) )
CheckPluginRegistryFiles( aBuf.makeStringAndClear(), rDescriptions );
}
}
}
if( pDIR )
closedir( pDIR );
}
Sequence<PluginDescription> XPluginManager_Impl::impl_getPluginDescriptions() throw(css::uno::RuntimeException, std::exception)
{
static Sequence<PluginDescription> aDescriptions;
static bool bHavePlugins = false;
if( ! bHavePlugins )
{
rtl_TextEncoding aEncoding = osl_getThreadTextEncoding();
list<PluginDescription*> aPlugins;
int i;
// unix: search for plugins in /usr/lib/netscape/plugins,
// ~/.netscape/plugins und NPX_PLUGIN_PATH
// additionally: search in PluginsPath
static const char* pHome = getenv( "HOME" );
static const char* pNPXPluginPath = getenv( "NPX_PLUGIN_PATH" );
// netscape!, quick, beam me back to the 90's when Motif roamed the earth
OStringBuffer aSearchBuffer("/usr/lib/netscape/plugins");
if( pHome )
aSearchBuffer.append(':').append(pHome).append("/.netscape/plugins");
if( pNPXPluginPath )
aSearchBuffer.append(':').append(pNPXPluginPath);
const Sequence< OUString >& rPaths( PluginManager::getAdditionalSearchPaths() );
for( i = 0; i < rPaths.getLength(); i++ )
{
aSearchBuffer.append(':').append(OUStringToOString(
rPaths.getConstArray()[i], aEncoding));
}
OString aSearchPath = aSearchBuffer.makeStringAndClear();
sal_Int32 nIndex = 0;
struct dirent u;
do
{
OString aPath(aSearchPath.getToken(0, ':', nIndex));
if (!aPath.isEmpty())
{
DIR* pDIR = opendir(aPath.getStr());
struct dirent* pDirEnt = nullptr;
while( pDIR && ! readdir_r( pDIR, &u, &pDirEnt ) && pDirEnt )
{
char* pBaseName = u.d_name;
if( pBaseName[0] != '.' ||
pBaseName[1] != '.' ||
pBaseName[2] != 0 )
{
OStringBuffer aFileName(aPath);
aFileName.append('/').append(pBaseName);
CheckPlugin( aFileName.makeStringAndClear(), aPlugins );
}
}
if( pDIR )
closedir( pDIR );
}
}
while ( nIndex >= 0 );
// try ~/.mozilla/pluginreg.dat
OStringBuffer aBuf(256);
aBuf.append( pHome );
aBuf.append( "/.mozilla" );
CheckPluginRegistryFiles( aBuf.makeStringAndClear(), aPlugins );
// create return value
aDescriptions = Sequence<PluginDescription>( aPlugins.size() );
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "found %" SAL_PRI_SIZET "u plugins\n", aPlugins.size() );
#endif
list<PluginDescription*>::iterator iter;
for( iter = aPlugins.begin(), i=0; iter != aPlugins.end(); ++iter ,i++ )
{
aDescriptions.getArray()[ i ] = **iter;
delete *iter;
}
aPlugins.clear();
bHavePlugins = true;
}
return aDescriptions;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,441 +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 <prewin.h>
#include <postwin.h>
#include <sal/log.hxx>
#include <plugin/impl.hxx>
#if defined _MSC_VER
#pragma warning (push,1)
#pragma warning (disable:4005)
#endif
#include <string.h>
#include <tchar.h>
#include <objbase.h>
#if defined _MSC_VER
#pragma warning (pop)
#endif
#include <list>
#include <map>
#include <algorithm>
extern NPNetscapeFuncs aNPNFuncs;
#include <tools/debug.hxx>
#if OSL_DEBUG_LEVEL > 1
void TRACE( char const * s );
void TRACEN( char const * s, long n );
#else
#define TRACE(x)
#define TRACEN(x,n)
#endif
std::shared_ptr<SysPlugData> CreateSysPlugData()
{
return std::shared_ptr<SysPlugData>();
}
PluginComm_Impl::PluginComm_Impl( const OUString& /*rMIME*/, const OUString& rName, HWND /*hWnd*/ )
: PluginComm( OUStringToOString( rName, RTL_TEXTENCODING_MS_1252 ) )
{
// initialize plugin function table
memset( &_NPPfuncs, 0, sizeof( _NPPfuncs ) );
#ifdef UNICODE
_plDLL = ::LoadLibrary( rName.getStr() );
#else
OString aStr( OUStringToOString( rName, RTL_TEXTENCODING_MS_1252 ) );
_plDLL = ::LoadLibrary( aStr.getStr() );
#endif
DBG_ASSERT( _plDLL, "### loading plugin dll failed!" );
NPError (WINAPI * pEntry)( NPPluginFuncs* );
retrieveFunction( _T("NP_GetEntryPoints"), (void**)&pEntry );
_NPPfuncs.size = sizeof( _NPPfuncs );
_NPPfuncs.version = 0;
NPError nErr = (*pEntry)( &_NPPfuncs );
SAL_WARN_IF(
nErr != NPERR_NO_ERROR, "extensions.plugin",
"NP_GetEntryPoints() failed");
DBG_ASSERT( (_NPPfuncs.version >> 8) >= NP_VERSION_MAJOR,
"### version failure!" );
m_eCall = eNP_Initialize;
if (execute() != NPERR_NO_ERROR) {
shutdown();
throw CannotInitializeException();
}
}
PluginComm_Impl::~PluginComm_Impl()
{
shutdown();
}
void PluginComm_Impl::shutdown()
{
if (_plDLL)
{
// NPP_Shutdown();
NPError (WINAPI * pShutdown)();
if (retrieveFunction( _T("NP_Shutdown"), (void**)&pShutdown ))
{
NPError nErr = (*pShutdown)(); (void)nErr;
DBG_ASSERT( nErr == NPERR_NO_ERROR, "### NP_Shutdown() failed!" );
}
BOOL bRet = (BOOL)::FreeLibrary( _plDLL ); (void)bRet;
DBG_ASSERT( bRet, "### unloading plugin dll failed!" );
_plDLL = NULL;
}
}
BOOL PluginComm_Impl::retrieveFunction( TCHAR const * pName, void** ppFunc ) const
{
if( ! _plDLL )
return FALSE;
*ppFunc = (void*)::GetProcAddress( _plDLL, pName );
return (*ppFunc != NULL);
}
long PluginComm_Impl::doIt()
{
long nRet = 0;
switch( m_eCall )
{
case eNP_Initialize:
{
TRACE( "eNP_Initialize" );
NPError (WINAPI * pInit)( NPNetscapeFuncs* );
if ((_NPPfuncs.version >> 8) >= NP_VERSION_MAJOR &&
(retrieveFunction( _T("NP_Initialize"), (void**)&pInit ) ||
retrieveFunction( _T("NP_PluginInit"), (void**)&pInit )))
{
nRet = (*pInit)( &aNPNFuncs );
}
else
{
nRet = NPERR_GENERIC_ERROR;
}
DBG_ASSERT( nRet == NPERR_NO_ERROR, "### NP_Initialize() failed!" );
}
break;
case eNPP_Destroy:
TRACE( "eNPP_Destroy" );
nRet = (_NPPfuncs.destroy
? (*_NPPfuncs.destroy)(
(NPP)m_aArgs[0],
(NPSavedData**)m_aArgs[1] )
: NPERR_GENERIC_ERROR);
break;
case eNPP_DestroyStream:
TRACE( "eNPP_DestroyStream" );
nRet = (_NPPfuncs.destroystream
? (*_NPPfuncs.destroystream)(
(NPP)m_aArgs[0],
(NPStream*)m_aArgs[1],
(NPError)(sal_IntPtr)m_aArgs[2] )
: NPERR_GENERIC_ERROR);
break;
case eNPP_New:
TRACE( "eNPP_New" );
nRet = (_NPPfuncs.newp
? (*_NPPfuncs.newp)(
(NPMIMEType)m_aArgs[0],
(NPP)m_aArgs[1],
(uint16_t)(sal_IntPtr)m_aArgs[2],
(int16_t)(sal_IntPtr)m_aArgs[3],
(char**)m_aArgs[4],
(char**)m_aArgs[5],
(NPSavedData*)m_aArgs[6] )
: NPERR_GENERIC_ERROR);
break;
case eNPP_NewStream:
TRACE( "eNPP_NewStream" );
nRet = (_NPPfuncs.newstream
? (*_NPPfuncs.newstream)(
(NPP)m_aArgs[0],
(NPMIMEType)m_aArgs[1],
(NPStream*)m_aArgs[2],
(NPBool)(sal_IntPtr)m_aArgs[3],
(uint16_t*)m_aArgs[4] )
: NPERR_GENERIC_ERROR);
break;
case eNPP_Print:
TRACE( "eNPP_Print" );
if (_NPPfuncs.print)
(*_NPPfuncs.print)(
(NPP)m_aArgs[0],
(NPPrint*)m_aArgs[1] );
break;
case eNPP_SetWindow:
{
TRACE( "eNPP_SetWindow" );
nRet = (_NPPfuncs.setwindow
? (*_NPPfuncs.setwindow)(
(NPP)m_aArgs[0],
(NPWindow*)m_aArgs[1] )
: NPERR_GENERIC_ERROR);
break;
}
case eNPP_StreamAsFile:
TRACE( "eNPP_StreamAsFile" );
if (_NPPfuncs.asfile)
(*_NPPfuncs.asfile)(
(NPP)m_aArgs[0],
(NPStream*)m_aArgs[1],
(char*)m_aArgs[2] );
break;
case eNPP_URLNotify:
TRACE( "eNPP_URLNotify" );
if (_NPPfuncs.urlnotify)
(*_NPPfuncs.urlnotify)(
(NPP)m_aArgs[0],
(char*)m_aArgs[1],
(NPReason)(sal_IntPtr)m_aArgs[2],
m_aArgs[3] );
break;
case eNPP_Write:
TRACEN( "eNPP_Write n=", (int32_t)m_aArgs[3] );
nRet = (_NPPfuncs.write
? (*_NPPfuncs.write)(
(NPP)m_aArgs[0],
(NPStream*)m_aArgs[1],
(sal_IntPtr)m_aArgs[2],
(sal_IntPtr)m_aArgs[3],
m_aArgs[4] )
: 0);
break;
case eNPP_WriteReady:
TRACE( "eNPP_WriteReady" );
nRet = (_NPPfuncs.writeready
? (*_NPPfuncs.writeready)(
(NPP)m_aArgs[0],
(NPStream*)m_aArgs[1] )
: 0);
break;
case eNPP_GetValue:
TRACE( "eNPP_GetValue" );
nRet = (_NPPfuncs.getvalue
? (*_NPPfuncs.getvalue)(
(NPP)m_aArgs[0],
(NPPVariable)(sal_IntPtr)m_aArgs[1],
m_aArgs[2] )
: NPERR_GENERIC_ERROR);
break;
case eNPP_SetValue:
TRACE( "eNPP_SetValue" );
nRet = (_NPPfuncs.setvalue
? (*_NPPfuncs.setvalue)(
(NPP)m_aArgs[0],
(NPNVariable)(sal_IntPtr)m_aArgs[1],
m_aArgs[2] )
: NPERR_GENERIC_ERROR);
break;
case eNPP_Shutdown:
{
TRACE( "eNPP_Shutdown" );
NPP_ShutdownUPP pFunc;
if (retrieveFunction( _T("NPP_Shutdown"), (void**)&pFunc ))
(*pFunc)();
}
break;
case eNPP_Initialize:
TRACE( "eNPP_Initialize" );
OSL_FAIL( "NPP_Initialize: not implemented!" );
break;
case eNPP_GetJavaClass:
TRACE( "eNPP_GetJavaClass" );
OSL_FAIL( "NPP_GetJavaClass: not implemented!" );
break;
}
return nRet;
}
NPError PluginComm_Impl::NPP_Destroy( NPP instance, NPSavedData** save )
{
DBG_ASSERT( _NPPfuncs.destroy, "### NPP_Destroy(): null pointer in NPP functions table!" );
m_eCall = eNPP_Destroy;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)save;
return (NPError)execute();
}
NPError PluginComm_Impl::NPP_DestroyStream( NPP instance, NPStream* stream, NPError reason )
{
DBG_ASSERT( _NPPfuncs.destroystream, "### NPP_DestroyStream(): null pointer in NPP functions table!" );
m_eCall = eNPP_DestroyStream;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)stream;
m_aArgs[2] = reinterpret_cast< void * >(static_cast< sal_IntPtr >(reason));
return (NPError)execute();
}
NPError PluginComm_Impl::NPP_New( NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc,
char* argn[], char* argv[], NPSavedData *saved )
{
DBG_ASSERT( _NPPfuncs.newp, "### NPP_New(): null pointer in NPP functions table!" );
m_eCall = eNPP_New;
m_aArgs[0] = (void*)pluginType;
m_aArgs[1] = (void*)instance;
m_aArgs[2] = reinterpret_cast< void * >(static_cast< sal_uIntPtr >(mode));
m_aArgs[3] = reinterpret_cast< void * >(static_cast< sal_IntPtr >(argc));
m_aArgs[4] = (void*)argn;
m_aArgs[5] = (void*)argv;
m_aArgs[6] = (void*)saved;
return (NPError)execute();
}
NPError PluginComm_Impl::NPP_NewStream( NPP instance, NPMIMEType type, NPStream* stream,
NPBool seekable, uint16_t* stype )
{
DBG_ASSERT( _NPPfuncs.newstream, "### NPP_NewStream(): null pointer in NPP functions table!" );
m_eCall = eNPP_NewStream;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)type;
m_aArgs[2] = (void*)stream;
m_aArgs[3] = reinterpret_cast< void * >(
static_cast< sal_uIntPtr >(seekable));
m_aArgs[4] = (void*)stype;
return (NPError)execute();
}
void PluginComm_Impl::NPP_Print( NPP instance, NPPrint* platformPrint )
{
DBG_ASSERT( _NPPfuncs.print, "### NPP_Print(): null pointer in NPP functions table!" );
m_eCall = eNPP_Print;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)platformPrint;
execute();
}
NPError PluginComm_Impl::NPP_SetWindow( NPP instance, NPWindow* window )
{
DBG_ASSERT( _NPPfuncs.setwindow, "### NPP_SetWindow(): null pointer in NPP functions table!" );
m_eCall = eNPP_SetWindow;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)window;
return (NPError)execute();
}
void PluginComm_Impl::NPP_StreamAsFile( NPP instance, NPStream* stream, const char* fname )
{
DBG_ASSERT( _NPPfuncs.asfile, "### NPP_StreamAsFile(): null pointer in NPP functions table!" );
m_eCall = eNPP_StreamAsFile;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)stream;
m_aArgs[2] = (void*)fname;
execute();
}
void PluginComm_Impl::NPP_URLNotify( NPP instance, const char* url, NPReason reason, void* notifyData )
{
DBG_ASSERT( _NPPfuncs.urlnotify, "### NPP_URLNotify(): null pointer in NPP functions table!" );
m_eCall = eNPP_URLNotify;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)url;
m_aArgs[2] = reinterpret_cast< void * >(static_cast< sal_IntPtr >(reason));
m_aArgs[3] = notifyData;
execute();
}
int32_t PluginComm_Impl::NPP_Write( NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer )
{
DBG_ASSERT( _NPPfuncs.write, "### NPP_Write(): null pointer in NPP functions table!" );
m_eCall = eNPP_Write;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)stream;
m_aArgs[2] = (void*)(sal_IntPtr)offset;
m_aArgs[3] = (void*)(sal_IntPtr)len;
m_aArgs[4] = buffer;
return (NPError)execute();
}
int32_t PluginComm_Impl::NPP_WriteReady( NPP instance, NPStream* stream )
{
DBG_ASSERT( _NPPfuncs.writeready, "### NPP_WriteReady(): null pointer in NPP functions table!" );
m_eCall = eNPP_WriteReady;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)stream;
return execute();
}
NPError PluginComm_Impl::NPP_GetValue( NPP instance, NPPVariable variable, void *ret_value )
{
DBG_ASSERT( _NPPfuncs.getvalue, "### NPP_GetValue(): null pointer in NPP functions table!" );
m_eCall = eNPP_GetValue;
m_aArgs[0] = (void*)instance;
m_aArgs[1] = (void*)variable;
m_aArgs[2] = ret_value;
return (NPError)execute();
}
NPError PluginComm_Impl::NPP_Initialize()
{
return NPERR_NO_ERROR;
}
void PluginComm_Impl::NPP_Shutdown()
{
m_eCall = eNPP_Shutdown;
execute();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,445 +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 <prewin.h>
#include <postwin.h>
#include "vcl/svapp.hxx"
#include "tools/urlobj.hxx"
#include "osl/mutex.hxx"
#include "rtl/string.hxx"
#include "rtl/ustring.hxx"
#include "rtl/ustrbuf.hxx"
#include "plugin/impl.hxx"
#if defined _MSC_VER
#pragma warning (push,1)
#pragma warning (disable:4005)
#endif
#include <string.h>
#include <tchar.h>
#include <objbase.h>
#if defined _MSC_VER
#pragma warning (pop)
#endif
#include <list>
#include <map>
#include <algorithm>
using namespace std;
using namespace osl;
using namespace com::sun::star::uno;
using namespace com::sun::star::plugin;
typedef map< OString, OUString, less< OString > > PluginLocationMap;
static void addPluginsFromPath( const TCHAR * pPluginsPath, PluginLocationMap & rPlugins )
{
// append dll name pattern we are looking for
TCHAR arPluginsPath[MAX_PATH];
arPluginsPath[0] = 0;
if (::rtl_str_indexOfStr( pPluginsPath, "%programfiles%" ) == 0)
{
const char * p = ::getenv( "ProgramFiles" );
if (p)
{
::lstrcpy( arPluginsPath, p );
pPluginsPath += 14;
}
}
::lstrcat( arPluginsPath, pPluginsPath );
::lstrcat( arPluginsPath, _T("\\") );
TCHAR arPluginsPattern[MAX_PATH];
::lstrcpy( arPluginsPattern, arPluginsPath );
::lstrcat( arPluginsPattern, _T("NP*.DLL") );
WIN32_FIND_DATA aFindData;
HANDLE hFind = ::FindFirstFile( arPluginsPattern, &aFindData );
while (hFind != INVALID_HANDLE_VALUE)
{
OString aName = OString( aFindData.cFileName ).toAsciiLowerCase();
// no netscape default plugin anymore...
// and no double plugin dlls
if ( !aName.equals( "npnul32.dll" ) &&
! aName.equals( "npnrvp.dll" ) &&
rPlugins.find( aName ) == rPlugins.end())
{
TCHAR arComplete[MAX_PATH];
::lstrcpy( arComplete, arPluginsPath );
::lstrcat( arComplete, aFindData.cFileName );
OUString path( OStringToOUString( arComplete, RTL_TEXTENCODING_MS_1252 ) );
rPlugins[ aName ] = path;
}
if (! ::FindNextFile( hFind, &aFindData ))
break;
}
if (hFind != INVALID_HANDLE_VALUE)
::FindClose( hFind );
}
static void addPluginsFromPath( const OUString & rPath, PluginLocationMap & rPlugins )
{
TCHAR arPluginsPath[MAX_PATH];
DWORD dwPluginsPathSize = sizeof(arPluginsPath);
arPluginsPath[dwPluginsPathSize-1] = 0;
OString aStr( OUStringToOString( rPath, RTL_TEXTENCODING_MS_1252 ) );
::strncpy( arPluginsPath, aStr.getStr(), dwPluginsPathSize );
addPluginsFromPath( arPluginsPath, rPlugins );
}
static void add_IE_Plugins( PluginLocationMap & rPlugins )
{
HKEY hKey;
TCHAR arCurrent[MAX_PATH];
DWORD dwType, dwCurrentSize = sizeof(arCurrent);
if (::RegOpenKeyEx( HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\IE4\\SETUP"),
0, KEY_READ, &hKey ) == ERROR_SUCCESS)
{
if (::RegQueryValueEx( hKey, _T("Path"), NULL, &dwType,
(LPBYTE)arCurrent, &dwCurrentSize ) == ERROR_SUCCESS &&
(dwType == REG_SZ || dwType == REG_EXPAND_SZ))
{
// add \\Plugins
::lstrcat( arCurrent, _T("\\Plugins") );
addPluginsFromPath( arCurrent, rPlugins );
}
::RegCloseKey( hKey );
}
}
static void add_NS_keys( HKEY hKey, PluginLocationMap & rPlugins )
{
TCHAR value[MAX_PATH];
DWORD dwType, size;
// 4.7
size = sizeof(value);
if (::RegQueryValueEx(
hKey, _T("Plugins Directory"), NULL, &dwType,
(LPBYTE)value, &size ) == ERROR_SUCCESS &&
(dwType == REG_SZ || dwType == REG_EXPAND_SZ))
{
addPluginsFromPath( value, rPlugins );
}
// 6
size = sizeof(value);
if (::RegQueryValueEx(
hKey, _T("Install Directory"), NULL, &dwType,
(LPBYTE)value, &size ) == ERROR_SUCCESS &&
(dwType == REG_SZ || dwType == REG_EXPAND_SZ))
{
int n = size / sizeof (TCHAR);
if ('\\' != value[ n -2 ])
{
value[ n -1 ] = '\\';
value[ n ] = 0;
}
addPluginsFromPath( ::lstrcat( value, _T("Plugins") ), rPlugins );
}
size = sizeof(value);
if (::RegQueryValueEx(
hKey, _T("Plugins"), NULL, &dwType,
(LPBYTE)value, &size ) == ERROR_SUCCESS &&
(dwType == REG_SZ || dwType == REG_EXPAND_SZ))
{
addPluginsFromPath( value, rPlugins );
}
}
static void add_NS_lookupRecursive( HKEY hKey, PluginLocationMap & rPlugins )
{
add_NS_keys( hKey, rPlugins );
TCHAR keyName[MAX_PATH];
DWORD dwIndex = 0, size = sizeof (keyName);
while (::RegEnumKeyEx( hKey, dwIndex, keyName, &size, NULL, NULL, NULL, NULL ) == ERROR_SUCCESS)
{
size = sizeof (keyName);
HKEY hSubKey;
if (::RegOpenKeyEx( hKey, keyName, 0, KEY_READ, &hSubKey ) == ERROR_SUCCESS)
{
add_NS_lookupRecursive( hSubKey, rPlugins );
::RegCloseKey( hSubKey );
}
++dwIndex;
}
}
static void add_MozPlugin( HKEY hKey, PluginLocationMap & rPlugins )
{
TCHAR value[MAX_PATH];
DWORD dwType, size;
size = sizeof(value);
if (::RegQueryValueEx(
hKey, _T("Path"), NULL, &dwType,
(LPBYTE)value, &size ) == ERROR_SUCCESS &&
(dwType == REG_SZ || dwType == REG_EXPAND_SZ))
{
OUString aUPath( OStringToOUString( value, RTL_TEXTENCODING_MS_1252 ) );
INetURLObject aURL( aUPath );
OString aName( OUStringToOString( aURL.GetName().toAsciiLowerCase(), RTL_TEXTENCODING_MS_1252 ) );
// no netscape default plugin anymore...
// and no double plugin dlls
if ( !aName.equals( "npnul32.dll" ) &&
! aName.equals( "npnrvp.dll" ) &&
rPlugins.find( aName ) == rPlugins.end())
{
rPlugins[ aName ] = aUPath;
}
}
}
static void add_MozillaPlugin( HKEY hKey, PluginLocationMap & rPlugins )
{
TCHAR keyName[MAX_PATH];
DWORD dwIndex = 0, size = sizeof (keyName);
while (::RegEnumKeyEx( hKey, dwIndex, keyName, &size, NULL, NULL, NULL, NULL ) == ERROR_SUCCESS)
{
size = sizeof (keyName);
HKEY hSubKey;
if (::RegOpenKeyEx( hKey, keyName, 0, KEY_READ, &hSubKey ) == ERROR_SUCCESS)
{
add_MozPlugin( hSubKey, rPlugins );
::RegCloseKey( hSubKey );
}
++dwIndex;
}
}
static void add_NS_Plugins( PluginLocationMap & rPlugins )
{
HKEY hKey;
// Netscape
if (::RegOpenKeyEx(
HKEY_LOCAL_MACHINE, _T("Software\\Netscape"),
0, KEY_READ, &hKey ) == ERROR_SUCCESS)
{
add_NS_lookupRecursive( hKey, rPlugins );
::RegCloseKey( hKey );
}
// Mozilla
if (::RegOpenKeyEx(
HKEY_LOCAL_MACHINE, _T("Software\\Mozilla"),
0, KEY_READ, &hKey ) == ERROR_SUCCESS)
{
add_NS_lookupRecursive( hKey, rPlugins );
::RegCloseKey( hKey );
}
// Mozilla - plugins
if (::RegOpenKeyEx(
HKEY_LOCAL_MACHINE, _T("Software\\MozillaPlugins"),
0, KEY_READ, &hKey ) == ERROR_SUCCESS)
{
add_MozillaPlugin( hKey, rPlugins );
::RegCloseKey( hKey );
}
}
static void add_SO_Plugins( PluginLocationMap & rPlugins )
{
const Sequence< OUString > & rPaths = PluginManager::getAdditionalSearchPaths();
const OUString * pPaths = rPaths.getConstArray();
for ( UINT32 nPos = rPaths.getLength(); nPos--; )
{
addPluginsFromPath( pPaths[nPos], rPlugins );
}
}
Sequence< PluginDescription > XPluginManager_Impl::impl_getPluginDescriptions() throw(css::uno::RuntimeException, std::exception)
{
Guard< Mutex > aGuard( Mutex::getGlobalMutex() );
static Sequence<PluginDescription > s_aDescriptions( 0 );
static bool s_bInit = FALSE;
if (! s_bInit)
{
// collect all distinct plugin dlls
PluginLocationMap aPlugins;
add_SO_Plugins( aPlugins );
add_NS_Plugins( aPlugins );
add_IE_Plugins( aPlugins );
// collect mime types of plugin dlls
for ( PluginLocationMap::iterator iPos( aPlugins.begin() );
iPos != aPlugins.end();
++iPos )
{
TCHAR arFileName[MAX_PATH];
DWORD dwDummy, dwSize;
// DLL name
OUString aName( (*iPos).second.getStr() );
OString aStr( OUStringToOString( aName, RTL_TEXTENCODING_MS_1252 ) );
::strcpy( arFileName, aStr.getStr() );
dwSize = ::GetFileVersionInfoSize( arFileName, &dwDummy );
if ( !dwSize )
continue;
char * pVersionData = new char[dwSize];
if (::GetFileVersionInfo( arFileName, 0, dwSize, pVersionData))
{
// optional comment
OUString aComment;
TCHAR * pInfo = NULL, * pInfo2 = NULL;
UINT nSize = 0;
if (::VerQueryValue( pVersionData, _T("\\StringFileInfo\\040904E4\\ProductName"),
(void**)&pInfo, &nSize ) && pInfo)
{
aComment.operator=( OStringToOUString( OString(pInfo), RTL_TEXTENCODING_MS_1252 ) );
}
// mandatory mime type and file extensions
if (::VerQueryValue( pVersionData, _T("\\StringFileInfo\\040904E4\\MIMEType"),
(void**)&pInfo, &nSize ) && pInfo &&
::VerQueryValue( pVersionData, _T("\\StringFileInfo\\040904E4\\FileExtents"),
(void**)&pInfo2, &nSize ) && pInfo2)
{
OString aExt( pInfo2 );
OString aMIME( pInfo );
aMIME.trim();
// count mime tokens
USHORT nToken = 0;
if (aMIME.getLength())
{
++nToken;
for ( sal_Int32 n = aMIME.getLength(); n--; )
{
if (aMIME[ n ] == '|')
{
++nToken;
}
}
}
sal_Int32 nIndex = 0, nIndex2 = 0;
UINT32 nStart = s_aDescriptions.getLength();
s_aDescriptions.realloc( nStart + nToken );
PluginDescription* pDescriptions = s_aDescriptions.getArray();
// for every MIME Type
sal_Int32 nTok = 0;
while (true)
{
if (nIndex < 0 || nIndex2 < 0)
break;
PluginDescription & rDescr = pDescriptions[nStart+nTok];
OString aMIMEToken( aMIME.getToken( 0, '|', nIndex ) );
OString aExtToken2( aExt.getToken( 0, '|', nIndex2 ) );
if( aMIMEToken.isEmpty() || aExtToken2.isEmpty() )
continue;
rDescr.Mimetype = OUString(
aMIMEToken.getStr(), aMIMEToken.getLength(), RTL_TEXTENCODING_MS_1252 );
if (! rDescr.Mimetype.getLength())
break;
OUString aExtToken( aExtToken2.getStr(), aExtToken2.getLength(), RTL_TEXTENCODING_MS_1252 );
rDescr.PluginName = aName;
rDescr.Description = aComment;
sal_Int32 nPos = 0, nLen = aExtToken.getLength();
OUString aExtensions = nLen ? OUString("*.") : OUString("*.*");
for ( ; nPos < nLen; ++nPos )
{
sal_Unicode c = aExtToken[nPos];
switch (c)
{
case ',':
case ';':
aExtensions += ";*.";
case ' ':
break;
case '*':
if (nPos < (nLen-1) && aExtToken[ nPos+1 ] == '.')
{
++nPos;
break;
}
default:
aExtensions += OUString( &c, 1 );
}
}
rDescr.Extension = aExtensions;
++nTok;
}
if (nToken != nTok)
{
s_aDescriptions.realloc( nTok );
}
}
#if OSL_DEBUG_LEVEL > 1
else
OSL_FAIL( "### cannot get MIME type or extensions!" );
#endif
}
delete[] pVersionData;
}
s_bInit = TRUE;
}
return s_aDescriptions;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1 +0,0 @@
Netscape Plugin SDK. Header to build Mozilla plugins.

View File

@@ -1,43 +0,0 @@
Please be apprised of the following Legal Notices:
A) The U.S. District Court for the Eastern District of Virginia has
ruled that the Netscape Navigator code does not infringe Wang's U.S.
Patent No. 4,751,669 ("the '669 Patent") because: 1) HTML is not
Videotex as defined by the '669 patent; 2) web servers are not central
suppliers; and 3) Navigator does not "connect," as defined by the '669
Patent, to web servers on the Internet. Wang may appeal this decision to
the Federal Circuit. Wang contended that its Patent disclosing a
"Videotext" system, is infringed by the following functionality in the
Netscape Navigator code: 1) the animated logo and status line indicators
--See Claims 1,8 and 9; 2) the "File Save As" function --See Claims
23-27; 3) Bookmarks and Rename Bookmarks in the Properties window --See
Claims 20-22; 4) storing HTML, GIF, and JPEG files and adding filename
extensions --See Claim 38
B) Intermind owns pending U.S. patent applications on communications
systems which employ metadata ("channel objects") to define a control
structure for information transfer. The Netscape code does not infringe
as released; however, modifications which utilize channel objects as
described by Intermind should be considered carefully. The following is
a statement from Intermind: "Intermind's claims fundamentally involve
the use of a control structure to automate communications. ...The
essence of Intermind's top claim is that two devices sender and
receiver have persistent storage, communicate over a network,
and exchange a control structure including metadata which describes: 1)
what information is to be updated, 2) when to update this information,
and 3) how to transfer the updated information. In addition, at least
the receiving device must be able to process the metadata in order to
perform the update determination and transfer. Any digital
communications system which incorporates all of these elements will be
covered by Intermind's patents." See Intermind.com.
C) Stac, Inc., and its licensing agent Hi/fn, own several patents which
disclose data compression methods implementing an LZS compression
algorithm, including U.S. Patent Nos. 4,701,745 and 5,016, 009 ("the
Stac Patents"). The Netscape Communicator code does not perform
compression. If you modify the Netscape source code to perform
compression, please take notice of the Stac Patents.
D) Netscape Communications Corporation ("Netscape") does not guarantee
that any source code or executable code available from the mozilla.org
domain is Year 2000 compliant.

View File

@@ -1,567 +0,0 @@
MOZILLA PUBLIC LICENSE
Version 1.1
---------------
1. Definitions.
1.0.1. "Commercial Use" means distribution or otherwise making the
Covered Code available to a third party.
1.1. "Contributor" means each entity that creates or contributes to
the creation of Modifications.
1.2. "Contributor Version" means the combination of the Original
Code, prior Modifications used by a Contributor, and the Modifications
made by that particular Contributor.
1.3. "Covered Code" means the Original Code or Modifications or the
combination of the Original Code and Modifications, in each case
including portions thereof.
1.4. "Electronic Distribution Mechanism" means a mechanism generally
accepted in the software development community for the electronic
transfer of data.
1.5. "Executable" means Covered Code in any form other than Source
Code.
1.6. "Initial Developer" means the individual or entity identified
as the Initial Developer in the Source Code notice required by Exhibit
A.
1.7. "Larger Work" means a work which combines Covered Code or
portions thereof with code not governed by the terms of this License.
1.8. "License" means this document.
1.8.1. "Licensable" means having the right to grant, to the maximum
extent possible, whether at the time of the initial grant or
subsequently acquired, any and all of the rights conveyed herein.
1.9. "Modifications" means any addition to or deletion from the
substance or structure of either the Original Code or any previous
Modifications. When Covered Code is released as a series of files, a
Modification is:
A. Any addition to or deletion from the contents of a file
containing Original Code or previous Modifications.
B. Any new file that contains any part of the Original Code or
previous Modifications.
1.10. "Original Code" means Source Code of computer software code
which is described in the Source Code notice required by Exhibit A as
Original Code, and which, at the time of its release under this
License is not already Covered Code governed by this License.
1.10.1. "Patent Claims" means any patent claim(s), now owned or
hereafter acquired, including without limitation, method, process,
and apparatus claims, in any patent Licensable by grantor.
1.11. "Source Code" means the preferred form of the Covered Code for
making modifications to it, including all modules it contains, plus
any associated interface definition files, scripts used to control
compilation and installation of an Executable, or source code
differential comparisons against either the Original Code or another
well known, available Covered Code of the Contributor's choice. The
Source Code can be in a compressed or archival form, provided the
appropriate decompression or de-archiving software is widely available
for no charge.
1.12. "You" (or "Your") means an individual or a legal entity
exercising rights under, and complying with all of the terms of, this
License or a future version of this License issued under Section 6.1.
For legal entities, "You" includes any entity which controls, is
controlled by, or is under common control with You. For purposes of
this definition, "control" means (a) the power, direct or indirect,
to cause the direction or management of such entity, whether by
contract or otherwise, or (b) ownership of more than fifty percent
(50%) of the outstanding shares or beneficial ownership of such
entity.
2. Source Code License.
2.1. The Initial Developer Grant.
The Initial Developer hereby grants You a world-wide, royalty-free,
non-exclusive license, subject to third party intellectual property
claims:
(a) under intellectual property rights (other than patent or
trademark) Licensable by Initial Developer to use, reproduce,
modify, display, perform, sublicense and distribute the Original
Code (or portions thereof) with or without Modifications, and/or
as part of a Larger Work; and
(b) under Patents Claims infringed by the making, using or
selling of Original Code, to make, have made, use, practice,
sell, and offer for sale, and/or otherwise dispose of the
Original Code (or portions thereof).
(c) the licenses granted in this Section 2.1(a) and (b) are
effective on the date Initial Developer first distributes
Original Code under the terms of this License.
(d) Notwithstanding Section 2.1(b) above, no patent license is
granted: 1) for code that You delete from the Original Code; 2)
separate from the Original Code; or 3) for infringements caused
by: i) the modification of the Original Code or ii) the
combination of the Original Code with other software or devices.
2.2. Contributor Grant.
Subject to third party intellectual property claims, each Contributor
hereby grants You a world-wide, royalty-free, non-exclusive license
(a) under intellectual property rights (other than patent or
trademark) Licensable by Contributor, to use, reproduce, modify,
display, perform, sublicense and distribute the Modifications
created by such Contributor (or portions thereof) either on an
unmodified basis, with other Modifications, as Covered Code
and/or as part of a Larger Work; and
(b) under Patent Claims infringed by the making, using, or
selling of Modifications made by that Contributor either alone
and/or in combination with its Contributor Version (or portions
of such combination), to make, use, sell, offer for sale, have
made, and/or otherwise dispose of: 1) Modifications made by that
Contributor (or portions thereof); and 2) the combination of
Modifications made by that Contributor with its Contributor
Version (or portions of such combination).
(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
effective on the date Contributor first makes Commercial Use of
the Covered Code.
(d) Notwithstanding Section 2.2(b) above, no patent license is
granted: 1) for any code that Contributor has deleted from the
Contributor Version; 2) separate from the Contributor Version;
3) for infringements caused by: i) third party modifications of
Contributor Version or ii) the combination of Modifications made
by that Contributor with other software (except as part of the
Contributor Version) or other devices; or 4) under Patent Claims
infringed by Covered Code in the absence of Modifications made by
that Contributor.
3. Distribution Obligations.
3.1. Application of License.
The Modifications which You create or to which You contribute are
governed by the terms of this License, including without limitation
Section 2.2. The Source Code version of Covered Code may be
distributed only under the terms of this License or a future version
of this License released under Section 6.1, and You must include a
copy of this License with every copy of the Source Code You
distribute. You may not offer or impose any terms on any Source Code
version that alters or restricts the applicable version of this
License or the recipients' rights hereunder. However, You may include
an additional document offering the additional rights described in
Section 3.5.
3.2. Availability of Source Code.
Any Modification which You create or to which You contribute must be
made available in Source Code form under the terms of this License
either on the same media as an Executable version or via an accepted
Electronic Distribution Mechanism to anyone to whom you made an
Executable version available; and if made available via Electronic
Distribution Mechanism, must remain available for at least twelve (12)
months after the date it initially became available, or at least six
(6) months after a subsequent version of that particular Modification
has been made available to such recipients. You are responsible for
ensuring that the Source Code version remains available even if the
Electronic Distribution Mechanism is maintained by a third party.
3.3. Description of Modifications.
You must cause all Covered Code to which You contribute to contain a
file documenting the changes You made to create that Covered Code and
the date of any change. You must include a prominent statement that
the Modification is derived, directly or indirectly, from Original
Code provided by the Initial Developer and including the name of the
Initial Developer in (a) the Source Code, and (b) in any notice in an
Executable version or related documentation in which You describe the
origin or ownership of the Covered Code.
3.4. Intellectual Property Matters
(a) Third Party Claims.
If Contributor has knowledge that a license under a third party's
intellectual property rights is required to exercise the rights
granted by such Contributor under Sections 2.1 or 2.2,
Contributor must include a text file with the Source Code
distribution titled "LEGAL" which describes the claim and the
party making the claim in sufficient detail that a recipient will
know whom to contact. If Contributor obtains such knowledge after
the Modification is made available as described in Section 3.2,
Contributor shall promptly modify the LEGAL file in all copies
Contributor makes available thereafter and shall take other steps
(such as notifying appropriate mailing lists or newsgroups)
reasonably calculated to inform those who received the Covered
Code that new knowledge has been obtained.
(b) Contributor APIs.
If Contributor's Modifications include an application programming
interface and Contributor has knowledge of patent licenses which
are reasonably necessary to implement that API, Contributor must
also include this information in the LEGAL file.
(c) Representations.
Contributor represents that, except as disclosed pursuant to
Section 3.4(a) above, Contributor believes that Contributor's
Modifications are Contributor's original creation(s) and/or
Contributor has sufficient rights to grant the rights conveyed by
this License.
3.5. Required Notices.
You must duplicate the notice in Exhibit A in each file of the Source
Code. If it is not possible to put such notice in a particular Source
Code file due to its structure, then You must include such notice in a
location (such as a relevant directory) where a user would be likely
to look for such a notice. If You created one or more Modification(s)
You may add your name as a Contributor to the notice described in
Exhibit A. You must also duplicate this License in any documentation
for the Source Code where You describe recipients' rights or ownership
rights relating to Covered Code. You may choose to offer, and to
charge a fee for, warranty, support, indemnity or liability
obligations to one or more recipients of Covered Code. However, You
may do so only on Your own behalf, and not on behalf of the Initial
Developer or any Contributor. You must make it absolutely clear than
any such warranty, support, indemnity or liability obligation is
offered by You alone, and You hereby agree to indemnify the Initial
Developer and every Contributor for any liability incurred by the
Initial Developer or such Contributor as a result of warranty,
support, indemnity or liability terms You offer.
3.6. Distribution of Executable Versions.
You may distribute Covered Code in Executable form only if the
requirements of Section 3.1-3.5 have been met for that Covered Code,
and if You include a notice stating that the Source Code version of
the Covered Code is available under the terms of this License,
including a description of how and where You have fulfilled the
obligations of Section 3.2. The notice must be conspicuously included
in any notice in an Executable version, related documentation or
collateral in which You describe recipients' rights relating to the
Covered Code. You may distribute the Executable version of Covered
Code or ownership rights under a license of Your choice, which may
contain terms different from this License, provided that You are in
compliance with the terms of this License and that the license for the
Executable version does not attempt to limit or alter the recipient's
rights in the Source Code version from the rights set forth in this
License. If You distribute the Executable version under a different
license You must make it absolutely clear that any terms which differ
from this License are offered by You alone, not by the Initial
Developer or any Contributor. You hereby agree to indemnify the
Initial Developer and every Contributor for any liability incurred by
the Initial Developer or such Contributor as a result of any such
terms You offer.
3.7. Larger Works.
You may create a Larger Work by combining Covered Code with other code
not governed by the terms of this License and distribute the Larger
Work as a single product. In such a case, You must make sure the
requirements of this License are fulfilled for the Covered Code.
4. Inability to Comply Due to Statute or Regulation.
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Code due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description
must be included in the LEGAL file described in Section 3.4 and must
be included with all distributions of the Source Code. Except to the
extent prohibited by statute or regulation, such description must be
sufficiently detailed for a recipient of ordinary skill to be able to
understand it.
5. Application of this License.
This License applies to code to which the Initial Developer has
attached the notice in Exhibit A and to related Covered Code.
6. Versions of the License.
6.1. New Versions.
Netscape Communications Corporation ("Netscape") may publish revised
and/or new versions of the License from time to time. Each version
will be given a distinguishing version number.
6.2. Effect of New Versions.
Once Covered Code has been published under a particular version of the
License, You may always continue to use it under the terms of that
version. You may also choose to use such Covered Code under the terms
of any subsequent version of the License published by Netscape. No one
other than Netscape has the right to modify the terms applicable to
Covered Code created under this License.
6.3. Derivative Works.
If You create or use a modified version of this License (which you may
only do in order to apply it to code which is not already Covered Code
governed by this License), You must (a) rename Your license so that
the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
"MPL", "NPL" or any confusingly similar phrase do not appear in your
license (except to note that your license differs from this License)
and (b) otherwise make it clear that Your version of the license
contains terms which differ from the Mozilla Public License and
Netscape Public License. (Filling in the name of the Initial
Developer, Original Code or Contributor in the notice described in
Exhibit A shall not of themselves be deemed to be modifications of
this License.)
7. DISCLAIMER OF WARRANTY.
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
8. TERMINATION.
8.1. This License and the rights granted hereunder will terminate
automatically if You fail to comply with terms herein and fail to cure
such breach within 30 days of becoming aware of the breach. All
sublicenses to the Covered Code which are properly granted shall
survive any termination of this License. Provisions which, by their
nature, must remain in effect beyond the termination of this License
shall survive.
8.2. If You initiate litigation by asserting a patent infringement
claim (excluding declatory judgment actions) against Initial Developer
or a Contributor (the Initial Developer or Contributor against whom
You file such action is referred to as "Participant") alleging that:
(a) such Participant's Contributor Version directly or indirectly
infringes any patent, then any and all rights granted by such
Participant to You under Sections 2.1 and/or 2.2 of this License
shall, upon 60 days notice from Participant terminate prospectively,
unless if within 60 days after receipt of notice You either: (i)
agree in writing to pay Participant a mutually agreeable reasonable
royalty for Your past and future use of Modifications made by such
Participant, or (ii) withdraw Your litigation claim with respect to
the Contributor Version against such Participant. If within 60 days
of notice, a reasonable royalty and payment arrangement are not
mutually agreed upon in writing by the parties or the litigation claim
is not withdrawn, the rights granted by Participant to You under
Sections 2.1 and/or 2.2 automatically terminate at the expiration of
the 60 day notice period specified above.
(b) any software, hardware, or device, other than such Participant's
Contributor Version, directly or indirectly infringes any patent, then
any rights granted to You by such Participant under Sections 2.1(b)
and 2.2(b) are revoked effective as of the date You first made, used,
sold, distributed, or had made, Modifications made by that
Participant.
8.3. If You assert a patent infringement claim against Participant
alleging that such Participant's Contributor Version directly or
indirectly infringes any patent where such claim is resolved (such as
by license or settlement) prior to the initiation of patent
infringement litigation, then the reasonable value of the licenses
granted by such Participant under Sections 2.1 or 2.2 shall be taken
into account in determining the amount or value of any payment or
license.
8.4. In the event of termination under Sections 8.1 or 8.2 above,
all end user license agreements (excluding distributors and resellers)
which have been validly granted by You or any distributor hereunder
prior to termination shall survive termination.
9. LIMITATION OF LIABILITY.
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
10. U.S. GOVERNMENT END USERS.
The Covered Code is a "commercial item," as that term is defined in
48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
software" and "commercial computer software documentation," as such
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
all U.S. Government End Users acquire Covered Code with only those
rights set forth herein.
11. MISCELLANEOUS.
This License represents the complete agreement concerning subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. This License shall be governed by
California law provisions (except to the extent applicable law, if
any, provides otherwise), excluding its conflict-of-law provisions.
With respect to disputes in which at least one party is a citizen of,
or an entity chartered or registered to do business in the United
States of America, any litigation relating to this License shall be
subject to the jurisdiction of the Federal Courts of the Northern
District of California, with venue lying in Santa Clara County,
California, with the losing party responsible for costs, including
without limitation, court costs and reasonable attorneys' fees and
expenses. The application of the United Nations Convention on
Contracts for the International Sale of Goods is expressly excluded.
Any law or regulation which provides that the language of a contract
shall be construed against the drafter shall not apply to this
License.
12. RESPONSIBILITY FOR CLAIMS.
As between Initial Developer and the Contributors, each party is
responsible for claims and damages arising, directly or indirectly,
out of its utilization of rights under this License and You agree to
work with Initial Developer and Contributors to distribute such
responsibility on an equitable basis. Nothing herein is intended or
shall be deemed to constitute any admission of liability.
13. MULTIPLE-LICENSED CODE.
Initial Developer may designate portions of the Covered Code as
"Multiple-Licensed". "Multiple-Licensed" means that the Initial
Developer permits you to utilize portions of the Covered Code under
Your choice of the NPL or the alternative licenses, if any, specified
by the Initial Developer in the file described in Exhibit A.
EXHIBIT A -Mozilla Public License.
``The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS"
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.
The Original Code is ______________________________________.
The Initial Developer of the Original Code is ________________________.
Portions created by ______________________ are Copyright (C) ______
_______________________. All Rights Reserved.
Contributor(s): ______________________________________.
Alternatively, the contents of this file may be used under the terms
of the _____ license (the "[___] License"), in which case the
provisions of [______] License are applicable instead of those
above. If you wish to allow use of your version of this file only
under the terms of the [____] License and not to allow others to use
your version of this file under the MPL, indicate your decision by
deleting the provisions above and replace them with the notice and
other provisions required by the [___] License. If you do not delete
the provisions above, a recipient may use your version of this file
under either the MPL or the [___] License."
[NOTE: The text of this Exhibit A may differ slightly from the text of
the notices in the Source Code files of the Original Code. You should
use the text of this Exhibit A rather than the text found in the
Original Code Source Code for Your Modifications.]
----------------------------------------------------------------------
AMENDMENTS
The Netscape Public License Version 1.1 ("NPL") consists of the
Mozilla Public License Version 1.1 with the following Amendments,
including Exhibit A-Netscape Public License. Files identified with
"Exhibit A-Netscape Public License" are governed by the Netscape
Public License Version 1.1.
Additional Terms applicable to the Netscape Public License.
I. Effect.
These additional terms described in this Netscape Public
License -- Amendments shall apply to the Mozilla Communicator
client code and to all Covered Code under this License.
II. "Netscape's Branded Code" means Covered Code that Netscape
distributes and/or permits others to distribute under one or more
trademark(s) which are controlled by Netscape but which are not
licensed for use under this License.
III. Netscape and logo.
This License does not grant any rights to use the trademarks
"Netscape", the "Netscape N and horizon" logo or the "Netscape
lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript",
"Smart Browsing" even if such marks are included in the Original
Code or Modifications.
IV. Inability to Comply Due to Contractual Obligation.
Prior to licensing the Original Code under this License, Netscape
has licensed third party code for use in Netscape's Branded Code.
To the extent that Netscape is limited contractually from making
such third party code available under this License, Netscape may
choose to reintegrate such code into Covered Code without being
required to distribute such code in Source Code form, even if
such code would otherwise be considered "Modifications" under
this License.
V. Use of Modifications and Covered Code by Initial Developer.
V.1. In General.
The obligations of Section 3 apply to Netscape, except to
the extent specified in this Amendment, Section V.2 and V.3.
V.2. Other Products.
Netscape may include Covered Code in products other than the
Netscape's Branded Code which are released by Netscape
during the two (2) years following the release date of the
Original Code, without such additional products becoming
subject to the terms of this License, and may license such
additional products on different terms from those contained
in this License.
V.3. Alternative Licensing.
Netscape may license the Source Code of Netscape's Branded
Code, including Modifications incorporated therein, without
such Netscape Branded Code becoming subject to the terms of
this License, and may license such Netscape Branded Code on
different terms from those contained in this License.
VI. Litigation.
Notwithstanding the limitations of Section 11 above, the
provisions regarding litigation in Section 11(a), (b) and (c) of
the License shall apply to all disputes relating to this License.
EXHIBIT A-Netscape Public License.
"The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
Contributor(s): ______________________________________.
Alternatively, the contents of this file may be used under the
terms of the _____ license (the "[___] License"), in which case
the provisions of [______] License are applicable instead of
those above. If you wish to allow use of your version of this
file only under the terms of the [____] License and not to allow
others to use your version of this file under the NPL, indicate
your decision by deleting the provisions above and replace them
with the notice and other provisions required by the [___]
License. If you do not delete the provisions above, a recipient
may use your version of this file under either the NPL or the
[___] License."

View File

@@ -1,879 +0,0 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef npapi_h_
#define npapi_h_
#if defined(__OS2__)
#pragma pack(1)
#endif
#include "nptypes.h"
#if defined(__OS2__) || defined(OS2)
#ifndef XP_OS2
#define XP_OS2 1
#endif
#endif
#if defined(_WIN32) && !defined(__SYMBIAN32__)
#include <windef.h>
#ifndef XP_WIN
#define XP_WIN 1
#endif
#endif
#if defined(__SYMBIAN32__)
#ifndef XP_SYMBIAN
#define XP_SYMBIAN 1
#undef XP_WIN
#endif
#endif
#if defined(__APPLE_CC__) && !defined(XP_UNIX)
#ifndef XP_MACOSX
#define XP_MACOSX 1
#endif
#endif
#if defined(XP_MACOSX) && defined(__LP64__)
#define NP_NO_QUICKDRAW
#define NP_NO_CARBON
#endif
#if defined(XP_MACOSX)
#include <ApplicationServices/ApplicationServices.h>
#include <OpenGL/OpenGL.h>
#ifndef NP_NO_CARBON
#include <Carbon/Carbon.h>
#endif
#endif
#if defined(XP_UNIX)
#include <stdio.h>
#if defined(MOZ_X11)
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#endif
#endif
#if defined(XP_SYMBIAN)
#include <QEvent>
#include <QRegion>
#endif
/*----------------------------------------------------------------------*/
/* Plugin Version Constants */
/*----------------------------------------------------------------------*/
#define NP_VERSION_MAJOR 0
#define NP_VERSION_MINOR 27
/* The OS/2 version of Netscape uses RC_DATA to define the
mime types, file extensions, etc that are required.
Use a vertical bar to separate types, end types with \0.
FileVersion and ProductVersion are 32bit ints, all other
entries are strings that MUST be terminated with a \0.
AN EXAMPLE:
RCDATA NP_INFO_ProductVersion { 1,0,0,1,}
RCDATA NP_INFO_MIMEType { "video/x-video|",
"video/x-flick\0" }
RCDATA NP_INFO_FileExtents { "avi|",
"flc\0" }
RCDATA NP_INFO_FileOpenName{ "MMOS2 video player(*.avi)|",
"MMOS2 Flc/Fli player(*.flc)\0" }
RCDATA NP_INFO_FileVersion { 1,0,0,1 }
RCDATA NP_INFO_CompanyName { "Netscape Communications\0" }
RCDATA NP_INFO_FileDescription { "NPAVI32 Extension DLL\0"
RCDATA NP_INFO_InternalName { "NPAVI32\0" )
RCDATA NP_INFO_LegalCopyright { "Copyright Netscape Communications \251 1996\0"
RCDATA NP_INFO_OriginalFilename { "NVAPI32.DLL" }
RCDATA NP_INFO_ProductName { "NPAVI32 Dynamic Link Library\0" }
*/
/* RC_DATA types for version info - required */
#define NP_INFO_ProductVersion 1
#define NP_INFO_MIMEType 2
#define NP_INFO_FileOpenName 3
#define NP_INFO_FileExtents 4
/* RC_DATA types for version info - used if found */
#define NP_INFO_FileDescription 5
#define NP_INFO_ProductName 6
/* RC_DATA types for version info - optional */
#define NP_INFO_CompanyName 7
#define NP_INFO_FileVersion 8
#define NP_INFO_InternalName 9
#define NP_INFO_LegalCopyright 10
#define NP_INFO_OriginalFilename 11
#ifndef RC_INVOKED
/*----------------------------------------------------------------------*/
/* Definition of Basic Types */
/*----------------------------------------------------------------------*/
typedef unsigned char NPBool;
typedef int16_t NPError;
typedef int16_t NPReason;
typedef char* NPMIMEType;
/*----------------------------------------------------------------------*/
/* Structures and definitions */
/*----------------------------------------------------------------------*/
#if !defined(__LP64__)
#if defined(XP_MACOSX)
#pragma options align=mac68k
#endif
#endif /* __LP64__ */
/*
* NPP is a plug-in's opaque instance handle
*/
typedef struct _NPP
{
void* pdata; /* plug-in private data */
void* ndata; /* netscape private data */
} NPP_t;
typedef NPP_t* NPP;
typedef struct _NPStream
{
void* pdata; /* plug-in private data */
void* ndata; /* netscape private data */
const char* url;
uint32_t end;
uint32_t lastmodified;
void* notifyData;
const char* headers; /* Response headers from host.
* Exists only for >= NPVERS_HAS_RESPONSE_HEADERS.
* Used for HTTP only; NULL for non-HTTP.
* Available from NPP_NewStream onwards.
* Plugin should copy this data before storing it.
* Includes HTTP status line and all headers,
* preferably verbatim as received from server,
* headers formatted as in HTTP ("Header: Value"),
* and newlines (\n, NOT \r\n) separating lines.
* Terminated by \n\0 (NOT \n\n\0). */
} NPStream;
typedef struct _NPByteRange
{
int32_t offset; /* negative offset means from the end */
uint32_t length;
struct _NPByteRange* next;
} NPByteRange;
typedef struct _NPSavedData
{
int32_t len;
void* buf;
} NPSavedData;
typedef struct _NPRect
{
uint16_t top;
uint16_t left;
uint16_t bottom;
uint16_t right;
} NPRect;
typedef struct _NPSize
{
int32_t width;
int32_t height;
} NPSize;
typedef enum {
NPFocusNext = 0,
NPFocusPrevious = 1
} NPFocusDirection;
/* Return values for NPP_HandleEvent */
#define kNPEventNotHandled 0
#define kNPEventHandled 1
/* Exact meaning must be spec'd in event model. */
#define kNPEventStartIME 2
#if defined(XP_UNIX)
/*
* Unix specific structures and definitions
*/
/*
* Callback Structures.
*
* These are used to pass additional platform specific information.
*/
enum {
NP_SETWINDOW = 1,
NP_PRINT
};
typedef struct
{
int32_t type;
} NPAnyCallbackStruct;
typedef struct
{
int32_t type;
#if defined(MOZ_X11)
Display* display;
Visual* visual;
Colormap colormap;
unsigned int depth;
#endif
} NPSetWindowCallbackStruct;
typedef struct
{
int32_t type;
FILE* fp;
} NPPrintCallbackStruct;
#endif /* XP_UNIX */
#if defined(XP_MACOSX)
typedef enum {
#ifndef NP_NO_QUICKDRAW
NPDrawingModelQuickDraw = 0,
#endif
NPDrawingModelCoreGraphics = 1,
NPDrawingModelOpenGL = 2,
NPDrawingModelCoreAnimation = 3,
NPDrawingModelInvalidatingCoreAnimation = 4
} NPDrawingModel;
typedef enum {
#ifndef NP_NO_CARBON
NPEventModelCarbon = 0,
#endif
NPEventModelCocoa = 1
} NPEventModel;
#endif
/*
* The following masks are applied on certain platforms to NPNV and
* NPPV selectors that pass around pointers to COM interfaces. Newer
* compilers on some platforms may generate vtables that are not
* compatible with older compilers. To prevent older plugins from
* not understanding a new browser's ABI, these masks change the
* values of those selectors on those platforms. To remain backwards
* compatible with different versions of the browser, plugins can
* use these masks to dynamically determine and use the correct C++
* ABI that the browser is expecting. This does not apply to Windows
* as Microsoft's COM ABI will likely not change.
*/
#define NP_ABI_GCC3_MASK 0x10000000
/*
* gcc 3.x generated vtables on UNIX and OSX are incompatible with
* previous compilers.
*/
#if defined(XP_UNIX) && defined(__GNUC__)
#define _NP_ABI_MIXIN_FOR_GCC3 NP_ABI_GCC3_MASK
#else
#define _NP_ABI_MIXIN_FOR_GCC3 0
#endif
#if defined(XP_MACOSX)
#define NP_ABI_MACHO_MASK 0x01000000
#define _NP_ABI_MIXIN_FOR_MACHO NP_ABI_MACHO_MASK
#else
#define _NP_ABI_MIXIN_FOR_MACHO 0
#endif
#define NP_ABI_MASK (_NP_ABI_MIXIN_FOR_GCC3 | _NP_ABI_MIXIN_FOR_MACHO)
/*
* List of variable names for which NPP_GetValue shall be implemented
*/
typedef enum {
NPPVpluginNameString = 1,
NPPVpluginDescriptionString,
NPPVpluginWindowBool,
NPPVpluginTransparentBool,
NPPVjavaClass,
NPPVpluginWindowSize,
NPPVpluginTimerInterval,
NPPVpluginScriptableInstance = (10 | NP_ABI_MASK),
NPPVpluginScriptableIID = 11,
NPPVjavascriptPushCallerBool = 12,
NPPVpluginKeepLibraryInMemory = 13,
NPPVpluginNeedsXEmbed = 14,
/* Get the NPObject for scripting the plugin. Introduced in NPAPI minor version 14.
*/
NPPVpluginScriptableNPObject = 15,
/* Get the plugin value (as \0-terminated UTF-8 string data) for
* form submission if the plugin is part of a form. Use
* NPN_MemAlloc() to allocate memory for the string data. Introduced
* in NPAPI minor version 15.
*/
NPPVformValue = 16,
NPPVpluginUrlRequestsDisplayedBool = 17,
/* Checks if the plugin is interested in receiving the http body of
* all http requests (including failed ones, http status != 200).
*/
NPPVpluginWantsAllNetworkStreams = 18,
/* Browsers can retrieve a native ATK accessibility plug ID via this variable. */
NPPVpluginNativeAccessibleAtkPlugId = 19,
/* Checks to see if the plug-in would like the browser to load the "src" attribute. */
NPPVpluginCancelSrcStream = 20,
NPPVSupportsAdvancedKeyHandling = 21
#if defined(XP_MACOSX)
/* Used for negotiating drawing models */
, NPPVpluginDrawingModel = 1000
/* Used for negotiating event models */
, NPPVpluginEventModel = 1001
/* In the NPDrawingModelCoreAnimation drawing model, the browser asks the plug-in for a Core Animation layer. */
, NPPVpluginCoreAnimationLayer = 1003
#endif
#if defined(MOZ_PLATFORM_MAEMO) && ((MOZ_PLATFORM_MAEMO == 5) || (MOZ_PLATFORM_MAEMO == 6))
, NPPVpluginWindowlessLocalBool = 2002
#endif
} NPPVariable;
/*
* List of variable names for which NPN_GetValue should be implemented.
*/
typedef enum {
NPNVxDisplay = 1,
NPNVxtAppContext,
NPNVnetscapeWindow,
NPNVjavascriptEnabledBool,
NPNVasdEnabledBool,
NPNVisOfflineBool,
NPNVserviceManager = (10 | NP_ABI_MASK),
NPNVDOMElement = (11 | NP_ABI_MASK),
NPNVDOMWindow = (12 | NP_ABI_MASK),
NPNVToolkit = (13 | NP_ABI_MASK),
NPNVSupportsXEmbedBool = 14,
/* Get the NPObject wrapper for the browser window. */
NPNVWindowNPObject = 15,
/* Get the NPObject wrapper for the plugins DOM element. */
NPNVPluginElementNPObject = 16,
NPNVSupportsWindowless = 17,
NPNVprivateModeBool = 18,
NPNVsupportsAdvancedKeyHandling = 21
#if defined(XP_MACOSX)
/* Used for negotiating drawing models */
, NPNVpluginDrawingModel = 1000
#ifndef NP_NO_QUICKDRAW
, NPNVsupportsQuickDrawBool = 2000
#endif
, NPNVsupportsCoreGraphicsBool = 2001
, NPNVsupportsOpenGLBool = 2002
, NPNVsupportsCoreAnimationBool = 2003
, NPNVsupportsInvalidatingCoreAnimationBool = 2004
#ifndef NP_NO_CARBON
, NPNVsupportsCarbonBool = 3000 /* TRUE if the browser supports the Carbon event model */
#endif
, NPNVsupportsCocoaBool = 3001 /* TRUE if the browser supports the Cocoa event model */
, NPNVsupportsUpdatedCocoaTextInputBool = 3002 /* TRUE if the browser supports the updated
Cocoa text input specification. */
#endif
#if defined(MOZ_PLATFORM_MAEMO) && ((MOZ_PLATFORM_MAEMO == 5) || (MOZ_PLATFORM_MAEMO == 6))
, NPNVSupportsWindowlessLocal = 2002
#endif
} NPNVariable;
typedef enum {
NPNURLVCookie = 501,
NPNURLVProxy
} NPNURLVariable;
/*
* The type of Toolkit the widgets use
*/
typedef enum {
NPNVGtk12 = 1,
NPNVGtk2
} NPNToolkitType;
/*
* The type of a NPWindow - it specifies the type of the data structure
* returned in the window field.
*/
typedef enum {
NPWindowTypeWindow = 1,
NPWindowTypeDrawable
} NPWindowType;
typedef struct _NPWindow
{
void* window; /* Platform specific window handle */
/* OS/2: x - Position of bottom left corner */
/* OS/2: y - relative to visible netscape window */
int32_t x; /* Position of top left corner relative */
int32_t y; /* to a netscape page. */
uint32_t width; /* Maximum window size */
uint32_t height;
NPRect clipRect; /* Clipping rectangle in port coordinates */
#if (defined(XP_UNIX) || defined(XP_SYMBIAN)) && !defined(XP_MACOSX)
void * ws_info; /* Platform-dependent additional data */
#endif /* XP_UNIX */
NPWindowType type; /* Is this a window or a drawable? */
} NPWindow;
typedef struct _NPImageExpose
{
char* data; /* image pointer */
int32_t stride; /* Stride of data image pointer */
int32_t depth; /* Depth of image pointer */
int32_t x; /* Expose x */
int32_t y; /* Expose y */
uint32_t width; /* Expose width */
uint32_t height; /* Expose height */
NPSize dataSize; /* Data buffer size */
float translateX; /* translate X matrix value */
float translateY; /* translate Y matrix value */
float scaleX; /* scale X matrix value */
float scaleY; /* scale Y matrix value */
} NPImageExpose;
typedef struct _NPFullPrint
{
NPBool pluginPrinted;/* Set TRUE if plugin handled fullscreen printing */
NPBool printOne; /* TRUE if plugin should print one copy to default
printer */
void* platformPrint; /* Platform-specific printing info */
} NPFullPrint;
typedef struct _NPEmbedPrint
{
NPWindow window;
void* platformPrint; /* Platform-specific printing info */
} NPEmbedPrint;
typedef struct _NPPrint
{
uint16_t mode; /* NP_FULL or NP_EMBED */
union
{
NPFullPrint fullPrint; /* if mode is NP_FULL */
NPEmbedPrint embedPrint; /* if mode is NP_EMBED */
} print;
} NPPrint;
#if defined(XP_MACOSX)
#ifndef NP_NO_CARBON
typedef EventRecord NPEvent;
#endif
#elif defined(XP_SYMBIAN)
typedef QEvent NPEvent;
#elif defined(XP_WIN)
typedef struct _NPEvent
{
uint16_t event;
uintptr_t wParam;
uintptr_t lParam;
} NPEvent;
#elif defined(XP_OS2)
typedef struct _NPEvent
{
uint32_t event;
uint32_t wParam;
uint32_t lParam;
} NPEvent;
#elif defined(XP_UNIX) && defined(MOZ_X11)
typedef XEvent NPEvent;
#else
typedef void* NPEvent;
#endif
#if defined(XP_MACOSX)
typedef void* NPRegion;
#ifndef NP_NO_QUICKDRAW
typedef RgnHandle NPQDRegion;
#endif
typedef CGPathRef NPCGRegion;
#elif defined(XP_WIN)
typedef HRGN NPRegion;
#elif defined(XP_UNIX) && defined(MOZ_X11)
typedef Region NPRegion;
#elif defined(XP_SYMBIAN)
typedef QRegion* NPRegion;
#else
typedef void *NPRegion;
#endif
typedef struct _NPNSString NPNSString;
typedef struct _NPNSWindow NPNSWindow;
typedef struct _NPNSMenu NPNSMenu;
#if defined(XP_MACOSX)
typedef NPNSMenu NPMenu;
#else
typedef void *NPMenu;
#endif
typedef enum {
NPCoordinateSpacePlugin = 1,
NPCoordinateSpaceWindow,
NPCoordinateSpaceFlippedWindow,
NPCoordinateSpaceScreen,
NPCoordinateSpaceFlippedScreen
} NPCoordinateSpace;
#if defined(XP_MACOSX)
#ifndef NP_NO_QUICKDRAW
typedef struct NP_Port
{
CGrafPtr port;
int32_t portx; /* position inside the topmost window */
int32_t porty;
} NP_Port;
#endif /* NP_NO_QUICKDRAW */
/*
* NP_CGContext is the type of the NPWindow's 'window' when the plugin specifies NPDrawingModelCoreGraphics
* as its drawing model.
*/
typedef struct NP_CGContext
{
CGContextRef context;
void *window; /* A WindowRef under the Carbon event model. */
} NP_CGContext;
/*
* NP_GLContext is the type of the NPWindow's 'window' when the plugin specifies NPDrawingModelOpenGL as its
* drawing model.
*/
typedef struct NP_GLContext
{
CGLContextObj context;
#ifdef NP_NO_CARBON
NPNSWindow *window;
#else
void *window; /* Can be either an NSWindow or a WindowRef depending on the event model */
#endif
} NP_GLContext;
typedef enum {
NPCocoaEventDrawRect = 1,
NPCocoaEventMouseDown,
NPCocoaEventMouseUp,
NPCocoaEventMouseMoved,
NPCocoaEventMouseEntered,
NPCocoaEventMouseExited,
NPCocoaEventMouseDragged,
NPCocoaEventKeyDown,
NPCocoaEventKeyUp,
NPCocoaEventFlagsChanged,
NPCocoaEventFocusChanged,
NPCocoaEventWindowFocusChanged,
NPCocoaEventScrollWheel,
NPCocoaEventTextInput
} NPCocoaEventType;
typedef struct _NPCocoaEvent {
NPCocoaEventType type;
uint32_t version;
union {
struct {
uint32_t modifierFlags;
double pluginX;
double pluginY;
int32_t buttonNumber;
int32_t clickCount;
double deltaX;
double deltaY;
double deltaZ;
} mouse;
struct {
uint32_t modifierFlags;
NPNSString *characters;
NPNSString *charactersIgnoringModifiers;
NPBool isARepeat;
uint16_t keyCode;
} key;
struct {
CGContextRef context;
double x;
double y;
double width;
double height;
} draw;
struct {
NPBool hasFocus;
} focus;
struct {
NPNSString *text;
} text;
} data;
} NPCocoaEvent;
#ifndef NP_NO_CARBON
/* Non-standard event types that can be passed to HandleEvent */
enum NPEventType {
NPEventType_GetFocusEvent = (osEvt + 16),
NPEventType_LoseFocusEvent,
NPEventType_AdjustCursorEvent,
NPEventType_MenuCommandEvent,
NPEventType_ClippingChangedEvent,
NPEventType_ScrollingBeginsEvent = 1000,
NPEventType_ScrollingEndsEvent
};
#endif /* NP_NO_CARBON */
#endif /* XP_MACOSX */
/*
* Values for mode passed to NPP_New:
*/
#define NP_EMBED 1
#define NP_FULL 2
/*
* Values for stream type passed to NPP_NewStream:
*/
#define NP_NORMAL 1
#define NP_SEEK 2
#define NP_ASFILE 3
#define NP_ASFILEONLY 4
#define NP_MAXREADY (((unsigned)(~0)<<1)>>1)
/*
* Flags for NPP_ClearSiteData.
*/
#define NP_CLEAR_ALL 0
#define NP_CLEAR_CACHE (1 << 0)
#if !defined(__LP64__)
#if defined(XP_MACOSX)
#pragma options align=reset
#endif
#endif /* __LP64__ */
/*----------------------------------------------------------------------*/
/* Error and Reason Code definitions */
/*----------------------------------------------------------------------*/
/*
* Values of type NPError:
*/
#define NPERR_BASE 0
#define NPERR_NO_ERROR (NPERR_BASE + 0)
#define NPERR_GENERIC_ERROR (NPERR_BASE + 1)
#define NPERR_INVALID_INSTANCE_ERROR (NPERR_BASE + 2)
#define NPERR_INVALID_FUNCTABLE_ERROR (NPERR_BASE + 3)
#define NPERR_MODULE_LOAD_FAILED_ERROR (NPERR_BASE + 4)
#define NPERR_OUT_OF_MEMORY_ERROR (NPERR_BASE + 5)
#define NPERR_INVALID_PLUGIN_ERROR (NPERR_BASE + 6)
#define NPERR_INVALID_PLUGIN_DIR_ERROR (NPERR_BASE + 7)
#define NPERR_INCOMPATIBLE_VERSION_ERROR (NPERR_BASE + 8)
#define NPERR_INVALID_PARAM (NPERR_BASE + 9)
#define NPERR_INVALID_URL (NPERR_BASE + 10)
#define NPERR_FILE_NOT_FOUND (NPERR_BASE + 11)
#define NPERR_NO_DATA (NPERR_BASE + 12)
#define NPERR_STREAM_NOT_SEEKABLE (NPERR_BASE + 13)
#define NPERR_TIME_RANGE_NOT_SUPPORTED (NPERR_BASE + 14)
#define NPERR_MALFORMED_SITE (NPERR_BASE + 15)
/*
* Values of type NPReason:
*/
#define NPRES_BASE 0
#define NPRES_DONE (NPRES_BASE + 0)
#define NPRES_NETWORK_ERR (NPRES_BASE + 1)
#define NPRES_USER_BREAK (NPRES_BASE + 2)
/*
* Version feature information
*/
#define NPVERS_HAS_STREAMOUTPUT 8
#define NPVERS_HAS_NOTIFICATION 9
#define NPVERS_HAS_LIVECONNECT 9
#define NPVERS_68K_HAS_LIVECONNECT 11
#define NPVERS_HAS_WINDOWLESS 11
#define NPVERS_HAS_XPCONNECT_SCRIPTING 13
#define NPVERS_HAS_NPRUNTIME_SCRIPTING 14
#define NPVERS_HAS_FORM_VALUES 15
#define NPVERS_HAS_POPUPS_ENABLED_STATE 16
#define NPVERS_HAS_RESPONSE_HEADERS 17
#define NPVERS_HAS_NPOBJECT_ENUM 18
#define NPVERS_HAS_PLUGIN_THREAD_ASYNC_CALL 19
#define NPVERS_HAS_ALL_NETWORK_STREAMS 20
#define NPVERS_HAS_URL_AND_AUTH_INFO 21
#define NPVERS_HAS_PRIVATE_MODE 22
#define NPVERS_MACOSX_HAS_COCOA_EVENTS 23
#define NPVERS_HAS_ADVANCED_KEY_HANDLING 25
#define NPVERS_HAS_URL_REDIRECT_HANDLING 26
#define NPVERS_HAS_CLEAR_SITE_DATA 27
/*----------------------------------------------------------------------*/
/* Function Prototypes */
/*----------------------------------------------------------------------*/
#if defined(__OS2__)
#define NP_LOADDS _System
#else
#define NP_LOADDS
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* NPP_* functions are provided by the plugin and called by the navigator. */
const char* NPP_GetMIMEDescription(void);
NPError NP_LOADDS NPP_New(NPMIMEType pluginType, NPP instance,
uint16_t mode, int16_t argc, char* argn[],
char* argv[], NPSavedData* saved);
NPError NP_LOADDS NPP_Destroy(NPP instance, NPSavedData** save);
NPError NP_LOADDS NPP_SetWindow(NPP instance, NPWindow* window);
NPError NP_LOADDS NPP_NewStream(NPP instance, NPMIMEType type,
NPStream* stream, NPBool seekable,
uint16_t* stype);
NPError NP_LOADDS NPP_DestroyStream(NPP instance, NPStream* stream,
NPReason reason);
int32_t NP_LOADDS NPP_WriteReady(NPP instance, NPStream* stream);
int32_t NP_LOADDS NPP_Write(NPP instance, NPStream* stream, int32_t offset,
int32_t len, void* buffer);
void NP_LOADDS NPP_StreamAsFile(NPP instance, NPStream* stream,
const char* fname);
void NP_LOADDS NPP_Print(NPP instance, NPPrint* platformPrint);
int16_t NP_LOADDS NPP_HandleEvent(NPP instance, void* event);
void NP_LOADDS NPP_URLNotify(NPP instance, const char* url,
NPReason reason, void* notifyData);
NPError NP_LOADDS NPP_GetValue(NPP instance, NPPVariable variable, void *value);
NPError NP_LOADDS NPP_SetValue(NPP instance, NPNVariable variable, void *value);
NPBool NP_LOADDS NPP_GotFocus(NPP instance, NPFocusDirection direction);
void NP_LOADDS NPP_LostFocus(NPP instance);
void NP_LOADDS NPP_URLRedirectNotify(NPP instance, const char* url, int32_t status, void* notifyData);
NPError NP_LOADDS NPP_ClearSiteData(const char* site, uint64_t flags, uint64_t maxAge);
char** NP_LOADDS NPP_GetSitesWithData(void);
/* NPN_* functions are provided by the navigator and called by the plugin. */
void NP_LOADDS NPN_Version(int* plugin_major, int* plugin_minor,
int* netscape_major, int* netscape_minor);
NPError NP_LOADDS NPN_GetURLNotify(NPP instance, const char* url,
const char* target, void* notifyData);
NPError NP_LOADDS NPN_GetURL(NPP instance, const char* url,
const char* target);
NPError NP_LOADDS NPN_PostURLNotify(NPP instance, const char* url,
const char* target, uint32_t len,
const char* buf, NPBool file,
void* notifyData);
NPError NP_LOADDS NPN_PostURL(NPP instance, const char* url,
const char* target, uint32_t len,
const char* buf, NPBool file);
NPError NP_LOADDS NPN_RequestRead(NPStream* stream, NPByteRange* rangeList);
NPError NP_LOADDS NPN_NewStream(NPP instance, NPMIMEType type,
const char* target, NPStream** stream);
int32_t NP_LOADDS NPN_Write(NPP instance, NPStream* stream, int32_t len,
void* buffer);
NPError NP_LOADDS NPN_DestroyStream(NPP instance, NPStream* stream,
NPReason reason);
void NP_LOADDS NPN_Status(NPP instance, const char* message);
const char* NP_LOADDS NPN_UserAgent(NPP instance);
void* NP_LOADDS NPN_MemAlloc(uint32_t size);
void NP_LOADDS NPN_MemFree(void* ptr);
uint32_t NP_LOADDS NPN_MemFlush(uint32_t size);
void NP_LOADDS NPN_ReloadPlugins(NPBool reloadPages);
NPError NP_LOADDS NPN_GetValue(NPP instance, NPNVariable variable,
void *value);
NPError NP_LOADDS NPN_SetValue(NPP instance, NPPVariable variable,
void *value);
void NP_LOADDS NPN_InvalidateRect(NPP instance, NPRect *invalidRect);
void NP_LOADDS NPN_InvalidateRegion(NPP instance,
NPRegion invalidRegion);
void NP_LOADDS NPN_ForceRedraw(NPP instance);
void NP_LOADDS NPN_PushPopupsEnabledState(NPP instance, NPBool enabled);
void NP_LOADDS NPN_PopPopupsEnabledState(NPP instance);
void NP_LOADDS NPN_PluginThreadAsyncCall(NPP instance,
void (*func) (void *),
void *userData);
NPError NP_LOADDS NPN_GetValueForURL(NPP instance, NPNURLVariable variable,
const char *url, char **value,
uint32_t *len);
NPError NP_LOADDS NPN_SetValueForURL(NPP instance, NPNURLVariable variable,
const char *url, const char *value,
uint32_t len);
NPError NP_LOADDS NPN_GetAuthenticationInfo(NPP instance,
const char *protocol,
const char *host, int32_t port,
const char *scheme,
const char *realm,
char **username, uint32_t *ulen,
char **password,
uint32_t *plen);
uint32_t NP_LOADDS NPN_ScheduleTimer(NPP instance, uint32_t interval, NPBool repeat, void (*timerFunc)(NPP npp, uint32_t timerID));
void NP_LOADDS NPN_UnscheduleTimer(NPP instance, uint32_t timerID);
NPError NP_LOADDS NPN_PopUpContextMenu(NPP instance, NPMenu* menu);
NPBool NP_LOADDS NPN_ConvertPoint(NPP instance, double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace);
NPBool NP_LOADDS NPN_HandleEvent(NPP instance, void *event, NPBool handled);
NPBool NP_LOADDS NPN_UnfocusInstance(NPP instance, NPFocusDirection direction);
void NP_LOADDS NPN_URLRedirectResponse(NPP instance, void* notifyData, NPBool allow);
#ifdef __cplusplus
} /* end extern "C" */
#endif
#endif /* RC_INVOKED */
#if defined(__OS2__)
#pragma pack()
#endif
#endif /* npapi_h_ */

View File

@@ -1,321 +0,0 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef npfunctions_h_
#define npfunctions_h_
#ifdef __OS2__
#pragma pack(1)
#define NP_LOADDS _System
#else
#define NP_LOADDS
#endif
#include "npapi.h"
#include "npruntime.h"
typedef NPError (* NP_LOADDS NPP_NewProcPtr)(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved);
typedef NPError (* NP_LOADDS NPP_DestroyProcPtr)(NPP instance, NPSavedData** save);
typedef NPError (* NP_LOADDS NPP_SetWindowProcPtr)(NPP instance, NPWindow* window);
typedef NPError (* NP_LOADDS NPP_NewStreamProcPtr)(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype);
typedef NPError (* NP_LOADDS NPP_DestroyStreamProcPtr)(NPP instance, NPStream* stream, NPReason reason);
typedef int32_t (* NP_LOADDS NPP_WriteReadyProcPtr)(NPP instance, NPStream* stream);
typedef int32_t (* NP_LOADDS NPP_WriteProcPtr)(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer);
typedef void (* NP_LOADDS NPP_StreamAsFileProcPtr)(NPP instance, NPStream* stream, const char* fname);
typedef void (* NP_LOADDS NPP_PrintProcPtr)(NPP instance, NPPrint* platformPrint);
typedef int16_t (* NP_LOADDS NPP_HandleEventProcPtr)(NPP instance, void* event);
typedef void (* NP_LOADDS NPP_URLNotifyProcPtr)(NPP instance, const char* url, NPReason reason, void* notifyData);
/* Any NPObjects returned to the browser via NPP_GetValue should be retained
by the plugin on the way out. The browser is responsible for releasing. */
typedef NPError (* NP_LOADDS NPP_GetValueProcPtr)(NPP instance, NPPVariable variable, void *ret_value);
typedef NPError (* NP_LOADDS NPP_SetValueProcPtr)(NPP instance, NPNVariable variable, void *value);
typedef NPBool (* NP_LOADDS NPP_GotFocusPtr)(NPP instance, NPFocusDirection direction);
typedef void (* NP_LOADDS NPP_LostFocusPtr)(NPP instance);
typedef void (* NP_LOADDS NPP_URLRedirectNotifyPtr)(NPP instance, const char* url, int32_t status, void* notifyData);
typedef NPError (* NP_LOADDS NPP_ClearSiteDataPtr)(const char* site, uint64_t flags, uint64_t maxAge);
typedef char** (* NP_LOADDS NPP_GetSitesWithDataPtr)(void);
typedef NPError (*NPN_GetValueProcPtr)(NPP instance, NPNVariable variable, void *ret_value);
typedef NPError (*NPN_SetValueProcPtr)(NPP instance, NPPVariable variable, void *value);
typedef NPError (*NPN_GetURLNotifyProcPtr)(NPP instance, const char* url, const char* window, void* notifyData);
typedef NPError (*NPN_PostURLNotifyProcPtr)(NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file, void* notifyData);
typedef NPError (*NPN_GetURLProcPtr)(NPP instance, const char* url, const char* window);
typedef NPError (*NPN_PostURLProcPtr)(NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file);
typedef NPError (*NPN_RequestReadProcPtr)(NPStream* stream, NPByteRange* rangeList);
typedef NPError (*NPN_NewStreamProcPtr)(NPP instance, NPMIMEType type, const char* window, NPStream** stream);
typedef int32_t (*NPN_WriteProcPtr)(NPP instance, NPStream* stream, int32_t len, void* buffer);
typedef NPError (*NPN_DestroyStreamProcPtr)(NPP instance, NPStream* stream, NPReason reason);
typedef void (*NPN_StatusProcPtr)(NPP instance, const char* message);
/* Browser manages the lifetime of the buffer returned by NPN_UserAgent, don't
depend on it sticking around and don't free it. */
typedef const char* (*NPN_UserAgentProcPtr)(NPP instance);
typedef void* (*NPN_MemAllocProcPtr)(uint32_t size);
typedef void (*NPN_MemFreeProcPtr)(void* ptr);
typedef uint32_t (*NPN_MemFlushProcPtr)(uint32_t size);
typedef void (*NPN_ReloadPluginsProcPtr)(NPBool reloadPages);
typedef void* (*NPN_GetJavaEnvProcPtr)(void);
typedef void* (*NPN_GetJavaPeerProcPtr)(NPP instance);
typedef void (*NPN_InvalidateRectProcPtr)(NPP instance, NPRect *rect);
typedef void (*NPN_InvalidateRegionProcPtr)(NPP instance, NPRegion region);
typedef void (*NPN_ForceRedrawProcPtr)(NPP instance);
typedef NPIdentifier (*NPN_GetStringIdentifierProcPtr)(const NPUTF8* name);
typedef void (*NPN_GetStringIdentifiersProcPtr)(const NPUTF8** names, int32_t nameCount, NPIdentifier* identifiers);
typedef NPIdentifier (*NPN_GetIntIdentifierProcPtr)(int32_t intid);
typedef bool (*NPN_IdentifierIsStringProcPtr)(NPIdentifier identifier);
typedef NPUTF8* (*NPN_UTF8FromIdentifierProcPtr)(NPIdentifier identifier);
typedef int32_t (*NPN_IntFromIdentifierProcPtr)(NPIdentifier identifier);
typedef NPObject* (*NPN_CreateObjectProcPtr)(NPP npp, NPClass *aClass);
typedef NPObject* (*NPN_RetainObjectProcPtr)(NPObject *obj);
typedef void (*NPN_ReleaseObjectProcPtr)(NPObject *obj);
typedef bool (*NPN_InvokeProcPtr)(NPP npp, NPObject* obj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result);
typedef bool (*NPN_InvokeDefaultProcPtr)(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result);
typedef bool (*NPN_EvaluateProcPtr)(NPP npp, NPObject *obj, NPString *script, NPVariant *result);
typedef bool (*NPN_GetPropertyProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName, NPVariant *result);
typedef bool (*NPN_SetPropertyProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName, const NPVariant *value);
typedef bool (*NPN_RemovePropertyProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName);
typedef bool (*NPN_HasPropertyProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName);
typedef bool (*NPN_HasMethodProcPtr)(NPP npp, NPObject *obj, NPIdentifier propertyName);
typedef void (*NPN_ReleaseVariantValueProcPtr)(NPVariant *variant);
typedef void (*NPN_SetExceptionProcPtr)(NPObject *obj, const NPUTF8 *message);
typedef void (*NPN_PushPopupsEnabledStateProcPtr)(NPP npp, NPBool enabled);
typedef void (*NPN_PopPopupsEnabledStateProcPtr)(NPP npp);
typedef bool (*NPN_EnumerateProcPtr)(NPP npp, NPObject *obj, NPIdentifier **identifier, uint32_t *count);
typedef void (*NPN_PluginThreadAsyncCallProcPtr)(NPP instance, void (*func)(void *), void *userData);
typedef bool (*NPN_ConstructProcPtr)(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result);
typedef NPError (*NPN_GetValueForURLPtr)(NPP npp, NPNURLVariable variable, const char *url, char **value, uint32_t *len);
typedef NPError (*NPN_SetValueForURLPtr)(NPP npp, NPNURLVariable variable, const char *url, const char *value, uint32_t len);
typedef NPError (*NPN_GetAuthenticationInfoPtr)(NPP npp, const char *protocol, const char *host, int32_t port, const char *scheme, const char *realm, char **username, uint32_t *ulen, char **password, uint32_t *plen);
typedef uint32_t (*NPN_ScheduleTimerPtr)(NPP instance, uint32_t interval, NPBool repeat, void (*timerFunc)(NPP npp, uint32_t timerID));
typedef void (*NPN_UnscheduleTimerPtr)(NPP instance, uint32_t timerID);
typedef NPError (*NPN_PopUpContextMenuPtr)(NPP instance, NPMenu* menu);
typedef NPBool (*NPN_ConvertPointPtr)(NPP instance, double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace);
typedef NPBool (*NPN_HandleEventPtr)(NPP instance, void *event, NPBool handled);
typedef NPBool (*NPN_UnfocusInstancePtr)(NPP instance, NPFocusDirection direction);
typedef void (*NPN_URLRedirectResponsePtr)(NPP instance, void* notifyData, NPBool allow);
typedef struct _NPPluginFuncs {
uint16_t size;
uint16_t version;
NPP_NewProcPtr newp;
NPP_DestroyProcPtr destroy;
NPP_SetWindowProcPtr setwindow;
NPP_NewStreamProcPtr newstream;
NPP_DestroyStreamProcPtr destroystream;
NPP_StreamAsFileProcPtr asfile;
NPP_WriteReadyProcPtr writeready;
NPP_WriteProcPtr write;
NPP_PrintProcPtr print;
NPP_HandleEventProcPtr event;
NPP_URLNotifyProcPtr urlnotify;
void* javaClass;
NPP_GetValueProcPtr getvalue;
NPP_SetValueProcPtr setvalue;
NPP_GotFocusPtr gotfocus;
NPP_LostFocusPtr lostfocus;
NPP_URLRedirectNotifyPtr urlredirectnotify;
NPP_ClearSiteDataPtr clearsitedata;
NPP_GetSitesWithDataPtr getsiteswithdata;
} NPPluginFuncs;
typedef struct _NPNetscapeFuncs {
uint16_t size;
uint16_t version;
NPN_GetURLProcPtr geturl;
NPN_PostURLProcPtr posturl;
NPN_RequestReadProcPtr requestread;
NPN_NewStreamProcPtr newstream;
NPN_WriteProcPtr write;
NPN_DestroyStreamProcPtr destroystream;
NPN_StatusProcPtr status;
NPN_UserAgentProcPtr uagent;
NPN_MemAllocProcPtr memalloc;
NPN_MemFreeProcPtr memfree;
NPN_MemFlushProcPtr memflush;
NPN_ReloadPluginsProcPtr reloadplugins;
NPN_GetJavaEnvProcPtr getJavaEnv;
NPN_GetJavaPeerProcPtr getJavaPeer;
NPN_GetURLNotifyProcPtr geturlnotify;
NPN_PostURLNotifyProcPtr posturlnotify;
NPN_GetValueProcPtr getvalue;
NPN_SetValueProcPtr setvalue;
NPN_InvalidateRectProcPtr invalidaterect;
NPN_InvalidateRegionProcPtr invalidateregion;
NPN_ForceRedrawProcPtr forceredraw;
NPN_GetStringIdentifierProcPtr getstringidentifier;
NPN_GetStringIdentifiersProcPtr getstringidentifiers;
NPN_GetIntIdentifierProcPtr getintidentifier;
NPN_IdentifierIsStringProcPtr identifierisstring;
NPN_UTF8FromIdentifierProcPtr utf8fromidentifier;
NPN_IntFromIdentifierProcPtr intfromidentifier;
NPN_CreateObjectProcPtr createobject;
NPN_RetainObjectProcPtr retainobject;
NPN_ReleaseObjectProcPtr releaseobject;
NPN_InvokeProcPtr invoke;
NPN_InvokeDefaultProcPtr invokeDefault;
NPN_EvaluateProcPtr evaluate;
NPN_GetPropertyProcPtr getproperty;
NPN_SetPropertyProcPtr setproperty;
NPN_RemovePropertyProcPtr removeproperty;
NPN_HasPropertyProcPtr hasproperty;
NPN_HasMethodProcPtr hasmethod;
NPN_ReleaseVariantValueProcPtr releasevariantvalue;
NPN_SetExceptionProcPtr setexception;
NPN_PushPopupsEnabledStateProcPtr pushpopupsenabledstate;
NPN_PopPopupsEnabledStateProcPtr poppopupsenabledstate;
NPN_EnumerateProcPtr enumerate;
NPN_PluginThreadAsyncCallProcPtr pluginthreadasynccall;
NPN_ConstructProcPtr construct;
NPN_GetValueForURLPtr getvalueforurl;
NPN_SetValueForURLPtr setvalueforurl;
NPN_GetAuthenticationInfoPtr getauthenticationinfo;
NPN_ScheduleTimerPtr scheduletimer;
NPN_UnscheduleTimerPtr unscheduletimer;
NPN_PopUpContextMenuPtr popupcontextmenu;
NPN_ConvertPointPtr convertpoint;
NPN_HandleEventPtr handleevent;
NPN_UnfocusInstancePtr unfocusinstance;
NPN_URLRedirectResponsePtr urlredirectresponse;
} NPNetscapeFuncs;
#ifdef XP_MACOSX
/*
* Mac OS X version(s) of NP_GetMIMEDescription(const char *)
* These can be called to retrieve MIME information from the plugin dynamically
*
* Note: For compatibility with Quicktime, BPSupportedMIMEtypes is another way
* to get mime info from the plugin only on OSX and may not be supported
* in future version -- use NP_GetMIMEDescription instead
*/
enum
{
kBPSupportedMIMETypesStructVers_1 = 1
};
typedef struct _BPSupportedMIMETypes
{
SInt32 structVersion; /* struct version */
Handle typeStrings; /* STR# formatted handle, allocated by plug-in */
Handle infoStrings; /* STR# formatted handle, allocated by plug-in */
} BPSupportedMIMETypes;
OSErr BP_GetSupportedMIMETypes(BPSupportedMIMETypes *mimeInfo, UInt32 flags);
#define NP_GETMIMEDESCRIPTION_NAME "NP_GetMIMEDescription"
typedef const char* (*NP_GetMIMEDescriptionProcPtr)(void);
typedef OSErr (*BP_GetSupportedMIMETypesProcPtr)(BPSupportedMIMETypes*, UInt32);
#endif
#if defined(_WIN32)
#define OSCALL WINAPI
#else
#if defined(__OS2__)
#define OSCALL _System
#else
#define OSCALL
#endif
#endif
#if defined(XP_UNIX)
#if defined(__GNUC__)
#define NP_VISIBILITY_DEFAULT __attribute__((visibility("default")))
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
#define NP_VISIBILITY_DEFAULT __global
#else
#define NP_VISIBILITY_DEFAULT
#endif
#define NP_EXPORT(__type) NP_VISIBILITY_DEFAULT __type
#endif
#if defined(_WIN32) || defined (__OS2__)
#ifdef __cplusplus
extern "C" {
#endif
/* plugin meta member functions */
#if defined(__OS2__)
typedef struct _NPPluginData { /* Alternate OS2 Plugin interface */
char *pMimeTypes;
char *pFileExtents;
char *pFileOpenTemplate;
char *pProductName;
char *pProductDescription;
unsigned long dwProductVersionMS;
unsigned long dwProductVersionLS;
} NPPluginData;
typedef NPError (*NP_GetPluginDataFunc)(NPPluginData*);
NPError OSCALL NP_GetPluginData(NPPluginData * pPluginData);
#endif
typedef NPError (*NP_GetEntryPointsFunc)(NPPluginFuncs*);
NPError OSCALL NP_GetEntryPoints(NPPluginFuncs* pFuncs);
typedef NPError (*NP_InitializeFunc)(NPNetscapeFuncs*);
NPError OSCALL NP_Initialize(NPNetscapeFuncs* bFuncs);
typedef NPError (*NP_ShutdownFunc)(void);
NPError OSCALL NP_Shutdown(void);
typedef char* (*NP_GetMIMEDescriptionFunc)(void);
char* NP_GetMIMEDescription(void);
#ifdef __cplusplus
}
#endif
#endif
#if defined(__OS2__)
#pragma pack()
#endif
#ifdef XP_UNIX
#ifdef __cplusplus
extern "C" {
#endif
typedef char* (*NP_GetPluginVersionFunc)(void);
NP_EXPORT(char*) NP_GetPluginVersion(void);
typedef char* (*NP_GetMIMEDescriptionFunc)(void);
NP_EXPORT(char*) NP_GetMIMEDescription(void);
#ifdef XP_MACOSX
typedef NPError (*NP_InitializeFunc)(NPNetscapeFuncs*);
NP_EXPORT(NPError) NP_Initialize(NPNetscapeFuncs* bFuncs);
typedef NPError (*NP_GetEntryPointsFunc)(NPPluginFuncs*);
NP_EXPORT(NPError) NP_GetEntryPoints(NPPluginFuncs* pFuncs);
#else
typedef NPError (*NP_InitializeFunc)(NPNetscapeFuncs*, NPPluginFuncs*);
NP_EXPORT(NPError) NP_Initialize(NPNetscapeFuncs* bFuncs, NPPluginFuncs* pFuncs);
#endif
typedef NPError (*NP_ShutdownFunc)(void);
NP_EXPORT(NPError) NP_Shutdown(void);
typedef NPError (*NP_GetValueFunc)(void *, NPPVariable, void *);
NP_EXPORT(NPError) NP_GetValue(void *future, NPPVariable aVariable, void *aValue);
#ifdef __cplusplus
}
#endif
#endif
#endif /* npfunctions_h_ */

View File

@@ -1,393 +0,0 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* Copyright (c) 2004, Apple Computer, Inc. and The Mozilla Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the names of Apple Computer, Inc. ("Apple") or The Mozilla
* Foundation ("Mozilla") nor the names of their contributors may be used
* to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY APPLE, MOZILLA AND THEIR CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE, MOZILLA OR
* THEIR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef _NP_RUNTIME_H_
#define _NP_RUNTIME_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "nptypes.h"
/*
This API is used to facilitate binding code written in C to script
objects. The API in this header does not assume the presence of a
user agent. That is, it can be used to bind C code to scripting
environments outside of the context of a user agent.
However, the normal use of the this API is in the context of a
scripting environment running in a browser or other user agent.
In particular it is used to support the extended Netscape
script-ability API for plugins (NP-SAP). NP-SAP is an extension
of the Netscape plugin API. As such we have adopted the use of
the "NP" prefix for this API.
The following NP{N|P}Variables were added to the Netscape plugin
API (in npapi.h):
NPNVWindowNPObject
NPNVPluginElementNPObject
NPPVpluginScriptableNPObject
These variables are exposed through NPN_GetValue() and
NPP_GetValue() (respectively) and are used to establish the
initial binding between the user agent and native code. The DOM
objects in the user agent can be examined and manipulated using
the NPN_ functions that operate on NPObjects described in this
header.
To the extent possible the assumptions about the scripting
language used by the scripting environment have been minimized.
*/
#define NP_BEGIN_MACRO do {
#define NP_END_MACRO } while (0)
/*
Objects (non-primitive data) passed between 'C' and script is
always wrapped in an NPObject. The 'interface' of an NPObject is
described by an NPClass.
*/
typedef struct NPObject NPObject;
typedef struct NPClass NPClass;
typedef char NPUTF8;
typedef struct _NPString {
const NPUTF8 *UTF8Characters;
uint32_t UTF8Length;
} NPString;
typedef enum {
NPVariantType_Void,
NPVariantType_Null,
NPVariantType_Bool,
NPVariantType_Int32,
NPVariantType_Double,
NPVariantType_String,
NPVariantType_Object
} NPVariantType;
typedef struct _NPVariant {
NPVariantType type;
union {
bool boolValue;
int32_t intValue;
double doubleValue;
NPString stringValue;
NPObject *objectValue;
} value;
} NPVariant;
/*
NPN_ReleaseVariantValue is called on all 'out' parameters
references. Specifically it is to be called on variants that own
their value, as is the case with all non-const NPVariant*
arguments after a successful call to any methods (except this one)
in this API.
After calling NPN_ReleaseVariantValue, the type of the variant
will be NPVariantType_Void.
*/
void NPN_ReleaseVariantValue(NPVariant *variant);
#define NPVARIANT_IS_VOID(_v) ((_v).type == NPVariantType_Void)
#define NPVARIANT_IS_NULL(_v) ((_v).type == NPVariantType_Null)
#define NPVARIANT_IS_BOOLEAN(_v) ((_v).type == NPVariantType_Bool)
#define NPVARIANT_IS_INT32(_v) ((_v).type == NPVariantType_Int32)
#define NPVARIANT_IS_DOUBLE(_v) ((_v).type == NPVariantType_Double)
#define NPVARIANT_IS_STRING(_v) ((_v).type == NPVariantType_String)
#define NPVARIANT_IS_OBJECT(_v) ((_v).type == NPVariantType_Object)
#define NPVARIANT_TO_BOOLEAN(_v) ((_v).value.boolValue)
#define NPVARIANT_TO_INT32(_v) ((_v).value.intValue)
#define NPVARIANT_TO_DOUBLE(_v) ((_v).value.doubleValue)
#define NPVARIANT_TO_STRING(_v) ((_v).value.stringValue)
#define NPVARIANT_TO_OBJECT(_v) ((_v).value.objectValue)
#define VOID_TO_NPVARIANT(_v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_Void; \
(_v).value.objectValue = NULL; \
NP_END_MACRO
#define NULL_TO_NPVARIANT(_v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_Null; \
(_v).value.objectValue = NULL; \
NP_END_MACRO
#define BOOLEAN_TO_NPVARIANT(_val, _v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_Bool; \
(_v).value.boolValue = !!(_val); \
NP_END_MACRO
#define INT32_TO_NPVARIANT(_val, _v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_Int32; \
(_v).value.intValue = _val; \
NP_END_MACRO
#define DOUBLE_TO_NPVARIANT(_val, _v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_Double; \
(_v).value.doubleValue = _val; \
NP_END_MACRO
#define STRINGZ_TO_NPVARIANT(_val, _v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_String; \
NPString str = { _val, (uint32_t)(strlen(_val)) }; \
(_v).value.stringValue = str; \
NP_END_MACRO
#define STRINGN_TO_NPVARIANT(_val, _len, _v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_String; \
NPString str = { _val, (uint32_t)(_len) }; \
(_v).value.stringValue = str; \
NP_END_MACRO
#define OBJECT_TO_NPVARIANT(_val, _v) \
NP_BEGIN_MACRO \
(_v).type = NPVariantType_Object; \
(_v).value.objectValue = _val; \
NP_END_MACRO
/*
Type mappings (JavaScript types have been used for illustration
purposes):
JavaScript to C (NPVariant with type:)
undefined NPVariantType_Void
null NPVariantType_Null
Boolean NPVariantType_Bool
Number NPVariantType_Double or NPVariantType_Int32
String NPVariantType_String
Object NPVariantType_Object
C (NPVariant with type:) to JavaScript
NPVariantType_Void undefined
NPVariantType_Null null
NPVariantType_Bool Boolean
NPVariantType_Int32 Number
NPVariantType_Double Number
NPVariantType_String String
NPVariantType_Object Object
*/
typedef void *NPIdentifier;
/*
NPObjects have methods and properties. Methods and properties are
identified with NPIdentifiers. These identifiers may be reflected
in script. NPIdentifiers can be either strings or integers, IOW,
methods and properties can be identified by either strings or
integers (i.e. foo["bar"] vs foo[1]). NPIdentifiers can be
compared using ==. In case of any errors, the requested
NPIdentifier(s) will be NULL. NPIdentifier lifetime is controlled
by the browser. Plugins do not need to worry about memory management
with regards to NPIdentifiers.
*/
NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name);
void NPN_GetStringIdentifiers(const NPUTF8 **names, int32_t nameCount,
NPIdentifier *identifiers);
NPIdentifier NPN_GetIntIdentifier(int32_t intid);
bool NPN_IdentifierIsString(NPIdentifier identifier);
/*
The NPUTF8 returned from NPN_UTF8FromIdentifier SHOULD be freed.
*/
NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier);
/*
Get the integer represented by identifier. If identifier is not an
integer identifier, the behaviour is undefined.
*/
int32_t NPN_IntFromIdentifier(NPIdentifier identifier);
/*
NPObject behavior is implemented using the following set of
callback functions.
The NPVariant *result argument of these functions (where
applicable) should be released using NPN_ReleaseVariantValue().
*/
typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp, NPClass *aClass);
typedef void (*NPDeallocateFunctionPtr)(NPObject *npobj);
typedef void (*NPInvalidateFunctionPtr)(NPObject *npobj);
typedef bool (*NPHasMethodFunctionPtr)(NPObject *npobj, NPIdentifier name);
typedef bool (*NPInvokeFunctionPtr)(NPObject *npobj, NPIdentifier name,
const NPVariant *args, uint32_t argCount,
NPVariant *result);
typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj,
const NPVariant *args,
uint32_t argCount,
NPVariant *result);
typedef bool (*NPHasPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name);
typedef bool (*NPGetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
NPVariant *result);
typedef bool (*NPSetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
const NPVariant *value);
typedef bool (*NPRemovePropertyFunctionPtr)(NPObject *npobj,
NPIdentifier name);
typedef bool (*NPEnumerationFunctionPtr)(NPObject *npobj, NPIdentifier **value,
uint32_t *count);
typedef bool (*NPConstructFunctionPtr)(NPObject *npobj,
const NPVariant *args,
uint32_t argCount,
NPVariant *result);
/*
NPObjects returned by create, retain, invoke, and getProperty pass
a reference count to the caller. That is, the callee adds a
reference count which passes to the caller. It is the caller's
responsibility to release the returned object.
NPInvokeFunctionPtr function may return 0 to indicate a void
result.
NPInvalidateFunctionPtr is called by the scripting environment
when the native code is shutdown. Any attempt to message a
NPObject instance after the invalidate callback has been
called will result in undefined behavior, even if the native code
is still retaining those NPObject instances. (The runtime
will typically return immediately, with 0 or NULL, from an attempt
to dispatch to a NPObject, but this behavior should not be
depended upon.)
The NPEnumerationFunctionPtr function may pass an array of
NPIdentifiers back to the caller. The callee allocs the memory of
the array using NPN_MemAlloc(), and it's the caller's responsibility
to release it using NPN_MemFree().
*/
struct NPClass
{
uint32_t structVersion;
NPAllocateFunctionPtr allocate;
NPDeallocateFunctionPtr deallocate;
NPInvalidateFunctionPtr invalidate;
NPHasMethodFunctionPtr hasMethod;
NPInvokeFunctionPtr invoke;
NPInvokeDefaultFunctionPtr invokeDefault;
NPHasPropertyFunctionPtr hasProperty;
NPGetPropertyFunctionPtr getProperty;
NPSetPropertyFunctionPtr setProperty;
NPRemovePropertyFunctionPtr removeProperty;
NPEnumerationFunctionPtr enumerate;
NPConstructFunctionPtr construct;
};
#define NP_CLASS_STRUCT_VERSION 3
#define NP_CLASS_STRUCT_VERSION_ENUM 2
#define NP_CLASS_STRUCT_VERSION_CTOR 3
#define NP_CLASS_STRUCT_VERSION_HAS_ENUM(npclass) \
((npclass)->structVersion >= NP_CLASS_STRUCT_VERSION_ENUM)
#define NP_CLASS_STRUCT_VERSION_HAS_CTOR(npclass) \
((npclass)->structVersion >= NP_CLASS_STRUCT_VERSION_CTOR)
struct NPObject {
NPClass *_class;
uint32_t referenceCount;
/*
* Additional space may be allocated here by types of NPObjects
*/
};
/*
If the class has an allocate function, NPN_CreateObject invokes
that function, otherwise a NPObject is allocated and
returned. This method will initialize the referenceCount member of
the NPObject to 1.
*/
NPObject *NPN_CreateObject(NPP npp, NPClass *aClass);
/*
Increment the NPObject's reference count.
*/
NPObject *NPN_RetainObject(NPObject *npobj);
/*
Decremented the NPObject's reference count. If the reference
count goes to zero, the class's destroy function is invoke if
specified, otherwise the object is freed directly.
*/
void NPN_ReleaseObject(NPObject *npobj);
/*
Functions to access script objects represented by NPObject.
Calls to script objects are synchronous. If a function returns a
value, it will be supplied via the result NPVariant
argument. Successful calls will return true, false will be
returned in case of an error.
Calls made from plugin code to script must be made from the thread
on which the plugin was initialized.
*/
bool NPN_Invoke(NPP npp, NPObject *npobj, NPIdentifier methodName,
const NPVariant *args, uint32_t argCount, NPVariant *result);
bool NPN_InvokeDefault(NPP npp, NPObject *npobj, const NPVariant *args,
uint32_t argCount, NPVariant *result);
bool NPN_Evaluate(NPP npp, NPObject *npobj, NPString *script,
NPVariant *result);
bool NPN_GetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName,
NPVariant *result);
bool NPN_SetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName,
const NPVariant *value);
bool NPN_RemoveProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName);
bool NPN_HasProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName);
bool NPN_HasMethod(NPP npp, NPObject *npobj, NPIdentifier methodName);
bool NPN_Enumerate(NPP npp, NPObject *npobj, NPIdentifier **identifier,
uint32_t *count);
bool NPN_Construct(NPP npp, NPObject *npobj, const NPVariant *args,
uint32_t argCount, NPVariant *result);
/*
NPN_SetException may be called to trigger a script exception upon
return from entry points into NPObjects. Typical usage:
NPN_SetException (npobj, message);
*/
void NPN_SetException(NPObject *npobj, const NPUTF8 *message);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -1,111 +0,0 @@
/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* mozilla.org.
* Portions created by the Initial Developer are Copyright (C) 2004
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Johnny Stenback <jst@mozilla.org> (Original author)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nptypes_h_
#define nptypes_h_
/*
* Header file for ensuring that C99 types ([u]int32_t, [u]int64_t and bool) and
* true/false macros are available.
*/
#if defined(WIN32) || defined(OS2)
/*
* Win32 and OS/2 don't know C99, so define [u]int_16/32/64 here. The bool
* is predefined tho, both in C and C++.
*/
typedef short int16_t;
typedef unsigned short uint16_t;
typedef int int32_t;
typedef unsigned int uint32_t;
typedef long long int64_t;
typedef unsigned long long uint64_t;
#elif defined(_AIX) || defined(__sun) || defined(__osf__) || defined(IRIX) || defined(HPUX)
/*
* AIX and SunOS ship a inttypes.h header that defines [u]int32_t,
* but not bool for C.
*/
#include <inttypes.h>
#ifndef __cplusplus
typedef int bool;
#define true 1
#define false 0
#endif
#elif defined(bsdi) || defined(FREEBSD) || defined(OPENBSD)
/*
* BSD/OS, FreeBSD, and OpenBSD ship sys/types.h that define int32_t and
* u_int32_t.
*/
#include <sys/types.h>
/*
* BSD/OS ships no header that defines uint32_t, nor bool (for C)
*/
#if defined(bsdi)
typedef u_int32_t uint32_t;
typedef u_int64_t uint64_t;
#if !defined(__cplusplus)
typedef int bool;
#define true 1
#define false 0
#endif
#else
/*
* FreeBSD and OpenBSD define uint32_t and bool.
*/
#include <inttypes.h>
#include <stdbool.h>
#endif
#elif defined(BEOS)
#include <inttypes.h>
#else
/*
* For those that ship a standard C99 stdint.h header file, include
* it. Can't do the same for stdbool.h tho, since some systems ship
* with a stdbool.h file that doesn't compile!
*/
#include <stdint.h>
#ifndef __cplusplus
#include <stdbool.h>
#endif
#endif
#endif /* nptypes_h_ */

View File

@@ -1,43 +0,0 @@
Please be apprised of the following Legal Notices:
A) The U.S. District Court for the Eastern District of Virginia has
ruled that the Netscape Navigator code does not infringe Wang's U.S.
Patent No. 4,751,669 ("the '669 Patent") because: 1) HTML is not
Videotex as defined by the '669 patent; 2) web servers are not central
suppliers; and 3) Navigator does not "connect," as defined by the '669
Patent, to web servers on the Internet. Wang may appeal this decision to
the Federal Circuit. Wang contended that its Patent disclosing a
"Videotext" system, is infringed by the following functionality in the
Netscape Navigator code: 1) the animated logo and status line indicators
--See Claims 1,8 and 9; 2) the "File Save As" function --See Claims
23-27; 3) Bookmarks and Rename Bookmarks in the Properties window --See
Claims 20-22; 4) storing HTML, GIF, and JPEG files and adding filename
extensions --See Claim 38
B) Intermind owns pending U.S. patent applications on communications
systems which employ metadata ("channel objects") to define a control
structure for information transfer. The Netscape code does not infringe
as released; however, modifications which utilize channel objects as
described by Intermind should be considered carefully. The following is
a statement from Intermind: "Intermind's claims fundamentally involve
the use of a control structure to automate communications. ...The
essence of Intermind's top claim is that two devices sender and
receiver have persistent storage, communicate over a network,
and exchange a control structure including metadata which describes: 1)
what information is to be updated, 2) when to update this information,
and 3) how to transfer the updated information. In addition, at least
the receiving device must be able to process the metadata in order to
perform the update determination and transfer. Any digital
communications system which incorporates all of these elements will be
covered by Intermind's patents." See Intermind.com.
C) Stac, Inc., and its licensing agent Hi/fn, own several patents which
disclose data compression methods implementing an LZS compression
algorithm, including U.S. Patent Nos. 4,701,745 and 5,016, 009 ("the
Stac Patents"). The Netscape Communicator code does not perform
compression. If you modify the Netscape source code to perform
compression, please take notice of the Stac Patents.
D) Netscape Communications Corporation ("Netscape") does not guarantee
that any source code or executable code available from the mozilla.org
domain is Year 2000 compliant.

View File

@@ -1,567 +0,0 @@
MOZILLA PUBLIC LICENSE
Version 1.1
---------------
1. Definitions.
1.0.1. "Commercial Use" means distribution or otherwise making the
Covered Code available to a third party.
1.1. "Contributor" means each entity that creates or contributes to
the creation of Modifications.
1.2. "Contributor Version" means the combination of the Original
Code, prior Modifications used by a Contributor, and the Modifications
made by that particular Contributor.
1.3. "Covered Code" means the Original Code or Modifications or the
combination of the Original Code and Modifications, in each case
including portions thereof.
1.4. "Electronic Distribution Mechanism" means a mechanism generally
accepted in the software development community for the electronic
transfer of data.
1.5. "Executable" means Covered Code in any form other than Source
Code.
1.6. "Initial Developer" means the individual or entity identified
as the Initial Developer in the Source Code notice required by Exhibit
A.
1.7. "Larger Work" means a work which combines Covered Code or
portions thereof with code not governed by the terms of this License.
1.8. "License" means this document.
1.8.1. "Licensable" means having the right to grant, to the maximum
extent possible, whether at the time of the initial grant or
subsequently acquired, any and all of the rights conveyed herein.
1.9. "Modifications" means any addition to or deletion from the
substance or structure of either the Original Code or any previous
Modifications. When Covered Code is released as a series of files, a
Modification is:
A. Any addition to or deletion from the contents of a file
containing Original Code or previous Modifications.
B. Any new file that contains any part of the Original Code or
previous Modifications.
1.10. "Original Code" means Source Code of computer software code
which is described in the Source Code notice required by Exhibit A as
Original Code, and which, at the time of its release under this
License is not already Covered Code governed by this License.
1.10.1. "Patent Claims" means any patent claim(s), now owned or
hereafter acquired, including without limitation, method, process,
and apparatus claims, in any patent Licensable by grantor.
1.11. "Source Code" means the preferred form of the Covered Code for
making modifications to it, including all modules it contains, plus
any associated interface definition files, scripts used to control
compilation and installation of an Executable, or source code
differential comparisons against either the Original Code or another
well known, available Covered Code of the Contributor's choice. The
Source Code can be in a compressed or archival form, provided the
appropriate decompression or de-archiving software is widely available
for no charge.
1.12. "You" (or "Your") means an individual or a legal entity
exercising rights under, and complying with all of the terms of, this
License or a future version of this License issued under Section 6.1.
For legal entities, "You" includes any entity which controls, is
controlled by, or is under common control with You. For purposes of
this definition, "control" means (a) the power, direct or indirect,
to cause the direction or management of such entity, whether by
contract or otherwise, or (b) ownership of more than fifty percent
(50%) of the outstanding shares or beneficial ownership of such
entity.
2. Source Code License.
2.1. The Initial Developer Grant.
The Initial Developer hereby grants You a world-wide, royalty-free,
non-exclusive license, subject to third party intellectual property
claims:
(a) under intellectual property rights (other than patent or
trademark) Licensable by Initial Developer to use, reproduce,
modify, display, perform, sublicense and distribute the Original
Code (or portions thereof) with or without Modifications, and/or
as part of a Larger Work; and
(b) under Patents Claims infringed by the making, using or
selling of Original Code, to make, have made, use, practice,
sell, and offer for sale, and/or otherwise dispose of the
Original Code (or portions thereof).
(c) the licenses granted in this Section 2.1(a) and (b) are
effective on the date Initial Developer first distributes
Original Code under the terms of this License.
(d) Notwithstanding Section 2.1(b) above, no patent license is
granted: 1) for code that You delete from the Original Code; 2)
separate from the Original Code; or 3) for infringements caused
by: i) the modification of the Original Code or ii) the
combination of the Original Code with other software or devices.
2.2. Contributor Grant.
Subject to third party intellectual property claims, each Contributor
hereby grants You a world-wide, royalty-free, non-exclusive license
(a) under intellectual property rights (other than patent or
trademark) Licensable by Contributor, to use, reproduce, modify,
display, perform, sublicense and distribute the Modifications
created by such Contributor (or portions thereof) either on an
unmodified basis, with other Modifications, as Covered Code
and/or as part of a Larger Work; and
(b) under Patent Claims infringed by the making, using, or
selling of Modifications made by that Contributor either alone
and/or in combination with its Contributor Version (or portions
of such combination), to make, use, sell, offer for sale, have
made, and/or otherwise dispose of: 1) Modifications made by that
Contributor (or portions thereof); and 2) the combination of
Modifications made by that Contributor with its Contributor
Version (or portions of such combination).
(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
effective on the date Contributor first makes Commercial Use of
the Covered Code.
(d) Notwithstanding Section 2.2(b) above, no patent license is
granted: 1) for any code that Contributor has deleted from the
Contributor Version; 2) separate from the Contributor Version;
3) for infringements caused by: i) third party modifications of
Contributor Version or ii) the combination of Modifications made
by that Contributor with other software (except as part of the
Contributor Version) or other devices; or 4) under Patent Claims
infringed by Covered Code in the absence of Modifications made by
that Contributor.
3. Distribution Obligations.
3.1. Application of License.
The Modifications which You create or to which You contribute are
governed by the terms of this License, including without limitation
Section 2.2. The Source Code version of Covered Code may be
distributed only under the terms of this License or a future version
of this License released under Section 6.1, and You must include a
copy of this License with every copy of the Source Code You
distribute. You may not offer or impose any terms on any Source Code
version that alters or restricts the applicable version of this
License or the recipients' rights hereunder. However, You may include
an additional document offering the additional rights described in
Section 3.5.
3.2. Availability of Source Code.
Any Modification which You create or to which You contribute must be
made available in Source Code form under the terms of this License
either on the same media as an Executable version or via an accepted
Electronic Distribution Mechanism to anyone to whom you made an
Executable version available; and if made available via Electronic
Distribution Mechanism, must remain available for at least twelve (12)
months after the date it initially became available, or at least six
(6) months after a subsequent version of that particular Modification
has been made available to such recipients. You are responsible for
ensuring that the Source Code version remains available even if the
Electronic Distribution Mechanism is maintained by a third party.
3.3. Description of Modifications.
You must cause all Covered Code to which You contribute to contain a
file documenting the changes You made to create that Covered Code and
the date of any change. You must include a prominent statement that
the Modification is derived, directly or indirectly, from Original
Code provided by the Initial Developer and including the name of the
Initial Developer in (a) the Source Code, and (b) in any notice in an
Executable version or related documentation in which You describe the
origin or ownership of the Covered Code.
3.4. Intellectual Property Matters
(a) Third Party Claims.
If Contributor has knowledge that a license under a third party's
intellectual property rights is required to exercise the rights
granted by such Contributor under Sections 2.1 or 2.2,
Contributor must include a text file with the Source Code
distribution titled "LEGAL" which describes the claim and the
party making the claim in sufficient detail that a recipient will
know whom to contact. If Contributor obtains such knowledge after
the Modification is made available as described in Section 3.2,
Contributor shall promptly modify the LEGAL file in all copies
Contributor makes available thereafter and shall take other steps
(such as notifying appropriate mailing lists or newsgroups)
reasonably calculated to inform those who received the Covered
Code that new knowledge has been obtained.
(b) Contributor APIs.
If Contributor's Modifications include an application programming
interface and Contributor has knowledge of patent licenses which
are reasonably necessary to implement that API, Contributor must
also include this information in the LEGAL file.
(c) Representations.
Contributor represents that, except as disclosed pursuant to
Section 3.4(a) above, Contributor believes that Contributor's
Modifications are Contributor's original creation(s) and/or
Contributor has sufficient rights to grant the rights conveyed by
this License.
3.5. Required Notices.
You must duplicate the notice in Exhibit A in each file of the Source
Code. If it is not possible to put such notice in a particular Source
Code file due to its structure, then You must include such notice in a
location (such as a relevant directory) where a user would be likely
to look for such a notice. If You created one or more Modification(s)
You may add your name as a Contributor to the notice described in
Exhibit A. You must also duplicate this License in any documentation
for the Source Code where You describe recipients' rights or ownership
rights relating to Covered Code. You may choose to offer, and to
charge a fee for, warranty, support, indemnity or liability
obligations to one or more recipients of Covered Code. However, You
may do so only on Your own behalf, and not on behalf of the Initial
Developer or any Contributor. You must make it absolutely clear than
any such warranty, support, indemnity or liability obligation is
offered by You alone, and You hereby agree to indemnify the Initial
Developer and every Contributor for any liability incurred by the
Initial Developer or such Contributor as a result of warranty,
support, indemnity or liability terms You offer.
3.6. Distribution of Executable Versions.
You may distribute Covered Code in Executable form only if the
requirements of Section 3.1-3.5 have been met for that Covered Code,
and if You include a notice stating that the Source Code version of
the Covered Code is available under the terms of this License,
including a description of how and where You have fulfilled the
obligations of Section 3.2. The notice must be conspicuously included
in any notice in an Executable version, related documentation or
collateral in which You describe recipients' rights relating to the
Covered Code. You may distribute the Executable version of Covered
Code or ownership rights under a license of Your choice, which may
contain terms different from this License, provided that You are in
compliance with the terms of this License and that the license for the
Executable version does not attempt to limit or alter the recipient's
rights in the Source Code version from the rights set forth in this
License. If You distribute the Executable version under a different
license You must make it absolutely clear that any terms which differ
from this License are offered by You alone, not by the Initial
Developer or any Contributor. You hereby agree to indemnify the
Initial Developer and every Contributor for any liability incurred by
the Initial Developer or such Contributor as a result of any such
terms You offer.
3.7. Larger Works.
You may create a Larger Work by combining Covered Code with other code
not governed by the terms of this License and distribute the Larger
Work as a single product. In such a case, You must make sure the
requirements of this License are fulfilled for the Covered Code.
4. Inability to Comply Due to Statute or Regulation.
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Code due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description
must be included in the LEGAL file described in Section 3.4 and must
be included with all distributions of the Source Code. Except to the
extent prohibited by statute or regulation, such description must be
sufficiently detailed for a recipient of ordinary skill to be able to
understand it.
5. Application of this License.
This License applies to code to which the Initial Developer has
attached the notice in Exhibit A and to related Covered Code.
6. Versions of the License.
6.1. New Versions.
Netscape Communications Corporation ("Netscape") may publish revised
and/or new versions of the License from time to time. Each version
will be given a distinguishing version number.
6.2. Effect of New Versions.
Once Covered Code has been published under a particular version of the
License, You may always continue to use it under the terms of that
version. You may also choose to use such Covered Code under the terms
of any subsequent version of the License published by Netscape. No one
other than Netscape has the right to modify the terms applicable to
Covered Code created under this License.
6.3. Derivative Works.
If You create or use a modified version of this License (which you may
only do in order to apply it to code which is not already Covered Code
governed by this License), You must (a) rename Your license so that
the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
"MPL", "NPL" or any confusingly similar phrase do not appear in your
license (except to note that your license differs from this License)
and (b) otherwise make it clear that Your version of the license
contains terms which differ from the Mozilla Public License and
Netscape Public License. (Filling in the name of the Initial
Developer, Original Code or Contributor in the notice described in
Exhibit A shall not of themselves be deemed to be modifications of
this License.)
7. DISCLAIMER OF WARRANTY.
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
8. TERMINATION.
8.1. This License and the rights granted hereunder will terminate
automatically if You fail to comply with terms herein and fail to cure
such breach within 30 days of becoming aware of the breach. All
sublicenses to the Covered Code which are properly granted shall
survive any termination of this License. Provisions which, by their
nature, must remain in effect beyond the termination of this License
shall survive.
8.2. If You initiate litigation by asserting a patent infringement
claim (excluding declatory judgment actions) against Initial Developer
or a Contributor (the Initial Developer or Contributor against whom
You file such action is referred to as "Participant") alleging that:
(a) such Participant's Contributor Version directly or indirectly
infringes any patent, then any and all rights granted by such
Participant to You under Sections 2.1 and/or 2.2 of this License
shall, upon 60 days notice from Participant terminate prospectively,
unless if within 60 days after receipt of notice You either: (i)
agree in writing to pay Participant a mutually agreeable reasonable
royalty for Your past and future use of Modifications made by such
Participant, or (ii) withdraw Your litigation claim with respect to
the Contributor Version against such Participant. If within 60 days
of notice, a reasonable royalty and payment arrangement are not
mutually agreed upon in writing by the parties or the litigation claim
is not withdrawn, the rights granted by Participant to You under
Sections 2.1 and/or 2.2 automatically terminate at the expiration of
the 60 day notice period specified above.
(b) any software, hardware, or device, other than such Participant's
Contributor Version, directly or indirectly infringes any patent, then
any rights granted to You by such Participant under Sections 2.1(b)
and 2.2(b) are revoked effective as of the date You first made, used,
sold, distributed, or had made, Modifications made by that
Participant.
8.3. If You assert a patent infringement claim against Participant
alleging that such Participant's Contributor Version directly or
indirectly infringes any patent where such claim is resolved (such as
by license or settlement) prior to the initiation of patent
infringement litigation, then the reasonable value of the licenses
granted by such Participant under Sections 2.1 or 2.2 shall be taken
into account in determining the amount or value of any payment or
license.
8.4. In the event of termination under Sections 8.1 or 8.2 above,
all end user license agreements (excluding distributors and resellers)
which have been validly granted by You or any distributor hereunder
prior to termination shall survive termination.
9. LIMITATION OF LIABILITY.
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
10. U.S. GOVERNMENT END USERS.
The Covered Code is a "commercial item," as that term is defined in
48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
software" and "commercial computer software documentation," as such
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
all U.S. Government End Users acquire Covered Code with only those
rights set forth herein.
11. MISCELLANEOUS.
This License represents the complete agreement concerning subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. This License shall be governed by
California law provisions (except to the extent applicable law, if
any, provides otherwise), excluding its conflict-of-law provisions.
With respect to disputes in which at least one party is a citizen of,
or an entity chartered or registered to do business in the United
States of America, any litigation relating to this License shall be
subject to the jurisdiction of the Federal Courts of the Northern
District of California, with venue lying in Santa Clara County,
California, with the losing party responsible for costs, including
without limitation, court costs and reasonable attorneys' fees and
expenses. The application of the United Nations Convention on
Contracts for the International Sale of Goods is expressly excluded.
Any law or regulation which provides that the language of a contract
shall be construed against the drafter shall not apply to this
License.
12. RESPONSIBILITY FOR CLAIMS.
As between Initial Developer and the Contributors, each party is
responsible for claims and damages arising, directly or indirectly,
out of its utilization of rights under this License and You agree to
work with Initial Developer and Contributors to distribute such
responsibility on an equitable basis. Nothing herein is intended or
shall be deemed to constitute any admission of liability.
13. MULTIPLE-LICENSED CODE.
Initial Developer may designate portions of the Covered Code as
"Multiple-Licensed". "Multiple-Licensed" means that the Initial
Developer permits you to utilize portions of the Covered Code under
Your choice of the NPL or the alternative licenses, if any, specified
by the Initial Developer in the file described in Exhibit A.
EXHIBIT A -Mozilla Public License.
``The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS"
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.
The Original Code is ______________________________________.
The Initial Developer of the Original Code is ________________________.
Portions created by ______________________ are Copyright (C) ______
_______________________. All Rights Reserved.
Contributor(s): ______________________________________.
Alternatively, the contents of this file may be used under the terms
of the _____ license (the "[___] License"), in which case the
provisions of [______] License are applicable instead of those
above. If you wish to allow use of your version of this file only
under the terms of the [____] License and not to allow others to use
your version of this file under the MPL, indicate your decision by
deleting the provisions above and replace them with the notice and
other provisions required by the [___] License. If you do not delete
the provisions above, a recipient may use your version of this file
under either the MPL or the [___] License."
[NOTE: The text of this Exhibit A may differ slightly from the text of
the notices in the Source Code files of the Original Code. You should
use the text of this Exhibit A rather than the text found in the
Original Code Source Code for Your Modifications.]
----------------------------------------------------------------------
AMENDMENTS
The Netscape Public License Version 1.1 ("NPL") consists of the
Mozilla Public License Version 1.1 with the following Amendments,
including Exhibit A-Netscape Public License. Files identified with
"Exhibit A-Netscape Public License" are governed by the Netscape
Public License Version 1.1.
Additional Terms applicable to the Netscape Public License.
I. Effect.
These additional terms described in this Netscape Public
License -- Amendments shall apply to the Mozilla Communicator
client code and to all Covered Code under this License.
II. "Netscape's Branded Code" means Covered Code that Netscape
distributes and/or permits others to distribute under one or more
trademark(s) which are controlled by Netscape but which are not
licensed for use under this License.
III. Netscape and logo.
This License does not grant any rights to use the trademarks
"Netscape", the "Netscape N and horizon" logo or the "Netscape
lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript",
"Smart Browsing" even if such marks are included in the Original
Code or Modifications.
IV. Inability to Comply Due to Contractual Obligation.
Prior to licensing the Original Code under this License, Netscape
has licensed third party code for use in Netscape's Branded Code.
To the extent that Netscape is limited contractually from making
such third party code available under this License, Netscape may
choose to reintegrate such code into Covered Code without being
required to distribute such code in Source Code form, even if
such code would otherwise be considered "Modifications" under
this License.
V. Use of Modifications and Covered Code by Initial Developer.
V.1. In General.
The obligations of Section 3 apply to Netscape, except to
the extent specified in this Amendment, Section V.2 and V.3.
V.2. Other Products.
Netscape may include Covered Code in products other than the
Netscape's Branded Code which are released by Netscape
during the two (2) years following the release date of the
Original Code, without such additional products becoming
subject to the terms of this License, and may license such
additional products on different terms from those contained
in this License.
V.3. Alternative Licensing.
Netscape may license the Source Code of Netscape's Branded
Code, including Modifications incorporated therein, without
such Netscape Branded Code becoming subject to the terms of
this License, and may license such Netscape Branded Code on
different terms from those contained in this License.
VI. Litigation.
Notwithstanding the limitations of Section 11 above, the
provisions regarding litigation in Section 11(a), (b) and (c) of
the License shall apply to all disputes relating to this License.
EXHIBIT A-Netscape Public License.
"The contents of this file are subject to the Netscape Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/NPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The Original Code is Mozilla Communicator client code, released
March 31, 1998.
The Initial Developer of the Original Code is Netscape
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
Contributor(s): ______________________________________.
Alternatively, the contents of this file may be used under the
terms of the _____ license (the "[___] License"), in which case
the provisions of [______] License are applicable instead of
those above. If you wish to allow use of your version of this
file only under the terms of the [____] License and not to allow
others to use your version of this file under the NPL, indicate
your decision by deleting the provisions above and replace them
with the notice and other provisions required by the [___]
License. If you do not delete the provisions above, a recipient
may use your version of this file under either the NPL or the
[___] License."

View File

@@ -1,2 +0,0 @@
This folder contains Mozilla headers related to plugin development. The original version of the files were taken from Mozilla1.0 tarball.

View File

@@ -1,689 +0,0 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/*******************************************************************************
* Java Runtime Interface
******************************************************************************/
#ifndef JRI_H
#define JRI_H
#include "jritypes.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/*******************************************************************************
* JRIEnv
******************************************************************************/
/* The type of the JRIEnv interface. */
typedef struct JRIEnvInterface JRIEnvInterface;
/* The type of a JRIEnv instance. */
typedef const JRIEnvInterface* JRIEnv;
/*******************************************************************************
* JRIEnv Operations
******************************************************************************/
#define JRI_DefineClass(env, classLoader, buf, bufLen) \
(((*(env))->DefineClass)(env, JRI_DefineClass_op, classLoader, buf, bufLen))
#define JRI_FindClass(env, name) \
(((*(env))->FindClass)(env, JRI_FindClass_op, name))
#define JRI_Throw(env, obj) \
(((*(env))->Throw)(env, JRI_Throw_op, obj))
#define JRI_ThrowNew(env, clazz, message) \
(((*(env))->ThrowNew)(env, JRI_ThrowNew_op, clazz, message))
#define JRI_ExceptionOccurred(env) \
(((*(env))->ExceptionOccurred)(env, JRI_ExceptionOccurred_op))
#define JRI_ExceptionDescribe(env) \
(((*(env))->ExceptionDescribe)(env, JRI_ExceptionDescribe_op))
#define JRI_ExceptionClear(env) \
(((*(env))->ExceptionClear)(env, JRI_ExceptionClear_op))
#define JRI_NewGlobalRef(env, ref) \
(((*(env))->NewGlobalRef)(env, JRI_NewGlobalRef_op, ref))
#define JRI_DisposeGlobalRef(env, gref) \
(((*(env))->DisposeGlobalRef)(env, JRI_DisposeGlobalRef_op, gref))
#define JRI_GetGlobalRef(env, gref) \
(((*(env))->GetGlobalRef)(env, JRI_GetGlobalRef_op, gref))
#define JRI_SetGlobalRef(env, gref, ref) \
(((*(env))->SetGlobalRef)(env, JRI_SetGlobalRef_op, gref, ref))
#define JRI_IsSameObject(env, a, b) \
(((*(env))->IsSameObject)(env, JRI_IsSameObject_op, a, b))
#define JRI_NewObject(env) ((*(env))->NewObject)
#define JRI_NewObjectV(env, clazz, methodID, args) \
(((*(env))->NewObjectV)(env, JRI_NewObject_op_va_list, clazz, methodID, args))
#define JRI_NewObjectA(env, clazz, method, args) \
(((*(env))->NewObjectA)(env, JRI_NewObject_op_array, clazz, methodID, args))
#define JRI_GetObjectClass(env, obj) \
(((*(env))->GetObjectClass)(env, JRI_GetObjectClass_op, obj))
#define JRI_IsInstanceOf(env, obj, clazz) \
(((*(env))->IsInstanceOf)(env, JRI_IsInstanceOf_op, obj, clazz))
#define JRI_GetMethodID(env, clazz, name, sig) \
(((*(env))->GetMethodID)(env, JRI_GetMethodID_op, clazz, name, sig))
#define JRI_CallMethod(env) ((*(env))->CallMethod)
#define JRI_CallMethodV(env, obj, methodID, args) \
(((*(env))->CallMethodV)(env, JRI_CallMethod_op_va_list, obj, methodID, args))
#define JRI_CallMethodA(env, obj, methodID, args) \
(((*(env))->CallMethodA)(env, JRI_CallMethod_op_array, obj, methodID, args))
#define JRI_CallMethodBoolean(env) ((*(env))->CallMethodBoolean)
#define JRI_CallMethodBooleanV(env, obj, methodID, args) \
(((*(env))->CallMethodBooleanV)(env, JRI_CallMethodBoolean_op_va_list, obj, methodID, args))
#define JRI_CallMethodBooleanA(env, obj, methodID, args) \
(((*(env))->CallMethodBooleanA)(env, JRI_CallMethodBoolean_op_array, obj, methodID, args))
#define JRI_CallMethodByte(env) ((*(env))->CallMethodByte)
#define JRI_CallMethodByteV(env, obj, methodID, args) \
(((*(env))->CallMethodByteV)(env, JRI_CallMethodByte_op_va_list, obj, methodID, args))
#define JRI_CallMethodByteA(env, obj, methodID, args) \
(((*(env))->CallMethodByteA)(env, JRI_CallMethodByte_op_array, obj, methodID, args))
#define JRI_CallMethodChar(env) ((*(env))->CallMethodChar)
#define JRI_CallMethodCharV(env, obj, methodID, args) \
(((*(env))->CallMethodCharV)(env, JRI_CallMethodChar_op_va_list, obj, methodID, args))
#define JRI_CallMethodCharA(env, obj, methodID, args) \
(((*(env))->CallMethodCharA)(env, JRI_CallMethodChar_op_array, obj, methodID, args))
#define JRI_CallMethodShort(env) ((*(env))->CallMethodShort)
#define JRI_CallMethodShortV(env, obj, methodID, args) \
(((*(env))->CallMethodShortV)(env, JRI_CallMethodShort_op_va_list, obj, methodID, args))
#define JRI_CallMethodShortA(env, obj, methodID, args) \
(((*(env))->CallMethodShortA)(env, JRI_CallMethodShort_op_array, obj, methodID, args))
#define JRI_CallMethodInt(env) ((*(env))->CallMethodInt)
#define JRI_CallMethodIntV(env, obj, methodID, args) \
(((*(env))->CallMethodIntV)(env, JRI_CallMethodInt_op_va_list, obj, methodID, args))
#define JRI_CallMethodIntA(env, obj, methodID, args) \
(((*(env))->CallMethodIntA)(env, JRI_CallMethodInt_op_array, obj, methodID, args))
#define JRI_CallMethodLong(env) ((*(env))->CallMethodLong)
#define JRI_CallMethodLongV(env, obj, methodID, args) \
(((*(env))->CallMethodLongV)(env, JRI_CallMethodLong_op_va_list, obj, methodID, args))
#define JRI_CallMethodLongA(env, obj, methodID, args) \
(((*(env))->CallMethodLongA)(env, JRI_CallMethodLong_op_array, obj, methodID, args))
#define JRI_CallMethodFloat(env) ((*(env))->CallMethodFloat)
#define JRI_CallMethodFloatV(env, obj, methodID, args) \
(((*(env))->CallMethodFloatV)(env, JRI_CallMethodFloat_op_va_list, obj, methodID, args))
#define JRI_CallMethodFloatA(env, obj, methodID, args) \
(((*(env))->CallMethodFloatA)(env, JRI_CallMethodFloat_op_array, obj, methodID, args))
#define JRI_CallMethodDouble(env) ((*(env))->CallMethodDouble)
#define JRI_CallMethodDoubleV(env, obj, methodID, args) \
(((*(env))->CallMethodDoubleV)(env, JRI_CallMethodDouble_op_va_list, obj, methodID, args))
#define JRI_CallMethodDoubleA(env, obj, methodID, args) \
(((*(env))->CallMethodDoubleA)(env, JRI_CallMethodDouble_op_array, obj, methodID, args))
#define JRI_GetFieldID(env, clazz, name, sig) \
(((*(env))->GetFieldID)(env, JRI_GetFieldID_op, clazz, name, sig))
#define JRI_GetField(env, obj, fieldID) \
(((*(env))->GetField)(env, JRI_GetField_op, obj, fieldID))
#define JRI_GetFieldBoolean(env, obj, fieldID) \
(((*(env))->GetFieldBoolean)(env, JRI_GetFieldBoolean_op, obj, fieldID))
#define JRI_GetFieldByte(env, obj, fieldID) \
(((*(env))->GetFieldByte)(env, JRI_GetFieldByte_op, obj, fieldID))
#define JRI_GetFieldChar(env, obj, fieldID) \
(((*(env))->GetFieldChar)(env, JRI_GetFieldChar_op, obj, fieldID))
#define JRI_GetFieldShort(env, obj, fieldID) \
(((*(env))->GetFieldShort)(env, JRI_GetFieldShort_op, obj, fieldID))
#define JRI_GetFieldInt(env, obj, fieldID) \
(((*(env))->GetFieldInt)(env, JRI_GetFieldInt_op, obj, fieldID))
#define JRI_GetFieldLong(env, obj, fieldID) \
(((*(env))->GetFieldLong)(env, JRI_GetFieldLong_op, obj, fieldID))
#define JRI_GetFieldFloat(env, obj, fieldID) \
(((*(env))->GetFieldFloat)(env, JRI_GetFieldFloat_op, obj, fieldID))
#define JRI_GetFieldDouble(env, obj, fieldID) \
(((*(env))->GetFieldDouble)(env, JRI_GetFieldDouble_op, obj, fieldID))
#define JRI_SetField(env, obj, fieldID, value) \
(((*(env))->SetField)(env, JRI_SetField_op, obj, fieldID, value))
#define JRI_SetFieldBoolean(env, obj, fieldID, value) \
(((*(env))->SetFieldBoolean)(env, JRI_SetFieldBoolean_op, obj, fieldID, value))
#define JRI_SetFieldByte(env, obj, fieldID, value) \
(((*(env))->SetFieldByte)(env, JRI_SetFieldByte_op, obj, fieldID, value))
#define JRI_SetFieldChar(env, obj, fieldID, value) \
(((*(env))->SetFieldChar)(env, JRI_SetFieldChar_op, obj, fieldID, value))
#define JRI_SetFieldShort(env, obj, fieldID, value) \
(((*(env))->SetFieldShort)(env, JRI_SetFieldShort_op, obj, fieldID, value))
#define JRI_SetFieldInt(env, obj, fieldID, value) \
(((*(env))->SetFieldInt)(env, JRI_SetFieldInt_op, obj, fieldID, value))
#define JRI_SetFieldLong(env, obj, fieldID, value) \
(((*(env))->SetFieldLong)(env, JRI_SetFieldLong_op, obj, fieldID, value))
#define JRI_SetFieldFloat(env, obj, fieldID, value) \
(((*(env))->SetFieldFloat)(env, JRI_SetFieldFloat_op, obj, fieldID, value))
#define JRI_SetFieldDouble(env, obj, fieldID, value) \
(((*(env))->SetFieldDouble)(env, JRI_SetFieldDouble_op, obj, fieldID, value))
#define JRI_IsSubclassOf(env, a, b) \
(((*(env))->IsSubclassOf)(env, JRI_IsSubclassOf_op, a, b))
#define JRI_GetStaticMethodID(env, clazz, name, sig) \
(((*(env))->GetStaticMethodID)(env, JRI_GetStaticMethodID_op, clazz, name, sig))
#define JRI_CallStaticMethod(env) ((*(env))->CallStaticMethod)
#define JRI_CallStaticMethodV(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodV)(env, JRI_CallStaticMethod_op_va_list, clazz, methodID, args))
#define JRI_CallStaticMethodA(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodA)(env, JRI_CallStaticMethod_op_array, clazz, methodID, args))
#define JRI_CallStaticMethodBoolean(env) ((*(env))->CallStaticMethodBoolean)
#define JRI_CallStaticMethodBooleanV(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodBooleanV)(env, JRI_CallStaticMethodBoolean_op_va_list, clazz, methodID, args))
#define JRI_CallStaticMethodBooleanA(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodBooleanA)(env, JRI_CallStaticMethodBoolean_op_array, clazz, methodID, args))
#define JRI_CallStaticMethodByte(env) ((*(env))->CallStaticMethodByte)
#define JRI_CallStaticMethodByteV(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodByteV)(env, JRI_CallStaticMethodByte_op_va_list, clazz, methodID, args))
#define JRI_CallStaticMethodByteA(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodByteA)(env, JRI_CallStaticMethodByte_op_array, clazz, methodID, args))
#define JRI_CallStaticMethodChar(env) ((*(env))->CallStaticMethodChar)
#define JRI_CallStaticMethodCharV(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodCharV)(env, JRI_CallStaticMethodChar_op_va_list, clazz, methodID, args))
#define JRI_CallStaticMethodCharA(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodCharA)(env, JRI_CallStaticMethodChar_op_array, clazz, methodID, args))
#define JRI_CallStaticMethodShort(env) ((*(env))->CallStaticMethodShort)
#define JRI_CallStaticMethodShortV(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodShortV)(env, JRI_CallStaticMethodShort_op_va_list, clazz, methodID, args))
#define JRI_CallStaticMethodShortA(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodShortA)(env, JRI_CallStaticMethodShort_op_array, clazz, methodID, args))
#define JRI_CallStaticMethodInt(env) ((*(env))->CallStaticMethodInt)
#define JRI_CallStaticMethodIntV(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodIntV)(env, JRI_CallStaticMethodInt_op_va_list, clazz, methodID, args))
#define JRI_CallStaticMethodIntA(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodIntA)(env, JRI_CallStaticMethodInt_op_array, clazz, methodID, args))
#define JRI_CallStaticMethodLong(env) ((*(env))->CallStaticMethodLong)
#define JRI_CallStaticMethodLongV(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodLongV)(env, JRI_CallStaticMethodLong_op_va_list, clazz, methodID, args))
#define JRI_CallStaticMethodLongA(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodLongA)(env, JRI_CallStaticMethodLong_op_array, clazz, methodID, args))
#define JRI_CallStaticMethodFloat(env) ((*(env))->CallStaticMethodFloat)
#define JRI_CallStaticMethodFloatV(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodFloatV)(env, JRI_CallStaticMethodFloat_op_va_list, clazz, methodID, args))
#define JRI_CallStaticMethodFloatA(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodFloatA)(env, JRI_CallStaticMethodFloat_op_array, clazz, methodID, args))
#define JRI_CallStaticMethodDouble(env) ((*(env))->CallStaticMethodDouble)
#define JRI_CallStaticMethodDoubleV(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodDoubleV)(env, JRI_CallStaticMethodDouble_op_va_list, clazz, methodID, args))
#define JRI_CallStaticMethodDoubleA(env, clazz, methodID, args) \
(((*(env))->CallStaticMethodDoubleA)(env, JRI_CallStaticMethodDouble_op_array, clazz, methodID, args))
#define JRI_GetStaticFieldID(env, clazz, name, sig) \
(((*(env))->GetStaticFieldID)(env, JRI_GetStaticFieldID_op, clazz, name, sig))
#define JRI_GetStaticField(env, clazz, fieldID) \
(((*(env))->GetStaticField)(env, JRI_GetStaticField_op, clazz, fieldID))
#define JRI_GetStaticFieldBoolean(env, clazz, fieldID) \
(((*(env))->GetStaticFieldBoolean)(env, JRI_GetStaticFieldBoolean_op, clazz, fieldID))
#define JRI_GetStaticFieldByte(env, clazz, fieldID) \
(((*(env))->GetStaticFieldByte)(env, JRI_GetStaticFieldByte_op, clazz, fieldID))
#define JRI_GetStaticFieldChar(env, clazz, fieldID) \
(((*(env))->GetStaticFieldChar)(env, JRI_GetStaticFieldChar_op, clazz, fieldID))
#define JRI_GetStaticFieldShort(env, clazz, fieldID) \
(((*(env))->GetStaticFieldShort)(env, JRI_GetStaticFieldShort_op, clazz, fieldID))
#define JRI_GetStaticFieldInt(env, clazz, fieldID) \
(((*(env))->GetStaticFieldInt)(env, JRI_GetStaticFieldInt_op, clazz, fieldID))
#define JRI_GetStaticFieldLong(env, clazz, fieldID) \
(((*(env))->GetStaticFieldLong)(env, JRI_GetStaticFieldLong_op, clazz, fieldID))
#define JRI_GetStaticFieldFloat(env, clazz, fieldID) \
(((*(env))->GetStaticFieldFloat)(env, JRI_GetStaticFieldFloat_op, clazz, fieldID))
#define JRI_GetStaticFieldDouble(env, clazz, fieldID) \
(((*(env))->GetStaticFieldDouble)(env, JRI_GetStaticFieldDouble_op, clazz, fieldID))
#define JRI_SetStaticField(env, clazz, fieldID, value) \
(((*(env))->SetStaticField)(env, JRI_SetStaticField_op, clazz, fieldID, value))
#define JRI_SetStaticFieldBoolean(env, clazz, fieldID, value) \
(((*(env))->SetStaticFieldBoolean)(env, JRI_SetStaticFieldBoolean_op, clazz, fieldID, value))
#define JRI_SetStaticFieldByte(env, clazz, fieldID, value) \
(((*(env))->SetStaticFieldByte)(env, JRI_SetStaticFieldByte_op, clazz, fieldID, value))
#define JRI_SetStaticFieldChar(env, clazz, fieldID, value) \
(((*(env))->SetStaticFieldChar)(env, JRI_SetStaticFieldChar_op, clazz, fieldID, value))
#define JRI_SetStaticFieldShort(env, clazz, fieldID, value) \
(((*(env))->SetStaticFieldShort)(env, JRI_SetStaticFieldShort_op, clazz, fieldID, value))
#define JRI_SetStaticFieldInt(env, clazz, fieldID, value) \
(((*(env))->SetStaticFieldInt)(env, JRI_SetStaticFieldInt_op, clazz, fieldID, value))
#define JRI_SetStaticFieldLong(env, clazz, fieldID, value) \
(((*(env))->SetStaticFieldLong)(env, JRI_SetStaticFieldLong_op, clazz, fieldID, value))
#define JRI_SetStaticFieldFloat(env, clazz, fieldID, value) \
(((*(env))->SetStaticFieldFloat)(env, JRI_SetStaticFieldFloat_op, clazz, fieldID, value))
#define JRI_SetStaticFieldDouble(env, clazz, fieldID, value) \
(((*(env))->SetStaticFieldDouble)(env, JRI_SetStaticFieldDouble_op, clazz, fieldID, value))
#define JRI_NewString(env, unicode, len) \
(((*(env))->NewString)(env, JRI_NewString_op, unicode, len))
#define JRI_GetStringLength(env, string) \
(((*(env))->GetStringLength)(env, JRI_GetStringLength_op, string))
#define JRI_GetStringChars(env, string) \
(((*(env))->GetStringChars)(env, JRI_GetStringChars_op, string))
#define JRI_NewStringUTF(env, utf, len) \
(((*(env))->NewStringUTF)(env, JRI_NewStringUTF_op, utf, len))
#define JRI_GetStringUTFLength(env, string) \
(((*(env))->GetStringUTFLength)(env, JRI_GetStringUTFLength_op, string))
#define JRI_GetStringUTFChars(env, string) \
(((*(env))->GetStringUTFChars)(env, JRI_GetStringUTFChars_op, string))
#define JRI_NewScalarArray(env, length, elementSig, initialElements) \
(((*(env))->NewScalarArray)(env, JRI_NewScalarArray_op, length, elementSig, initialElements))
#define JRI_GetScalarArrayLength(env, array) \
(((*(env))->GetScalarArrayLength)(env, JRI_GetScalarArrayLength_op, array))
#define JRI_GetScalarArrayElements(env, array) \
(((*(env))->GetScalarArrayElements)(env, JRI_GetScalarArrayElements_op, array))
#define JRI_NewObjectArray(env, length, elementClass, initialElement) \
(((*(env))->NewObjectArray)(env, JRI_NewObjectArray_op, length, elementClass, initialElement))
#define JRI_GetObjectArrayLength(env, array) \
(((*(env))->GetObjectArrayLength)(env, JRI_GetObjectArrayLength_op, array))
#define JRI_GetObjectArrayElement(env, array, index) \
(((*(env))->GetObjectArrayElement)(env, JRI_GetObjectArrayElement_op, array, index))
#define JRI_SetObjectArrayElement(env, array, index, value) \
(((*(env))->SetObjectArrayElement)(env, JRI_SetObjectArrayElement_op, array, index, value))
#define JRI_RegisterNatives(env, clazz, nameAndSigArray, nativeProcArray) \
(((*(env))->RegisterNatives)(env, JRI_RegisterNatives_op, clazz, nameAndSigArray, nativeProcArray))
#define JRI_UnregisterNatives(env, clazz) \
(((*(env))->UnregisterNatives)(env, JRI_UnregisterNatives_op, clazz))
#define JRI_NewStringPlatform(env, string, len, encoding, encodingLength) \
(((*(env))->NewStringPlatform)(env, JRI_NewStringPlatform_op, string, len, encoding, encodingLength))
#define JRI_GetStringPlatformChars(env, string, encoding, encodingLength) \
(((*(env))->GetStringPlatformChars)(env, JRI_GetStringPlatformChars_op, string, encoding, encodingLength))
/*******************************************************************************
* JRIEnv Interface
******************************************************************************/
struct java_lang_ClassLoader;
struct java_lang_Class;
struct java_lang_Throwable;
struct java_lang_Object;
struct java_lang_String;
struct JRIEnvInterface {
void* reserved0;
void* reserved1;
void* reserved2;
void* reserved3;
struct java_lang_Class* (*FindClass)(JRIEnv* env, jint op, const char* a);
void (*Throw)(JRIEnv* env, jint op, struct java_lang_Throwable* a);
void (*ThrowNew)(JRIEnv* env, jint op, struct java_lang_Class* a, const char* b);
struct java_lang_Throwable* (*ExceptionOccurred)(JRIEnv* env, jint op);
void (*ExceptionDescribe)(JRIEnv* env, jint op);
void (*ExceptionClear)(JRIEnv* env, jint op);
jglobal (*NewGlobalRef)(JRIEnv* env, jint op, void* a);
void (*DisposeGlobalRef)(JRIEnv* env, jint op, jglobal a);
void* (*GetGlobalRef)(JRIEnv* env, jint op, jglobal a);
void (*SetGlobalRef)(JRIEnv* env, jint op, jglobal a, void* b);
jbool (*IsSameObject)(JRIEnv* env, jint op, void* a, void* b);
void* (*NewObject)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, ...);
void* (*NewObjectV)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, va_list c);
void* (*NewObjectA)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, JRIValue* c);
struct java_lang_Class* (*GetObjectClass)(JRIEnv* env, jint op, void* a);
jbool (*IsInstanceOf)(JRIEnv* env, jint op, void* a, struct java_lang_Class* b);
jint (*GetMethodID)(JRIEnv* env, jint op, struct java_lang_Class* a, const char* b, const char* c);
void* (*CallMethod)(JRIEnv* env, jint op, void* a, jint b, ...);
void* (*CallMethodV)(JRIEnv* env, jint op, void* a, jint b, va_list c);
void* (*CallMethodA)(JRIEnv* env, jint op, void* a, jint b, JRIValue* c);
jbool (*CallMethodBoolean)(JRIEnv* env, jint op, void* a, jint b, ...);
jbool (*CallMethodBooleanV)(JRIEnv* env, jint op, void* a, jint b, va_list c);
jbool (*CallMethodBooleanA)(JRIEnv* env, jint op, void* a, jint b, JRIValue* c);
jbyte (*CallMethodByte)(JRIEnv* env, jint op, void* a, jint b, ...);
jbyte (*CallMethodByteV)(JRIEnv* env, jint op, void* a, jint b, va_list c);
jbyte (*CallMethodByteA)(JRIEnv* env, jint op, void* a, jint b, JRIValue* c);
jchar (*CallMethodChar)(JRIEnv* env, jint op, void* a, jint b, ...);
jchar (*CallMethodCharV)(JRIEnv* env, jint op, void* a, jint b, va_list c);
jchar (*CallMethodCharA)(JRIEnv* env, jint op, void* a, jint b, JRIValue* c);
jshort (*CallMethodShort)(JRIEnv* env, jint op, void* a, jint b, ...);
jshort (*CallMethodShortV)(JRIEnv* env, jint op, void* a, jint b, va_list c);
jshort (*CallMethodShortA)(JRIEnv* env, jint op, void* a, jint b, JRIValue* c);
jint (*CallMethodInt)(JRIEnv* env, jint op, void* a, jint b, ...);
jint (*CallMethodIntV)(JRIEnv* env, jint op, void* a, jint b, va_list c);
jint (*CallMethodIntA)(JRIEnv* env, jint op, void* a, jint b, JRIValue* c);
jlong (*CallMethodLong)(JRIEnv* env, jint op, void* a, jint b, ...);
jlong (*CallMethodLongV)(JRIEnv* env, jint op, void* a, jint b, va_list c);
jlong (*CallMethodLongA)(JRIEnv* env, jint op, void* a, jint b, JRIValue* c);
jfloat (*CallMethodFloat)(JRIEnv* env, jint op, void* a, jint b, ...);
jfloat (*CallMethodFloatV)(JRIEnv* env, jint op, void* a, jint b, va_list c);
jfloat (*CallMethodFloatA)(JRIEnv* env, jint op, void* a, jint b, JRIValue* c);
jdouble (*CallMethodDouble)(JRIEnv* env, jint op, void* a, jint b, ...);
jdouble (*CallMethodDoubleV)(JRIEnv* env, jint op, void* a, jint b, va_list c);
jdouble (*CallMethodDoubleA)(JRIEnv* env, jint op, void* a, jint b, JRIValue* c);
jint (*GetFieldID)(JRIEnv* env, jint op, struct java_lang_Class* a, const char* b, const char* c);
void* (*GetField)(JRIEnv* env, jint op, void* a, jint b);
jbool (*GetFieldBoolean)(JRIEnv* env, jint op, void* a, jint b);
jbyte (*GetFieldByte)(JRIEnv* env, jint op, void* a, jint b);
jchar (*GetFieldChar)(JRIEnv* env, jint op, void* a, jint b);
jshort (*GetFieldShort)(JRIEnv* env, jint op, void* a, jint b);
jint (*GetFieldInt)(JRIEnv* env, jint op, void* a, jint b);
jlong (*GetFieldLong)(JRIEnv* env, jint op, void* a, jint b);
jfloat (*GetFieldFloat)(JRIEnv* env, jint op, void* a, jint b);
jdouble (*GetFieldDouble)(JRIEnv* env, jint op, void* a, jint b);
void (*SetField)(JRIEnv* env, jint op, void* a, jint b, void* c);
void (*SetFieldBoolean)(JRIEnv* env, jint op, void* a, jint b, jbool c);
void (*SetFieldByte)(JRIEnv* env, jint op, void* a, jint b, jbyte c);
void (*SetFieldChar)(JRIEnv* env, jint op, void* a, jint b, jchar c);
void (*SetFieldShort)(JRIEnv* env, jint op, void* a, jint b, jshort c);
void (*SetFieldInt)(JRIEnv* env, jint op, void* a, jint b, jint c);
void (*SetFieldLong)(JRIEnv* env, jint op, void* a, jint b, jlong c);
void (*SetFieldFloat)(JRIEnv* env, jint op, void* a, jint b, jfloat c);
void (*SetFieldDouble)(JRIEnv* env, jint op, void* a, jint b, jdouble c);
jbool (*IsSubclassOf)(JRIEnv* env, jint op, struct java_lang_Class* a, struct java_lang_Class* b);
jint (*GetStaticMethodID)(JRIEnv* env, jint op, struct java_lang_Class* a, const char* b, const char* c);
void* (*CallStaticMethod)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, ...);
void* (*CallStaticMethodV)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, va_list c);
void* (*CallStaticMethodA)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, JRIValue* c);
jbool (*CallStaticMethodBoolean)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, ...);
jbool (*CallStaticMethodBooleanV)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, va_list c);
jbool (*CallStaticMethodBooleanA)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, JRIValue* c);
jbyte (*CallStaticMethodByte)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, ...);
jbyte (*CallStaticMethodByteV)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, va_list c);
jbyte (*CallStaticMethodByteA)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, JRIValue* c);
jchar (*CallStaticMethodChar)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, ...);
jchar (*CallStaticMethodCharV)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, va_list c);
jchar (*CallStaticMethodCharA)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, JRIValue* c);
jshort (*CallStaticMethodShort)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, ...);
jshort (*CallStaticMethodShortV)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, va_list c);
jshort (*CallStaticMethodShortA)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, JRIValue* c);
jint (*CallStaticMethodInt)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, ...);
jint (*CallStaticMethodIntV)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, va_list c);
jint (*CallStaticMethodIntA)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, JRIValue* c);
jlong (*CallStaticMethodLong)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, ...);
jlong (*CallStaticMethodLongV)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, va_list c);
jlong (*CallStaticMethodLongA)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, JRIValue* c);
jfloat (*CallStaticMethodFloat)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, ...);
jfloat (*CallStaticMethodFloatV)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, va_list c);
jfloat (*CallStaticMethodFloatA)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, JRIValue* c);
jdouble (*CallStaticMethodDouble)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, ...);
jdouble (*CallStaticMethodDoubleV)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, va_list c);
jdouble (*CallStaticMethodDoubleA)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, JRIValue* c);
jint (*GetStaticFieldID)(JRIEnv* env, jint op, struct java_lang_Class* a, const char* b, const char* c);
void* (*GetStaticField)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b);
jbool (*GetStaticFieldBoolean)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b);
jbyte (*GetStaticFieldByte)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b);
jchar (*GetStaticFieldChar)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b);
jshort (*GetStaticFieldShort)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b);
jint (*GetStaticFieldInt)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b);
jlong (*GetStaticFieldLong)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b);
jfloat (*GetStaticFieldFloat)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b);
jdouble (*GetStaticFieldDouble)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b);
void (*SetStaticField)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, void* c);
void (*SetStaticFieldBoolean)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, jbool c);
void (*SetStaticFieldByte)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, jbyte c);
void (*SetStaticFieldChar)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, jchar c);
void (*SetStaticFieldShort)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, jshort c);
void (*SetStaticFieldInt)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, jint c);
void (*SetStaticFieldLong)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, jlong c);
void (*SetStaticFieldFloat)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, jfloat c);
void (*SetStaticFieldDouble)(JRIEnv* env, jint op, struct java_lang_Class* a, jint b, jdouble c);
struct java_lang_String* (*NewString)(JRIEnv* env, jint op, const jchar* a, jint b);
jint (*GetStringLength)(JRIEnv* env, jint op, struct java_lang_String* a);
const jchar* (*GetStringChars)(JRIEnv* env, jint op, struct java_lang_String* a);
struct java_lang_String* (*NewStringUTF)(JRIEnv* env, jint op, const jbyte* a, jint b);
jint (*GetStringUTFLength)(JRIEnv* env, jint op, struct java_lang_String* a);
const jbyte* (*GetStringUTFChars)(JRIEnv* env, jint op, struct java_lang_String* a);
void* (*NewScalarArray)(JRIEnv* env, jint op, jint a, const char* b, const jbyte* c);
jint (*GetScalarArrayLength)(JRIEnv* env, jint op, void* a);
jbyte* (*GetScalarArrayElements)(JRIEnv* env, jint op, void* a);
void* (*NewObjectArray)(JRIEnv* env, jint op, jint a, struct java_lang_Class* b, void* c);
jint (*GetObjectArrayLength)(JRIEnv* env, jint op, void* a);
void* (*GetObjectArrayElement)(JRIEnv* env, jint op, void* a, jint b);
void (*SetObjectArrayElement)(JRIEnv* env, jint op, void* a, jint b, void* c);
void (*RegisterNatives)(JRIEnv* env, jint op, struct java_lang_Class* a, char** b, void** c);
void (*UnregisterNatives)(JRIEnv* env, jint op, struct java_lang_Class* a);
struct java_lang_Class* (*DefineClass)(JRIEnv* env, jint op, struct java_lang_ClassLoader* a, jbyte* b, jsize bLen);
struct java_lang_String* (*NewStringPlatform)(JRIEnv* env, jint op, const jbyte* a, jint b, const jbyte* c, jint d);
const jbyte* (*GetStringPlatformChars)(JRIEnv* env, jint op, struct java_lang_String* a, const jbyte* b, jint c);
};
/*
** ****************************************************************************
** JRIEnv Operation IDs
** ***************************************************************************
*/
typedef enum JRIEnvOperations {
JRI_Reserved0_op,
JRI_Reserved1_op,
JRI_Reserved2_op,
JRI_Reserved3_op,
JRI_FindClass_op,
JRI_Throw_op,
JRI_ThrowNew_op,
JRI_ExceptionOccurred_op,
JRI_ExceptionDescribe_op,
JRI_ExceptionClear_op,
JRI_NewGlobalRef_op,
JRI_DisposeGlobalRef_op,
JRI_GetGlobalRef_op,
JRI_SetGlobalRef_op,
JRI_IsSameObject_op,
JRI_NewObject_op,
JRI_NewObject_op_va_list,
JRI_NewObject_op_array,
JRI_GetObjectClass_op,
JRI_IsInstanceOf_op,
JRI_GetMethodID_op,
JRI_CallMethod_op,
JRI_CallMethod_op_va_list,
JRI_CallMethod_op_array,
JRI_CallMethodBoolean_op,
JRI_CallMethodBoolean_op_va_list,
JRI_CallMethodBoolean_op_array,
JRI_CallMethodByte_op,
JRI_CallMethodByte_op_va_list,
JRI_CallMethodByte_op_array,
JRI_CallMethodChar_op,
JRI_CallMethodChar_op_va_list,
JRI_CallMethodChar_op_array,
JRI_CallMethodShort_op,
JRI_CallMethodShort_op_va_list,
JRI_CallMethodShort_op_array,
JRI_CallMethodInt_op,
JRI_CallMethodInt_op_va_list,
JRI_CallMethodInt_op_array,
JRI_CallMethodLong_op,
JRI_CallMethodLong_op_va_list,
JRI_CallMethodLong_op_array,
JRI_CallMethodFloat_op,
JRI_CallMethodFloat_op_va_list,
JRI_CallMethodFloat_op_array,
JRI_CallMethodDouble_op,
JRI_CallMethodDouble_op_va_list,
JRI_CallMethodDouble_op_array,
JRI_GetFieldID_op,
JRI_GetField_op,
JRI_GetFieldBoolean_op,
JRI_GetFieldByte_op,
JRI_GetFieldChar_op,
JRI_GetFieldShort_op,
JRI_GetFieldInt_op,
JRI_GetFieldLong_op,
JRI_GetFieldFloat_op,
JRI_GetFieldDouble_op,
JRI_SetField_op,
JRI_SetFieldBoolean_op,
JRI_SetFieldByte_op,
JRI_SetFieldChar_op,
JRI_SetFieldShort_op,
JRI_SetFieldInt_op,
JRI_SetFieldLong_op,
JRI_SetFieldFloat_op,
JRI_SetFieldDouble_op,
JRI_IsSubclassOf_op,
JRI_GetStaticMethodID_op,
JRI_CallStaticMethod_op,
JRI_CallStaticMethod_op_va_list,
JRI_CallStaticMethod_op_array,
JRI_CallStaticMethodBoolean_op,
JRI_CallStaticMethodBoolean_op_va_list,
JRI_CallStaticMethodBoolean_op_array,
JRI_CallStaticMethodByte_op,
JRI_CallStaticMethodByte_op_va_list,
JRI_CallStaticMethodByte_op_array,
JRI_CallStaticMethodChar_op,
JRI_CallStaticMethodChar_op_va_list,
JRI_CallStaticMethodChar_op_array,
JRI_CallStaticMethodShort_op,
JRI_CallStaticMethodShort_op_va_list,
JRI_CallStaticMethodShort_op_array,
JRI_CallStaticMethodInt_op,
JRI_CallStaticMethodInt_op_va_list,
JRI_CallStaticMethodInt_op_array,
JRI_CallStaticMethodLong_op,
JRI_CallStaticMethodLong_op_va_list,
JRI_CallStaticMethodLong_op_array,
JRI_CallStaticMethodFloat_op,
JRI_CallStaticMethodFloat_op_va_list,
JRI_CallStaticMethodFloat_op_array,
JRI_CallStaticMethodDouble_op,
JRI_CallStaticMethodDouble_op_va_list,
JRI_CallStaticMethodDouble_op_array,
JRI_GetStaticFieldID_op,
JRI_GetStaticField_op,
JRI_GetStaticFieldBoolean_op,
JRI_GetStaticFieldByte_op,
JRI_GetStaticFieldChar_op,
JRI_GetStaticFieldShort_op,
JRI_GetStaticFieldInt_op,
JRI_GetStaticFieldLong_op,
JRI_GetStaticFieldFloat_op,
JRI_GetStaticFieldDouble_op,
JRI_SetStaticField_op,
JRI_SetStaticFieldBoolean_op,
JRI_SetStaticFieldByte_op,
JRI_SetStaticFieldChar_op,
JRI_SetStaticFieldShort_op,
JRI_SetStaticFieldInt_op,
JRI_SetStaticFieldLong_op,
JRI_SetStaticFieldFloat_op,
JRI_SetStaticFieldDouble_op,
JRI_NewString_op,
JRI_GetStringLength_op,
JRI_GetStringChars_op,
JRI_NewStringUTF_op,
JRI_GetStringUTFLength_op,
JRI_GetStringUTFChars_op,
JRI_NewScalarArray_op,
JRI_GetScalarArrayLength_op,
JRI_GetScalarArrayElements_op,
JRI_NewObjectArray_op,
JRI_GetObjectArrayLength_op,
JRI_GetObjectArrayElement_op,
JRI_SetObjectArrayElement_op,
JRI_RegisterNatives_op,
JRI_UnregisterNatives_op,
JRI_DefineClass_op,
JRI_NewStringPlatform_op,
JRI_GetStringPlatformChars_op
} JRIEnvOperations;
#ifdef __cplusplus
} /* extern "C" */
#endif /* __cplusplus */
#endif /* JRI_H */
/******************************************************************************/

View File

@@ -1,545 +0,0 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/*******************************************************************************
* Java Runtime Interface - Machine Dependent Types
******************************************************************************/
#ifndef JRI_MD_H
#define JRI_MD_H
#include <assert.h>
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* WHAT'S UP WITH THIS FILE?
*
* This is where we define the mystical JRI_PUBLIC_API macro that works on all
* platforms. If you're running with Visual C++, Symantec C, or Borland's
* development environment on the PC, you're all set. Or if you're on the Mac
* with Metrowerks, Symantec or MPW with SC you're ok too. For UNIX it shouldn't
* matter.
*
* On UNIX though you probably care about a couple of other symbols though:
* IS_LITTLE_ENDIAN must be defined for little-endian systems
* HAVE_LONG_LONG must be defined on systems that have 'long long' integers
* HAVE_ALIGNED_LONGLONGS must be defined if long-longs must be 8 byte aligned
* HAVE_ALIGNED_DOUBLES must be defined if doubles must be 8 byte aligned
* IS_64 must be defined on 64-bit machines (like Dec Alpha)
******************************************************************************/
/* DLL Entry modifiers... */
/* PC */
#if defined(XP_PC) || defined(_WINDOWS) || defined(WIN32) || defined(_WIN32)
# include <windows.h>
# if defined(_MSC_VER) || defined(__MINGW32__)
# if defined(WIN32) || defined(_WIN32)
# define JRI_PUBLIC_API(ResultType) __declspec(dllexport) ResultType
# define JRI_PUBLIC_VAR(VarType) VarType
# define JRI_PUBLIC_VAR_EXP(VarType) __declspec(dllexport) VarType
# define JRI_PUBLIC_VAR_IMP(VarType) __declspec(dllimport) VarType
# define JRI_NATIVE_STUB(ResultType) __declspec(dllexport) ResultType
# define JRI_CALLBACK
# else /* !_WIN32 */
# if defined(_WINDLL)
# define JRI_PUBLIC_API(ResultType) ResultType __cdecl __export __loadds
# define JRI_PUBLIC_VAR(VarType) VarType
# define JRI_PUBLIC_VAR_EXP(VarType) JRI_PUBLIC_VAR(VarType)
# define JRI_PUBLIC_VAR_IMP(VarType) JRI_PUBLIC_VAR(VarType)
# define JRI_NATIVE_STUB(ResultType) ResultType __cdecl __loadds
# define JRI_CALLBACK __loadds
# else /* !WINDLL */
# define JRI_PUBLIC_API(ResultType) ResultType __cdecl __export
# define JRI_PUBLIC_VAR(VarType) VarType
# define JRI_PUBLIC_VAR_EXP(VarType) JRI_PUBLIC_VAR(VarType)
# define JRI_PUBLIC_VAR_IMP(VarType) JRI_PUBLIC_VAR(VarType)
# define JRI_NATIVE_STUB(ResultType) ResultType __cdecl __export
# define JRI_CALLBACK __export
# endif /* !WINDLL */
# endif /* !_WIN32 */
# elif defined(__BORLANDC__)
# if defined(WIN32) || defined(_WIN32)
# define JRI_PUBLIC_API(ResultType) __export ResultType
# define JRI_PUBLIC_VAR(VarType) VarType
# define JRI_PUBLIC_VAR_EXP(VarType) __export VarType
# define JRI_PUBLIC_VAR_IMP(VarType) __import VarType
# define JRI_NATIVE_STUB(ResultType) __export ResultType
# define JRI_CALLBACK
# else /* !_WIN32 */
# define JRI_PUBLIC_API(ResultType) ResultType _cdecl _export _loadds
# define JRI_PUBLIC_VAR(VarType) VarType
# define JRI_PUBLIC_VAR_EXP(VarType) __cdecl __export VarType
# define JRI_PUBLIC_VAR_IMP(VarType) __cdecl __import VarType
# define JRI_NATIVE_STUB(ResultType) ResultType _cdecl _loadds
# define JRI_CALLBACK _loadds
# endif
# else
# error Unsupported PC development environment.
# endif
# ifndef IS_LITTLE_ENDIAN
# define IS_LITTLE_ENDIAN
# endif
/* Mac */
#elif defined (macintosh) || defined(Macintosh) || defined(THINK_C)
# if defined(__MWERKS__) /* Metrowerks */
# if !__option(enumsalwaysint)
# error You need to define 'Enums Always Int' for your project.
# endif
# if defined(TARGET_CPU_68K) && !TARGET_RT_MAC_CFM
# if !__option(fourbyteints)
# error You need to define 'Struct Alignment: 68k' for your project.
# endif
# endif /* !GENERATINGCFM */
# define JRI_PUBLIC_API(ResultType) __declspec(export) ResultType
# define JRI_PUBLIC_VAR(VarType) JRI_PUBLIC_API(VarType)
# define JRI_PUBLIC_VAR_EXP(VarType) JRI_PUBLIC_API(VarType)
# define JRI_PUBLIC_VAR_IMP(VarType) JRI_PUBLIC_API(VarType)
# define JRI_NATIVE_STUB(ResultType) JRI_PUBLIC_API(ResultType)
# elif defined(__SC__) /* Symantec */
# error What are the Symantec defines? (warren@netscape.com)
# elif macintosh && applec /* MPW */
# error Please upgrade to the latest MPW compiler (SC).
# else
# error Unsupported Mac development environment.
# endif
# define JRI_CALLBACK
/* Unix or else */
#else
# define JRI_PUBLIC_API(ResultType) ResultType
# define JRI_PUBLIC_VAR(VarType) VarType
# define JRI_PUBLIC_VAR_EXP(VarType) JRI_PUBLIC_VAR(VarType)
# define JRI_PUBLIC_VAR_IMP(VarType) JRI_PUBLIC_VAR(VarType)
# define JRI_NATIVE_STUB(ResultType) ResultType
# define JRI_CALLBACK
#endif
#ifndef FAR /* for non-Win16 */
#define FAR
#endif
/******************************************************************************/
/* Java Scalar Types */
/* moved from jni.h -- Sun's new jni.h doesn't have this anymore */
#ifdef __cplusplus
typedef class _jobject *jref;
#else
typedef struct _jobject *jref;
#endif
typedef unsigned char jbool;
typedef char jbyte;
typedef short jchar;
typedef short jshort;
#ifdef IS_64 /* XXX ok for alpha, but not right on all 64-bit architectures */
typedef unsigned int juint;
typedef int jint;
#else
typedef unsigned long juint;
typedef long jint;
#endif
typedef float jfloat;
typedef double jdouble;
typedef juint jsize;
/*******************************************************************************
* jlong : long long (64-bit signed integer type) support.
******************************************************************************/
/*
** Bit masking macros. (n must be <= 31 to be portable)
*/
#define JRI_BIT(n) ((juint)1 << (n))
#define JRI_BITMASK(n) (JRI_BIT(n) - 1)
#ifdef HAVE_LONG_LONG
#if (defined(WIN32) || defined(_WIN32))
typedef LONGLONG jlong;
typedef DWORDLONG julong;
#define jlong_MAXINT 0x7fffffffffffffffi64
#define jlong_MININT 0x8000000000000000i64
#define jlong_ZERO 0x0i64
#else
typedef long long jlong;
typedef unsigned long long julong;
#define jlong_MAXINT 0x7fffffffffffffffLL
#define jlong_MININT 0x8000000000000000LL
#define jlong_ZERO 0x0LL
#endif
#define jlong_IS_ZERO(a) ((a) == 0)
#define jlong_EQ(a, b) ((a) == (b))
#define jlong_NE(a, b) ((a) != (b))
#define jlong_GE_ZERO(a) ((a) >= 0)
#define jlong_CMP(a, op, b) ((a) op (b))
#define jlong_AND(r, a, b) ((r) = (a) & (b))
#define jlong_OR(r, a, b) ((r) = (a) | (b))
#define jlong_XOR(r, a, b) ((r) = (a) ^ (b))
#define jlong_OR2(r, a) ((r) = (r) | (a))
#define jlong_NOT(r, a) ((r) = ~(a))
#define jlong_NEG(r, a) ((r) = -(a))
#define jlong_ADD(r, a, b) ((r) = (a) + (b))
#define jlong_SUB(r, a, b) ((r) = (a) - (b))
#define jlong_MUL(r, a, b) ((r) = (a) * (b))
#define jlong_DIV(r, a, b) ((r) = (a) / (b))
#define jlong_MOD(r, a, b) ((r) = (a) % (b))
#define jlong_SHL(r, a, b) ((r) = (a) << (b))
#define jlong_SHR(r, a, b) ((r) = (a) >> (b))
#define jlong_USHR(r, a, b) ((r) = (julong)(a) >> (b))
#define jlong_ISHL(r, a, b) ((r) = ((jlong)(a)) << (b))
#define jlong_L2I(i, l) ((i) = (int)(l))
#define jlong_L2UI(ui, l) ((ui) =(unsigned int)(l))
#define jlong_L2F(f, l) ((f) = (l))
#define jlong_L2D(d, l) ((d) = (l))
#define jlong_I2L(l, i) ((l) = (i))
#define jlong_UI2L(l, ui) ((l) = (ui))
#define jlong_F2L(l, f) ((l) = (f))
#define jlong_D2L(l, d) ((l) = (d))
#define jlong_UDIVMOD(qp, rp, a, b) \
(*(qp) = ((julong)(a) / (b)), \
*(rp) = ((julong)(a) % (b)))
#else /* !HAVE_LONG_LONG */
typedef struct {
#ifdef IS_LITTLE_ENDIAN
juint lo, hi;
#else
juint hi, lo;
#endif
} jlong;
typedef jlong julong;
extern jlong jlong_MAXINT, jlong_MININT, jlong_ZERO;
#define jlong_IS_ZERO(a) (((a).hi == 0) && ((a).lo == 0))
#define jlong_EQ(a, b) (((a).hi == (b).hi) && ((a).lo == (b).lo))
#define jlong_NE(a, b) (((a).hi != (b).hi) || ((a).lo != (b).lo))
#define jlong_GE_ZERO(a) (((a).hi >> 31) == 0)
/*
* NB: jlong_CMP and jlong_UCMP work only for strict relationals (<, >).
*/
#define jlong_CMP(a, op, b) (((int32)(a).hi op (int32)(b).hi) || \
(((a).hi == (b).hi) && ((a).lo op (b).lo)))
#define jlong_UCMP(a, op, b) (((a).hi op (b).hi) || \
(((a).hi == (b).hi) && ((a).lo op (b).lo)))
#define jlong_AND(r, a, b) ((r).lo = (a).lo & (b).lo, \
(r).hi = (a).hi & (b).hi)
#define jlong_OR(r, a, b) ((r).lo = (a).lo | (b).lo, \
(r).hi = (a).hi | (b).hi)
#define jlong_XOR(r, a, b) ((r).lo = (a).lo ^ (b).lo, \
(r).hi = (a).hi ^ (b).hi)
#define jlong_OR2(r, a) ((r).lo = (r).lo | (a).lo, \
(r).hi = (r).hi | (a).hi)
#define jlong_NOT(r, a) ((r).lo = ~(a).lo, \
(r).hi = ~(a).hi)
#define jlong_NEG(r, a) ((r).lo = -(int32)(a).lo, \
(r).hi = -(int32)(a).hi - ((r).lo != 0))
#define jlong_ADD(r, a, b) { \
jlong _a, _b; \
_a = a; _b = b; \
(r).lo = _a.lo + _b.lo; \
(r).hi = _a.hi + _b.hi + ((r).lo < _b.lo); \
}
#define jlong_SUB(r, a, b) { \
jlong _a, _b; \
_a = a; _b = b; \
(r).lo = _a.lo - _b.lo; \
(r).hi = _a.hi - _b.hi - (_a.lo < _b.lo); \
} \
/*
* Multiply 64-bit operands a and b to get 64-bit result r.
* First multiply the low 32 bits of a and b to get a 64-bit result in r.
* Then add the outer and inner products to r.hi.
*/
#define jlong_MUL(r, a, b) { \
jlong _a, _b; \
_a = a; _b = b; \
jlong_MUL32(r, _a.lo, _b.lo); \
(r).hi += _a.hi * _b.lo + _a.lo * _b.hi; \
}
/* XXX _jlong_lo16(a) = ((a) << 16 >> 16) is better on some archs (not on mips) */
#define _jlong_lo16(a) ((a) & JRI_BITMASK(16))
#define _jlong_hi16(a) ((a) >> 16)
/*
* Multiply 32-bit operands a and b to get 64-bit result r.
* Use polynomial expansion based on primitive field element (1 << 16).
*/
#define jlong_MUL32(r, a, b) { \
juint _a1, _a0, _b1, _b0, _y0, _y1, _y2, _y3; \
_a1 = _jlong_hi16(a), _a0 = _jlong_lo16(a); \
_b1 = _jlong_hi16(b), _b0 = _jlong_lo16(b); \
_y0 = _a0 * _b0; \
_y1 = _a0 * _b1; \
_y2 = _a1 * _b0; \
_y3 = _a1 * _b1; \
_y1 += _jlong_hi16(_y0); /* can't carry */ \
_y1 += _y2; /* might carry */ \
if (_y1 < _y2) _y3 += 1 << 16; /* propagate */ \
(r).lo = (_jlong_lo16(_y1) << 16) + _jlong_lo16(_y0); \
(r).hi = _y3 + _jlong_hi16(_y1); \
}
/*
* Divide 64-bit unsigned operand a by 64-bit unsigned operand b, setting *qp
* to the 64-bit unsigned quotient, and *rp to the 64-bit unsigned remainder.
* Minimize effort if one of qp and rp is null.
*/
#define jlong_UDIVMOD(qp, rp, a, b) jlong_udivmod(qp, rp, a, b)
extern JRI_PUBLIC_API(void)
jlong_udivmod(julong *qp, julong *rp, julong a, julong b);
#define jlong_DIV(r, a, b) { \
jlong _a, _b; \
juint _negative = (int32)(a).hi < 0; \
if (_negative) { \
jlong_NEG(_a, a); \
} else { \
_a = a; \
} \
if ((int32)(b).hi < 0) { \
_negative ^= 1; \
jlong_NEG(_b, b); \
} else { \
_b = b; \
} \
jlong_UDIVMOD(&(r), 0, _a, _b); \
if (_negative) \
jlong_NEG(r, r); \
}
#define jlong_MOD(r, a, b) { \
jlong _a, _b; \
juint _negative = (int32)(a).hi < 0; \
if (_negative) { \
jlong_NEG(_a, a); \
} else { \
_a = a; \
} \
if ((int32)(b).hi < 0) { \
jlong_NEG(_b, b); \
} else { \
_b = b; \
} \
jlong_UDIVMOD(0, &(r), _a, _b); \
if (_negative) \
jlong_NEG(r, r); \
}
/*
* NB: b is a juint, not jlong or julong, for the shift ops.
*/
#define jlong_SHL(r, a, b) { \
if (b) { \
jlong _a; \
_a = a; \
if ((b) < 32) { \
(r).lo = _a.lo << (b); \
(r).hi = (_a.hi << (b)) | (_a.lo >> (32 - (b))); \
} else { \
(r).lo = 0; \
(r).hi = _a.lo << ((b) & 31); \
} \
} else { \
(r) = (a); \
} \
}
/* a is an int32, b is int32, r is jlong */
#define jlong_ISHL(r, a, b) { \
if (b) { \
jlong _a; \
_a.lo = (a); \
_a.hi = 0; \
if ((b) < 32) { \
(r).lo = (a) << (b); \
(r).hi = ((a) >> (32 - (b))); \
} else { \
(r).lo = 0; \
(r).hi = (a) << ((b) & 31); \
} \
} else { \
(r).lo = (a); \
(r).hi = 0; \
} \
}
#define jlong_SHR(r, a, b) { \
if (b) { \
jlong _a; \
_a = a; \
if ((b) < 32) { \
(r).lo = (_a.hi << (32 - (b))) | (_a.lo >> (b)); \
(r).hi = (int32)_a.hi >> (b); \
} else { \
(r).lo = (int32)_a.hi >> ((b) & 31); \
(r).hi = (int32)_a.hi >> 31; \
} \
} else { \
(r) = (a); \
} \
}
#define jlong_USHR(r, a, b) { \
if (b) { \
jlong _a; \
_a = a; \
if ((b) < 32) { \
(r).lo = (_a.hi << (32 - (b))) | (_a.lo >> (b)); \
(r).hi = _a.hi >> (b); \
} else { \
(r).lo = _a.hi >> ((b) & 31); \
(r).hi = 0; \
} \
} else { \
(r) = (a); \
} \
}
#define jlong_L2I(i, l) ((i) = (l).lo)
#define jlong_L2UI(ui, l) ((ui) = (l).lo)
#define jlong_L2F(f, l) { double _d; jlong_L2D(_d, l); (f) = (float) _d; }
#define jlong_L2D(d, l) { \
int32 _negative; \
jlong _absval; \
\
_negative = (l).hi >> 31; \
if (_negative) { \
jlong_NEG(_absval, l); \
} else { \
_absval = l; \
} \
(d) = (double)_absval.hi * 4.294967296e9 + _absval.lo; \
if (_negative) \
(d) = -(d); \
}
#define jlong_I2L(l, i) ((l).hi = (i) >> 31, (l).lo = (i))
#define jlong_UI2L(l, ui) ((l).hi = 0, (l).lo = (ui))
#define jlong_F2L(l, f) { double _d = (double) f; jlong_D2L(l, _d); }
#define jlong_D2L(l, d) { \
int _negative; \
double _absval, _d_hi; \
jlong _lo_d; \
\
_negative = ((d) < 0); \
_absval = _negative ? -(d) : (d); \
\
(l).hi = (juint)(_absval / 4.294967296e9); \
(l).lo = 0; \
jlong_L2D(_d_hi, l); \
_absval -= _d_hi; \
_lo_d.hi = 0; \
if (_absval < 0) { \
_lo_d.lo = (juint) -_absval; \
jlong_SUB(l, l, _lo_d); \
} else { \
_lo_d.lo = (juint) _absval; \
jlong_ADD(l, l, _lo_d); \
} \
\
if (_negative) \
jlong_NEG(l, l); \
}
#endif /* !HAVE_LONG_LONG */
/******************************************************************************/
#ifdef HAVE_ALIGNED_LONGLONGS
#define JRI_GET_INT64(_t,_addr) ( ((_t).x[0] = ((jint*)(_addr))[0]), \
((_t).x[1] = ((jint*)(_addr))[1]), \
(_t).l )
#define JRI_SET_INT64(_t, _addr, _v) ( (_t).l = (_v), \
((jint*)(_addr))[0] = (_t).x[0], \
((jint*)(_addr))[1] = (_t).x[1] )
#else
#define JRI_GET_INT64(_t,_addr) (*(jlong*)(_addr))
#define JRI_SET_INT64(_t, _addr, _v) (*(jlong*)(_addr) = (_v))
#endif
/* If double's must be aligned on doubleword boundaries then define this */
#ifdef HAVE_ALIGNED_DOUBLES
#define JRI_GET_DOUBLE(_t,_addr) ( ((_t).x[0] = ((jint*)(_addr))[0]), \
((_t).x[1] = ((jint*)(_addr))[1]), \
(_t).d )
#define JRI_SET_DOUBLE(_t, _addr, _v) ( (_t).d = (_v), \
((jint*)(_addr))[0] = (_t).x[0], \
((jint*)(_addr))[1] = (_t).x[1] )
#else
#define JRI_GET_DOUBLE(_t,_addr) (*(jdouble*)(_addr))
#define JRI_SET_DOUBLE(_t, _addr, _v) (*(jdouble*)(_addr) = (_v))
#endif
/******************************************************************************/
#ifdef __cplusplus
}
#endif
#endif /* JRI_MD_H */
/******************************************************************************/

View File

@@ -1,232 +0,0 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/*******************************************************************************
* Java Runtime Interface
******************************************************************************/
#ifndef JRITYPES_H
#define JRITYPES_H
#include "jri_md.h"
#include <stddef.h>
#include <stdlib.h>
#include <stdarg.h>
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* Types
******************************************************************************/
struct JRIEnvInterface;
typedef void* JRIRef;
typedef void* JRIGlobalRef;
typedef jint JRIFieldID;
typedef jint JRIMethodID;
/* synonyms: */
typedef JRIGlobalRef jglobal;
typedef union JRIValue {
jbool z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong l;
jfloat f;
jdouble d;
jref r;
} JRIValue;
typedef enum JRIBoolean {
JRIFalse = 0,
JRITrue = 1
} JRIBoolean;
typedef enum JRIConstant {
JRIUninitialized = -1
} JRIConstant;
/* convenience types (these must be distinct struct types for c++ overloading): */
typedef struct jstringArrayStruct* jstringArray;
typedef struct jarrayArrayStruct* jarrayArray;
#define JRIConstructorMethodName "<init>"
/*******************************************************************************
* Signature Construction Macros
******************************************************************************/
/*
** These macros can be used to construct signature strings. Hopefully their names
** are a little easier to remember than the single character they correspond to.
** For example, to specify the signature of the method:
**
** public int read(byte b[], int off, int len);
**
** you could write something like this in C:
**
** char* readSig = JRISigMethod(JRISigArray(JRISigByte)
** JRISigInt
** JRISigInt) JRISigInt;
**
** Of course, don't put commas between the types.
*/
#define JRISigArray(T) "[" T
#define JRISigByte "B"
#define JRISigChar "C"
#define JRISigClass(name) "L" name ";"
#define JRISigFloat "F"
#define JRISigDouble "D"
#define JRISigMethod(args) "(" args ")"
#define JRISigNoArgs ""
#define JRISigInt "I"
#define JRISigLong "J"
#define JRISigShort "S"
#define JRISigVoid "V"
#define JRISigBoolean "Z"
/*******************************************************************************
* Environments
******************************************************************************/
extern JRI_PUBLIC_API(const struct JRIEnvInterface**)
JRI_GetCurrentEnv(void);
/*******************************************************************************
* Specific Scalar Array Types
******************************************************************************/
/*
** The JRI Native Method Interface does not support boolean arrays. This
** is to allow Java runtime implementations to optimize boolean array
** storage. Using the ScalarArray operations on boolean arrays is bound
** to fail, so convert any boolean arrays to byte arrays in Java before
** passing them to a native method.
*/
#define JRI_NewByteArray(env, length, initialValues) \
JRI_NewScalarArray(env, length, JRISigByte, (jbyte*)(initialValues))
#define JRI_GetByteArrayLength(env, array) \
JRI_GetScalarArrayLength(env, array)
#define JRI_GetByteArrayElements(env, array) \
JRI_GetScalarArrayElements(env, array)
#define JRI_NewCharArray(env, length, initialValues) \
JRI_NewScalarArray(env, ((length) * sizeof(jchar)), JRISigChar, (jbyte*)(initialValues))
#define JRI_GetCharArrayLength(env, array) \
JRI_GetScalarArrayLength(env, array)
#define JRI_GetCharArrayElements(env, array) \
((jchar*)JRI_GetScalarArrayElements(env, array))
#define JRI_NewShortArray(env, length, initialValues) \
JRI_NewScalarArray(env, ((length) * sizeof(jshort)), JRISigShort, (jbyte*)(initialValues))
#define JRI_GetShortArrayLength(env, array) \
JRI_GetScalarArrayLength(env, array)
#define JRI_GetShortArrayElements(env, array) \
((jshort*)JRI_GetScalarArrayElements(env, array))
#define JRI_NewIntArray(env, length, initialValues) \
JRI_NewScalarArray(env, ((length) * sizeof(jint)), JRISigInt, (jbyte*)(initialValues))
#define JRI_GetIntArrayLength(env, array) \
JRI_GetScalarArrayLength(env, array)
#define JRI_GetIntArrayElements(env, array) \
((jint*)JRI_GetScalarArrayElements(env, array))
#define JRI_NewLongArray(env, length, initialValues) \
JRI_NewScalarArray(env, ((length) * sizeof(jlong)), JRISigLong, (jbyte*)(initialValues))
#define JRI_GetLongArrayLength(env, array) \
JRI_GetScalarArrayLength(env, array)
#define JRI_GetLongArrayElements(env, array) \
((jlong*)JRI_GetScalarArrayElements(env, array))
#define JRI_NewFloatArray(env, length, initialValues) \
JRI_NewScalarArray(env, ((length) * sizeof(jfloat)), JRISigFloat, (jbyte*)(initialValues))
#define JRI_GetFloatArrayLength(env, array) \
JRI_GetScalarArrayLength(env, array)
#define JRI_GetFloatArrayElements(env, array) \
((jfloat*)JRI_GetScalarArrayElements(env, array))
#define JRI_NewDoubleArray(env, length, initialValues) \
JRI_NewScalarArray(env, ((length) * sizeof(jdouble)), JRISigDouble, (jbyte*)(initialValues))
#define JRI_GetDoubleArrayLength(env, array) \
JRI_GetScalarArrayLength(env, array)
#define JRI_GetDoubleArrayElements(env, array) \
((jdouble*)JRI_GetScalarArrayElements(env, array))
/******************************************************************************/
/*
** JDK Stuff -- This stuff is still needed while we're using the JDK
** dynamic linking strategy to call native methods.
*/
typedef union JRI_JDK_stack_item {
/* Non pointer items */
jint i;
jfloat f;
jint o;
/* Pointer items */
void *h;
void *p;
unsigned char *addr;
#ifdef IS_64
double d;
long l; /* == 64bits! */
#endif
} JRI_JDK_stack_item;
typedef union JRI_JDK_Java8Str {
jint x[2];
jdouble d;
jlong l;
void *p;
float f;
} JRI_JDK_Java8;
/******************************************************************************/
#ifdef __cplusplus
}
#endif
#endif /* JRITYPES_H */
/******************************************************************************/

File diff suppressed because it is too large Load Diff

View File

@@ -270,9 +270,6 @@ $(eval $(call gb_UnoApi_add_idlfiles_nohdl,offapi,com/sun/star/packages/manifest
$(eval $(call gb_UnoApi_add_idlfiles_nohdl,offapi,com/sun/star/packages/zip,\
ZipFileAccess \
))
$(eval $(call gb_UnoApi_add_idlfiles_nohdl,offapi,com/sun/star/plugin,\
PluginManager \
))
$(eval $(call gb_UnoApi_add_idlfiles_nohdl,offapi,com/sun/star/presentation,\
SlideShow \
TransitionFactory \
@@ -2898,11 +2895,6 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/mozilla,\
XMenuProxy \
XMenuProxyListener \
XMozillaBootstrap \
XPluginInstance \
XPluginInstanceNotifySink \
XPluginInstancePeer \
XPluginInstanceSyncPeer \
XPluginWindowPeer \
XProfileDiscover \
XProfileManager \
XProxyRunner \
@@ -2932,15 +2924,6 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/packages/zip,\
ZipException \
ZipIOException \
))
$(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/plugin,\
PluginDescription \
PluginException \
PluginMode \
PluginVariable \
XPlugin \
XPluginContext \
XPluginManager \
))
$(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/presentation,\
AnimationEffect \
AnimationSpeed \

View File

@@ -1,109 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_mozilla_XPluginInstance_idl__
#define __com_sun_star_mozilla_XPluginInstance_idl__
#include <com/sun/star/uno/XInterface.idl>
#include <com/sun/star/io/XInputStream.idl>
module com { module sun { module star { module mozilla {
/** Allows to control an office side plugin instance and to communicate with it.
This interface is oriented for communication with browsers plugins.
*/
published interface XPluginInstance: com::sun::star::uno::XInterface
{
/** Starts plugin operation. This is called after a plugin instance is
created.
*/
void start();
/** Stops plugin operation. This is called when the user goes to another web
page. The XPluginInstance::destroy() method is directly called
afterwards.
*/
void stop();
/** Destroy the plugin instance. This method is called when it is no
longer possible to return to the plugin instance, because it was
destroyed by the browser (e.g., window close).
*/
void destroy();
/** Creates a new window for plugin operation.
@param PlatformParentData [in]: platform dependent window data
@param embedded [in]: selects embedded or full page plugin mode
*/
void createWindow( [in] any PlatformParentData, [in] boolean embedded );
/** Notifies the plugin of a new stream to display.
@param MIMEDesc [in]: the MIMEtype of the data stream
@param theURL [in]: the URL that denotes the stream
@param filter [in]: a filter string to suggest a component that should handle the document
@param stream [in]: the data stream
@param sessionData [in]: the data specifying the current session
*/
void newStream(
[in] string MIMEDesc,
[in] string theURL,
[in] string filter,
[in] ::com::sun::star::io::XInputStream stream ,
[in] any sessionData
);
/** Notifies the plugin of a new url to open as document.
@param MIMEDesc [in]: the MIMEtype of the data stream
@param theURL [in]: the URL to be opened
@param filter [in]: a filter string to suggest a component that should handle the document
@param sessionData [in]: the data specifying the current session
*/
void newURL( [in] string MIMEDesc, [in] string theURL, [in] string filter, [in] any sessionData );
/** Retrieves the URL of the HTTP Load balancing Slave.
@param aHost [out]: the full qualified host name of the LBS
@param aPort [out]: the port number
@param aPrefix [out]: the url prefix to the portal
*/
void getHttpServerURL( [out] string aHost, [out] unsigned short aPort,
[out] string aPrefix);
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,49 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_mozilla_XPluginInstanceNotifySink_idl__
#define __com_sun_star_mozilla_XPluginInstanceNotifySink_idl__
#include <com/sun/star/uno/XInterface.idl>
module com { module sun { module star { module mozilla {
/** Allows a plugin to get notification from office side
about status of new document opening.
This interface is oriented for communication with browsers plugins.
*/
published interface XPluginInstanceNotifySink: com::sun::star::uno::XInterface
{
/** Notifies the plugin that a getURL / postURL operation on the
corresponding XPluginInstancePeer was finished.
@param theURL [in]: name of the URL that was used during a previous getURL or postURL call
*/
void notifyURL( [in] string theURL );
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,132 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_mozilla_XPluginInstancePeer_idl__
#define __com_sun_star_mozilla_XPluginInstancePeer_idl__
#include <com/sun/star/uno/XInterface.idl>
#include <com/sun/star/io/XActiveDataSource.idl>
#include <com/sun/star/io/XInputStream.idl>
#include <com/sun/star/lang/XMultiServiceFactory.idl>
module com { module sun { module star { module mozilla {
published interface XPluginInstanceNotifySink;
/** Allows to communicate with a plugin from the office side.
This interface is oriented for communication with browsers plugins.
*/
published interface XPluginInstancePeer: com::sun::star::uno::XInterface
{
/** Alters the plugin's window size in the browser window.
@param width [in]: the new window width
@param height [in]: the new window height
@return <CODE>TRUE</CODE> on success
*/
boolean setWindowSize( [in] long width, [in] long height );
/** Show status / hint message in browser's message area.
@param message [in]: the string to be displayed
*/
void showStatusMessage( [in] string message );
/** Indicates to the plugin that the document was loaded successfully and scripting
interfaces are now available.
@param document [in]: the active document
@param servicemanager [in]: the office servicemanager
*/
void enableScripting( [in] com::sun::star::uno::XInterface document, [in] com::sun::star::lang::XMultiServiceFactory servicemanager );
/** Creates a new stream of data produced by the plug-in and consumed by
the browser.
@param MIMEDesc [in]: the MIME type of the plug-in to create
@param target [in]: the name of the target window or frame (supports _blank, _self)
@param data [in]: on success the output stream will be associated with this instance
*/
void newStream(
[in] string MIMEDesc,
[in] string target,
[in] com::sun::star::io::XActiveDataSource data
);
/** Fetches an URL into the target window. The parameters and their meaning map to the
corresponding Netscape-API call.
@param aURL [in]: the URL to be fetched
@param target [in]: the name of the target window or frame (supports _blank, _self)
@param alternativeHost [in]: alternativeHost
@param referrer [in]: referrer
@param sink [in]: the sink is notified on success
*/
void getURL (
[in] string aURL,
[in] string target,
[in] string alternativeHost,
[in] string referrer,
[in] XPluginInstanceNotifySink sink
);
/** Posts to a URL with post data and/or post headers. The parameters and their meaning
map to the corresponding Netscape-API call.
@param aURL [in]: the URL to be posted to
@param postData [in]: the data to be posted
@param target [in]: the name of the target window or frame (supports _blank, _self)
@param alternativeHost [in]: alternativeHost
@param referrer [in]: referrer
@param postHeaders [in]: the header to be posted
@param sink [in]: the sink is notified on success
*/
void postURL (
[in] string aURL,
[in] com::sun::star::io::XInputStream postData,
[in] string target,
[in] string alternativeHost,
[in] string referrer,
[in] com::sun::star::io::XInputStream postHeaders,
[in] XPluginInstanceNotifySink sink
);
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,54 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_mozilla_XPluginInstanceSyncPeer_idl__
#define __com_sun_star_mozilla_XPluginInstanceSyncPeer_idl__
#include <com/sun/star/uno/XInterface.idl>
#include <com/sun/star/mozilla/XPluginInstance.idl>
module com { module sun { module star { module mozilla {
/** This interface is an extension for XPluginInstancePeer interface.
An object can support this interface in addition to XPluginInstancePeer interface.
*/
published interface XPluginInstanceSyncPeer : com::sun::star::uno::XInterface
{
/** Opens a new browser window with a plugin instance synchronously.
@param aInstance [out]: new plugin instance in case of success
@param aLinkage [out]: linkage to the window data
@param embedded [out]: selects embedded or full page plugin mode
*/
void openNewBrowserWindow(
[out] XPluginInstance aInstance,
[out] any aLinkage,
[out] boolean embedded);
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,46 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_mozilla_XPluginWindowPeer_idl__
#define __com_sun_star_mozilla_XPluginWindowPeer_idl__
#include <com/sun/star/uno/XInterface.idl>
module com { module sun { module star { module mozilla {
/** Allows to notify a plugin from the office side about plugin window's child window creation.
This interface is oriented for communication with browsers plugins.
*/
published interface XPluginWindowPeer: com::sun::star::uno::XInterface
{
/** Notifies the peer of the created child window.
@param SystemWindowData [in]: platform dependent window data
*/
void setChildWindow( [in] any SystemWindowData );
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,47 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_plugin_PluginDescription_idl__
#define __com_sun_star_plugin_PluginDescription_idl__
module com { module sun { module star { module plugin {
/** Describes a specific plugin. If there are multiple mimetypes and/or
extensions, multiple PluginDescriptions will be created.
*/
published struct PluginDescription
{
/** the plugin's name (usually the shared object file name) */
string PluginName;
/** a mimetype for which this plugin should be registered */
string Mimetype;
/** the file extension for files the plugin can handle */
string Extension;
/** text description of the plugin */
string Description;
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,46 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_plugin_PluginException_idl__
#define __com_sun_star_plugin_PluginException_idl__
#include <com/sun/star/uno/Exception.idl>
module com { module sun { module star { module plugin {
/** Indicates that an error occurred in an NPN or NPP function call.
@see XPlugin
@see XPluginContext
@see XPluginManager
*/
published exception PluginException: com::sun::star::uno::Exception
{
/** original Netscape plugin error code */
short ErrorCode;
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,38 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_plugin_PluginManager_idl__
#define __com_sun_star_plugin_PluginManager_idl__
#include <com/sun/star/plugin/XPluginManager.idl>
module com { module sun { module star { module plugin {
/** This service manages all recognized Netscape plugins.
*/
published service PluginManager : XPluginManager;
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,40 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_plugin_PluginMode_idl__
#define __com_sun_star_plugin_PluginMode_idl__
module com { module sun { module star { module plugin {
published constants PluginMode
{
/** embedded into document */
const short EMBED = 1;
/** full size */
const short FULL = 2;
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,48 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_plugin_PluginVariable_idl__
#define __com_sun_star_plugin_PluginVariable_idl__
module com { module sun { module star { module plugin {
/** Describes the possible parameters to XPluginContext::getValue.
It describes what kind of object is requested.
*/
published enum PluginVariable
{
/** XPluginContext::getValue will return the XWindow display pointer of
a display connection (UNIX only)
*/
VxDisplay,
/** XPluginContext::getValue will return the global Xt application context
(UNIX only)
*/
VxtAppContext
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,67 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_plugin_XPlugin_idl__
#define __com_sun_star_plugin_XPlugin_idl__
#include <com/sun/star/uno/XInterface.idl>
#include <com/sun/star/io/XActiveDataSource.idl>
#include <com/sun/star/plugin/PluginException.idl>
module com { module sun { module star { module plugin {
/** This interface allows the container, e.g. document to control the plugin.
*/
published interface XPlugin: com::sun::star::uno::XInterface
{
/** Tells the plugin instance that a new stream is requested.
@param mimetype
mime type of provided data
@param aSource
data source
@param url
url
@param length
number of bytes (if file)
@param lastmodified
time stamp of last modification (if file)
@param isfile
whether data comes from a file
@return true upon success
*/
boolean provideNewStream( [in] string mimetype,
[in] com::sun::star::io::XActiveDataSource aSource,
[in] string url,
[in] long length,
[in] long lastmodified,
[in] boolean isfile )
raises( com::sun::star::plugin::PluginException );
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,177 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_plugin_XPluginContext_idl__
#define __com_sun_star_plugin_XPluginContext_idl__
#include <com/sun/star/uno/XInterface.idl>
#include <com/sun/star/plugin/XPlugin.idl>
#include <com/sun/star/plugin/PluginVariable.idl>
#include <com/sun/star/plugin/PluginException.idl>
#include <com/sun/star/lang/XEventListener.idl>
#include <com/sun/star/io/XActiveDataSource.idl>
module com { module sun { module star { module plugin {
/** Interface receiving calls from a plugin library.
A default context can be created using the PluginManager.
*/
published interface XPluginContext: com::sun::star::uno::XInterface
{
/** Requests global application parameters like display connection
on UNIX systems.
@param xPlugin
plugin
@param aVariable
variable
@return value
*/
string getValue( [in] com::sun::star::plugin::XPlugin xPlugin,
[in] com::sun::star::plugin::PluginVariable aVariable )
raises( com::sun::star::plugin::PluginException );
/** Requests a notification of completion of the operation on an URL.
@param plugin
plugin
@param url
url
@param target
target frame
@param listener
event listener
*/
void getURLNotify( [in] com::sun::star::plugin::XPlugin plugin,
[in] string url,
[in] string target,
[in] com::sun::star::lang::XEventListener listener )
raises( com::sun::star::plugin::PluginException );
/** Requests an URL to be loaded into the frame target.
@param plugin
plugin
@param url
url
@param target
target frame
*/
void getURL( [in] com::sun::star::plugin::XPlugin plugin,
[in] string url,
[in] string target )
raises( com::sun::star::plugin::PluginException );
/** Posts data from a buffer or file to an URL and receives a
notification upon completion.
@param plugin
plugin
@param url
url
@param target
target frame
@param buf
data
@param file
whether data is from file
@param listener
event listener
*/
void postURLNotify( [in] com::sun::star::plugin::XPlugin plugin,
[in] string url,
[in] string target,
[in] sequence<byte> buf,
[in] boolean file,
[in] com::sun::star::lang::XEventListener listener )
raises( com::sun::star::plugin::PluginException );
/** Posts data from a buffer or file to an URL.
@param plugin
plugin
@param url
url
@param target
target frame
@param buf
data
@param file
whether data is from file
*/
void postURL( [in] com::sun::star::plugin::XPlugin plugin,
[in] string url,
[in] string target,
[in] sequence<byte> buf,
[in] boolean file )
raises( com::sun::star::plugin::PluginException );
/** Requests a new stream that is created by the plugin and consumed
by the browser.
@param plugin
plugin
@param mimetype
mime type
@param target
target frame
@param aSource
data source
*/
void newStream( [in] com::sun::star::plugin::XPlugin plugin,
[in] string mimetype,
[in] string target,
[in] com::sun::star::io::XActiveDataSource aSource )
raises( com::sun::star::plugin::PluginException );
/** Displays a message in the browser status line.
@param plugin
plugin
@param message
message
*/
void displayStatusText( [in] com::sun::star::plugin::XPlugin plugin,
[in] string message )
raises( com::sun::star::plugin::PluginException );
/** Returns an application dependent identification string.
This is the same string that is transmitted by a browser to an http server.
@param plugin
plugin
@return id
*/
string getUserAgent( [in] com::sun::star::plugin::XPlugin plugin )
raises( com::sun::star::plugin::PluginException );
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -1,114 +0,0 @@
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_plugin_XPluginManager_idl__
#define __com_sun_star_plugin_XPluginManager_idl__
#include <com/sun/star/uno/XInterface.idl>
#include <com/sun/star/plugin/XPluginContext.idl>
#include <com/sun/star/plugin/PluginDescription.idl>
#include <com/sun/star/plugin/XPlugin.idl>
#include <com/sun/star/plugin/PluginException.idl>
#include <com/sun/star/awt/XToolkit.idl>
#include <com/sun/star/awt/XWindowPeer.idl>
module com { module sun { module star { module plugin {
/** Interface accessing all recognized Netscape plugins.
*/
published interface XPluginManager: com::sun::star::uno::XInterface
{
/** Creates a default context. This context depends on the service
com::sun::star::frame::Desktop.</p>
@return plugin context
*/
com::sun::star::plugin::XPluginContext createPluginContext();
/** Returns the descriptions for all recognized plugins.
@return plugin descriptions
*/
sequence<com::sun::star::plugin::PluginDescription> getPluginDescriptions();
/** Creates a new plugin instance.
@param acontext
plugin context
@param mode
plugin mode
@param argn
argument name list provided to plugin
@param argv
argument value list provided to plugin
@param plugintype
plugin description
@return plugin instance
*/
com::sun::star::plugin::XPlugin createPlugin(
[in] com::sun::star::plugin::XPluginContext acontext,
[in] short mode,
[in] sequence<string> argn,
[in] sequence<string> argv,
[in] com::sun::star::plugin::PluginDescription plugintype )
raises( com::sun::star::plugin::PluginException );
/** Creates a new plugin instance.
@param acontext
plugin context
@param mode
plugin mode
@param argn
argument name list provided to plugin
@param argv
argument value list provided to plugin
@param toolkit
toolkit to be used to get system window handle for plugin
@param parent
parent window
@param url
url
@return plugin instance
*/
com::sun::star::plugin::XPlugin createPluginFromURL(
[in] com::sun::star::plugin::XPluginContext acontext,
[in] short mode,
[in] sequence<string> argn,
[in] sequence<string> argv,
[in] com::sun::star::awt::XToolkit toolkit,
[in] com::sun::star::awt::XWindowPeer parent,
[in] string url );
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -9208,41 +9208,6 @@ module com {
::com::sun::star::mozilla::MozillaProductType getProductType();
string getProfileName();
};
published interface XPluginInstance {
interface ::com::sun::star::uno::XInterface;
void start();
void stop();
void destroy();
void createWindow([in] any PlatformParentData, [in] boolean embedded);
void newStream([in] string MIMEDesc, [in] string theURL, [in] string filter, [in] ::com::sun::star::io::XInputStream stream, [in] any sessionData);
void newURL([in] string MIMEDesc, [in] string theURL, [in] string filter, [in] any sessionData);
void getHttpServerURL([out] string aHost, [out] unsigned short aPort, [out] string aPrefix);
};
published interface XPluginInstanceNotifySink {
interface ::com::sun::star::uno::XInterface;
void notifyURL([in] string theURL);
};
published interface XPluginInstancePeer {
interface ::com::sun::star::uno::XInterface;
boolean setWindowSize([in] long width, [in] long height);
void showStatusMessage([in] string message);
void enableScripting([in] ::com::sun::star::uno::XInterface document, [in] ::com::sun::star::lang::XMultiServiceFactory servicemanager);
void newStream([in] string MIMEDesc, [in] string target, [in] ::com::sun::star::io::XActiveDataSource data);
void getURL([in] string aURL, [in] string target, [in] string alternativeHost, [in] string referrer, [in] ::com::sun::star::mozilla::XPluginInstanceNotifySink sink);
void postURL([in] string aURL, [in] ::com::sun::star::io::XInputStream postData, [in] string target, [in] string alternativeHost, [in] string referrer, [in] ::com::sun::star::io::XInputStream postHeaders, [in] ::com::sun::star::mozilla::XPluginInstanceNotifySink sink);
};
published interface XPluginInstanceSyncPeer {
interface ::com::sun::star::uno::XInterface;
void openNewBrowserWindow([out] ::com::sun::star::mozilla::XPluginInstance aInstance, [out] any aLinkage, [out] boolean embedded);
};
published interface XPluginWindowPeer {
interface ::com::sun::star::uno::XInterface;
void setChildWindow([in] any SystemWindowData);
};
/** @deprecated */ published interface XRemoteServiceManagerProvider {
interface ::com::sun::star::uno::XInterface;
::com::sun::star::lang::XMultiServiceFactory getServiceManager([in] any sessionData);
};
};
module packages {
published service Package {
@@ -9414,50 +9379,6 @@ module com {
};
};
};
module plugin {
published struct PluginDescription {
string PluginName;
string Mimetype;
string Extension;
string Description;
};
published exception PluginException: ::com::sun::star::uno::Exception {
short ErrorCode;
};
published interface XPlugin;
published interface XPluginContext;
published interface XPluginManager {
interface ::com::sun::star::uno::XInterface;
::com::sun::star::plugin::XPluginContext createPluginContext();
sequence< ::com::sun::star::plugin::PluginDescription > getPluginDescriptions();
::com::sun::star::plugin::XPlugin createPlugin([in] ::com::sun::star::plugin::XPluginContext acontext, [in] short mode, [in] sequence< string > argn, [in] sequence< string > argv, [in] ::com::sun::star::plugin::PluginDescription plugintype) raises (::com::sun::star::plugin::PluginException);
::com::sun::star::plugin::XPlugin createPluginFromURL([in] ::com::sun::star::plugin::XPluginContext acontext, [in] short mode, [in] sequence< string > argn, [in] sequence< string > argv, [in] ::com::sun::star::awt::XToolkit toolkit, [in] ::com::sun::star::awt::XWindowPeer parent, [in] string url);
};
published service PluginManager: ::com::sun::star::plugin::XPluginManager;
published constants PluginMode {
const short EMBED = 1;
const short FULL = 2;
};
published enum PluginVariable {
VxDisplay = 0,
VxtAppContext = 1
};
published interface XPlugin {
interface ::com::sun::star::uno::XInterface;
boolean provideNewStream([in] string mimetype, [in] ::com::sun::star::io::XActiveDataSource aSource, [in] string url, [in] long length, [in] long lastmodified, [in] boolean isfile) raises (::com::sun::star::plugin::PluginException);
};
published interface XPluginContext {
interface ::com::sun::star::uno::XInterface;
string getValue([in] ::com::sun::star::plugin::XPlugin xPlugin, [in] ::com::sun::star::plugin::PluginVariable aVariable) raises (::com::sun::star::plugin::PluginException);
void getURLNotify([in] ::com::sun::star::plugin::XPlugin plugin, [in] string url, [in] string target, [in] ::com::sun::star::lang::XEventListener listener) raises (::com::sun::star::plugin::PluginException);
void getURL([in] ::com::sun::star::plugin::XPlugin plugin, [in] string url, [in] string target) raises (::com::sun::star::plugin::PluginException);
void postURLNotify([in] ::com::sun::star::plugin::XPlugin plugin, [in] string url, [in] string target, [in] sequence< byte > buf, [in] boolean file, [in] ::com::sun::star::lang::XEventListener listener) raises (::com::sun::star::plugin::PluginException);
void postURL([in] ::com::sun::star::plugin::XPlugin plugin, [in] string url, [in] string target, [in] sequence< byte > buf, [in] boolean file) raises (::com::sun::star::plugin::PluginException);
void newStream([in] ::com::sun::star::plugin::XPlugin plugin, [in] string mimetype, [in] string target, [in] ::com::sun::star::io::XActiveDataSource aSource) raises (::com::sun::star::plugin::PluginException);
void displayStatusText([in] ::com::sun::star::plugin::XPlugin plugin, [in] string message) raises (::com::sun::star::plugin::PluginException);
string getUserAgent([in] ::com::sun::star::plugin::XPlugin plugin) raises (::com::sun::star::plugin::PluginException);
};
};
module presentation {
published enum AnimationEffect {
NONE = 0,