diff options
Diffstat (limited to 'binfilter/bf_so3/source/inplace/rmapplet.cxx')
-rw-r--r-- | binfilter/bf_so3/source/inplace/rmapplet.cxx | 413 |
1 files changed, 413 insertions, 0 deletions
diff --git a/binfilter/bf_so3/source/inplace/rmapplet.cxx b/binfilter/bf_so3/source/inplace/rmapplet.cxx new file mode 100644 index 000000000000..20da571e5edd --- /dev/null +++ b/binfilter/bf_so3/source/inplace/rmapplet.cxx @@ -0,0 +1,413 @@ +/* -*- 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 REMOTE_VERSION + +#include <svgen.hxx> +#include <thread.hxx> + +#include <dcca/object.hxx> +#include <dcca/message.hxx> +#include <dcca/broker.hxx> + +#include <string.h> + +#include <owncont.hxx> +#include <tlgen.hxx> + +#include <rsvstrm.hxx> + +#include <RmApplet.hxx> + +namespace binfilter { + +// Attention : MT_LINK should be here temporarily only for testing +// and is supposed to be moved into SV ! + +#if !defined WNT +// caution: faster but be aware of deadlocks +// todo: someone in the main thread must call Lock()/Unlock() +#define MT_LINK +#endif + +// Example: +// MT_Link aLink = LINK( Instance, Class, Method ); +// long n = aLink.Call( (void*)pData ); +// Caution: +// Never call MT_Link::Call() in the main thread + +#if !defined MT_LINK +class MT_Link +{ + Link rLink_; + long nReturn_; + ULONG nEvent_; + SignaledEvent *aOut_; + static int count; + DECL_LINK( Call_Impl, void* ); +public: + long Call( void *p ); + MT_Link( Link r ); + ~MT_Link(); +}; + +IMPL_LINK( MT_Link, Call_Impl, void*, p ) +{ + nEvent_ = 0; + nReturn_ = rLink_.Call( p ); + aOut_->Set(); + return nReturn_; +} +int MT_Link::count = 0; + +long MT_Link::Call( void *p ) +{ + Link aLink = LINK( this, MT_Link, Call_Impl ); + + nEvent_ = GetpApp()->PostUserEvent( aLink, p ); + aOut_->Wait(); + return nReturn_; +} + +MT_Link::MT_Link( Link r ) : rLink_( r ) +{ + nEvent_ = 0; + String name1 = "Event"; + + name1 += count++; + aOut_ = new SignaledEvent(name1, FALSE); +} + +MT_Link::~MT_Link() +{ + if( nEvent_ ) GetpApp()->RemoveUserEvent( nEvent_ ); + if (aOut_) + delete aOut_; +} + +#else +class MT_Link +{ + Link rLink_; + + static Mutex aMtx__; +public: + static void Lock() { aMtx__.Lock(); } + static void Unlock() { aMtx__.Unlock(); } + + long Call( void *p ); + + MT_Link( Link r ) : rLink_( r ) {} +}; + +Mutex MT_Link::aMtx__; + +long MT_Link::Call( void *p ) +{ + Lock(); + long nReturn = rLink_.Call( p ); + Unlock(); + return nReturn; +} +#endif + + +// Link Deklarationen + + +INetURLObject *getURL(String& rStr) +{ + if( rStr.Len() >= 8 && rStr.Compare( "file:/", 6 ) == COMPARE_EQUAL + && rStr[(USHORT)7] == ':' ) + { + // Verkehrte JavaURL von file:/?: auf file:///?| bringen; + String aNew = "file:///"; + aNew += rStr[(USHORT)6]; + aNew += '|'; + aNew += rStr.Erase( 0, 8 ); + rStr = aNew; + //aStr = "file:///" + aStr[(USHORT)6] + '|' + aStr.Erase( 0, 7 ); + } + + INetURLObject *aDocURL = new INetURLObject(); + aDocURL->SetURL( rStr ); + return aDocURL; +} +/** + macht aus C++ URL eine JAVA kompatible URL +*/ +String getJavaURL(const INetURLObject & rDocBase) +{ + String aURL = rDocBase.GetMainURL(NetURLObject::DECODE_TO_IURI); + if( aURL.Len() ) + { + //WorkAround, weil Java mit dem | nicht zurecht kommt + if( rDocBase.GetProtocol() == INET_PROT_FILE + && aURL[ (USHORT)9 ] == INET_ENC_DELIM_TOKEN ) + aURL[ (USHORT)9 ] = INET_DELIM_TOKEN; + } + return aURL; +} + +RmAppletStub::RmAppletStub( ) : + RmBasisObject() +{ + pClassName = "ApOAppletStub"; +} + +void RmAppletStub::Create(RmAppletContext* pContext, const INetURLObject& rURL1, const SvCommandList & rList,const INetURLObject& rURL2 , BOOL bMayScript ) +{ + DBG_TRACE1( "Rm: AppletStub::Create() - Befor createObject() - %s", pClassName ); + + char * aBuf + = new char[ strlen( RMAPPLET_PACKAGE ) + strlen( pClassName ) + 1 ]; + strcpy( aBuf, RMAPPLET_PACKAGE ); // #100211# - checked + strcat( aBuf, pClassName ); // #100211# - checked + createObject( DCA_NAMESPACE(OObjectBroker, dca)::getBroker("dcabroker"), aBuf ); + delete[] aBuf; + + DBG_TRACE( "Rm: Window::Create() - After createObject()" ); + + DCA_NAMESPACE(OCallMethodMsg, dca) aMsg(this, MSG_APPLET_CREATE); + DCA_NAMESPACE(OObjStream , dca)& s = aMsg.getData(); + + s << getJavaURL(rURL1); + s << getJavaURL(rURL2); + + s << pContext; + + long size = rList.Count(); + s << size; + for( long i = 0; i < size; i++ ) + { + const SvCommand & rCmd = rList[i]; + s << rCmd.GetCommand().Lower() ; + s << rCmd.GetArgument(); + + } + + s << bMayScript; + aMsg.post(); +} + + +// ----------------------------------------------------------------------- + +RmAppletContext::RmAppletContext( ) : + RmBasisObject() +{ + pClassName = "ApOAppletContainer"; +} + +// ----------------------------------------------------------------------- + +void RmAppletContext::Create( ) +{ + DBG_TRACE1( "Rm: AppletContext::Create() - Befor createObject() - %s", pClassName ); + + char * aBuf + = new char[ strlen( RMAPPLET_PACKAGE ) + strlen( pClassName ) + 1 ]; + strcpy( aBuf, RMAPPLET_PACKAGE ); // #100211# - checked + strcat( aBuf, pClassName ); // #100211# - checked + createObject( DCA_NAMESPACE(OObjectBroker, dca)::getBroker("dcabroker"), aBuf ); + delete[] aBuf; + + DBG_TRACE( "Rm: Window::Create() - After createObject()" ); + +} + +// ----------------------------------------------------------------------- + +RmAppletObject::RmAppletObject( ) : + RmBasisObject() +{ + pClassName = "ApOAppletPanel"; +} + +void RmAppletObject::Create(const String& sClassName, const String& sName, const RmAppletStub& stub, const Window& parent ) +{ + DBG_TRACE1( "Rm: AppletObject::Create() - Befor createObject() - %s", pClassName ); + + char * aBuf + = new char[ strlen( RMAPPLET_PACKAGE ) + strlen( pClassName ) + 1 ]; + strcpy( aBuf, RMAPPLET_PACKAGE ); // #100211# - checked + strcat( aBuf, pClassName ); // #100211# - checked + createObject( DCA_NAMESPACE(OObjectBroker, dca)::getBroker("dcabroker"), aBuf ); + delete[] aBuf; + + DBG_TRACE( "Rm: Window::Create() - After createObject()" ); + DCA_NAMESPACE(OCallMethodMsg, dca) aMsg( this, MSG_APPLET_CREATE ); + DCA_NAMESPACE(OObjStream , dca)& s = aMsg.getData(); + + s << sClassName; + s << sName; + s << (RmAppletStub*)&stub; + void *dummy = (void *)parent.ImpGetRemoteObject(); + s << (DCA_NAMESPACE(OObj , dca)*)dummy; + + aMsg.post(); +} + +void RmAppletObject::Start( const Size & rSize) +{ + DCA_NAMESPACE(OCallMethodMsg, dca) aMsg( this, MSG_APPLET_START ); + DCA_NAMESPACE(OObjStream , dca)& s = aMsg.getData(); + + s << rSize.Width(); + s << rSize.Height(); + + aMsg.post(); + +} + +void RmAppletObject::Stop() +{ + DCA_NAMESPACE(OCallMethodMsg, dca) aMsg( this, MSG_APPLET_STOP ); + aMsg.post(); + +} + +void RmAppletObject::SetSizePixel( const Size & rSize) +{ + DCA_NAMESPACE(OCallMethodMsg, dca) aMsg( this, MSG_APPLET_SETSIZE ); + DCA_NAMESPACE(OObjStream , dca)& s = aMsg.getData(); + s << rSize.Width(); + s << rSize.Height(); + aMsg.post(); + +} + + +/* -------- Basis Object ---------------- */ + +RmBasisObject::RmBasisObject( ) +{ +} + + +Boolean RmBasisObject::dispatchMessage(DCA_NAMESPACE(OCallMethodMsg , dca)& rMsg) +{ + // we have to switch to the main Thread + MT_Link aLink (LINK((RmBasisObject*) this, RmBasisObject,executeMessage )); + aLink.Call(&rMsg); + return 1; +} + +IMPL_LINK( RmBasisObject, executeMessage, DCA_NAMESPACE(OCallMethodMsg , dca) *, pMsg ) +{ + int nType = pMsg->getType(); + + switch ( nType ) + { + case MSG_SHOWSTATUS: + { + DBG_TRACE( "Rm: ShowStatus" ); + DCA_NAMESPACE(OObjStream , dca)& s = pMsg->getData(); + String statusText; + s >> statusText; + ((RmAppletContext*)this) -> showStatus(statusText); + } + break; + case MSG_GETAPPLET : + { + DBG_TRACE( "Rm: GetApplet" ); + DCA_NAMESPACE(OObjStream , dca)& s = pMsg->getData(); + String sName; + s >> sName; + RmAppletObject * pObj = ((RmAppletContext *)this) -> getApplet(sName ); + DCA_NAMESPACE(OObjStream , dca)& rStream = pMsg->getData(); + rStream << pObj; + pMsg->post(); + } + break; + case MSG_GETAPPLETS : + { + DBG_TRACE( "Rm: GetApplets" ); + DCA_NAMESPACE(OObjStream , dca)& s = pMsg->getData(); + List rList; + ((RmAppletContext *) this) -> fillApplets(rList ); + DCA_NAMESPACE(OObjStream , dca)& rStream = pMsg->getData(); + rStream << (long)rList.Count(); + for (int i = 0; i < (int)rList.Count(); i++) + rStream << (RmAppletObject*)rList.GetObject(i); + pMsg->post(); + } + break; + case MSG_SHOWDOCUMENT : + { + DBG_TRACE( "Rm: ShowDocument" ); + DCA_NAMESPACE(OObjStream , dca)& s = pMsg->getData(); + String sURL; + String sDest; + INetURLObject *pURL; + s >> sURL; + s >> sDest; + pURL = getURL(sURL); + ((RmAppletContext*) this) -> showDocument((*pURL), sDest ); + } + break; + case MSG_APPLETRESIZE : + { + DBG_TRACE( "Rm: AppletResize" ); + long width; + long height; + DCA_NAMESPACE(OObjStream , dca)& s = pMsg->getData(); + s >> width; + s >> height; + ((RmAppletStub *) this) -> appletResize(width, height); + } + break; + case MSG_APPLETSTARTED: + { + DBG_TRACE( "Rm: AppletStarted" ); + ((RmAppletStub *) this) -> appletStarted(); + } + break; + case MSG_APPLETABORT: + { + DBG_TRACE( "Rm: AppletAbort" ); + ((RmAppletStub *) this) -> onAppletAbort(); + } + break; + + + default: + DBG_TRACE1( "Rm: Unknown dispatchMessage (%d)", nType ); + //OObj::dispatchMessage( rMsg ); + break; + } + + return 1; +} + + +} + +#endif // REMOTE_VERSION + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |