xref: /AOO41X/main/automation/source/server/server.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_automation.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir // do not use Application Idle but AutoTimer instead
32*cdf0e10cSrcweir #define TIMERIDLE
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir #define NO_JPEG
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir #ifndef NO_JPEG
37*cdf0e10cSrcweir #include <svtools/jpeg.hxx>
38*cdf0e10cSrcweir #endif
39*cdf0e10cSrcweir #include <vcl/timer.hxx>
40*cdf0e10cSrcweir #include <vcl/wrkwin.hxx>
41*cdf0e10cSrcweir #include <osl/diagnose.h>
42*cdf0e10cSrcweir #include <osl/mutex.hxx>
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir #ifndef _DIALOG_HXX //autogen
45*cdf0e10cSrcweir #include <vcl/dialog.hxx>
46*cdf0e10cSrcweir #endif
47*cdf0e10cSrcweir #include <tools/stream.hxx>
48*cdf0e10cSrcweir #include <tools/config.hxx>
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir #include <vos/socket.hxx>
51*cdf0e10cSrcweir 
52*cdf0e10cSrcweir #if 1
53*cdf0e10cSrcweir #include <svtools/ttprops.hxx>
54*cdf0e10cSrcweir #include <basic/ttstrhlp.hxx>
55*cdf0e10cSrcweir #include <svl/stritem.hxx>
56*cdf0e10cSrcweir #include <svtools/stringtransfer.hxx>
57*cdf0e10cSrcweir #include <vcl/sound.hxx>
58*cdf0e10cSrcweir #include "testtool.hrc"
59*cdf0e10cSrcweir #include <vcl/bitmap.hxx>
60*cdf0e10cSrcweir // Hat keinen Includeschutz
61*cdf0e10cSrcweir #include <svtools/svtdata.hxx>
62*cdf0e10cSrcweir //#ifndef _DTRANS_HXX //autogen
63*cdf0e10cSrcweir //#include <so2/dtrans.hxx>
64*cdf0e10cSrcweir //#endif
65*cdf0e10cSrcweir #endif // 1
66*cdf0e10cSrcweir #include <rtl/textenc.h>
67*cdf0e10cSrcweir #include <rtl/uri.h>
68*cdf0e10cSrcweir #include <rtl/uri.hxx>
69*cdf0e10cSrcweir #include "statemnt.hxx"
70*cdf0e10cSrcweir #include "scmdstrm.hxx"
71*cdf0e10cSrcweir #include "rcontrol.hxx"
72*cdf0e10cSrcweir #include "server.hxx"
73*cdf0e10cSrcweir #include "testtool.hxx"
74*cdf0e10cSrcweir #include "automation/automation.hxx"
75*cdf0e10cSrcweir #include "recorder.hxx"
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir #include "basic/svtmsg.hrc"
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir #ifdef DBG_UTIL
80*cdf0e10cSrcweir void TestToolDebugPrint( const sal_Char *pString )
81*cdf0e10cSrcweir {
82*cdf0e10cSrcweir     if ( !DbgFilterMessage( pString ) )
83*cdf0e10cSrcweir     	StatementList::DirectLog( S_AssertError, UniString( pString, RTL_TEXTENCODING_UTF8 ) );
84*cdf0e10cSrcweir }
85*cdf0e10cSrcweir void SAL_CALL osl_TestToolDebugPrint( const sal_Char *pString )
86*cdf0e10cSrcweir {
87*cdf0e10cSrcweir     TestToolDebugPrint( pString );
88*cdf0e10cSrcweir }
89*cdf0e10cSrcweir #endif
90*cdf0e10cSrcweir 
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir sal_uLong RemoteControlCommunicationManager::nPortIs = TT_PORT_NOT_INITIALIZED;
93*cdf0e10cSrcweir sal_uInt16 RemoteControlCommunicationManager::nComm = 0;
94*cdf0e10cSrcweir sal_Bool RemoteControlCommunicationManager::bQuiet = sal_False;
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
97*cdf0e10cSrcweir RemoteControlCommunicationManager::RemoteControlCommunicationManager( EditWindow * pDbgWin )
98*cdf0e10cSrcweir #else
99*cdf0e10cSrcweir RemoteControlCommunicationManager::RemoteControlCommunicationManager()
100*cdf0e10cSrcweir #endif
101*cdf0e10cSrcweir : CommunicationManagerServerViaSocket( GetPort(), 1, sal_True )
102*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
103*cdf0e10cSrcweir , m_pDbgWin( pDbgWin )
104*cdf0e10cSrcweir #endif
105*cdf0e10cSrcweir , pTimer( NULL )
106*cdf0e10cSrcweir {
107*cdf0e10cSrcweir 	bIsPortValid = ( GetPort() != 0 );
108*cdf0e10cSrcweir 	if ( bQuiet )
109*cdf0e10cSrcweir 	{
110*cdf0e10cSrcweir 		SetInfoType( CM_NO_TEXT );
111*cdf0e10cSrcweir 	}
112*cdf0e10cSrcweir 	else
113*cdf0e10cSrcweir 	{
114*cdf0e10cSrcweir 		SetInfoType( CM_SHORT_TEXT | CM_ALL );
115*cdf0e10cSrcweir         ByteString aByteString;
116*cdf0e10cSrcweir 		InfoMsg( InfoString( aByteString, CM_ALL ) );	// Anzeigen, da� wir da sind
117*cdf0e10cSrcweir 	}
118*cdf0e10cSrcweir }
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir RemoteControlCommunicationManager::~RemoteControlCommunicationManager()
121*cdf0e10cSrcweir {
122*cdf0e10cSrcweir 	if ( pTimer )
123*cdf0e10cSrcweir 		delete pTimer;
124*cdf0e10cSrcweir     DoQuickShutdown();
125*cdf0e10cSrcweir }
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir void RemoteControlCommunicationManager::ConnectionOpened( CommunicationLink* pCL )
128*cdf0e10cSrcweir {
129*cdf0e10cSrcweir 	StatementFlow::pCommLink = pCL;
130*cdf0e10cSrcweir 	CommunicationManagerServerViaSocket::ConnectionOpened( pCL );
131*cdf0e10cSrcweir }
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir 
134*cdf0e10cSrcweir void RemoteControlCommunicationManager::ConnectionClosed( CommunicationLink* pCL )
135*cdf0e10cSrcweir {
136*cdf0e10cSrcweir 	StatementFlow::pCommLink = NULL;
137*cdf0e10cSrcweir 	CommunicationManagerServerViaSocket::ConnectionClosed( pCL );
138*cdf0e10cSrcweir }
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir 
141*cdf0e10cSrcweir IMPL_LINK( RemoteControlCommunicationManager, SetWinCaption, Timer*, EMPTYARG )
142*cdf0e10cSrcweir {
143*cdf0e10cSrcweir 	if ( pTimer )
144*cdf0e10cSrcweir 	{
145*cdf0e10cSrcweir 		delete pTimer;
146*cdf0e10cSrcweir 		pTimer = NULL;
147*cdf0e10cSrcweir 	}
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir 	if ( StatementList::GetFirstDocFrame() )
150*cdf0e10cSrcweir 	{
151*cdf0e10cSrcweir 		if ( !aOriginalWinCaption.Len() )
152*cdf0e10cSrcweir 			aOriginalWinCaption = StatementList::GetFirstDocFrame()->GetText();
153*cdf0e10cSrcweir 		StatementList::GetFirstDocFrame()->SetText(String(aOriginalWinCaption).AppendAscii(" TT").Append(aAdditionalWinCaption).AppendAscii("[").Append(UniString::CreateFromInt32(nPortToListen)).AppendAscii("]"));
154*cdf0e10cSrcweir 	}
155*cdf0e10cSrcweir 	else
156*cdf0e10cSrcweir 	{	// Dann Probieren wir es eben in 1 Sekunde nochmal
157*cdf0e10cSrcweir 		pTimer = new Timer();	// Wird im Link gel�scht
158*cdf0e10cSrcweir 		pTimer->SetTimeout( 1000 );
159*cdf0e10cSrcweir 		pTimer->SetTimeoutHdl( LINK( this, RemoteControlCommunicationManager, SetWinCaption ) );
160*cdf0e10cSrcweir 		pTimer->Start();
161*cdf0e10cSrcweir 	}
162*cdf0e10cSrcweir 	return 0;
163*cdf0e10cSrcweir }
164*cdf0e10cSrcweir 
165*cdf0e10cSrcweir void RemoteControlCommunicationManager::InfoMsg( InfoString aMsg )
166*cdf0e10cSrcweir {
167*cdf0e10cSrcweir 	if ( !bIsPortValid )
168*cdf0e10cSrcweir 		return;
169*cdf0e10cSrcweir 	aAdditionalWinCaption = UniString( aMsg, RTL_TEXTENCODING_ASCII_US );
170*cdf0e10cSrcweir 	SetWinCaption();
171*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
172*cdf0e10cSrcweir 	m_pDbgWin->AddText( UniString( (ByteString)aMsg, RTL_TEXTENCODING_ASCII_US ) );
173*cdf0e10cSrcweir 	m_pDbgWin->AddText( "\n" );
174*cdf0e10cSrcweir #endif
175*cdf0e10cSrcweir }
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir sal_uLong RemoteControlCommunicationManager::GetPort()
178*cdf0e10cSrcweir {
179*cdf0e10cSrcweir 	if ( TT_PORT_NOT_INITIALIZED == nPortIs )
180*cdf0e10cSrcweir 	{	// Read Config
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir         sal_uInt16 i;
183*cdf0e10cSrcweir         // are we to be automated at all?
184*cdf0e10cSrcweir         sal_Bool bAutomate = sal_False;
185*cdf0e10cSrcweir 		for ( i = 0 ; i < Application::GetCommandLineParamCount() ; i++ )
186*cdf0e10cSrcweir 		{
187*cdf0e10cSrcweir 			if ( Application::GetCommandLineParam( i ).EqualsIgnoreCaseAscii("/enableautomation")
188*cdf0e10cSrcweir 				|| Application::GetCommandLineParam( i ).EqualsIgnoreCaseAscii("-enableautomation"))
189*cdf0e10cSrcweir             {
190*cdf0e10cSrcweir                 bAutomate = sal_True;
191*cdf0e10cSrcweir                 break;
192*cdf0e10cSrcweir             }
193*cdf0e10cSrcweir         }
194*cdf0e10cSrcweir 
195*cdf0e10cSrcweir // if started within Portal determin location of testtool.ini/rc by analysing the commandline
196*cdf0e10cSrcweir // /userid:demo1[/export/home/user/demo1]
197*cdf0e10cSrcweir // -userid:demo1[/export/home/user/demo1]
198*cdf0e10cSrcweir 		String aIniFileDir;
199*cdf0e10cSrcweir 		for ( i = 0 ; i < Application::GetCommandLineParamCount() ; i++ )
200*cdf0e10cSrcweir 		{
201*cdf0e10cSrcweir 			if ( Application::GetCommandLineParam( i ).Copy(0,8).EqualsIgnoreCaseAscii("/userid:")
202*cdf0e10cSrcweir 				|| Application::GetCommandLineParam( i ).Copy(0,8).EqualsIgnoreCaseAscii("-userid:") )
203*cdf0e10cSrcweir 			{
204*cdf0e10cSrcweir 				rtl::OUString aEncHome
205*cdf0e10cSrcweir 					= Application::GetCommandLineParam(i).GetBuffer();
206*cdf0e10cSrcweir 
207*cdf0e10cSrcweir 				rtl::OUString aDecHome = rtl::Uri::decode(aEncHome,
208*cdf0e10cSrcweir 						rtl_UriDecodeWithCharset,
209*cdf0e10cSrcweir 						RTL_TEXTENCODING_UTF8);
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir 				aIniFileDir = aDecHome;
212*cdf0e10cSrcweir 				aIniFileDir.Erase( 0, aIniFileDir.Search('[')+1 );
213*cdf0e10cSrcweir 				aIniFileDir.Erase( aIniFileDir.Search(']') );
214*cdf0e10cSrcweir 			}
215*cdf0e10cSrcweir 		}
216*cdf0e10cSrcweir 
217*cdf0e10cSrcweir 		if ( ! aIniFileDir.Len() )
218*cdf0e10cSrcweir 			aIniFileDir = Config::GetDefDirectory();
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir 		Config aConf(Config::GetConfigName( aIniFileDir, CUniString("testtool") ));
221*cdf0e10cSrcweir 		aConf.SetGroup("Communication");
222*cdf0e10cSrcweir 
223*cdf0e10cSrcweir 		ByteString aNoTesttoolKey( ByteString("Exclude_").Append( ByteString( Application::GetAppFileName(), RTL_TEXTENCODING_UTF8 ) ) );
224*cdf0e10cSrcweir // -notesttool
225*cdf0e10cSrcweir 		for ( i = 0 ; i < Application::GetCommandLineParamCount() ; i++ )
226*cdf0e10cSrcweir 		{
227*cdf0e10cSrcweir 			if ( Application::GetCommandLineParam( i ).CompareIgnoreCaseToAscii("-notesttool") == COMPARE_EQUAL )
228*cdf0e10cSrcweir 				aConf.WriteKey( aNoTesttoolKey, "something" );
229*cdf0e10cSrcweir 		}
230*cdf0e10cSrcweir 
231*cdf0e10cSrcweir 		nPortIs = aConf.ReadKey("TTPort","0").ToInt32();
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir         // noch pr�fen ob dieses Office getestet werden soll.
234*cdf0e10cSrcweir 		if ( !bAutomate || aConf.ReadKey( aNoTesttoolKey, "" ) != "" )
235*cdf0e10cSrcweir 			nPortIs = 0;
236*cdf0e10cSrcweir 
237*cdf0e10cSrcweir 		nComm = (sal_uInt16)aConf.ReadKey("Comm","0").ToInt32();
238*cdf0e10cSrcweir 		if ( nComm )
239*cdf0e10cSrcweir 			aConf.DeleteKey("Comm");
240*cdf0e10cSrcweir 
241*cdf0e10cSrcweir 		bQuiet = ( aConf.ReadKey("Quiet","no").CompareIgnoreCaseToAscii("yes") == COMPARE_EQUAL );
242*cdf0e10cSrcweir 	}
243*cdf0e10cSrcweir 	return nPortIs;
244*cdf0e10cSrcweir }
245*cdf0e10cSrcweir 
246*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
247*cdf0e10cSrcweir #define MIN_IDLE 10000		// Ruhe vor dem Sturm min 10 Sekunden
248*cdf0e10cSrcweir #else
249*cdf0e10cSrcweir #define MIN_IDLE 60000		// Ruhe vor dem Sturm min 1 Minuten
250*cdf0e10cSrcweir #endif
251*cdf0e10cSrcweir 
252*cdf0e10cSrcweir class ExtraIdle : public AutoTimer
253*cdf0e10cSrcweir {
254*cdf0e10cSrcweir 	virtual void    Timeout();
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir 	sal_uInt16 nStep;
257*cdf0e10cSrcweir 	ImplRemoteControl *pRemoteControl;
258*cdf0e10cSrcweir public:
259*cdf0e10cSrcweir 	ExtraIdle( ImplRemoteControl *pRC );
260*cdf0e10cSrcweir };
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir 
263*cdf0e10cSrcweir ExtraIdle::ExtraIdle( ImplRemoteControl *pRC )
264*cdf0e10cSrcweir : nStep( 0 )
265*cdf0e10cSrcweir , pRemoteControl (pRC )
266*cdf0e10cSrcweir {
267*cdf0e10cSrcweir 	SetTimeout( 120000 );	// 2 Minuten
268*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
269*cdf0e10cSrcweir 	SetTimeout( 40000 );	// 40 Sekunden
270*cdf0e10cSrcweir #endif
271*cdf0e10cSrcweir 	Start();
272*cdf0e10cSrcweir }
273*cdf0e10cSrcweir 
274*cdf0e10cSrcweir void ExtraIdle::Timeout()
275*cdf0e10cSrcweir {
276*cdf0e10cSrcweir 	if ( !StatementList::pTTProperties )
277*cdf0e10cSrcweir 		StatementList::pTTProperties = new TTProperties();
278*cdf0e10cSrcweir 
279*cdf0e10cSrcweir 	if ( !StatementList::pTTProperties->GetSlots() )
280*cdf0e10cSrcweir 	{
281*cdf0e10cSrcweir 		delete this;
282*cdf0e10cSrcweir 		return;
283*cdf0e10cSrcweir 	}
284*cdf0e10cSrcweir 
285*cdf0e10cSrcweir 	// M�ssen wir selbst idlen?
286*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
287*cdf0e10cSrcweir 	sal_uLong nLastInputInterval = Application::GetLastInputInterval();
288*cdf0e10cSrcweir 	sal_Bool bIsInModalMode = Application::IsInModalMode();
289*cdf0e10cSrcweir 	if ( bIsInModalMode || nLastInputInterval < MIN_IDLE )
290*cdf0e10cSrcweir #else
291*cdf0e10cSrcweir 	if ( Application::IsInModalMode() || Application::GetLastInputInterval() < MIN_IDLE )
292*cdf0e10cSrcweir #endif
293*cdf0e10cSrcweir 	{
294*cdf0e10cSrcweir 		if ( nStep )	// Schon angefangen? dann abbrechen, sonst sp�ter nochmal
295*cdf0e10cSrcweir 		{
296*cdf0e10cSrcweir             if ( nStep < 15 )
297*cdf0e10cSrcweir             {
298*cdf0e10cSrcweir 			    Sound::Beep();
299*cdf0e10cSrcweir 			    Sound::Beep();
300*cdf0e10cSrcweir             }
301*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL < 2
302*cdf0e10cSrcweir 			delete this;
303*cdf0e10cSrcweir #endif
304*cdf0e10cSrcweir 		}
305*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
306*cdf0e10cSrcweir         if ( nStep < 15 )
307*cdf0e10cSrcweir         {
308*cdf0e10cSrcweir 			Sound::Beep();
309*cdf0e10cSrcweir 			Sound::Beep();
310*cdf0e10cSrcweir         }
311*cdf0e10cSrcweir #endif
312*cdf0e10cSrcweir 		return;
313*cdf0e10cSrcweir 	}
314*cdf0e10cSrcweir 
315*cdf0e10cSrcweir 	if ( StatementList::pFirst )	// Verarbeitung neu aufsetzen
316*cdf0e10cSrcweir 	{
317*cdf0e10cSrcweir 		GetpApp()->PostUserEvent( LINK( pRemoteControl, ImplRemoteControl, CommandHdl ) );
318*cdf0e10cSrcweir 		return;
319*cdf0e10cSrcweir 	}
320*cdf0e10cSrcweir 
321*cdf0e10cSrcweir 
322*cdf0e10cSrcweir 	switch ( nStep++ )		// Probieren ob wir noch was machen k�nnen
323*cdf0e10cSrcweir 	{
324*cdf0e10cSrcweir 		case 0:
325*cdf0e10cSrcweir 		{
326*cdf0e10cSrcweir 			SfxPoolItem *pItem = new SfxStringItem((sal_uInt16)StatementList::pTTProperties->nSidNewDocDirect, CUniString("swriter/web") );
327*cdf0e10cSrcweir 			new StatementSlot( StatementList::pTTProperties->nSidNewDocDirect, pItem );
328*cdf0e10cSrcweir 			SetTimeout(30000);
329*cdf0e10cSrcweir 			return;
330*cdf0e10cSrcweir 		}
331*cdf0e10cSrcweir 		case 1:
332*cdf0e10cSrcweir 		{
333*cdf0e10cSrcweir 			new StatementSlot( StatementList::pTTProperties->nSidSourceView );
334*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
335*cdf0e10cSrcweir 			SetTimeout(7000);
336*cdf0e10cSrcweir #else
337*cdf0e10cSrcweir 			SetTimeout(1500);
338*cdf0e10cSrcweir #endif
339*cdf0e10cSrcweir 			return;
340*cdf0e10cSrcweir 		}
341*cdf0e10cSrcweir 		case 2:
342*cdf0e10cSrcweir 		{
343*cdf0e10cSrcweir 			new StatementSlot( StatementList::pTTProperties->nSidSelectAll );
344*cdf0e10cSrcweir 			return;
345*cdf0e10cSrcweir 		}
346*cdf0e10cSrcweir 		case 3:
347*cdf0e10cSrcweir 		{
348*cdf0e10cSrcweir 
349*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
350*cdf0e10cSrcweir //#define TT_NO_DECRYPT
351*cdf0e10cSrcweir #define TT_CODE
352*cdf0e10cSrcweir #else
353*cdf0e10cSrcweir #define TT_CODE
354*cdf0e10cSrcweir #endif
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir #ifdef TT_NO_DECRYPT
357*cdf0e10cSrcweir 			String aStr =
358*cdf0e10cSrcweir 				""
359*cdf0e10cSrcweir 				;
360*cdf0e10cSrcweir 
361*cdf0e10cSrcweir #else
362*cdf0e10cSrcweir 			ByteString aStr =
363*cdf0e10cSrcweir 				"\n"
364*cdf0e10cSrcweir 				"VRQJ`ob\n"
365*cdf0e10cSrcweir 				"YEZO\n"
366*cdf0e10cSrcweir 				"ob\n"
367*cdf0e10cSrcweir 				"UmRo`\n"
368*cdf0e10cSrcweir 				"5J~O2o5+90~5,6xW$+5:c9o0UXRm`Y	UQ~JP~X]`Y\\|%Y`Yo]~O||2[pP0Y1J,|V),,7:,+|JS+U*[/O|K\n"
369*cdf0e10cSrcweir 				"|KaLYNV~]]2W/]*Y9|`*Y,P=[5P|U\n"
370*cdf0e10cSrcweir 				"]}mqbw`zZU\\L\n"
371*cdf0e10cSrcweir 				"LZdYWo9\n"
372*cdf0e10cSrcweir 				"/J\n"
373*cdf0e10cSrcweir 				"U~[QoZ\n"
374*cdf0e10cSrcweir 				"Rqd~V\n"
375*cdf0e10cSrcweir 				",)1~00\n"
376*cdf0e10cSrcweir 				"\n"
377*cdf0e10cSrcweir 				")0~*2=\n"
378*cdf0e10cSrcweir 				"++2\\5&K|~5n9r~9/*9<*~051*Q|0~0rY|~./97~Q*7,Z9<|KY0:=K*<=w~qY`IbOKzLwN,`7b,V~]E`]b\\ORE~\n"
379*cdf0e10cSrcweir 				"\n"
380*cdf0e10cSrcweir 				"Vq~bR`W;a+Y\\J=LKJa+W*I/PbR~JLUX[|b~`Z2P/R*[9a~W=9~/9p8=a*P=J0OZ~7L`JbL=P<WbaLQbPO]JYKbD\n"
381*cdf0e10cSrcweir 				"aY`J5J:b~7=2~+9)9W1,50b9X3P0`YbYVJ`Jb	\\`Z]`Vb\n"
382*cdf0e10cSrcweir 				"VRQJ`b"
383*cdf0e10cSrcweir 				;
384*cdf0e10cSrcweir #endif
385*cdf0e10cSrcweir 
386*cdf0e10cSrcweir #ifdef TT_CODE
387*cdf0e10cSrcweir 			for ( sal_uInt16 i = 0 ; i < aStr.Len() ; i++ )
388*cdf0e10cSrcweir 			{
389*cdf0e10cSrcweir 				if ( aStr.GetChar(i) < 32 || aStr.GetChar(i) > 126 )
390*cdf0e10cSrcweir 				{
391*cdf0e10cSrcweir 					// do nothing
392*cdf0e10cSrcweir 				}
393*cdf0e10cSrcweir 				else
394*cdf0e10cSrcweir 				{
395*cdf0e10cSrcweir 					aStr.SetChar( i, aStr.GetChar(i) - 32 );
396*cdf0e10cSrcweir 					aStr.SetChar( i, 126 - aStr.GetChar(i) );
397*cdf0e10cSrcweir 				}
398*cdf0e10cSrcweir 
399*cdf0e10cSrcweir 				if ( i > (aStr.Len() / 2) && (i&1) )
400*cdf0e10cSrcweir 				{
401*cdf0e10cSrcweir 					sal_Char c = aStr.GetChar(i);
402*cdf0e10cSrcweir 					aStr.SetChar( i, aStr.GetChar(aStr.Len()-i-1) );
403*cdf0e10cSrcweir 					aStr.SetChar( aStr.Len()-i-1, c );
404*cdf0e10cSrcweir 				}
405*cdf0e10cSrcweir 			}
406*cdf0e10cSrcweir #endif
407*cdf0e10cSrcweir 
408*cdf0e10cSrcweir 			::svt::OStringTransfer::CopyString( UniString( aStr, RTL_TEXTENCODING_ASCII_US ), StatementList::GetFirstDocFrame()  );
409*cdf0e10cSrcweir 
410*cdf0e10cSrcweir 			new StatementSlot( StatementList::pTTProperties->nSidPaste );
411*cdf0e10cSrcweir 			return;
412*cdf0e10cSrcweir 		}
413*cdf0e10cSrcweir 		case 4:
414*cdf0e10cSrcweir 		{
415*cdf0e10cSrcweir 			new StatementSlot( StatementList::pTTProperties->nSidSourceView );
416*cdf0e10cSrcweir 			return;
417*cdf0e10cSrcweir 		}
418*cdf0e10cSrcweir 		case 5:
419*cdf0e10cSrcweir 		{
420*cdf0e10cSrcweir 			new StatementSlot( StatementList::pTTProperties->nSidSelectAll );
421*cdf0e10cSrcweir 			new StatementSlot( StatementList::pTTProperties->nSidCopy );
422*cdf0e10cSrcweir 			new StatementSlot( StatementList::pTTProperties->nSidPaste );
423*cdf0e10cSrcweir 			return;
424*cdf0e10cSrcweir 		}
425*cdf0e10cSrcweir 		case 6:
426*cdf0e10cSrcweir 		{
427*cdf0e10cSrcweir 			ByteString aTr("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-");
428*cdf0e10cSrcweir 			ByteString aData =
429*cdf0e10cSrcweir "P-S-0U04Fihixh00l0004b0b300-PS0g30428333y243q334j44426a6a65576c8k97aJecf7feccedg2inj3ghlshde5krk+lno"
430*cdf0e10cSrcweir "PpqpBfjsgusp1unp-po-PS0gm044x465e6b6L6boygeg-ooo-ooo-ooo-ooo-ooo-ooo-ooo-ooo-ooo-ooo-ooo-ooo-ooo-ooo"
431*cdf0e10cSrcweir "-ooo-ooo-oo-1M04020Y30J0o080B040R040M-N0M700l010l000k000000000006000N011I112r222M-N0gJ40D000U001R011"
432*cdf0e10cSrcweir "0110500vr0001014p148mcg1R4koV18s95cwkAE2V8gImM5kgQY9WcosCw22I556p669I99aoaadrddd6eeeNghhIhhiriik6lll"
433*cdf0e10cSrcweir "NlmmImoprppp6qqqNsttItturuuw6xxxNxyyHyAA6BBBNBCCHCEE6FFFNFGGHGII6JJJNJKKHKMM6NNNNNOOHOQQ6RRRNRSSCSUU"
434*cdf0e10cSrcweir "NUVVIVVWpWWYIYYZrZZZ6+++M-N0Q700R000l000l000g00000006000N011I112r222M-N0kJ40C0003110d1110110r00t6000"
435*cdf0e10cSrcweir "Q041l18cF14gtk1ous48Acw295gAlEIMv28cxkY5FosQE2595dU9sY56q669N9aaCaddNdeeIeghrhhh6iiiNkllIllmrmmo6ppp"
436*cdf0e10cSrcweir "NpqqIqstrttt6uuuIwwxrxxx6yyyIAABrBBB6CCCIEEFrFFF6GGGIIIJrJJJ6KKKIMMNrNNN6OOOIQQRrRRR6SSSIUUVrVVV6WWW"
437*cdf0e10cSrcweir "IYYZrZZZ6+++U-S0d3009004Q040Of0TPU5QGjFCdPoji85WiqEopkCag321kP8dW4yO4KRlNi9iwzeTKup+Yk0lrdcicCEeLtVQ"
438*cdf0e10cSrcweir "z1IFeROmSJBa7VYMYY-0EWGkJWH6LpAVdrUepM7ScEpkTBkenX3YGuoFVU0IGk+dSzPpv0N6U07eTPFgid-YtvOD2ws5C96qDgIL"
439*cdf0e10cSrcweir "vhsoWmBPAozc+KgPjiVuW0TJnrt6PqF63p2VJEJ6A+l33JqESWh0G4yn1JkcaaEBnw17xmaf0q4BGkVy40Jj+FAyioG3KEukCtP1"
440*cdf0e10cSrcweir "OAdOe4ASVCPuUrQDFsqBoRWN6jqxOBfH-30WbgyZy+HtyI6xNVvt3M0lnfscjA8rBUeoRXifTPCceY6t46AR9ooG2jVzdmo+PQ6R"
441*cdf0e10cSrcweir "cAEDd7VE3GvUyDJzn2e0yyzypEdnCzUZorT029pk4LHJYsRQmR5smaW9EuCbt2A2s2Nd9ZKAkcJSWoTGPV5p6d1PZCiYt6kVETBB"
442*cdf0e10cSrcweir "K7zNWhRK7kMBCag7zELQ2e6HWHM+BwO4nJA-30uF2a2WgcgndWuk6gPbha0D5WFPq902KmjNwyg5xkVQvgd9W9SCfiFd95Ndh9yj"
443*cdf0e10cSrcweir "Odd7k38da3xWqtwcHPOEb7AvIPqAdRbz3XNNEYFu7bS9Iz-0UVQJc-gtgPCQ7cledmoGTULsGpjeu0TzkJi2tusMDnR4cisDw2rz"
444*cdf0e10cSrcweir "Vhs36hPC0oSH7V-UMAjVIC3dRFwNoc20a0+Culnm3q9QQJsgt00IeEoRXCh3jUg3eO8yGBOpFwYap5OrpoAfMeR6Q8L0sUIgI7B3"
445*cdf0e10cSrcweir "Oy9q5WMBAxg5PYnBSxZlywhwDlb45Il6Y+F-NaH62MEoByaq02d2aaEz5Bwx45DqfEC4ACqd4FYjI9IbAgqH7uFopm+JQRSHrSNd"
446*cdf0e10cSrcweir "ct0dwNo+FAUaD926b3wtUoRIPJ-MTLLiQcC92bTBue9RkDqqYRcXxn06S9Jm6Qhpk9IjH8JLyIinJj3EAF7bTH9jkf170OvzuO2j"
447*cdf0e10cSrcweir "I2jenHhQvnKoDSHSmWenEhfEHkVgekpfIOhkBhqLVaEvb83EyfD2Awrbk5+lwyvOne6yBA36rdrmna4xFOsvqGxRcgcJy-lXnjCn"
448*cdf0e10cSrcweir "eeWhGvqAbmSf7LcDwqykK9jqADpRqkXSq7MB7ZOHSgJhNitiw3i6y9LYjRNlq4Lc-00zCNL3CThC65Ajjlw8550bAbqa0d0Jz3BT"
449*cdf0e10cSrcweir "kH6EDgQhRUhjtyK9y9CjraNEw9ERUq6MmYa989nsRqsPxo+zi2IbOfxy9q3lFL-QSWn5qwp7nTFUwVe-XaDxnGfWOIYXXfIkILs-"
450*cdf0e10cSrcweir "lWPSm51tjj967w11u-YylxUO++EfuLsmr1c3jLdgcDYmK9roIAmz1t1vAalje3oyXDp335xkQ24rS1JhdokOn5cWpizqiE5bsbg4"
451*cdf0e10cSrcweir "4gWkfJ2IEVnSoWmj8eNeAFuoT0wzWWm9UgmDKRH2INGJy6OHTwn7zawsiPo796yQd6OsPORlTrUR-bEMLPj8nZdMwyX-Jb8npd2-"
452*cdf0e10cSrcweir "zV9JMRdNarUy1aF0tiihB0o+kQh5iy9r9BMqhPjf+WckJ9WWqmSQTEqAl+zwgw-+vH5WomSNVjbDLchO9Ae-ggdQGPcb+7Dq0X-d"
453*cdf0e10cSrcweir "XsFHj76-a0eUqKlN6cgHMKgKSmv8xcMVnCIPAnqR0SsThTWe8GSgo3pTGWTgBrtb1X2OfHMHsi8D3gkpPwKvoxoEuSJcTmD2kiAS"
454*cdf0e10cSrcweir "Pk3wl5C5NZDe9OrZMdDg6VQpDybXJ7EWLCdwsPoTGqhcGOGvrJ2WgFuuem+wP1ZGhkpee9rU7CTad9q9DxVgNzGWk+lGid6rKswa"
455*cdf0e10cSrcweir "1+Uc57RmFASpo3qbaGvuMReTLCWXsocM6lvXmSZHAhhaaV7EHH9sJglnrUlniII4I0gVZHFLys8VKKb2yKbAYHeSY3VlmgRywmqd"
456*cdf0e10cSrcweir "UXugq90wSsh0poya0qEAF9CjjadQumckue1unyK1sdcUwyxQOcARlHjLWYd3lS2ozCTQ48zZXesU66bAUfTdoXoOInm7MpPgwiDp"
457*cdf0e10cSrcweir "XDqJrEMEChxb747KzIHfxSdi++EwdRNK7RHEmgVhqiZkW1WqBEnjst6Oz08ztIPVknfPjq8NDB4h9g1sD+l1xQNzHNg+Jb1Vmii6"
458*cdf0e10cSrcweir "1dP-57LPdOhlWSTKYaCmzwAhGqyOlPrY9zXZodpZuoL2kjTBLBxaeGcM+NONZcN7GqIqFcNlhVgMXKHsd-WEBBR957ZZn7hk-mbb"
459*cdf0e10cSrcweir "FGxWLzaiHE6t48mXupNDlxi6d1w-yaPlmczA0gTsEhqRrsEbj48ProNvyivlaY06bdYSvGN7IOBc1ezBJiFd5OTz+RbzIsqJpCsJ"
460*cdf0e10cSrcweir "BOTSLjAdwXCzq-XExGbygb3X2oURVXxTB4q0e6euBRnXkIJuTM7SfQfQkdEEjN7J56t3oxP6B0cA4lgSDhURzsDzrkk0ECxfwaU3"
461*cdf0e10cSrcweir "ovagJuvzx07aksPdxkQ8aqEy618F-4wjCr3hZq8gq3gu7RJ4ovXa86R7ZskSYJC01o2OpfvJh0WqpYiIuE0zBqpI3kTJQZ0Or5ku"
462*cdf0e10cSrcweir "9RzhbzbV1AU0BzJ5vPTOBRIOIAiJiBiOdI8fR3dcWle3xCder+W6QELyr6NaldJipQCeAMwRr5mpzZESGAhuU3BDdkCh5ENgMUE-"
463*cdf0e10cSrcweir "sWotoCfnOwT7tJlXLHODk8K7Z4zYCG9Dh2fQazDE0JqBDruomfatotGADn25BCDpk6GI6SSftpUd71Qr1JBrgOr33aWswl983Uk7"
464*cdf0e10cSrcweir "cq9Em7vGtACekHlvOOVJfbdh76nNHzuQ1Z1oBvuU9l-dAg+-QWWFQ18D8U+zmYn1jypyarIXSrcIb67wLDTFXWm8F9XPmFWRBD3d"
465*cdf0e10cSrcweir "WukVJwhGNV5ZHVE1wCudY07ZIEAd1kgzgPcRSxFhRhFpXsnESjJhUNCA3DlrARwzz+llg0xpVHrJiddYT36P453qxpOmIE9e6-qJ"
466*cdf0e10cSrcweir "h4ipfTTt8f2Kq4mdWniErPtI+wrN-edvCQFtPdrL+tpV6EpPRXgmHnjRhV0eWWzqxdRZacX98CME3pvwDYWkO8TOUlcNQSKTU1iF"
467*cdf0e10cSrcweir "FC9WIBA8PulsCFVNH1qJwZxYYcaX6CGNnR7vHiIBDsTE51J4b4fYucNYFG9V5mCUdrJT57tHk9eghSOfgeHZDxuvQt8619pwKma7"
468*cdf0e10cSrcweir "3Nl00EFklZOk+APRmKviL+iyiG1sWfA3E0xUPznlQgvsHJRzD9u0TzHsB6tIMKLmOxvVHG9knpHerjAXNqIp7jwZzvYXIyW8kw8g"
469*cdf0e10cSrcweir "3ycECFaB2Y2U0l00NE7l2Aca2y5uhk+QJygN0857SQMVSEXjy+Q84nQjkTh1GAtFACtdHRhwQ6FhQMLjFu6zyxuFycbQA7qNSsiy"
470*cdf0e10cSrcweir "90wlAaUBBtFhxMV0TPd8DbVScjJoMSAYMh6GhAHnKOZsbdqvwtHKdZWZ9HQbdmVOt0xnnK5Ju9KfwhuHMZIoPt73BqspII6qBobB"
471*cdf0e10cSrcweir "5kfcwm183j4fwapcs50EoGgz2UZGuK88agfskePeYt9DOQD3qxxfuJ5lZUFHa8aqFJIT6MG2Kwtwuu0zBqTz8x5DYM7PDh29F9FU"
472*cdf0e10cSrcweir "1ge-wqqIMqmXlpbO65sila1be1yRGABAbw2njF5txZEAaqEyEo9FUPqnKQ4y1NQqSXkCpsqpO06UUCyBBzaDjawwoHkKOT1-zqpz"
473*cdf0e10cSrcweir "FU7JNudONE3fuYk83U9thALoAIeG6FKizOLgU4AcDcszCmGZgylUI-Edd9mAKL9nJe+YdiYxl7uX4mATdO30KcuDrRoTxBbiHbuA"
474*cdf0e10cSrcweir "qlorQn1D0opRuIhzVLm8+z8QRFlNA0683M1QYE+Lhka+kaIDvE8RHQHel4bOsMFp6lmV6D3cNhQvpG1sECm02a5tgF52reEBaYEw"
475*cdf0e10cSrcweir "OhD+RQiFedTm3OQg5iq2c04kidOoDgaPNGs1VitbrhIvAuzStaWksap3jp9UrAN1O-0nAECIfSP0QHVkGWtduz6XSmJ7MsLPmPJ3"
476*cdf0e10cSrcweir "hRjY7DtZXWjvtHcj9ooAXcPsI+3YgG951n7urnyB1kbQV+ZdlAbI11Y3orBMB+le8goi66fWyEX9FHpFEL32jNqSghzvyEC1227-"
477*cdf0e10cSrcweir "p5t8vx19mYHbOghy5K7voWUAXsjX2gwzicmKiNJR9OrHppAbVEVzVjOuYWmwCpGWFW1DlaoOc03PWkgqvVeezQY8IiM9Rptnniwf"
478*cdf0e10cSrcweir "Xa1XnMPo6ES0MHE5nwC8tT65VVw3C2peCu720i6oVvevcoMGeP3PVgvBkudifs0GNH7AaOGVFhrbE68B8sq6AH8BFvXhZfzdhb1f"
479*cdf0e10cSrcweir "Y1p-GVyr3qECy393zFEq0wHg2Vls4OiVD-J0d7JFKsuhUPgdykTCWhbqkdvwUUyg7qXPvdeC09AUAszRcVsk5iihIr1+N-0ATkGU"
480*cdf0e10cSrcweir "i6GPwTlzw-dALNmjbVjHOSAsWaihe303RxAmD4akSPWkjgtot17BTZfaSgaNH+ESoUGJ3GgPJqD8UBsAShIF-X0wwyFpDkTwESHg"
481*cdf0e10cSrcweir "jNwUF9EpszCwj1myzqZG9hIp76G1ymz7BuZF0T5pdA1GMG8AGuRbXEtJMkHsDJoztG06Jqm-khFPydXg-VB1k+l9AMwzzvtCDacK"
482*cdf0e10cSrcweir "k22WU1fByYcDpmW0Y9YF-zeZDDcQJVF8tT8cNNjt9GdIF3103ZFP8oulWCfnXETCKz3YQFsm3qOUu6GJ-lb2foo1WJqGpcCbyPmy"
483*cdf0e10cSrcweir "Ib95rQLJnk56YC1KmN5zMJ831cVsERyvdPOSW8kg-2uk8m3J4zgAWAhvvBOofIjFb5yNf0shVv-JJ9f49ZFcQ+LKDFKX3iNV1E-G"
484*cdf0e10cSrcweir "MxeEwbi-uGP8BGO4vGgV0IFbgswumfhk14OF3q+1qwRFpq4hr1s6zQEAgoVAW3QE4tsQpYW3JkcqDcnSOjbePZeFrFMor-o3UG2F"
485*cdf0e10cSrcweir "jmw8667eXk3UiM9vq5EpyrbQxexsJ3tKy7w6lGsumfMWIlcSglkLUzicysuPgqT5Wuzn8MkGvTYve2UyunErUnD-+Qwr0rDo1tOG"
486*cdf0e10cSrcweir "bbtcNNeFInx5rDK3DHahjTON3d3oTpePxioVK3sRLDh185yKMzTQv812ADCFcwvFHbetPF41f7kot00O2OMUkw4OPvuTRkhdAhgd"
487*cdf0e10cSrcweir "il2SM9bunNaNHqh9Ov8Qv3SKEl1O-BwzjYF0VWjkxycswQFqQotUPw+Q-6FrCPFWvaF2CP2F319stMfD-8bHsd87KZfQ9ChereG4"
488*cdf0e10cSrcweir "Z8XP8dNMipn-evkOVVFqfgN16dO8Ya9nqGFIpIW1Ljv7wOAzdZFsm5C1EuQoKzwyXDO0BDjceBsyTt40H0upG8D1N1ZP66OPIeQy"
489*cdf0e10cSrcweir "oXQwI63e+NnuYA0687-d6N6rDscj+VHn2R0RUXQFZ2+EANqcqvan4y0Erpl01fAfmLaI8pmOgsRUDvuF5e9YnWNhxtSzS4fsjj1J"
490*cdf0e10cSrcweir "1EIGpcw0WfiaOul1s19ZIECoLBx-#S";
491*cdf0e10cSrcweir 
492*cdf0e10cSrcweir 
493*cdf0e10cSrcweir //#if OSL_DEBUG_LEVEL > 1
494*cdf0e10cSrcweir //			SvFileStream aStream( "d:\\gh_writeback.jpg" , STREAM_STD_READWRITE | STREAM_TRUNC );
495*cdf0e10cSrcweir //#else
496*cdf0e10cSrcweir 			SvMemoryStream aStream;
497*cdf0e10cSrcweir //#endif
498*cdf0e10cSrcweir 			xub_StrLen c;
499*cdf0e10cSrcweir 			xub_StrLen cRest = 0;
500*cdf0e10cSrcweir 
501*cdf0e10cSrcweir 			xub_StrLen nIndex;
502*cdf0e10cSrcweir 			for ( nIndex = 0 ; nIndex < aData.Len() ; nIndex++ )
503*cdf0e10cSrcweir 			{
504*cdf0e10cSrcweir 				if ( ( nIndex & 3 ) == 0 )
505*cdf0e10cSrcweir 				{
506*cdf0e10cSrcweir 					cRest = aData.GetChar( nIndex );
507*cdf0e10cSrcweir 					cRest = aTr.Search( (sal_Char)cRest );
508*cdf0e10cSrcweir 				}
509*cdf0e10cSrcweir 				else
510*cdf0e10cSrcweir 				{
511*cdf0e10cSrcweir 					c = aData.GetChar( nIndex );
512*cdf0e10cSrcweir 					c = aTr.Search( (sal_Char)c );
513*cdf0e10cSrcweir 
514*cdf0e10cSrcweir 					c <<= 2;
515*cdf0e10cSrcweir 					c |= ( ( cRest & 0x30 ) >> 4 );
516*cdf0e10cSrcweir 					cRest <<= 2;
517*cdf0e10cSrcweir 
518*cdf0e10cSrcweir 					aStream << sal_Char(c);
519*cdf0e10cSrcweir 				}
520*cdf0e10cSrcweir 			}
521*cdf0e10cSrcweir 
522*cdf0e10cSrcweir 			aStream.Seek(0);
523*cdf0e10cSrcweir #ifndef NO_JPEG
524*cdf0e10cSrcweir 			Graphic aGraphic;
525*cdf0e10cSrcweir 			if ( ImportJPEG( aStream, aGraphic, NULL ) )
526*cdf0e10cSrcweir 			{
527*cdf0e10cSrcweir 				Bitmap *pBmp = new Bitmap( aGraphic.GetBitmap() );
528*cdf0e10cSrcweir 				StatementList::pTTProperties->Img( pBmp );
529*cdf0e10cSrcweir 				delete pBmp;
530*cdf0e10cSrcweir 			}
531*cdf0e10cSrcweir 			else
532*cdf0e10cSrcweir #endif
533*cdf0e10cSrcweir 			{
534*cdf0e10cSrcweir 				::svt::OStringTransfer::CopyString( CUniString("\nSorry! no bitmap"), StatementList::GetFirstDocFrame() );
535*cdf0e10cSrcweir 			}
536*cdf0e10cSrcweir 
537*cdf0e10cSrcweir /***********************************************************************
538*cdf0e10cSrcweir //			sal_uInt16 nBC = pBmp->GetBitCount();
539*cdf0e10cSrcweir //			pBmp->Scale( 0.02, 0.02 );
540*cdf0e10cSrcweir //			nBC = pBmp->GetBitCount();
541*cdf0e10cSrcweir //			SvMemoryStream aStream;
542*cdf0e10cSrcweir 			SvFileStream aStream( "d:\gh_small50.jpg", STREAM_STD_READ );
543*cdf0e10cSrcweir 
544*cdf0e10cSrcweir 			aStream.Seek( 0 );
545*cdf0e10cSrcweir 			xub_StrLen c;
546*cdf0e10cSrcweir 			String aOut;
547*cdf0e10cSrcweir 			String aDreierGruppe;
548*cdf0e10cSrcweir 			xub_StrLen cRest=0;
549*cdf0e10cSrcweir 			aStream >> c;
550*cdf0e10cSrcweir 			while ( !aStream.IsEof() )
551*cdf0e10cSrcweir 			{
552*cdf0e10cSrcweir 				cRest <<= 2;		// Im ersten Durchgang egal, da immer 0
553*cdf0e10cSrcweir 				cRest |= ( c & 0x03 );
554*cdf0e10cSrcweir 				c >>= 2;
555*cdf0e10cSrcweir 				aDreierGruppe += aTr.GetChar( c );
556*cdf0e10cSrcweir 
557*cdf0e10cSrcweir 				if ( aDreierGruppe.Len() == 3 )
558*cdf0e10cSrcweir 				{
559*cdf0e10cSrcweir 					aOut += aTr.GetChar( cRest );
560*cdf0e10cSrcweir 					aOut += aDreierGruppe;
561*cdf0e10cSrcweir 					cRest = 0;
562*cdf0e10cSrcweir 					aDreierGruppe = "";
563*cdf0e10cSrcweir 				}
564*cdf0e10cSrcweir 				aStream >> c;
565*cdf0e10cSrcweir 			}
566*cdf0e10cSrcweir 			if ( aDreierGruppe.Len() )
567*cdf0e10cSrcweir 			{
568*cdf0e10cSrcweir 				aOut += cRest;
569*cdf0e10cSrcweir 				aOut += aDreierGruppe;
570*cdf0e10cSrcweir 			}
571*cdf0e10cSrcweir 			::svt::OStringTransfer::CopyString( aOut );
572*cdf0e10cSrcweir **********************************************************************************/
573*cdf0e10cSrcweir 
574*cdf0e10cSrcweir 			new StatementSlot( StatementList::pTTProperties->nSidPaste );
575*cdf0e10cSrcweir 			return;
576*cdf0e10cSrcweir 		}
577*cdf0e10cSrcweir 		case 7:
578*cdf0e10cSrcweir 		{
579*cdf0e10cSrcweir 			new StatementSlot( 20384 );	// FN_TOOL_ANKER_CHAR aus SW?
580*cdf0e10cSrcweir 			return;
581*cdf0e10cSrcweir 		}
582*cdf0e10cSrcweir 	}
583*cdf0e10cSrcweir 
584*cdf0e10cSrcweir 	// Wir sind am Ende
585*cdf0e10cSrcweir 
586*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL < 2
587*cdf0e10cSrcweir 	delete this;
588*cdf0e10cSrcweir #endif
589*cdf0e10cSrcweir }
590*cdf0e10cSrcweir 
591*cdf0e10cSrcweir IMPL_LINK( ImplRemoteControl, IdleHdl, Application*, EMPTYARG )
592*cdf0e10cSrcweir {
593*cdf0e10cSrcweir 	if( StatementList::pFirst )
594*cdf0e10cSrcweir 	{
595*cdf0e10cSrcweir         #if OSL_DEBUG_LEVEL > 1
596*cdf0e10cSrcweir 		m_pDbgWin->AddText( "* " );
597*cdf0e10cSrcweir 		#endif
598*cdf0e10cSrcweir 		GetpApp()->PostUserEvent( LINK( this, ImplRemoteControl, CommandHdl ) );
599*cdf0e10cSrcweir 	}
600*cdf0e10cSrcweir 	return 0;
601*cdf0e10cSrcweir }
602*cdf0e10cSrcweir 
603*cdf0e10cSrcweir 
604*cdf0e10cSrcweir 
605*cdf0e10cSrcweir IMPL_LINK( ImplRemoteControl, CommandHdl, Application*, EMPTYARG )
606*cdf0e10cSrcweir {
607*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
608*cdf0e10cSrcweir 	m_pDbgWin->AddText( "Entering CommandHdl\n" );
609*cdf0e10cSrcweir #endif
610*cdf0e10cSrcweir 
611*cdf0e10cSrcweir 	if ( StatementList::MaybeResetSafeReschedule() )
612*cdf0e10cSrcweir 	{
613*cdf0e10cSrcweir 		StatementList::bExecuting = sal_False;		// Wird nacher im SafeReschedule wieder zur�ckgesetzt
614*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
615*cdf0e10cSrcweir 		m_pDbgWin->AddText( "SafeReschedule has been reset\n" );
616*cdf0e10cSrcweir #endif
617*cdf0e10cSrcweir 	}
618*cdf0e10cSrcweir 
619*cdf0e10cSrcweir 	if ( ( StatementList::bReadingCommands && !StatementList::bDying ) ||
620*cdf0e10cSrcweir 		 ( StatementList::bExecuting ) ||
621*cdf0e10cSrcweir 		 ( StatementList::IsInReschedule() ) )
622*cdf0e10cSrcweir 		{
623*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
624*cdf0e10cSrcweir 			if ( StatementList::bReadingCommands )
625*cdf0e10cSrcweir 				m_pDbgWin->AddText( "Reading Commands " );
626*cdf0e10cSrcweir 			if ( StatementList::bExecuting )
627*cdf0e10cSrcweir 				m_pDbgWin->AddText( "In Execute " );
628*cdf0e10cSrcweir 			if ( StatementList::IsInReschedule() )
629*cdf0e10cSrcweir 			{
630*cdf0e10cSrcweir 				m_pDbgWin->AddText( "In Reschedule FocusWindow: 0x" );
631*cdf0e10cSrcweir 				m_pDbgWin->AddText(
632*cdf0e10cSrcweir 				        String::CreateFromInt64(
633*cdf0e10cSrcweir 				            sal::static_int_cast< sal_Int64 >(
634*cdf0e10cSrcweir 				                reinterpret_cast< sal_IntPtr >(GetpApp()->GetFocusWindow())),
635*cdf0e10cSrcweir 				            16 ));
636*cdf0e10cSrcweir                                 m_pDbgWin->AddText( " " );
637*cdf0e10cSrcweir 			}
638*cdf0e10cSrcweir 			m_pDbgWin->AddText( "Leaving CommandHdl\n" );
639*cdf0e10cSrcweir #endif
640*cdf0e10cSrcweir 			return 0;        // Garnicht erst irgendwelchen bl�dsinn machen
641*cdf0e10cSrcweir 		}
642*cdf0e10cSrcweir 
643*cdf0e10cSrcweir 	while( StatementList::pFirst && ( !StatementList::bReadingCommands || StatementList::bDying ) )
644*cdf0e10cSrcweir 		// Schleift hier bis Befehl nicht zur�ckkommt,
645*cdf0e10cSrcweir 		// Wird dann rekursiv �ber IdleHdl und PostUserEvent aufgerufen.
646*cdf0e10cSrcweir 	{
647*cdf0e10cSrcweir         m_bInsideExecutionLoop = sal_True;
648*cdf0e10cSrcweir #ifdef TIMERIDLE
649*cdf0e10cSrcweir         m_aIdleTimer.Stop();
650*cdf0e10cSrcweir         m_aIdleTimer.Start();
651*cdf0e10cSrcweir #endif
652*cdf0e10cSrcweir 		StatementList *pC = StatementList::pFirst;
653*cdf0e10cSrcweir 
654*cdf0e10cSrcweir //      MessBox MB( pMainWin, WB_DEF_OK|WB_OK, "Pause ...", "... und Weiter" );
655*cdf0e10cSrcweir //      MB.Execute();
656*cdf0e10cSrcweir 
657*cdf0e10cSrcweir         if ( !StatementList::bCatchGPF )
658*cdf0e10cSrcweir         {
659*cdf0e10cSrcweir 			if (!pC->CheckWindowWait()  ||  !pC->Execute())
660*cdf0e10cSrcweir 			{
661*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
662*cdf0e10cSrcweir 				m_pDbgWin->AddText( "Leaving CommandHdl\n" );
663*cdf0e10cSrcweir #endif
664*cdf0e10cSrcweir 				return 0;        // So dass die App nochmal �ne chance bekommt
665*cdf0e10cSrcweir 			}
666*cdf0e10cSrcweir         }
667*cdf0e10cSrcweir         else
668*cdf0e10cSrcweir         {
669*cdf0e10cSrcweir 		    try
670*cdf0e10cSrcweir 		    {
671*cdf0e10cSrcweir 			    if (!pC->CheckWindowWait()  ||  !pC->Execute())
672*cdf0e10cSrcweir 			    {
673*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
674*cdf0e10cSrcweir 				    m_pDbgWin->AddText( "Leaving CommandHdl\n" );
675*cdf0e10cSrcweir #endif
676*cdf0e10cSrcweir 				    return 0;        // So dass die App nochmal �ne chance bekommt
677*cdf0e10cSrcweir 			    }
678*cdf0e10cSrcweir 		    }
679*cdf0e10cSrcweir 		    catch( ... )
680*cdf0e10cSrcweir 		    {
681*cdf0e10cSrcweir 			    if ( !StatementFlow::bUseIPC )
682*cdf0e10cSrcweir 				    throw;	// aus der Hilfe heraus nicht leise abbrechen
683*cdf0e10cSrcweir 
684*cdf0e10cSrcweir 			    try
685*cdf0e10cSrcweir 			    {
686*cdf0e10cSrcweir 				    ModelessDialog *pDlg = new ModelessDialog(NULL);
687*cdf0e10cSrcweir 				    pDlg->SetOutputSizePixel(Size(150,0));
688*cdf0e10cSrcweir 				    pDlg->SetText( String ( TTProperties::GetSvtResId( TT_GPF ) ) );
689*cdf0e10cSrcweir 				    pDlg->Show();
690*cdf0e10cSrcweir 				    DBG_ERROR("GPF");
691*cdf0e10cSrcweir 				    pC->ReportError( GEN_RES_STR0( S_GPF_ABORT ) );
692*cdf0e10cSrcweir 				    StatementList::bDying = sal_True;
693*cdf0e10cSrcweir 				    while ( StatementList::pFirst )			// Kommandos werden �bersprungen
694*cdf0e10cSrcweir 					    StatementList::NormalReschedule();
695*cdf0e10cSrcweir 				    delete pDlg;
696*cdf0e10cSrcweir 			    }
697*cdf0e10cSrcweir 			    catch ( ... )
698*cdf0e10cSrcweir 			    {
699*cdf0e10cSrcweir 				    Application::Quit();
700*cdf0e10cSrcweir 			    }
701*cdf0e10cSrcweir 			    Application::Quit();
702*cdf0e10cSrcweir 		    }
703*cdf0e10cSrcweir         }
704*cdf0e10cSrcweir 
705*cdf0e10cSrcweir /*  #i46293# remove reschedules
706*cdf0e10cSrcweir 		for (int xx = 1;xx < 20;xx++)
707*cdf0e10cSrcweir 			StatementList::NormalReschedule();
708*cdf0e10cSrcweir */
709*cdf0e10cSrcweir         m_bInsideExecutionLoop = sal_False;
710*cdf0e10cSrcweir 	}
711*cdf0e10cSrcweir 
712*cdf0e10cSrcweir 	StatementList::aWindowWaitUId = rtl::OString();  // Warten r�cksetzen, da handler sowieso verlassen wird
713*cdf0e10cSrcweir 
714*cdf0e10cSrcweir /*    if( StatementList::pFirst && !StatementList::bReadingCommands )
715*cdf0e10cSrcweir 		 // Abfrage n�tig, da andere CommandHdl aktiv sein k�nnen oder
716*cdf0e10cSrcweir 		 // neue Commands gelesen werden k�nnen
717*cdf0e10cSrcweir 	{
718*cdf0e10cSrcweir 		delete StatementList::pFirst;     // L�scht die gesamte Liste !!
719*cdf0e10cSrcweir 		StatementList::pFirst   = NULL;
720*cdf0e10cSrcweir 		StatementList::pCurrent = NULL;   // Nur zur Sicherheit, sollte hier sowieso NULL sein
721*cdf0e10cSrcweir 	}*/
722*cdf0e10cSrcweir 
723*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
724*cdf0e10cSrcweir 	m_pDbgWin->AddText( "Leaving CommandHdl\n" );
725*cdf0e10cSrcweir #endif
726*cdf0e10cSrcweir 	return 0;
727*cdf0e10cSrcweir }
728*cdf0e10cSrcweir 
729*cdf0e10cSrcweir IMPL_LINK( ImplRemoteControl, QueCommandsEvent, CommunicationLink*, pCL )
730*cdf0e10cSrcweir {
731*cdf0e10cSrcweir 	SvStream *pTemp = pCL->GetServiceData();
732*cdf0e10cSrcweir 	QueCommands( SI_IPCCommandBlock, pTemp );
733*cdf0e10cSrcweir 	delete pTemp;
734*cdf0e10cSrcweir 	return 0;
735*cdf0e10cSrcweir }
736*cdf0e10cSrcweir 
737*cdf0e10cSrcweir sal_Bool ImplRemoteControl::QueCommands( sal_uLong nServiceId, SvStream *pIn )
738*cdf0e10cSrcweir {
739*cdf0e10cSrcweir //    return sal_True;
740*cdf0e10cSrcweir 	sal_uInt16 nId;
741*cdf0e10cSrcweir 
742*cdf0e10cSrcweir 	if( !m_bIdleInserted )
743*cdf0e10cSrcweir 	{
744*cdf0e10cSrcweir #ifdef TIMERIDLE
745*cdf0e10cSrcweir         m_aIdleTimer.SetTimeoutHdl( LINK( this, ImplRemoteControl, IdleHdl ) );
746*cdf0e10cSrcweir         m_aIdleTimer.SetTimeout( 500 );
747*cdf0e10cSrcweir         m_aIdleTimer.Start();
748*cdf0e10cSrcweir #else
749*cdf0e10cSrcweir 		GetpApp()->InsertIdleHdl( LINK( this, ImplRemoteControl, IdleHdl ), 1 );
750*cdf0e10cSrcweir #endif
751*cdf0e10cSrcweir 		m_bIdleInserted = sal_True;
752*cdf0e10cSrcweir 	}
753*cdf0e10cSrcweir 
754*cdf0e10cSrcweir 
755*cdf0e10cSrcweir 	StatementList::bReadingCommands = sal_True;
756*cdf0e10cSrcweir 
757*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
758*cdf0e10cSrcweir 	if (!m_pDbgWin->bQuiet)
759*cdf0e10cSrcweir 		m_pDbgWin->Show();
760*cdf0e10cSrcweir 	m_pDbgWin->AddText( "Reading " );
761*cdf0e10cSrcweir 	m_pDbgWin->AddText( String::CreateFromInt64( nServiceId ) );
762*cdf0e10cSrcweir 	m_pDbgWin->AddText( " :\n" );
763*cdf0e10cSrcweir #endif
764*cdf0e10cSrcweir 
765*cdf0e10cSrcweir 	if( nServiceId != SI_IPCCommandBlock && nServiceId != SI_DirectCommandBlock )
766*cdf0e10cSrcweir 	{
767*cdf0e10cSrcweir 		DBG_ERROR1( "Ung�ltiger Request :%i", (int)nServiceId );
768*cdf0e10cSrcweir 		return sal_False;
769*cdf0e10cSrcweir 	}
770*cdf0e10cSrcweir 
771*cdf0e10cSrcweir 	SCmdStream *pCmdStream = new SCmdStream(pIn);
772*cdf0e10cSrcweir 
773*cdf0e10cSrcweir 	pCmdStream->Read( nId );
774*cdf0e10cSrcweir 	while( !pIn->IsEof() )
775*cdf0e10cSrcweir 	{
776*cdf0e10cSrcweir 		switch( nId )
777*cdf0e10cSrcweir 		{
778*cdf0e10cSrcweir 			case SICommand:
779*cdf0e10cSrcweir 			{
780*cdf0e10cSrcweir 				new StatementCommand( pCmdStream );     // Wird im Konstruktor an Liste angeh�ngt
781*cdf0e10cSrcweir 				break;
782*cdf0e10cSrcweir 			}
783*cdf0e10cSrcweir 			case SIControl:
784*cdf0e10cSrcweir 			case SIStringControl:
785*cdf0e10cSrcweir 			{
786*cdf0e10cSrcweir 				new StatementControl( pCmdStream, nId );     // Wird im Konstruktor an Liste angeh�ngt
787*cdf0e10cSrcweir 				break;
788*cdf0e10cSrcweir 			}
789*cdf0e10cSrcweir 			case SISlot:
790*cdf0e10cSrcweir 			{
791*cdf0e10cSrcweir 				new StatementSlot( pCmdStream );    // Wird im Konstruktor an Liste angeh�ngt
792*cdf0e10cSrcweir 				break;
793*cdf0e10cSrcweir 			}
794*cdf0e10cSrcweir 			case SIUnoSlot:
795*cdf0e10cSrcweir 			{
796*cdf0e10cSrcweir 				new StatementUnoSlot( pCmdStream );    // Wird im Konstruktor an Liste angeh�ngt
797*cdf0e10cSrcweir 				break;
798*cdf0e10cSrcweir 			}
799*cdf0e10cSrcweir 			case SIFlow:
800*cdf0e10cSrcweir 			{
801*cdf0e10cSrcweir 				new StatementFlow( nServiceId, pCmdStream, this );              // Wird im Konstruktor an Liste angeh�ngt
802*cdf0e10cSrcweir 				break;
803*cdf0e10cSrcweir 			}
804*cdf0e10cSrcweir 			default:
805*cdf0e10cSrcweir 				DBG_ERROR1( "Unbekannter Request Nr:%i", nId );
806*cdf0e10cSrcweir 				break;
807*cdf0e10cSrcweir 		}
808*cdf0e10cSrcweir 		if( !pIn->IsEof() )
809*cdf0e10cSrcweir 			pCmdStream->Read( nId );
810*cdf0e10cSrcweir 		else {
811*cdf0e10cSrcweir 			DBG_ERROR( "truncated input stream" );
812*cdf0e10cSrcweir         }
813*cdf0e10cSrcweir 	}
814*cdf0e10cSrcweir 
815*cdf0e10cSrcweir 	StatementList::bReadingCommands = sal_False;
816*cdf0e10cSrcweir 
817*cdf0e10cSrcweir 	delete pCmdStream;
818*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
819*cdf0e10cSrcweir 	m_pDbgWin->AddText( "Done Reading " );
820*cdf0e10cSrcweir 	m_pDbgWin->AddText( String::CreateFromInt64( nServiceId ) );
821*cdf0e10cSrcweir 	m_pDbgWin->AddText( " :\n" );
822*cdf0e10cSrcweir #endif
823*cdf0e10cSrcweir     if ( !m_bInsideExecutionLoop )
824*cdf0e10cSrcweir     {
825*cdf0e10cSrcweir #ifdef DEBUG
826*cdf0e10cSrcweir         m_pDbgWin->AddText( "Posting Event for CommandHdl.\n" );
827*cdf0e10cSrcweir #endif
828*cdf0e10cSrcweir 
829*cdf0e10cSrcweir         GetpApp()->PostUserEvent( LINK( this, ImplRemoteControl, CommandHdl ) );
830*cdf0e10cSrcweir     }
831*cdf0e10cSrcweir #ifdef DEBUG
832*cdf0e10cSrcweir     else
833*cdf0e10cSrcweir         m_bInsideExecutionLoop = sal_True;
834*cdf0e10cSrcweir #endif
835*cdf0e10cSrcweir 	return sal_True;
836*cdf0e10cSrcweir } // sal_Bool ImplRemoteControl::QueCommands( sal_uLong nServiceId, SvStream *pIn )
837*cdf0e10cSrcweir 
838*cdf0e10cSrcweir 
839*cdf0e10cSrcweir SvStream* ImplRemoteControl::GetReturnStream()
840*cdf0e10cSrcweir {
841*cdf0e10cSrcweir 	SvStream* pTemp = pRetStream;
842*cdf0e10cSrcweir 	pRetStream = NULL;
843*cdf0e10cSrcweir 	return pTemp;
844*cdf0e10cSrcweir }
845*cdf0e10cSrcweir 
846*cdf0e10cSrcweir ImplRemoteControl::ImplRemoteControl()
847*cdf0e10cSrcweir : m_bIdleInserted( sal_False )
848*cdf0e10cSrcweir , m_bInsideExecutionLoop( sal_False )
849*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
850*cdf0e10cSrcweir , m_pDbgWin(NULL)
851*cdf0e10cSrcweir #endif
852*cdf0e10cSrcweir , pRetStream(NULL)
853*cdf0e10cSrcweir {
854*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
855*cdf0e10cSrcweir 	if ( RemoteControlCommunicationManager::GetPort() != TT_NO_PORT_DEFINED || RemoteControlCommunicationManager::nComm )
856*cdf0e10cSrcweir 	{
857*cdf0e10cSrcweir 		m_pDbgWin = new EditWindow( NULL, CUniString("Debug Window"), WB_VSCROLL );
858*cdf0e10cSrcweir 		m_pDbgWin->bQuiet = sal_True;
859*cdf0e10cSrcweir 		m_pDbgWin->Hide();
860*cdf0e10cSrcweir 		m_pDbgWin->bQuiet = sal_False;
861*cdf0e10cSrcweir         m_pDbgWin->Show();
862*cdf0e10cSrcweir 
863*cdf0e10cSrcweir 		StatementList::m_pDbgWin = m_pDbgWin;
864*cdf0e10cSrcweir 	}
865*cdf0e10cSrcweir #endif
866*cdf0e10cSrcweir 	if ( RemoteControlCommunicationManager::GetPort() == TT_NO_PORT_DEFINED )
867*cdf0e10cSrcweir 		pServiceMgr = NULL;
868*cdf0e10cSrcweir 	else
869*cdf0e10cSrcweir 	{
870*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
871*cdf0e10cSrcweir 		pServiceMgr = new RemoteControlCommunicationManager( m_pDbgWin );
872*cdf0e10cSrcweir #else
873*cdf0e10cSrcweir 		pServiceMgr = new RemoteControlCommunicationManager();
874*cdf0e10cSrcweir #endif
875*cdf0e10cSrcweir 		pServiceMgr->SetDataReceivedHdl( LINK( this, ImplRemoteControl, QueCommandsEvent ) );
876*cdf0e10cSrcweir 		pServiceMgr->StartCommunication();
877*cdf0e10cSrcweir 
878*cdf0e10cSrcweir #ifdef DBG_UTIL
879*cdf0e10cSrcweir 		DbgSetPrintTestTool( TestToolDebugPrint );
880*cdf0e10cSrcweir 		// first change it, so we get the original Pointer
881*cdf0e10cSrcweir 		StatementCommand::pOriginal_osl_DebugMessageFunc = osl_setDebugMessageFunc( osl_TestToolDebugPrint );
882*cdf0e10cSrcweir 		if ( DbgGetErrorOut() != DBG_OUT_TESTTOOL )
883*cdf0e10cSrcweir 			osl_setDebugMessageFunc( StatementCommand::pOriginal_osl_DebugMessageFunc );
884*cdf0e10cSrcweir #endif
885*cdf0e10cSrcweir 	}
886*cdf0e10cSrcweir 	if ( RemoteControlCommunicationManager::nComm )
887*cdf0e10cSrcweir 		new ExtraIdle( this );		// Setzt die Bearbeitung wieder auf
888*cdf0e10cSrcweir }
889*cdf0e10cSrcweir 
890*cdf0e10cSrcweir ImplRemoteControl::~ImplRemoteControl()
891*cdf0e10cSrcweir {
892*cdf0e10cSrcweir     if ( MacroRecorder::HasMacroRecorder() )
893*cdf0e10cSrcweir         MacroRecorder::GetMacroRecorder()->SetActionRecord( sal_False );   // Will delete MacroRecorder if necessary
894*cdf0e10cSrcweir 
895*cdf0e10cSrcweir 
896*cdf0e10cSrcweir     StatementList::bDying = sal_True;
897*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
898*cdf0e10cSrcweir 	if ( m_pDbgWin )
899*cdf0e10cSrcweir 		m_pDbgWin->bQuiet = sal_True;	// Keine Ausgabe mehr im Debugwindow
900*cdf0e10cSrcweir #endif
901*cdf0e10cSrcweir 
902*cdf0e10cSrcweir #ifdef DBG_UTIL
903*cdf0e10cSrcweir 	// Zur�cksetzen, so da� nachfolgende Assertions nicht verloren gehen
904*cdf0e10cSrcweir 	DbgSetPrintTestTool( NULL );
905*cdf0e10cSrcweir     osl_setDebugMessageFunc( StatementCommand::pOriginal_osl_DebugMessageFunc );
906*cdf0e10cSrcweir #endif
907*cdf0e10cSrcweir 
908*cdf0e10cSrcweir 	if ( StatementList::pFirst )
909*cdf0e10cSrcweir 	{	// Es sind noch Kommandos da, also auch eine M�glichkeit zur�ckzusenden.
910*cdf0e10cSrcweir 		StatementList::pFirst->ReportError( GEN_RES_STR0( S_APP_SHUTDOWN ) );
911*cdf0e10cSrcweir 		while ( StatementList::pFirst )				// Kommandos werden �bersprungen
912*cdf0e10cSrcweir 			StatementList::NormalReschedule();		// Fehler zur�ckgeschickt
913*cdf0e10cSrcweir 	}
914*cdf0e10cSrcweir 
915*cdf0e10cSrcweir 	if ( pServiceMgr )
916*cdf0e10cSrcweir 		pServiceMgr->StopCommunication();
917*cdf0e10cSrcweir 
918*cdf0e10cSrcweir     if ( GetTTSettings()->pDisplayHidWin )
919*cdf0e10cSrcweir     {
920*cdf0e10cSrcweir         delete (Window*)(GetTTSettings()->pDisplayHidWin);
921*cdf0e10cSrcweir         GetTTSettings()->pDisplayHidWin = NULL;
922*cdf0e10cSrcweir     }
923*cdf0e10cSrcweir     if ( GetTTSettings()->pTranslateWin )
924*cdf0e10cSrcweir     {
925*cdf0e10cSrcweir         delete (Window*)(GetTTSettings()->pTranslateWin);
926*cdf0e10cSrcweir         GetTTSettings()->pTranslateWin = NULL;
927*cdf0e10cSrcweir     }
928*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
929*cdf0e10cSrcweir 	delete m_pDbgWin;
930*cdf0e10cSrcweir #endif
931*cdf0e10cSrcweir 	if( m_bIdleInserted )
932*cdf0e10cSrcweir 	{
933*cdf0e10cSrcweir #ifdef TIMERIDLE
934*cdf0e10cSrcweir         m_aIdleTimer.Stop();
935*cdf0e10cSrcweir #else
936*cdf0e10cSrcweir 		GetpApp()->RemoveIdleHdl( LINK( this, ImplRemoteControl, IdleHdl ) );
937*cdf0e10cSrcweir #endif
938*cdf0e10cSrcweir 		m_bIdleInserted = sal_False;
939*cdf0e10cSrcweir 	}
940*cdf0e10cSrcweir 	delete pServiceMgr;
941*cdf0e10cSrcweir }
942*cdf0e10cSrcweir 
943*cdf0e10cSrcweir RemoteControl::RemoteControl()
944*cdf0e10cSrcweir {
945*cdf0e10cSrcweir 	pImpl = new ImplRemoteControl;
946*cdf0e10cSrcweir }
947*cdf0e10cSrcweir 
948*cdf0e10cSrcweir RemoteControl::~RemoteControl()
949*cdf0e10cSrcweir {
950*cdf0e10cSrcweir 	delete pImpl;
951*cdf0e10cSrcweir }
952*cdf0e10cSrcweir 
953*cdf0e10cSrcweir static ::osl::Mutex aMutex;
954*cdf0e10cSrcweir static RemoteControl* pRemoteControl = 0;
955*cdf0e10cSrcweir extern "C" void CreateRemoteControl()
956*cdf0e10cSrcweir {
957*cdf0e10cSrcweir 	if ( !pRemoteControl )
958*cdf0e10cSrcweir 	{
959*cdf0e10cSrcweir 		::osl::MutexGuard aGuard( aMutex );
960*cdf0e10cSrcweir 		if ( !pRemoteControl )
961*cdf0e10cSrcweir 			pRemoteControl = new RemoteControl();
962*cdf0e10cSrcweir 	}
963*cdf0e10cSrcweir }
964*cdf0e10cSrcweir 
965*cdf0e10cSrcweir extern "C" void DestroyRemoteControl()
966*cdf0e10cSrcweir {
967*cdf0e10cSrcweir 	::osl::MutexGuard aGuard( aMutex );
968*cdf0e10cSrcweir 	delete pRemoteControl;
969*cdf0e10cSrcweir 	pRemoteControl = 0;
970*cdf0e10cSrcweir }
971*cdf0e10cSrcweir 
972*cdf0e10cSrcweir extern "C" void CreateEventLogger()
973*cdf0e10cSrcweir {
974*cdf0e10cSrcweir     MacroRecorder::GetMacroRecorder()->SetActionLog();
975*cdf0e10cSrcweir }
976*cdf0e10cSrcweir 
977*cdf0e10cSrcweir extern "C" void DestroyEventLogger()
978*cdf0e10cSrcweir {
979*cdf0e10cSrcweir     MacroRecorder::GetMacroRecorder()->SetActionLog( sal_False );   // Will delete MacroRecorder if necessary
980*cdf0e10cSrcweir }
981*cdf0e10cSrcweir 
982