CWS-TOOLING: integrate CWS fwk92
2008-12-04 14:43:28 +0100 oc r264844 : #i96788# 2008-12-03 02:15:17 +0100 fredrikh r264734 : i96817 2008-12-02 16:42:46 +0100 tbo r264720 : #i96763# changes to password dialog for framework, math, global 2008-11-26 16:26:28 +0100 mav r264418 : #i93617# fix typo 2008-11-26 16:13:03 +0100 mav r264411 : #i93617# fix the linux scenario 2008-11-25 17:58:01 +0100 mav r264323 : #i93617# fix the windows problems 2008-11-25 17:51:33 +0100 mav r264321 : #i93617# fix the windows problems 2008-11-21 16:01:18 +0100 mav r264145 : #i78753# integrate the patch 2008-11-21 14:08:32 +0100 mav r264136 : #i93617# integrate the patch 2008-11-21 13:01:56 +0100 mav r264127 : #i82947# integrate the patch 2008-11-20 18:14:19 +0100 mav r264092 : #i95793# look for import filter 2008-11-18 15:23:44 +0100 pb r263776 : fix: #i92579# #i92583# SvxSecurity/SearchPage: more space for controls 2008-11-18 15:21:39 +0100 pb r263774 : fix: #i92579# #i92583# SvxSecurity/SearchPage: more space for controls 2008-11-18 15:18:54 +0100 pb r263772 : fix: #i92583# SvxSearchPage::InitControls_Impl() added 2008-11-18 15:16:07 +0100 pb r263771 : fix: #i92579# columns calculated newly 2008-11-18 11:09:28 +0100 mav r263751 : #i21923# small fixes 2008-11-17 17:22:04 +0100 mav r263730 : #i21923# integrate the patch 2008-11-17 14:29:02 +0100 mav r263723 : #i21923# integrate the patch 2008-11-13 16:46:08 +0100 mav r263653 : #i88127# integrate the patch 2008-11-13 14:46:56 +0100 mav r263645 : #i54638# integrate the patch 2008-11-11 13:11:03 +0100 pb r263554 : fix: #i93142# disable maRecommReadOnlyCB on read-only documents 2008-11-10 13:30:58 +0100 pb r263516 : fix: #i93833# Mozilla Plug-in -> Browser Plug-in 2008-11-10 13:29:10 +0100 pb r263515 : fix: #i93833# Mozilla Plug-in -> Browser Plug-in 2008-11-10 06:10:11 +0100 pb r263505 : fix: #i94937# now .uno.ExtendedHelp without image 2008-11-04 20:52:50 +0100 mav r263337 : migrate cws fwk92 to svn
This commit is contained in:
parent
e239ccaae9
commit
3d8934c4ed
5 changed files with 235 additions and 272 deletions
|
@ -7,7 +7,7 @@
|
|||
* OpenOffice.org - a multi-platform office productivity suite
|
||||
*
|
||||
* $RCSfile: basdoc.cxx,v $
|
||||
* $Revision: 1.22 $
|
||||
* $Revision: 1.21.22.2 $
|
||||
*
|
||||
* This file is part of OpenOffice.org.
|
||||
*
|
||||
|
@ -126,8 +126,11 @@ void BasicDocShell::FillStatusBar( StatusBar& rStatusBar )
|
|||
|
||||
}
|
||||
|
||||
void BasicDocShell::FillClass( SvGlobalName*, sal_uInt32*, String*, String*, String*, sal_Int32) const
|
||||
{}
|
||||
void BasicDocShell::FillClass( SvGlobalName*, sal_uInt32*, String*, String*, String*, sal_Int32, sal_Bool bTemplate) const
|
||||
{
|
||||
(void)bTemplate;
|
||||
DBG_ASSERT( bTemplate == sal_False, "No template for Basic" );
|
||||
}
|
||||
|
||||
void BasicDocShell::Draw( OutputDevice *, const JobSetup &, USHORT )
|
||||
{}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* OpenOffice.org - a multi-platform office productivity suite
|
||||
*
|
||||
* $RCSfile: basdoc.hxx,v $
|
||||
* $Revision: 1.9 $
|
||||
* $Revision: 1.8.22.2 $
|
||||
*
|
||||
* This file is part of OpenOffice.org.
|
||||
*
|
||||
|
@ -50,7 +50,8 @@ protected:
|
|||
String * pAppName,
|
||||
String * pFullTypeName,
|
||||
String * pShortTypeName,
|
||||
sal_Int32 nVersion ) const;
|
||||
sal_Int32 nVersion,
|
||||
sal_Bool bTemplate = sal_False ) const;
|
||||
|
||||
public:
|
||||
TYPEINFO();
|
||||
|
|
|
@ -69,15 +69,9 @@ using namespace com::sun::star;
|
|||
|
||||
char SoPluginInstance::sSO_Dir[] = {0};
|
||||
Reference< XMultiServiceFactory > SoPluginInstance::mxRemoteMSF = Reference< XMultiServiceFactory >(NULL);
|
||||
Reference< XMultiServiceFactory > SoPluginInstance::mxLocalMSF = Reference< XMultiServiceFactory >(NULL);
|
||||
|
||||
|
||||
extern "C"{
|
||||
sal_Bool restart_office(void);
|
||||
}
|
||||
|
||||
|
||||
SoPluginInstance::SoPluginInstance(long pParent):
|
||||
SoPluginInstance::SoPluginInstance(long pParent, Reference< XMultiServiceFactory > xMSF):
|
||||
m_xUnoWin(NULL),
|
||||
m_xComponent(NULL),
|
||||
m_xFrame(NULL),
|
||||
|
@ -96,134 +90,13 @@ SoPluginInstance::SoPluginInstance(long pParent):
|
|||
m_hParent = 0;
|
||||
m_pParent = pParent;
|
||||
m_dParentStyl = 0;
|
||||
mxRemoteMSF = xMSF;
|
||||
}
|
||||
|
||||
SoPluginInstance::~SoPluginInstance()
|
||||
{
|
||||
}
|
||||
|
||||
// Start listening staroffice and connect to it
|
||||
sal_Bool SoPluginInstance::Connect()
|
||||
{
|
||||
Reference< XComponentContext > xComponentContext;
|
||||
sal_Bool bRetval(sal_False);
|
||||
|
||||
if(mxRemoteMSF.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, remote ServiceManager has been created. no need to create it again.\n");
|
||||
return sal_True;
|
||||
}
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, try to create defaultBootstrap_InitialComponentContext.\n");
|
||||
/*
|
||||
#ifdef UNIX
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, HOME:%s; LANG:%s; LC_ALL:%s; LC_COLLATE:%s; PATH:%s; current dir:%s \n",
|
||||
getenv("HOME"), getenv("LANG"), getenv("LC_ALL"), getenv("LC_COLLATE"), getenv("PATH"), get_current_dir_name());
|
||||
#endif // end of UNIX
|
||||
*/
|
||||
//create local service manager
|
||||
if(!mxLocalMSF.is())
|
||||
{
|
||||
xComponentContext = defaultBootstrap_InitialComponentContext();
|
||||
if (xComponentContext.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, try to create mxLocalMSF.\n");
|
||||
mxLocalMSF = Reference< XMultiServiceFactory >::query(xComponentContext->getServiceManager());
|
||||
bRetval = sal_True;
|
||||
if(!mxLocalMSF.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, create mxLocalMSF failure.\n");
|
||||
return sal_False;
|
||||
}
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, create mxLocalMSF success.\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, try to create mxLocalMSF false.\n");
|
||||
return bRetval;
|
||||
}
|
||||
}
|
||||
|
||||
//then try to connect to the remote StarOffice process
|
||||
bRetval = sal_True;
|
||||
try
|
||||
{
|
||||
const OUString sUnoUrlResolver(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.bridge.UnoUrlResolver"));
|
||||
char para[128] = {0};
|
||||
sprintf(para, "uno:socket,host=localhost,port=%d;urp;StarOffice.ServiceManager", SO_SERVER_PORT);
|
||||
const OUString sResolverArguments(OUString::createFromAscii(para));
|
||||
|
||||
// Create UnoUrlResolver
|
||||
Reference < XInterface > rInterface = mxLocalMSF->createInstance(sUnoUrlResolver);
|
||||
if (!rInterface.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, create sUnoUrlResolver, failure.\n");
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// Create XUnoUrlResolver by querying Interface of UnoUrlResolver
|
||||
Reference < com::sun::star::bridge::XUnoUrlResolver > rResolver(rInterface, UNO_QUERY);
|
||||
if(!rResolver.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, create XUnoUrlResolver, failure.\n");
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// Resolve the arguments
|
||||
rInterface = rResolver->resolve(sResolverArguments);
|
||||
if(!rInterface.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, rResolver->resolve(sResolverArguments), failure\n");
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// Create XPropertySet
|
||||
Reference< ::com::sun::star::beans::XPropertySet > xPropSet( rInterface, UNO_QUERY );
|
||||
if(!xPropSet.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, xPropSet( rInterface, UNO_QUERY ), failure\n");
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// Get remote xComponentContext
|
||||
xPropSet->getPropertyValue( OUString::createFromAscii("DefaultContext") ) >>= xComponentContext;
|
||||
|
||||
// Get the service manager from the remote context
|
||||
mxRemoteMSF = Reference< XMultiServiceFactory >( xComponentContext->getServiceManager(), UNO_QUERY);
|
||||
if(!mxRemoteMSF.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, create mcRemoteMSF, failure.\n");
|
||||
bRetval = sal_False;
|
||||
}
|
||||
}
|
||||
catch (ConnectionSetupException& )
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "couldn't access local resource (possible security resons)\n");
|
||||
bRetval = sal_False;
|
||||
}
|
||||
catch (NoConnectException& )
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "no server listening on the resource\n");
|
||||
bRetval = sal_False;
|
||||
}
|
||||
catch (IllegalArgumentException& )
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "uno url invalid\n");
|
||||
bRetval = sal_False;
|
||||
}
|
||||
catch (RuntimeException& )
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "a remote call was aborted\n");
|
||||
bRetval = sal_False;
|
||||
}
|
||||
catch (uno::Exception&)
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, unknown error while connect to remote Office.\n");
|
||||
bRetval = sal_False;
|
||||
}
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, connect over.\n");
|
||||
return bRetval;
|
||||
}
|
||||
|
||||
sal_Bool SoPluginInstance::SetURL(char* aURL)
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "SoPluginInstance::SetURL %s\n", aURL);
|
||||
|
@ -240,7 +113,7 @@ sal_Bool SoPluginInstance::SetURL(char* aURL)
|
|||
}
|
||||
|
||||
// plugin window UI part: create window, load document
|
||||
bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
||||
sal_Bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
||||
{
|
||||
// If doc has been loaded, we just resize the window and return
|
||||
if(m_bInit)
|
||||
|
@ -249,24 +122,14 @@ bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
|||
m_xUnoWin->setPosSize( m_nX, m_nY, m_nWidth, m_nHeight, m_nFlag );
|
||||
debug_fprintf(NSP_LOG_APPEND, "set windows to x:%d y:%d w:%d h%d falg:%d\n",
|
||||
m_nX, m_nY, m_nWidth, m_nHeight, m_nFlag);
|
||||
return true;
|
||||
return sal_True;
|
||||
}
|
||||
|
||||
// If mxRemoteMSF is not initialized, we assert and return sal_False
|
||||
if(!mxRemoteMSF.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "Remote StarOfiice ServiceManager is not initilzed correctly!\n");
|
||||
|
||||
// first, try restar office and reconnect
|
||||
if(!restart_office()){
|
||||
debug_fprintf(NSP_LOG_APPEND, "restar office error!\n");
|
||||
return false;
|
||||
}
|
||||
if(!Connect()){
|
||||
debug_fprintf(NSP_LOG_APPEND, "reconnect office error!\n");
|
||||
return false;
|
||||
}
|
||||
debug_fprintf(NSP_LOG_APPEND, "Restore StarOfiice ServiceManager is not initilzed correctly!\n");
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
try
|
||||
|
@ -278,7 +141,7 @@ bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
|||
if( !xToolkit.is() )
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "Can not create Toolkit!\n");
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// prepare parameters for plugin window
|
||||
|
@ -294,7 +157,7 @@ bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
|||
if (!xToolkitSystemChildFactory.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, get xToolkitSystemChildFactory failure.\n");
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, try to create plugin container window HWIN:%ld.\n", hParent);
|
||||
|
@ -306,7 +169,7 @@ bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
|||
if ( !xNewWinPeer.is() )
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "can not create first window\n", hParent);
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// get interface of first window
|
||||
|
@ -314,7 +177,7 @@ bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
|||
if( !m_xUnoWin.is() )
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "can not get interface of first window\n", hParent);
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// initialize window
|
||||
|
@ -331,7 +194,7 @@ bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
|||
if (!m_xFrame.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "can not create frame\n");
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// initialize frame
|
||||
|
@ -356,7 +219,7 @@ bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
|||
if ( !m_xFramesSupplier.is() )
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "can not get desktop\n");
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// get frames
|
||||
|
@ -364,7 +227,7 @@ bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
|||
if ( !m_xFrames.is() )
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "can not get frames from FramesSupplier\n");
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// append m_xFrame to m_xFrames
|
||||
|
@ -375,7 +238,7 @@ bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
|||
if ( !xLoader.is() )
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "can not get ComponentLoader to load URL\n");
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
//create stream for the document
|
||||
|
@ -385,14 +248,14 @@ bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
|||
if(!xSimpleFileAccess.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "can not create SimpleFileAccess to load URL\n");
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
Reference<io::XInputStream> xInputStream = xSimpleFileAccess->openFileRead( m_sURL );
|
||||
|
||||
if(!xInputStream.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "can not create XInputStream for URL\n");
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// prepare to load document
|
||||
|
@ -434,7 +297,7 @@ bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
|||
if ( !m_xComponent.is() )
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by Nsplugin, Load Componment error\n");
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
// register the closelistener that will prevent closing of the component
|
||||
|
@ -458,13 +321,13 @@ bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
|||
if(!m_xDispatcher.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "m_xDispatcher can not be getten\n");
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
m_xDispatchProvider = Reference< frame::XDispatchProvider >(m_xFrame, uno::UNO_QUERY);
|
||||
if(!m_xDispatchProvider.is())
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "m_xDispatchProvider can not be getten\n");
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
|
||||
//try to enable toolbar and tool windows
|
||||
|
@ -487,9 +350,9 @@ bool SoPluginInstance::LoadDocument(NSP_HWND hParent)
|
|||
debug_fprintf(NSP_LOG_APPEND, "Unknown exception while loading document in netscape plugin windows\n");
|
||||
OString o = OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US );
|
||||
debug_fprintf(NSP_LOG_APPEND, "error: %s \n", o.pData->buffer );
|
||||
return false;
|
||||
return sal_False;
|
||||
}
|
||||
return true;
|
||||
return sal_True;
|
||||
}
|
||||
|
||||
sal_Bool SoPluginInstance::SetSODir(char * sDir)
|
||||
|
@ -528,12 +391,8 @@ sal_Bool SoPluginInstance::SetWindow(NSP_HWND hParent, int x, int y, int w, int
|
|||
|
||||
if(!mxRemoteMSF.is())
|
||||
{
|
||||
bRetval = Connect(); // Connect to listening so and get mxRemoteMSF
|
||||
if(!bRetval)
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "can not connect to remote service manager\n");
|
||||
return sal_False;
|
||||
}
|
||||
debug_fprintf(NSP_LOG_APPEND, "Remote StarOfiice ServiceManager is not initilzed correctly!\n");
|
||||
return sal_False;
|
||||
}
|
||||
debug_fprintf(NSP_LOG_APPEND, "in SoPluginInstance::SetWindow, begin LoadDocument(hParent)\n");
|
||||
bRetval = LoadDocument(hParent); // Load document into current window
|
||||
|
|
|
@ -63,8 +63,6 @@ class SoPluginInstance
|
|||
private:
|
||||
// Service manager of remote Soffice
|
||||
static ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxRemoteMSF;
|
||||
// Service manager of local Soffice
|
||||
static ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxLocalMSF;
|
||||
// Dir where Soffice is in, ie. /Soffice7/program
|
||||
static char sSO_Dir[NPP_PATH_MAX];
|
||||
int m_nWidth;
|
||||
|
@ -93,14 +91,13 @@ private:
|
|||
PluginDocumentClosePreventer* m_pCloseListener;
|
||||
::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseListener > m_xCloseListener;
|
||||
|
||||
bool LoadDocument(NSP_HWND hParent);
|
||||
sal_Bool Connect(void);
|
||||
sal_Bool LoadDocument(NSP_HWND hParent);
|
||||
|
||||
long m_dParentStyl; // Old Windows style of parent window
|
||||
|
||||
|
||||
public:
|
||||
SoPluginInstance(long iInstance);
|
||||
SoPluginInstance(long iInstance, ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xMSF);
|
||||
virtual ~SoPluginInstance(void);
|
||||
virtual sal_Bool SetURL(char* aURL);
|
||||
virtual sal_Bool IsInit(void){return m_bInit;};
|
||||
|
|
|
@ -69,6 +69,33 @@
|
|||
|
||||
#include "sal/main.h"
|
||||
|
||||
#include "rtl/process.h"
|
||||
#include "rtl/bootstrap.hxx"
|
||||
#include "rtl/string.hxx"
|
||||
#include "rtl/ustrbuf.hxx"
|
||||
|
||||
#include "osl/security.hxx"
|
||||
#include "osl/thread.hxx"
|
||||
|
||||
#include "cppuhelper/bootstrap.hxx"
|
||||
|
||||
|
||||
|
||||
#include "com/sun/star/uno/XComponentContext.hpp"
|
||||
#include "com/sun/star/lang/XMultiServiceFactory.hpp"
|
||||
#include "com/sun/star/bridge/UnoUrlResolver.hpp"
|
||||
#include "com/sun/star/bridge/XUnoUrlResolver.hpp"
|
||||
|
||||
#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
|
||||
#define ARLEN(x) sizeof (x) / sizeof *(x)
|
||||
|
||||
using namespace ::rtl;
|
||||
using namespace ::osl;
|
||||
using namespace ::cppu;
|
||||
using namespace ::com::sun::star;
|
||||
using namespace ::com::sun::star::uno;
|
||||
|
||||
|
||||
#define MAX_NODE_NUM 1024
|
||||
|
||||
SoPluginInstance* lpInstance[MAX_NODE_NUM];
|
||||
|
@ -159,13 +186,13 @@ int Set_URL(PLUGIN_MSG* pMsg)
|
|||
return -1;
|
||||
}
|
||||
|
||||
int New_Instance(PLUGIN_MSG* pMsg)
|
||||
int New_Instance(PLUGIN_MSG* pMsg, Reference< lang::XMultiServiceFactory > xMSF)
|
||||
{
|
||||
dump_plugin_message(pMsg);
|
||||
int free_no;
|
||||
if( -1 == (free_no = find_free_node()))
|
||||
return -1;
|
||||
lpInstance[free_no] = new SoPluginInstance(pMsg->instance_id);
|
||||
lpInstance[free_no] = new SoPluginInstance(pMsg->instance_id, xMSF);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -212,14 +239,15 @@ int Shutdown()
|
|||
return -1;
|
||||
}
|
||||
|
||||
int dispatchMsg(PLUGIN_MSG* pMsg)
|
||||
int dispatchMsg(PLUGIN_MSG* pMsg, Reference< lang::XMultiServiceFactory > xMSF)
|
||||
{
|
||||
switch(pMsg->msg_id)
|
||||
{
|
||||
case SO_SET_WINDOW:
|
||||
return Set_Window(pMsg);
|
||||
case SO_NEW_INSTANCE:
|
||||
return New_Instance(pMsg);
|
||||
if(xMSF.is())
|
||||
return New_Instance(pMsg, xMSF);
|
||||
case SO_SET_URL:
|
||||
return Set_URL(pMsg);
|
||||
case SO_DESTROY:
|
||||
|
@ -235,118 +263,198 @@ int dispatchMsg(PLUGIN_MSG* pMsg)
|
|||
}
|
||||
}
|
||||
|
||||
sal_Bool start_office(NSP_PIPE_FD read_fd)
|
||||
Reference< lang::XMultiServiceFactory > SAL_CALL start_office(NSP_PIPE_FD read_fd)
|
||||
{
|
||||
int my_sock;
|
||||
struct sockaddr_in dst_addr;
|
||||
char sCommand[NPP_PATH_MAX];
|
||||
sCommand[0] = 0;
|
||||
#ifdef WNT
|
||||
Reference< XComponentContext > xRemoteContext;
|
||||
|
||||
try
|
||||
{
|
||||
WSADATA wsaData;
|
||||
WORD wVersionRequested;
|
||||
OUString aOfficePath;
|
||||
|
||||
wVersionRequested = MAKEWORD(2,0);
|
||||
if(WSAStartup(wVersionRequested, &wsaData))
|
||||
{
|
||||
NSP_Close_Pipe(read_fd);
|
||||
debug_fprintf(NSP_LOG_APPEND, "Can not init socket in Windows.\n");
|
||||
return sal_False;
|
||||
}
|
||||
}
|
||||
#endif //end of WNT
|
||||
memset(&dst_addr, 0, sizeof(dst_addr));
|
||||
dst_addr.sin_family = AF_INET;
|
||||
dst_addr.sin_port = htons(SO_SERVER_PORT);
|
||||
dst_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
|
||||
|
||||
int count = 0;
|
||||
int ret = 0;
|
||||
|
||||
my_sock=socket(PF_INET, SOCK_STREAM, 0);
|
||||
|
||||
// if Star Office has been stared, we need not to start it again
|
||||
ret = connect(my_sock, (struct sockaddr *)&dst_addr, sizeof(dst_addr));
|
||||
if(ret == 0)
|
||||
{
|
||||
NSP_CloseSocket(my_sock);
|
||||
debug_fprintf(NSP_LOG_APPEND, "Staroffice already start\n");
|
||||
return sal_True;
|
||||
}
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "try to star Staroffice\n");
|
||||
char para[128] = {0};
|
||||
sprintf(para, "-accept=socket,host=0,port=%d;urp", SO_SERVER_PORT);
|
||||
#ifdef UNIX
|
||||
|
||||
boost::scoped_array< char > exepath(
|
||||
new char[( progdir ? strlen( progdir ) : 0 ) + RTL_CONSTASCII_LENGTH( "/soffice" ) + 1] );
|
||||
if ( progdir )
|
||||
sprintf( exepath.get(), "%s/soffice", progdir );
|
||||
else
|
||||
sprintf( exepath.get(), "soffice" );
|
||||
|
||||
int nChildPID = fork();
|
||||
if( ! nChildPID ) // child process
|
||||
{
|
||||
NSP_CloseSocket(my_sock);
|
||||
NSP_Close_Pipe(read_fd);
|
||||
sprintf(sCommand, "/bin/sh %s -nologo -nodefault %s", exepath.get(), para);
|
||||
debug_fprintf(NSP_LOG_APPEND,"StarOffice will be started by command: %s\n",sCommand);
|
||||
execl("/bin/sh", "/bin/sh", exepath.get(), "-nologo", "-nodefault", para, NULL);
|
||||
_exit(255);
|
||||
if (!rtl_convertStringToUString(
|
||||
&aOfficePath.pData, exepath.get(), strlen(exepath.get()), osl_getThreadTextEncoding(),
|
||||
(RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
|
||||
RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
|
||||
RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)))
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND,"bad characters in soffice installation path!\n");
|
||||
return Reference< lang::XMultiServiceFactory >(NULL);
|
||||
}
|
||||
#endif //end of UNIX
|
||||
#ifdef WNT
|
||||
STARTUPINFO NSP_StarInfo;
|
||||
memset((void*) &NSP_StarInfo, 0, sizeof(STARTUPINFO));
|
||||
NSP_StarInfo.cb = sizeof(STARTUPINFO);
|
||||
PROCESS_INFORMATION NSP_ProcessInfo;
|
||||
memset((void*)&NSP_ProcessInfo, 0, sizeof(PROCESS_INFORMATION));
|
||||
sprintf(para, " -nologo -nodefault -accept=socket,host=0,port=%d;urp", SO_SERVER_PORT);
|
||||
//sprintf(para, " -accept=socket,host=0,port=%d;urp\n", SO_SERVER_PORT);
|
||||
SECURITY_ATTRIBUTES NSP_access = { sizeof(SECURITY_ATTRIBUTES), NULL, FALSE}; (void)NSP_access;
|
||||
sprintf(sCommand, "\"%s\" %s", findSofficeExecutable(), para);
|
||||
debug_fprintf(NSP_LOG_APPEND,"StarOffice will be started by command: %s",sCommand);
|
||||
BOOL ret = false;
|
||||
ret = CreateProcess(findSofficeExecutable(), sCommand, NULL, NULL, FALSE,
|
||||
0 , NULL, NULL, &NSP_StarInfo, &NSP_ProcessInfo);
|
||||
if(ret==false){
|
||||
debug_fprintf(NSP_LOG_APPEND,"run staroffice error: %u \n",
|
||||
GetLastError());
|
||||
}
|
||||
else debug_fprintf(NSP_LOG_APPEND,"run staroffice success\n");
|
||||
#endif //end of WNT
|
||||
}
|
||||
char sPath[NPP_PATH_MAX];
|
||||
sPath[0] = 0;
|
||||
|
||||
NSP_Sleep(5);
|
||||
// try to connect to background SO, thus judge if it is ready
|
||||
while(0 > connect(my_sock, (struct sockaddr *)&dst_addr, sizeof(dst_addr)))
|
||||
{
|
||||
NSP_Sleep(1);
|
||||
if (count++ >= 120)
|
||||
// The quotes will be added in osl_executeProcess
|
||||
sprintf(sPath, "%s", findSofficeExecutable() );
|
||||
if (!rtl_convertStringToUString(
|
||||
&aOfficePath.pData, sPath, strlen(sPath), osl_getThreadTextEncoding(),
|
||||
(RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
|
||||
RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
|
||||
RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)))
|
||||
{
|
||||
NSP_CloseSocket(my_sock);
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by nsplugin, con star remote StarOffice\n");
|
||||
return sal_False;
|
||||
debug_fprintf(NSP_LOG_APPEND,"bad characters in soffice installation path!\n");
|
||||
return Reference< lang::XMultiServiceFactory >(NULL);
|
||||
}
|
||||
debug_fprintf(NSP_LOG_APPEND, "print by nsplugin, Current count: %d\n", count);
|
||||
#endif //end of WNT
|
||||
|
||||
// create default local component context
|
||||
Reference< XComponentContext > xLocalContext(
|
||||
defaultBootstrap_InitialComponentContext() );
|
||||
if ( !xLocalContext.is() )
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND,"no local component context!\n");
|
||||
return Reference< lang::XMultiServiceFactory >(NULL);
|
||||
}
|
||||
|
||||
// env string
|
||||
::rtl::OUStringBuffer buf;
|
||||
OUString aIniPath, aPluginPipeName;
|
||||
|
||||
if(!Bootstrap::get(OUSTR("BRAND_BASE_DIR"), aIniPath))
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND,"failed to get BRAND_BASE_DIR!\n");
|
||||
return Reference< lang::XMultiServiceFactory >(NULL);
|
||||
}
|
||||
aIniPath += OUSTR("/program/");
|
||||
aIniPath += OUSTR(SAL_CONFIGFILE("bootstrap"));
|
||||
Bootstrap aVersionFile(aIniPath);
|
||||
aVersionFile.getFrom(OUSTR("BaseInstallation"), aPluginPipeName, OUString());
|
||||
|
||||
aPluginPipeName = ::rtl::OUString::valueOf( aPluginPipeName.hashCode() );
|
||||
|
||||
// accept string
|
||||
OSL_ASSERT( buf.getLength() == 0 );
|
||||
buf.appendAscii( RTL_CONSTASCII_STRINGPARAM( "-accept=pipe,name=" ) );
|
||||
buf.append( aPluginPipeName ); //user installation path as pipe name
|
||||
buf.appendAscii( RTL_CONSTASCII_STRINGPARAM( ";urp;" ) );
|
||||
OUString sConnectStartString( buf.makeStringAndClear() );
|
||||
|
||||
// arguments
|
||||
OUString args [] = {
|
||||
OUSTR( "-nologo" ),
|
||||
OUSTR( "-nodefault" ),
|
||||
OUSTR( "-nolockcheck" ),
|
||||
sConnectStartString,
|
||||
};
|
||||
|
||||
// create a URL resolver
|
||||
Reference< bridge::XUnoUrlResolver > xUrlResolver(
|
||||
bridge::UnoUrlResolver::create( xLocalContext ) );
|
||||
|
||||
// connection string
|
||||
OSL_ASSERT( buf.getLength() == 0 );
|
||||
buf.appendAscii( RTL_CONSTASCII_STRINGPARAM( "uno:pipe,name=" ) );
|
||||
buf.append( aPluginPipeName );
|
||||
buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(
|
||||
";urp;StarOffice.ComponentContext" ) );
|
||||
OUString sConnectString( buf.makeStringAndClear() );
|
||||
|
||||
try
|
||||
{
|
||||
// try to connect to office, no need to start instance again if office already started
|
||||
xRemoteContext.set(
|
||||
xUrlResolver->resolve( sConnectString ), UNO_QUERY_THROW );
|
||||
debug_fprintf(NSP_LOG_APPEND, "Staroffice already start\n");
|
||||
return Reference< lang::XMultiServiceFactory >(xRemoteContext->getServiceManager(), UNO_QUERY);
|
||||
}
|
||||
catch ( connection::NoConnectException & )
|
||||
{
|
||||
}
|
||||
|
||||
// start office process
|
||||
#ifdef UNIX
|
||||
// a temporary solution
|
||||
// in future the process should be started using the osl_executeProcess call
|
||||
int nChildPID = fork();
|
||||
if( ! nChildPID ) // child process
|
||||
{
|
||||
NSP_Close_Pipe(read_fd);
|
||||
execl( "/bin/sh",
|
||||
"/bin/sh",
|
||||
::rtl::OUStringToOString( aOfficePath, osl_getThreadTextEncoding() ).getStr(),
|
||||
::rtl::OUStringToOString( args[0], osl_getThreadTextEncoding() ).getStr(),
|
||||
::rtl::OUStringToOString( args[1], osl_getThreadTextEncoding() ).getStr(),
|
||||
::rtl::OUStringToOString( args[2], osl_getThreadTextEncoding() ).getStr(),
|
||||
::rtl::OUStringToOString( args[3], osl_getThreadTextEncoding() ).getStr(),
|
||||
NULL);
|
||||
_exit(255);
|
||||
}
|
||||
#else
|
||||
Security sec;
|
||||
oslProcess hProcess = 0;
|
||||
rtl_uString * ar_args [] = {
|
||||
args[ 0 ].pData,
|
||||
args[ 1 ].pData,
|
||||
args[ 2 ].pData,
|
||||
args[ 3 ].pData,
|
||||
};
|
||||
|
||||
oslProcessError rc = osl_executeProcess(
|
||||
aOfficePath.pData,
|
||||
ar_args,
|
||||
ARLEN( ar_args ),
|
||||
osl_Process_DETACHED,
|
||||
sec.getHandle(),
|
||||
0, // => current working dir
|
||||
0,
|
||||
0, // => no env vars
|
||||
&hProcess );
|
||||
switch ( rc )
|
||||
{
|
||||
case osl_Process_E_None:
|
||||
osl_freeProcessHandle( hProcess );
|
||||
break;
|
||||
default:
|
||||
debug_fprintf(NSP_LOG_APPEND, "unmapped error!\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
// wait until office is started
|
||||
for ( int i = 0; i < 240 /* stop the connection after 240 * 500ms */; ++i )
|
||||
{
|
||||
try
|
||||
{
|
||||
// try to connect to office
|
||||
xRemoteContext.set(
|
||||
xUrlResolver->resolve( sConnectString ), UNO_QUERY_THROW );
|
||||
return Reference< lang::XMultiServiceFactory >(xRemoteContext->getServiceManager(), UNO_QUERY);
|
||||
}
|
||||
catch ( connection::NoConnectException & )
|
||||
{
|
||||
// wait 500 ms, then try to connect again
|
||||
TimeValue tv = { 0 /* secs */, 500000000 /* nanosecs */ };
|
||||
::osl::Thread::wait( tv );
|
||||
}
|
||||
}
|
||||
debug_fprintf(NSP_LOG_APPEND, "Failed to connect to Staroffice in 2 minutes\n");
|
||||
return Reference< lang::XMultiServiceFactory >(NULL);
|
||||
}
|
||||
catch ( Exception & e)
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "unexpected UNO exception caught: ");
|
||||
debug_fprintf(NSP_LOG_APPEND, (sal_Char *)e.Message.getStr());
|
||||
return Reference< lang::XMultiServiceFactory >(NULL);
|
||||
}
|
||||
NSP_CloseSocket(my_sock);
|
||||
NSP_Sleep(5);
|
||||
|
||||
prepareEnviron();
|
||||
|
||||
return sal_True;
|
||||
}
|
||||
|
||||
|
||||
SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
|
||||
{
|
||||
// Sleep(20*1000);
|
||||
// Sleep(20*1000);
|
||||
debug_fprintf(NSP_LOG_APPEND, "start of main\n");
|
||||
memset(lpInstance, 0, sizeof(lpInstance));
|
||||
|
||||
// MessageBox( NULL, "nsplugin has been started", "Info", MB_OK );
|
||||
|
||||
NSP_PIPE_FD fd_pipe[2];
|
||||
int iPipe[2];
|
||||
if(argc < 3)
|
||||
|
@ -372,12 +480,13 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
|
|||
// the program path is provided only on unix, on windows the registry entry is used
|
||||
if ( argc > 4 )
|
||||
progdir = argv[4];
|
||||
if(!start_office(la_read_fd))
|
||||
|
||||
Reference< lang::XMultiServiceFactory > xFactory = start_office(la_read_fd);
|
||||
if(!xFactory.is())
|
||||
{
|
||||
NSP_Close_Pipe(la_read_fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
PLUGIN_MSG nMsg;
|
||||
int len;
|
||||
while(1)
|
||||
|
@ -387,7 +496,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
|
|||
if(len != sizeof(PLUGIN_MSG))
|
||||
break;
|
||||
debug_fprintf(NSP_LOG_APPEND, "Read message from pipe type %d \n", nMsg.msg_id);
|
||||
if(-1 == dispatchMsg(&nMsg))
|
||||
if(-1 == dispatchMsg(&nMsg, xFactory))
|
||||
{
|
||||
debug_fprintf(NSP_LOG_APPEND, "plugin will shutdown\n");
|
||||
break;
|
||||
|
@ -397,9 +506,3 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
|
|||
_exit(0);
|
||||
return EXIT_SUCCESS; // avoid warnings
|
||||
}
|
||||
|
||||
extern "C"{
|
||||
sal_Bool restart_office(void){
|
||||
return start_office(la_read_fd);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue