xref: /aoo41x/main/sfx2/source/appl/appdde.cxx (revision d119d52d)
1*d119d52dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*d119d52dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*d119d52dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*d119d52dSAndrew Rist  * distributed with this work for additional information
6*d119d52dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*d119d52dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*d119d52dSAndrew Rist  * "License"); you may not use this file except in compliance
9*d119d52dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*d119d52dSAndrew Rist  *
11*d119d52dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*d119d52dSAndrew Rist  *
13*d119d52dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*d119d52dSAndrew Rist  * software distributed under the License is distributed on an
15*d119d52dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*d119d52dSAndrew Rist  * KIND, either express or implied.  See the License for the
17*d119d52dSAndrew Rist  * specific language governing permissions and limitations
18*d119d52dSAndrew Rist  * under the License.
19*d119d52dSAndrew Rist  *
20*d119d52dSAndrew Rist  *************************************************************/
21*d119d52dSAndrew Rist 
22*d119d52dSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sfx2.hxx"
26cdf0e10cSrcweir #include <vcl/wrkwin.hxx>
27cdf0e10cSrcweir #include <svl/rectitem.hxx>
28cdf0e10cSrcweir #include <svl/eitem.hxx>
29cdf0e10cSrcweir #include <svl/intitem.hxx>
30cdf0e10cSrcweir #include <basic/sbstar.hxx>
31cdf0e10cSrcweir #include <svl/stritem.hxx>
32cdf0e10cSrcweir #include <svl/svdde.hxx>
33cdf0e10cSrcweir #include <sfx2/lnkbase.hxx>
34cdf0e10cSrcweir #include <sfx2/linkmgr.hxx>
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #include <tools/urlobj.hxx>
37cdf0e10cSrcweir #include <tools/diagnose_ex.h>
38cdf0e10cSrcweir #include <unotools/pathoptions.hxx>
39cdf0e10cSrcweir #ifndef GCC
40cdf0e10cSrcweir #endif
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #include <sfx2/app.hxx>
43cdf0e10cSrcweir #include "appdata.hxx"
44cdf0e10cSrcweir #include <sfx2/objsh.hxx>
45cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
46cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
47cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
48cdf0e10cSrcweir #include "sfxtypes.hxx"
49cdf0e10cSrcweir #include <sfx2/sfxsids.hrc>
50cdf0e10cSrcweir #include "helper.hxx"
51cdf0e10cSrcweir #include <sfx2/docfile.hxx>
52cdf0e10cSrcweir 
53cdf0e10cSrcweir //========================================================================
54cdf0e10cSrcweir 
55cdf0e10cSrcweir String SfxDdeServiceName_Impl( const String& sIn )
56cdf0e10cSrcweir {
57cdf0e10cSrcweir 	ByteString sTemp = U2S( sIn );
58cdf0e10cSrcweir 	ByteString sReturn;
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 	for ( sal_uInt16 n = sTemp.Len(); n; --n )
61cdf0e10cSrcweir 		if ( sTemp.Copy( n-1, 1 ).IsAlphaNumericAscii() )
62cdf0e10cSrcweir 			sReturn += sTemp.GetChar(n-1);
63cdf0e10cSrcweir 
64cdf0e10cSrcweir 	return S2U( sReturn );
65cdf0e10cSrcweir }
66cdf0e10cSrcweir 
67cdf0e10cSrcweir 
68cdf0e10cSrcweir class ImplDdeService : public DdeService
69cdf0e10cSrcweir {
70cdf0e10cSrcweir public:
71cdf0e10cSrcweir 	ImplDdeService( const String& rNm )
72cdf0e10cSrcweir 		: DdeService( rNm )
73cdf0e10cSrcweir 	{}
74cdf0e10cSrcweir 	virtual sal_Bool MakeTopic( const String& );
75cdf0e10cSrcweir 
76cdf0e10cSrcweir 	virtual String	Topics();
77cdf0e10cSrcweir //	virtual String	Formats();
78cdf0e10cSrcweir //	virtual String	SysItems();
79cdf0e10cSrcweir //	virtual String	Status();
80cdf0e10cSrcweir 
81cdf0e10cSrcweir 	virtual sal_Bool SysTopicExecute( const String* pStr );
82cdf0e10cSrcweir };
83cdf0e10cSrcweir 
84cdf0e10cSrcweir class SfxDdeTriggerTopic_Impl : public DdeTopic
85cdf0e10cSrcweir {
86cdf0e10cSrcweir public:
87cdf0e10cSrcweir 	SfxDdeTriggerTopic_Impl()
88cdf0e10cSrcweir 	: DdeTopic( DEFINE_CONST_UNICODE("TRIGGER") )
89cdf0e10cSrcweir 	{}
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 	virtual sal_Bool Execute( const String* );
92cdf0e10cSrcweir };
93cdf0e10cSrcweir 
94cdf0e10cSrcweir class SfxDdeDocTopic_Impl : public DdeTopic
95cdf0e10cSrcweir {
96cdf0e10cSrcweir public:
97cdf0e10cSrcweir 	SfxObjectShell* pSh;
98cdf0e10cSrcweir 	DdeData aData;
99cdf0e10cSrcweir 	::com::sun::star::uno::Sequence< sal_Int8 > aSeq;
100cdf0e10cSrcweir 
101cdf0e10cSrcweir 	SfxDdeDocTopic_Impl( SfxObjectShell* pShell )
102cdf0e10cSrcweir 		: DdeTopic( pShell->GetTitle(SFX_TITLE_FULLNAME) ), pSh( pShell )
103cdf0e10cSrcweir 	{}
104cdf0e10cSrcweir 
105cdf0e10cSrcweir 	virtual DdeData* Get( sal_uIntPtr );
106cdf0e10cSrcweir 	virtual sal_Bool Put( const DdeData* );
107cdf0e10cSrcweir 	virtual sal_Bool Execute( const String* );
108cdf0e10cSrcweir 	virtual sal_Bool StartAdviseLoop();
109cdf0e10cSrcweir 	virtual sal_Bool MakeItem( const String& rItem );
110cdf0e10cSrcweir 
111cdf0e10cSrcweir // wird benoetigt?
112cdf0e10cSrcweir //	virtual void Connect( long n );
113cdf0e10cSrcweir //	virtual void Disconnect( long n );
114cdf0e10cSrcweir //	virtual void StopAdviseLoop();
115cdf0e10cSrcweir 
116cdf0e10cSrcweir };
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 
119cdf0e10cSrcweir SV_DECL_PTRARR( SfxDdeDocTopics_Impl, SfxDdeDocTopic_Impl *, 4, 4 )
120cdf0e10cSrcweir SV_IMPL_PTRARR( SfxDdeDocTopics_Impl, SfxDdeDocTopic_Impl *)
121cdf0e10cSrcweir 
122cdf0e10cSrcweir //========================================================================
123cdf0e10cSrcweir 
124cdf0e10cSrcweir sal_Bool SfxAppEvent_Impl( ApplicationEvent &rAppEvent,
125cdf0e10cSrcweir 					   const String &rCmd, const String &rEvent )
126cdf0e10cSrcweir 
127cdf0e10cSrcweir /*	[Beschreibung]
128cdf0e10cSrcweir 
129cdf0e10cSrcweir 	Pr"uft, ob 'rCmd' das Event 'rEvent' ist (ohne '(') und baut
130cdf0e10cSrcweir 	aus diesem dann ein <ApplicationEvent> zusammen, das per
131cdf0e10cSrcweir 	<Application::AppEvent()> ausgef"uhrt werden kann. Ist 'rCmd' das
132cdf0e10cSrcweir 	angegegeben Event 'rEvent', dann wird TRUE zur"uckgegeben, sonst FALSE.
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 	[Beispiel]
136cdf0e10cSrcweir 
137cdf0e10cSrcweir 	rCmd = "Open(\"d:\doc\doc.sdw\")"
138cdf0e10cSrcweir 	rEvent = "Open"
139cdf0e10cSrcweir */
140cdf0e10cSrcweir 
141cdf0e10cSrcweir {
142cdf0e10cSrcweir 	String aEvent( rEvent );
143cdf0e10cSrcweir 	aEvent += '(';
144cdf0e10cSrcweir     if ( rCmd.CompareIgnoreCaseToAscii( aEvent, aEvent.Len() ) == COMPARE_EQUAL )
145cdf0e10cSrcweir 	{
146cdf0e10cSrcweir 		String aData( rCmd );
147cdf0e10cSrcweir 		aData.Erase( 0, aEvent.Len() );
148cdf0e10cSrcweir 		if ( aData.Len() > 2 )
149cdf0e10cSrcweir 		{
150cdf0e10cSrcweir 			// in das ApplicationEvent-Format wandeln
151cdf0e10cSrcweir 			aData.Erase( aData.Len()-1, 1 );
152cdf0e10cSrcweir 			for ( sal_uInt16 n = 0; n < aData.Len(); ++n )
153cdf0e10cSrcweir 			{
154cdf0e10cSrcweir 				if ( aData.GetChar(n) == 0x0022 ) // " = 22h
155cdf0e10cSrcweir 					for ( ; aData.GetChar(++n) != 0x0022 ; )
156cdf0e10cSrcweir 						/* empty loop */ ;
157cdf0e10cSrcweir 				else if ( aData.GetChar(n) == 0x0020 ) // SPACE = 20h
158cdf0e10cSrcweir 					aData.SetChar(n, '\n');
159cdf0e10cSrcweir 			}
160cdf0e10cSrcweir 			aData.EraseAllChars( 0x0022 );
161cdf0e10cSrcweir 			ApplicationAddress aAddr;
162cdf0e10cSrcweir 			rAppEvent = ApplicationEvent( String(), aAddr, U2S(rEvent), aData );
163cdf0e10cSrcweir 			return sal_True;
164cdf0e10cSrcweir 		}
165cdf0e10cSrcweir 	}
166cdf0e10cSrcweir 
167cdf0e10cSrcweir 	return sal_False;
168cdf0e10cSrcweir }
169cdf0e10cSrcweir 
170cdf0e10cSrcweir //-------------------------------------------------------------------------
171cdf0e10cSrcweir 
172cdf0e10cSrcweir long SfxApplication::DdeExecute
173cdf0e10cSrcweir (
174cdf0e10cSrcweir 	const String&	rCmd		// in unserer BASIC-Syntax formuliert
175cdf0e10cSrcweir )
176cdf0e10cSrcweir 
177cdf0e10cSrcweir /*	[Beschreibung]
178cdf0e10cSrcweir 
179cdf0e10cSrcweir 	Diese Methode kann vom Applikationsentwickler "uberladen werden,
180cdf0e10cSrcweir 	um an seine SfxApplication-Subklasse gerichtete DDE-Kommandos
181cdf0e10cSrcweir 	zu empfangen.
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 	Die Basisimplementierung versteht die API-Funktionalit"at der
184cdf0e10cSrcweir 	betreffenden SfxApplication-Subklasse in BASIC-Syntax. R"uckgabewerte
185cdf0e10cSrcweir 	k"onnen dabei leider nicht "ubertragen werden.
186cdf0e10cSrcweir */
187cdf0e10cSrcweir 
188cdf0e10cSrcweir {
189cdf0e10cSrcweir 	// Print oder Open-Event?
190cdf0e10cSrcweir 	ApplicationEvent aAppEvent;
191cdf0e10cSrcweir 	if ( SfxAppEvent_Impl( aAppEvent, rCmd, DEFINE_CONST_UNICODE("Print") ) ||
192cdf0e10cSrcweir 		 SfxAppEvent_Impl( aAppEvent, rCmd, DEFINE_CONST_UNICODE("Open") ) )
193cdf0e10cSrcweir 		GetpApp()->AppEvent( aAppEvent );
194cdf0e10cSrcweir 	else
195cdf0e10cSrcweir 	{
196cdf0e10cSrcweir 		// alle anderen per BASIC
197cdf0e10cSrcweir 		StarBASIC* pBasic = GetBasic();
198cdf0e10cSrcweir         ENSURE_OR_RETURN( pBasic, "where's my basic?", 0 );
199cdf0e10cSrcweir 		SbxVariable* pRet = pBasic->Execute( rCmd );
200cdf0e10cSrcweir 		if( !pRet )
201cdf0e10cSrcweir 		{
202cdf0e10cSrcweir 			SbxBase::ResetError();
203cdf0e10cSrcweir 			return 0;
204cdf0e10cSrcweir 		}
205cdf0e10cSrcweir 	}
206cdf0e10cSrcweir 	return 1;
207cdf0e10cSrcweir }
208cdf0e10cSrcweir 
209cdf0e10cSrcweir //--------------------------------------------------------------------
210cdf0e10cSrcweir 
211cdf0e10cSrcweir long SfxApplication::DdeGetData
212cdf0e10cSrcweir (
213cdf0e10cSrcweir 	const String&,				// das anzusprechende Item
214cdf0e10cSrcweir 	const String&,				// in: Format
215cdf0e10cSrcweir 	::com::sun::star::uno::Any& // out: angeforderte Daten
216cdf0e10cSrcweir )
217cdf0e10cSrcweir 
218cdf0e10cSrcweir /*	[Beschreibung]
219cdf0e10cSrcweir 
220cdf0e10cSrcweir 	Diese Methode kann vom Applikationsentwickler "uberladen werden,
221cdf0e10cSrcweir 	um an seine SfxApplication-Subklasse gerichtete DDE-Daten-Anforderungen
222cdf0e10cSrcweir 	zu empfangen.
223cdf0e10cSrcweir 
224cdf0e10cSrcweir 	Die Basisimplementierung liefert keine Daten und gibt 0 zur"uck.
225cdf0e10cSrcweir */
226cdf0e10cSrcweir 
227cdf0e10cSrcweir {
228cdf0e10cSrcweir 	return 0;
229cdf0e10cSrcweir }
230cdf0e10cSrcweir 
231cdf0e10cSrcweir //--------------------------------------------------------------------
232cdf0e10cSrcweir 
233cdf0e10cSrcweir long SfxApplication::DdeSetData
234cdf0e10cSrcweir (
235cdf0e10cSrcweir 	const String&,                    // das anzusprechende Item
236cdf0e10cSrcweir 	const String&,				      // in: Format
237cdf0e10cSrcweir 	const ::com::sun::star::uno::Any& // out: angeforderte Daten
238cdf0e10cSrcweir )
239cdf0e10cSrcweir 
240cdf0e10cSrcweir /*	[Beschreibung]
241cdf0e10cSrcweir 
242cdf0e10cSrcweir 	Diese Methode kann vom Applikationsentwickler "uberladen werden,
243cdf0e10cSrcweir 	um an seine SfxApplication-Subklasse gerichtete DDE-Daten
244cdf0e10cSrcweir 	zu empfangen.
245cdf0e10cSrcweir 
246cdf0e10cSrcweir 	Die Basisimplementierung nimmt keine Daten entgegen und liefert 0 zur"uck.
247cdf0e10cSrcweir */
248cdf0e10cSrcweir 
249cdf0e10cSrcweir {
250cdf0e10cSrcweir 	return 0;
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir //--------------------------------------------------------------------
254cdf0e10cSrcweir 
255cdf0e10cSrcweir ::sfx2::SvLinkSource* SfxApplication::DdeCreateLinkSource
256cdf0e10cSrcweir (
257cdf0e10cSrcweir 	const String&	   // das zu erzeugende Item
258cdf0e10cSrcweir )
259cdf0e10cSrcweir 
260cdf0e10cSrcweir /*	[Beschreibung]
261cdf0e10cSrcweir 
262cdf0e10cSrcweir 	Diese Methode kann vom Applikationsentwickler "uberladen werden,
263cdf0e10cSrcweir 	um an seiner SfxApplication-Subklasse einen DDE-Hotlink einzurichten
264cdf0e10cSrcweir 
265cdf0e10cSrcweir 	Die Basisimplementierung erzeugt keinen und liefert 0 zur"uck.
266cdf0e10cSrcweir */
267cdf0e10cSrcweir 
268cdf0e10cSrcweir {
269cdf0e10cSrcweir 	return 0;
270cdf0e10cSrcweir }
271cdf0e10cSrcweir 
272cdf0e10cSrcweir //========================================================================
273cdf0e10cSrcweir 
274cdf0e10cSrcweir long SfxObjectShell::DdeExecute
275cdf0e10cSrcweir (
276cdf0e10cSrcweir 	const String&	rCmd		// in unserer BASIC-Syntax formuliert
277cdf0e10cSrcweir )
278cdf0e10cSrcweir 
279cdf0e10cSrcweir /*	[Beschreibung]
280cdf0e10cSrcweir 
281cdf0e10cSrcweir 	Diese Methode kann vom Applikationsentwickler "uberladen werden,
282cdf0e10cSrcweir 	um an seine SfxObjectShell-Subklasse gerichtete DDE-Kommandos
283cdf0e10cSrcweir 	zu empfangen.
284cdf0e10cSrcweir 
285cdf0e10cSrcweir 	Die Basisimplementierung f"uhrt nichts aus und liefert 0 zur"uck.
286cdf0e10cSrcweir */
287cdf0e10cSrcweir 
288cdf0e10cSrcweir {
289cdf0e10cSrcweir 	StarBASIC* pBasic = GetBasic();
290cdf0e10cSrcweir 	DBG_ASSERT( pBasic, "Wo ist mein Basic???" ) ;
291cdf0e10cSrcweir 	SbxVariable* pRet = pBasic->Execute( rCmd );
292cdf0e10cSrcweir 	if( !pRet )
293cdf0e10cSrcweir 	{
294cdf0e10cSrcweir 		SbxBase::ResetError();
295cdf0e10cSrcweir 		return 0;
296cdf0e10cSrcweir 	}
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 	return 1;
299cdf0e10cSrcweir }
300cdf0e10cSrcweir 
301cdf0e10cSrcweir //--------------------------------------------------------------------
302cdf0e10cSrcweir 
303cdf0e10cSrcweir long SfxObjectShell::DdeGetData
304cdf0e10cSrcweir (
305cdf0e10cSrcweir 	const String&,				// das anzusprechende Item
306cdf0e10cSrcweir 	const String&,				// in: Format
307cdf0e10cSrcweir 	::com::sun::star::uno::Any& // out: angeforderte Daten
308cdf0e10cSrcweir )
309cdf0e10cSrcweir 
310cdf0e10cSrcweir /*	[Beschreibung]
311cdf0e10cSrcweir 
312cdf0e10cSrcweir 	Diese Methode kann vom Applikationsentwickler "uberladen werden,
313cdf0e10cSrcweir 	um an seine SfxObjectShell-Subklasse gerichtete DDE-Daten-Anforderungen
314cdf0e10cSrcweir 	zu empfangen.
315cdf0e10cSrcweir 
316cdf0e10cSrcweir 	Die Basisimplementierung liefert keine Daten und gibt 0 zur"uck.
317cdf0e10cSrcweir */
318cdf0e10cSrcweir 
319cdf0e10cSrcweir {
320cdf0e10cSrcweir 	return 0;
321cdf0e10cSrcweir }
322cdf0e10cSrcweir 
323cdf0e10cSrcweir //--------------------------------------------------------------------
324cdf0e10cSrcweir 
325cdf0e10cSrcweir long SfxObjectShell::DdeSetData
326cdf0e10cSrcweir (
327cdf0e10cSrcweir 	const String&,					  // das anzusprechende Item
328cdf0e10cSrcweir 	const String&,					  // in: Format
329cdf0e10cSrcweir 	const ::com::sun::star::uno::Any& // out: angeforderte Daten
330cdf0e10cSrcweir )
331cdf0e10cSrcweir 
332cdf0e10cSrcweir /*	[Beschreibung]
333cdf0e10cSrcweir 
334cdf0e10cSrcweir 	Diese Methode kann vom Applikationsentwickler "uberladen werden,
335cdf0e10cSrcweir 	um an seine SfxObjectShell-Subklasse gerichtete DDE-Daten
336cdf0e10cSrcweir 	zu empfangen.
337cdf0e10cSrcweir 
338cdf0e10cSrcweir 	Die Basisimplementierung nimmt keine Daten entgegen und liefert 0 zur"uck.
339cdf0e10cSrcweir */
340cdf0e10cSrcweir 
341cdf0e10cSrcweir {
342cdf0e10cSrcweir 	return 0;
343cdf0e10cSrcweir }
344cdf0e10cSrcweir 
345cdf0e10cSrcweir //--------------------------------------------------------------------
346cdf0e10cSrcweir ::sfx2::SvLinkSource* SfxObjectShell::DdeCreateLinkSource
347cdf0e10cSrcweir (
348cdf0e10cSrcweir 	const String&	   // das zu erzeugende Item
349cdf0e10cSrcweir )
350cdf0e10cSrcweir 
351cdf0e10cSrcweir /*	[Beschreibung]
352cdf0e10cSrcweir 
353cdf0e10cSrcweir 	Diese Methode kann vom Applikationsentwickler "uberladen werden,
354cdf0e10cSrcweir 	um an seiner SfxObjectShell-Subklasse einen DDE-Hotlink einzurichten
355cdf0e10cSrcweir 
356cdf0e10cSrcweir 	Die Basisimplementierung erzeugt keinen und liefert 0 zur"uck.
357cdf0e10cSrcweir */
358cdf0e10cSrcweir 
359cdf0e10cSrcweir {
360cdf0e10cSrcweir 	return 0;
361cdf0e10cSrcweir }
362cdf0e10cSrcweir 
363cdf0e10cSrcweir //========================================================================
364cdf0e10cSrcweir 
365cdf0e10cSrcweir long SfxViewFrame::DdeExecute
366cdf0e10cSrcweir (
367cdf0e10cSrcweir 	const String&	rCmd		// in unserer BASIC-Syntax formuliert
368cdf0e10cSrcweir )
369cdf0e10cSrcweir 
370cdf0e10cSrcweir /*	[Beschreibung]
371cdf0e10cSrcweir 
372cdf0e10cSrcweir 	Diese Methode kann vom Applikationsentwickler "uberladen werden,
373cdf0e10cSrcweir 	um an seine SfxViewFrame-Subklasse gerichtete DDE-Kommandos
374cdf0e10cSrcweir 	zu empfangen.
375cdf0e10cSrcweir 
376cdf0e10cSrcweir 	Die Basisimplementierung versteht die API-Funktionalit"at des
377cdf0e10cSrcweir 	betreffenden SfxViewFrame, der darin dargestellten SfxViewShell und
378cdf0e10cSrcweir 	der betreffenden SfxObjectShell-Subklasse in BASIC-Syntax.
379cdf0e10cSrcweir 	R"uckgabewerte k"onnen dabei leider nicht "ubertragen werden.
380cdf0e10cSrcweir */
381cdf0e10cSrcweir 
382cdf0e10cSrcweir {
383cdf0e10cSrcweir 	if ( GetObjectShell() )
384cdf0e10cSrcweir 		return GetObjectShell()->DdeExecute( rCmd );
385cdf0e10cSrcweir 
386cdf0e10cSrcweir 	return 0;
387cdf0e10cSrcweir }
388cdf0e10cSrcweir 
389cdf0e10cSrcweir //--------------------------------------------------------------------
390cdf0e10cSrcweir 
391cdf0e10cSrcweir long SfxViewFrame::DdeGetData
392cdf0e10cSrcweir (
393cdf0e10cSrcweir 	const String&,				// das anzusprechende Item
394cdf0e10cSrcweir 	const String&,				// in: Format
395cdf0e10cSrcweir 	::com::sun::star::uno::Any& // out: angeforderte Daten
396cdf0e10cSrcweir )
397cdf0e10cSrcweir 
398cdf0e10cSrcweir /*	[Beschreibung]
399cdf0e10cSrcweir 
400cdf0e10cSrcweir 	Diese Methode kann vom Applikationsentwickler "uberladen werden,
401cdf0e10cSrcweir 	um an seine SfxViewFrame-Subklasse gerichtete DDE-Daten-Anforderungen
402cdf0e10cSrcweir 	zu empfangen.
403cdf0e10cSrcweir 
404cdf0e10cSrcweir 	Die Basisimplementierung liefert keine Daten und gibt 0 zur"uck.
405cdf0e10cSrcweir */
406cdf0e10cSrcweir 
407cdf0e10cSrcweir {
408cdf0e10cSrcweir 	return 0;
409cdf0e10cSrcweir }
410cdf0e10cSrcweir 
411cdf0e10cSrcweir //--------------------------------------------------------------------
412cdf0e10cSrcweir 
413cdf0e10cSrcweir long SfxViewFrame::DdeSetData
414cdf0e10cSrcweir (
415cdf0e10cSrcweir 	const String& ,						// das anzusprechende Item
416cdf0e10cSrcweir 	const String& ,					    // in: Format
417cdf0e10cSrcweir 	const ::com::sun::star::uno::Any&   // out: angeforderte Daten
418cdf0e10cSrcweir )
419cdf0e10cSrcweir 
420cdf0e10cSrcweir /*	[Beschreibung]
421cdf0e10cSrcweir 
422cdf0e10cSrcweir 	Diese Methode kann vom Applikationsentwickler "uberladen werden,
423cdf0e10cSrcweir 	um an seine SfxViewFrame-Subklasse gerichtete DDE-Daten
424cdf0e10cSrcweir 	zu empfangen.
425cdf0e10cSrcweir 
426cdf0e10cSrcweir 	Die Basisimplementierung nimmt keine Daten entgegen und liefert 0 zur"uck.
427cdf0e10cSrcweir */
428cdf0e10cSrcweir 
429cdf0e10cSrcweir {
430cdf0e10cSrcweir 	return 0;
431cdf0e10cSrcweir }
432cdf0e10cSrcweir 
433cdf0e10cSrcweir //--------------------------------------------------------------------
434cdf0e10cSrcweir 
435cdf0e10cSrcweir ::sfx2::SvLinkSource* SfxViewFrame::DdeCreateLinkSource
436cdf0e10cSrcweir (
437cdf0e10cSrcweir 	const String& // das zu erzeugende Item
438cdf0e10cSrcweir )
439cdf0e10cSrcweir 
440cdf0e10cSrcweir /*	[Beschreibung]
441cdf0e10cSrcweir 
442cdf0e10cSrcweir 	Diese Methode kann vom Applikationsentwickler "uberladen werden,
443cdf0e10cSrcweir 	um an seiner SfxViewFrame-Subklasse einen DDE-Hotlink einzurichten
444cdf0e10cSrcweir 
445cdf0e10cSrcweir 	Die Basisimplementierung erzeugt keinen und liefert 0 zur"uck.
446cdf0e10cSrcweir */
447cdf0e10cSrcweir 
448cdf0e10cSrcweir {
449cdf0e10cSrcweir 	return 0;
450cdf0e10cSrcweir }
451cdf0e10cSrcweir 
452cdf0e10cSrcweir //========================================================================
453cdf0e10cSrcweir 
454cdf0e10cSrcweir sal_Bool SfxApplication::InitializeDde()
455cdf0e10cSrcweir {
456cdf0e10cSrcweir 	DBG_ASSERT( !pAppData_Impl->pDdeService,
457cdf0e10cSrcweir 				"Dde kann nicht mehrfach initialisiert werden" );
458cdf0e10cSrcweir 
459cdf0e10cSrcweir 	pAppData_Impl->pDdeService = new ImplDdeService( Application::GetAppName() );
460cdf0e10cSrcweir 	int nError = pAppData_Impl->pDdeService->GetError();
461cdf0e10cSrcweir 	if( !nError )
462cdf0e10cSrcweir 	{
463cdf0e10cSrcweir 		pAppData_Impl->pDocTopics = new SfxDdeDocTopics_Impl;
464cdf0e10cSrcweir 
465cdf0e10cSrcweir 		// wir wollen auf jedenfall RTF unterstuetzen!
466cdf0e10cSrcweir 		pAppData_Impl->pDdeService->AddFormat( FORMAT_RTF );
467cdf0e10cSrcweir 
468cdf0e10cSrcweir 		// Config-Pfad als Topic wegen Mehrfachstart
469cdf0e10cSrcweir         INetURLObject aOfficeLockFile( SvtPathOptions().GetUserConfigPath() );
470cdf0e10cSrcweir 		aOfficeLockFile.insertName( DEFINE_CONST_UNICODE( "soffice.lck" ) );
471cdf0e10cSrcweir         String aService( SfxDdeServiceName_Impl(
472cdf0e10cSrcweir 					aOfficeLockFile.GetMainURL(INetURLObject::DECODE_TO_IURI) ) );
473cdf0e10cSrcweir 		aService.ToUpperAscii();
474cdf0e10cSrcweir 		pAppData_Impl->pDdeService2 = new ImplDdeService( aService );
475cdf0e10cSrcweir 		pAppData_Impl->pTriggerTopic = new SfxDdeTriggerTopic_Impl;
476cdf0e10cSrcweir 		pAppData_Impl->pDdeService2->AddTopic( *pAppData_Impl->pTriggerTopic );
477cdf0e10cSrcweir 	}
478cdf0e10cSrcweir 	return !nError;
479cdf0e10cSrcweir }
480cdf0e10cSrcweir 
481cdf0e10cSrcweir void SfxAppData_Impl::DeInitDDE()
482cdf0e10cSrcweir {
483cdf0e10cSrcweir     DELETEZ( pTriggerTopic );
484cdf0e10cSrcweir     DELETEZ( pDdeService2 );
485cdf0e10cSrcweir     DELETEZ( pDocTopics );
486cdf0e10cSrcweir     DELETEZ( pDdeService );
487cdf0e10cSrcweir }
488cdf0e10cSrcweir 
489cdf0e10cSrcweir //--------------------------------------------------------------------
490cdf0e10cSrcweir 
491cdf0e10cSrcweir void SfxApplication::AddDdeTopic( SfxObjectShell* pSh )
492cdf0e10cSrcweir {
493cdf0e10cSrcweir 	DBG_ASSERT( pAppData_Impl->pDocTopics, "es gibt gar keinen Dde-Service" );
494cdf0e10cSrcweir 	//OV: Im Serverbetrieb ist DDE abgeklemmt!
495cdf0e10cSrcweir 	if( !pAppData_Impl->pDocTopics )
496cdf0e10cSrcweir 		return;
497cdf0e10cSrcweir 
498cdf0e10cSrcweir 	// doppeltes Eintragen verhindern
499cdf0e10cSrcweir 	String sShellNm;
500cdf0e10cSrcweir 	sal_Bool bFnd = sal_False;
501cdf0e10cSrcweir 	for( sal_uInt16 n = pAppData_Impl->pDocTopics->Count(); n; )
502cdf0e10cSrcweir 		if( (*pAppData_Impl->pDocTopics)[ --n ]->pSh == pSh )
503cdf0e10cSrcweir 		{
504cdf0e10cSrcweir 			// JP 18.03.96 - Bug 26470
505cdf0e10cSrcweir 			//	falls das Document unbenannt wurde, ist trotzdem ein
506cdf0e10cSrcweir 			//	neues Topics anzulegen!
507cdf0e10cSrcweir 			if( !bFnd )
508cdf0e10cSrcweir 			{
509cdf0e10cSrcweir 				bFnd = sal_True;
510cdf0e10cSrcweir 				(sShellNm = pSh->GetTitle(SFX_TITLE_FULLNAME)).ToLowerAscii();
511cdf0e10cSrcweir 			}
512cdf0e10cSrcweir 			String sNm( (*pAppData_Impl->pDocTopics)[ n ]->GetName() );
513cdf0e10cSrcweir 			if( sShellNm == sNm.ToLowerAscii() )
514cdf0e10cSrcweir 				return ;
515cdf0e10cSrcweir 		}
516cdf0e10cSrcweir 
517cdf0e10cSrcweir 	const SfxDdeDocTopic_Impl* pTopic = new SfxDdeDocTopic_Impl( pSh );
518cdf0e10cSrcweir 	pAppData_Impl->pDocTopics->Insert( pTopic,
519cdf0e10cSrcweir 									   pAppData_Impl->pDocTopics->Count() );
520cdf0e10cSrcweir 	pAppData_Impl->pDdeService->AddTopic( *pTopic );
521cdf0e10cSrcweir }
522cdf0e10cSrcweir 
523cdf0e10cSrcweir void SfxApplication::RemoveDdeTopic( SfxObjectShell* pSh )
524cdf0e10cSrcweir {
525cdf0e10cSrcweir 	DBG_ASSERT( pAppData_Impl->pDocTopics, "es gibt gar keinen Dde-Service" );
526cdf0e10cSrcweir 	//OV: Im Serverbetrieb ist DDE abgeklemmt!
527cdf0e10cSrcweir 	if( !pAppData_Impl->pDocTopics )
528cdf0e10cSrcweir 		return;
529cdf0e10cSrcweir 
530cdf0e10cSrcweir 	SfxDdeDocTopic_Impl* pTopic;
531cdf0e10cSrcweir 	for( sal_uInt16 n = pAppData_Impl->pDocTopics->Count(); n; )
532cdf0e10cSrcweir 		if( ( pTopic = (*pAppData_Impl->pDocTopics)[ --n ])->pSh == pSh )
533cdf0e10cSrcweir 		{
534cdf0e10cSrcweir 			pAppData_Impl->pDdeService->RemoveTopic( *pTopic );
535cdf0e10cSrcweir 			pAppData_Impl->pDocTopics->DeleteAndDestroy( n );
536cdf0e10cSrcweir 		}
537cdf0e10cSrcweir }
538cdf0e10cSrcweir 
539cdf0e10cSrcweir const DdeService* SfxApplication::GetDdeService() const
540cdf0e10cSrcweir {
541cdf0e10cSrcweir 	return pAppData_Impl->pDdeService;
542cdf0e10cSrcweir }
543cdf0e10cSrcweir 
544cdf0e10cSrcweir DdeService* SfxApplication::GetDdeService()
545cdf0e10cSrcweir {
546cdf0e10cSrcweir 	return pAppData_Impl->pDdeService;
547cdf0e10cSrcweir }
548cdf0e10cSrcweir 
549cdf0e10cSrcweir //--------------------------------------------------------------------
550cdf0e10cSrcweir 
551cdf0e10cSrcweir sal_Bool ImplDdeService::MakeTopic( const String& rNm )
552cdf0e10cSrcweir {
553cdf0e10cSrcweir 	// Workaround gegen Event nach unserem Main() unter OS/2
554cdf0e10cSrcweir 	// passierte wenn man beim Beenden aus dem OffMgr die App neu startet
555cdf0e10cSrcweir 	if ( !Application::IsInExecute() )
556cdf0e10cSrcweir 		return sal_False;
557cdf0e10cSrcweir 
558cdf0e10cSrcweir 	// das Topic rNm wird gesucht, haben wir es ?
559cdf0e10cSrcweir 	// erstmal nur ueber die ObjectShells laufen und die mit dem
560cdf0e10cSrcweir 	// Namen heraussuchen:
561cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
562cdf0e10cSrcweir 	String sNm( rNm );
563cdf0e10cSrcweir 	sNm.ToLowerAscii();
564cdf0e10cSrcweir 	TypeId aType( TYPE(SfxObjectShell) );
565cdf0e10cSrcweir 	SfxObjectShell* pShell = SfxObjectShell::GetFirst( &aType );
566cdf0e10cSrcweir 	while( pShell )
567cdf0e10cSrcweir 	{
568cdf0e10cSrcweir 		String sTmp( pShell->GetTitle(SFX_TITLE_FULLNAME) );
569cdf0e10cSrcweir 		sTmp.ToLowerAscii();
570cdf0e10cSrcweir 		if( sTmp == sNm )		// die wollen wir haben
571cdf0e10cSrcweir 		{
572cdf0e10cSrcweir 			SFX_APP()->AddDdeTopic( pShell );
573cdf0e10cSrcweir 			bRet = sal_True;
574cdf0e10cSrcweir 			break;
575cdf0e10cSrcweir 		}
576cdf0e10cSrcweir 		pShell = SfxObjectShell::GetNext( *pShell, &aType );
577cdf0e10cSrcweir 	}
578cdf0e10cSrcweir 
579cdf0e10cSrcweir 	if( !bRet )
580cdf0e10cSrcweir 	{
581cdf0e10cSrcweir         INetURLObject aWorkPath( SvtPathOptions().GetWorkPath() );
582cdf0e10cSrcweir 		INetURLObject aFile;
583cdf0e10cSrcweir 		if ( aWorkPath.GetNewAbsURL( rNm, &aFile ) &&
584cdf0e10cSrcweir 			 SfxContentHelper::IsDocument( aFile.GetMainURL( INetURLObject::NO_DECODE ) ) )
585cdf0e10cSrcweir 		{
586cdf0e10cSrcweir 			// File vorhanden
587cdf0e10cSrcweir 
588cdf0e10cSrcweir 			// dann versuche die Datei zu laden:
589cdf0e10cSrcweir 			SfxStringItem aName( SID_FILE_NAME, aFile.GetMainURL( INetURLObject::NO_DECODE ) );
590cdf0e10cSrcweir 			SfxBoolItem aNewView(SID_OPEN_NEW_VIEW, sal_True);
591cdf0e10cSrcweir 
592cdf0e10cSrcweir 			SfxBoolItem aSilent(SID_SILENT, sal_True);
593cdf0e10cSrcweir             SfxDispatcher* pDispatcher = SFX_APP()->GetDispatcher_Impl();
594cdf0e10cSrcweir             const SfxPoolItem* pRet = pDispatcher->Execute( SID_OPENDOC,
595cdf0e10cSrcweir 					SFX_CALLMODE_SYNCHRON,
596cdf0e10cSrcweir 					&aName, &aNewView,
597cdf0e10cSrcweir 					&aSilent, 0L );
598cdf0e10cSrcweir 
599cdf0e10cSrcweir 			if( pRet && pRet->ISA( SfxViewFrameItem ) &&
600cdf0e10cSrcweir 				((SfxViewFrameItem*)pRet)->GetFrame() &&
601cdf0e10cSrcweir 				0 != ( pShell = ((SfxViewFrameItem*)pRet)
602cdf0e10cSrcweir 					->GetFrame()->GetObjectShell() ) )
603cdf0e10cSrcweir 			{
604cdf0e10cSrcweir 				SFX_APP()->AddDdeTopic( pShell );
605cdf0e10cSrcweir 				bRet = sal_True;
606cdf0e10cSrcweir 			}
607cdf0e10cSrcweir 		}
608cdf0e10cSrcweir 	}
609cdf0e10cSrcweir 	return bRet;
610cdf0e10cSrcweir }
611cdf0e10cSrcweir 
612cdf0e10cSrcweir String ImplDdeService::Topics()
613cdf0e10cSrcweir {
614cdf0e10cSrcweir 	String sRet;
615cdf0e10cSrcweir 	if( GetSysTopic() )
616cdf0e10cSrcweir 		sRet += GetSysTopic()->GetName();
617cdf0e10cSrcweir 
618cdf0e10cSrcweir 	TypeId aType( TYPE(SfxObjectShell) );
619cdf0e10cSrcweir 	SfxObjectShell* pShell = SfxObjectShell::GetFirst( &aType );
620cdf0e10cSrcweir 	while( pShell )
621cdf0e10cSrcweir 	{
622cdf0e10cSrcweir 		if( SfxViewFrame::GetFirst( pShell ) )
623cdf0e10cSrcweir 		{
624cdf0e10cSrcweir 			if( sRet.Len() )
625cdf0e10cSrcweir 				sRet += '\t';
626cdf0e10cSrcweir 			sRet += pShell->GetTitle(SFX_TITLE_FULLNAME);
627cdf0e10cSrcweir 		}
628cdf0e10cSrcweir 		pShell = SfxObjectShell::GetNext( *pShell, &aType );
629cdf0e10cSrcweir 	}
630cdf0e10cSrcweir 	if( sRet.Len() )
631cdf0e10cSrcweir 		sRet += DEFINE_CONST_UNICODE("\r\n");
632cdf0e10cSrcweir 	return sRet;
633cdf0e10cSrcweir }
634cdf0e10cSrcweir 
635cdf0e10cSrcweir sal_Bool ImplDdeService::SysTopicExecute( const String* pStr )
636cdf0e10cSrcweir {
637cdf0e10cSrcweir 	return (sal_Bool)SFX_APP()->DdeExecute( *pStr );
638cdf0e10cSrcweir }
639cdf0e10cSrcweir 
640cdf0e10cSrcweir //--------------------------------------------------------------------
641cdf0e10cSrcweir 
642cdf0e10cSrcweir sal_Bool SfxDdeTriggerTopic_Impl::Execute( const String* )
643cdf0e10cSrcweir {
644cdf0e10cSrcweir 	return sal_True;
645cdf0e10cSrcweir }
646cdf0e10cSrcweir 
647cdf0e10cSrcweir //--------------------------------------------------------------------
648cdf0e10cSrcweir DdeData* SfxDdeDocTopic_Impl::Get( sal_uIntPtr nFormat )
649cdf0e10cSrcweir {
650cdf0e10cSrcweir 	String sMimeType( SotExchange::GetFormatMimeType( nFormat ));
651cdf0e10cSrcweir 	::com::sun::star::uno::Any aValue;
652cdf0e10cSrcweir 	long nRet = pSh->DdeGetData( GetCurItem(), sMimeType, aValue );
653cdf0e10cSrcweir 	if( nRet && aValue.hasValue() && ( aValue >>= aSeq ) )
654cdf0e10cSrcweir 	{
655cdf0e10cSrcweir 		aData = DdeData( aSeq.getConstArray(), aSeq.getLength(), nFormat );
656cdf0e10cSrcweir 		return &aData;
657cdf0e10cSrcweir 	}
658cdf0e10cSrcweir 	aSeq.realloc( 0 );
659cdf0e10cSrcweir 	return 0;
660cdf0e10cSrcweir }
661cdf0e10cSrcweir 
662cdf0e10cSrcweir sal_Bool SfxDdeDocTopic_Impl::Put( const DdeData* pData )
663cdf0e10cSrcweir {
664cdf0e10cSrcweir 	aSeq = ::com::sun::star::uno::Sequence< sal_Int8 >(
665cdf0e10cSrcweir 							(sal_Int8*)(const void*)*pData, (long)*pData );
666cdf0e10cSrcweir 	sal_Bool bRet;
667cdf0e10cSrcweir 	if( aSeq.getLength() )
668cdf0e10cSrcweir 	{
669cdf0e10cSrcweir 		::com::sun::star::uno::Any aValue;
670cdf0e10cSrcweir 		aValue <<= aSeq;
671cdf0e10cSrcweir 		String sMimeType( SotExchange::GetFormatMimeType( pData->GetFormat() ));
672cdf0e10cSrcweir 		bRet = 0 != pSh->DdeSetData( GetCurItem(), sMimeType, aValue );
673cdf0e10cSrcweir 	}
674cdf0e10cSrcweir 	else
675cdf0e10cSrcweir 		bRet = sal_False;
676cdf0e10cSrcweir 	return bRet;
677cdf0e10cSrcweir }
678cdf0e10cSrcweir 
679cdf0e10cSrcweir sal_Bool SfxDdeDocTopic_Impl::Execute( const String* pStr )
680cdf0e10cSrcweir {
681cdf0e10cSrcweir 	long nRet = pStr ? pSh->DdeExecute( *pStr ) : 0;
682cdf0e10cSrcweir 	return 0 != nRet;
683cdf0e10cSrcweir }
684cdf0e10cSrcweir 
685cdf0e10cSrcweir sal_Bool SfxDdeDocTopic_Impl::MakeItem( const String& rItem )
686cdf0e10cSrcweir {
687cdf0e10cSrcweir 	AddItem( DdeItem( rItem ) );
688cdf0e10cSrcweir 	return sal_True;
689cdf0e10cSrcweir }
690cdf0e10cSrcweir 
691cdf0e10cSrcweir sal_Bool SfxDdeDocTopic_Impl::StartAdviseLoop()
692cdf0e10cSrcweir {
693cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
694cdf0e10cSrcweir 	::sfx2::SvLinkSource* pNewObj = pSh->DdeCreateLinkSource( GetCurItem() );
695cdf0e10cSrcweir 	if( pNewObj )
696cdf0e10cSrcweir 	{
697cdf0e10cSrcweir 		// dann richten wir auch einen entsprechenden SvBaseLink ein
698cdf0e10cSrcweir 		String sNm, sTmp( Application::GetAppName() );
699cdf0e10cSrcweir 		::sfx2::MakeLnkName( sNm, &sTmp, pSh->GetTitle(SFX_TITLE_FULLNAME), GetCurItem() );
700cdf0e10cSrcweir         new ::sfx2::SvBaseLink( sNm, OBJECT_DDE_EXTERN, pNewObj );
701cdf0e10cSrcweir 		bRet = sal_True;
702cdf0e10cSrcweir 	}
703cdf0e10cSrcweir 	return bRet;
704cdf0e10cSrcweir }
705cdf0e10cSrcweir 
706