Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef INCLUDED_SVL_SVDDE_HXX
21 : #define INCLUDED_SVL_SVDDE_HXX
22 :
23 : #include <svl/svldllapi.h>
24 : #include <sot/exchange.hxx>
25 : #include <tools/solar.h>
26 : #include <tools/link.hxx>
27 : #include <vector>
28 :
29 : class DdeString;
30 : class DdeData;
31 : class DdeConnection;
32 : class DdeTransaction;
33 : class DdeLink;
34 : class DdeRequest;
35 : class DdeWarmLink;
36 : class DdeHotLink;
37 : class DdePoke;
38 : class DdeExecute;
39 : class DdeItem;
40 : class DdeTopic;
41 : class DdeService;
42 : struct DdeDataImp;
43 : struct DdeImp;
44 : class DdeItemImp;
45 : struct Conversation;
46 :
47 : typedef ::std::vector< DdeService* > DdeServices;
48 : typedef ::std::vector< long > DdeFormats;
49 : typedef ::std::vector< Conversation* > ConvList;
50 :
51 :
52 : // - DdeData -
53 :
54 :
55 : class SVL_DLLPUBLIC DdeData
56 : {
57 : friend class DdeInternal;
58 : friend class DdeService;
59 : friend class DdeConnection;
60 : friend class DdeTransaction;
61 : DdeDataImp* pImp;
62 :
63 : SVL_DLLPRIVATE void Lock();
64 :
65 : void SetFormat( SotClipboardFormatId nFmt );
66 :
67 : public:
68 : DdeData();
69 : DdeData( SAL_UNUSED_PARAMETER const void*, SAL_UNUSED_PARAMETER long, SAL_UNUSED_PARAMETER SotClipboardFormatId = SotClipboardFormatId::STRING );
70 : DdeData( SAL_UNUSED_PARAMETER const OUString& );
71 : DdeData( const DdeData& );
72 : ~DdeData();
73 :
74 : operator const void*() const;
75 : operator long() const;
76 :
77 : SotClipboardFormatId GetFormat() const;
78 :
79 : DdeData& operator = ( const DdeData& );
80 :
81 : static sal_uLong GetExternalFormat(SotClipboardFormatId nFmt);
82 : static SotClipboardFormatId GetInternalFormat(sal_uLong nFmt);
83 : };
84 :
85 :
86 : // - DdeTransaction -
87 :
88 :
89 : class SVL_DLLPUBLIC DdeTransaction
90 : {
91 : public:
92 : void Data( const DdeData* );
93 : void Done( bool bDataValid );
94 : protected:
95 : DdeConnection& rDde;
96 : DdeData aDdeData;
97 : DdeString* pName;
98 : short nType;
99 : sal_IntPtr nId;
100 : sal_IntPtr nTime;
101 : Link<> aData;
102 : Link<> aDone;
103 : bool bBusy;
104 :
105 : DdeTransaction( DdeConnection&, SAL_UNUSED_PARAMETER const OUString&, SAL_UNUSED_PARAMETER long = 0 );
106 :
107 : public:
108 : virtual ~DdeTransaction();
109 :
110 0 : bool IsBusy() { return bBusy; }
111 : const OUString GetName() const;
112 :
113 : void Execute();
114 :
115 0 : void SetDataHdl( const Link<>& rLink ) { aData = rLink; }
116 : const Link<>& GetDataHdl() const { return aData; }
117 :
118 0 : void SetDoneHdl( const Link<>& rLink ) { aDone = rLink; }
119 : const Link<>& GetDoneHdl() const { return aDone; }
120 :
121 0 : void SetFormat( SotClipboardFormatId nFmt ) { aDdeData.SetFormat( nFmt ); }
122 0 : SotClipboardFormatId GetFormat() const { return aDdeData.GetFormat(); }
123 :
124 : long GetError();
125 :
126 : private:
127 : friend class DdeInternal;
128 : friend class DdeConnection;
129 :
130 : DdeTransaction( const DdeTransaction& ) SAL_DELETED_FUNCTION;
131 : const DdeTransaction& operator= ( const DdeTransaction& ) SAL_DELETED_FUNCTION;
132 :
133 : };
134 :
135 :
136 : // - DdeLink -
137 :
138 :
139 : class SVL_DLLPUBLIC DdeLink : public DdeTransaction
140 : {
141 : Link<> aNotify;
142 :
143 : public:
144 : DdeLink( DdeConnection&, const OUString&, long = 0 );
145 : virtual ~DdeLink();
146 :
147 : void SetNotifyHdl( const Link<>& rLink ) { aNotify = rLink; }
148 : const Link<>& GetNotifyHdl() const { return aNotify; }
149 : void Notify();
150 : };
151 :
152 :
153 : // - DdeWarmLink -
154 :
155 :
156 : class SVL_DLLPUBLIC DdeWarmLink : public DdeLink
157 : {
158 : public:
159 : DdeWarmLink( DdeConnection&, const OUString&, long = 0 );
160 : };
161 :
162 :
163 : // - DdeHotLink -
164 :
165 :
166 0 : class SVL_DLLPUBLIC DdeHotLink : public DdeLink
167 : {
168 : public:
169 : DdeHotLink( DdeConnection&, const OUString&, long = 0 );
170 : };
171 :
172 :
173 : // - DdeRequest -
174 :
175 :
176 0 : class SVL_DLLPUBLIC DdeRequest : public DdeTransaction
177 : {
178 : public:
179 : DdeRequest( DdeConnection&, const OUString&, long = 0 );
180 : };
181 :
182 :
183 : // - DdePoke -
184 :
185 :
186 0 : class SVL_DLLPUBLIC DdePoke : public DdeTransaction
187 : {
188 : public:
189 : DdePoke( DdeConnection&, const OUString&, const char*, long,
190 : SotClipboardFormatId = SotClipboardFormatId::STRING, long = 0 );
191 : DdePoke( DdeConnection&, const OUString&, SAL_UNUSED_PARAMETER const DdeData&, long = 0 );
192 : DdePoke( DdeConnection&, const OUString&, const OUString&, long = 0 );
193 : };
194 :
195 :
196 : // - DdeExecute -
197 :
198 :
199 0 : class SVL_DLLPUBLIC DdeExecute : public DdeTransaction
200 : {
201 : public:
202 : DdeExecute( DdeConnection&, const OUString&, long = 0 );
203 : };
204 :
205 :
206 : // - DdeConnection -
207 :
208 :
209 : class SVL_DLLPUBLIC DdeConnection
210 : {
211 : friend class DdeInternal;
212 : friend class DdeTransaction;
213 : std::vector<DdeTransaction*> aTransactions;
214 : DdeString* pService;
215 : DdeString* pTopic;
216 : DdeImp* pImp;
217 :
218 : public:
219 : DdeConnection( SAL_UNUSED_PARAMETER const OUString&, SAL_UNUSED_PARAMETER const OUString& );
220 : ~DdeConnection();
221 :
222 : long GetError();
223 : sal_IntPtr GetConvId();
224 :
225 : static const std::vector<DdeConnection*>& GetConnections();
226 :
227 : bool IsConnected();
228 :
229 : const OUString GetServiceName();
230 : const OUString GetTopicName();
231 :
232 : private:
233 : DdeConnection( const DdeConnection& ) SAL_DELETED_FUNCTION;
234 : const DdeConnection& operator= ( const DdeConnection& ) SAL_DELETED_FUNCTION;
235 : };
236 :
237 :
238 : // - DdeItem -
239 :
240 :
241 : class SVL_DLLPUBLIC DdeItem
242 : {
243 : friend class DdeInternal;
244 : friend class DdeTopic;
245 : DdeString* pName;
246 : DdeTopic* pMyTopic;
247 : DdeItemImp* pImpData;
248 :
249 : void IncMonitor( sal_uLong );
250 : void DecMonitor( sal_uLong );
251 :
252 : protected:
253 : sal_uInt8 nType;
254 :
255 : public:
256 : DdeItem( const sal_Unicode* );
257 : DdeItem( SAL_UNUSED_PARAMETER const OUString& );
258 : DdeItem( const DdeItem& );
259 : virtual ~DdeItem();
260 :
261 : const OUString GetName() const;
262 : short GetLinks();
263 : void NotifyClient();
264 : };
265 :
266 :
267 : // - DdeItem -
268 :
269 :
270 0 : class SVL_DLLPUBLIC DdeGetPutItem : public DdeItem
271 : {
272 : public:
273 : DdeGetPutItem( const sal_Unicode* p );
274 : DdeGetPutItem( const OUString& rStr );
275 : DdeGetPutItem( const DdeItem& rItem );
276 :
277 : virtual DdeData* Get( SotClipboardFormatId );
278 : virtual bool Put( const DdeData* );
279 : virtual void AdviseLoop( bool ); // Start / Stop AdviseLoop
280 : };
281 :
282 :
283 : // - DdeTopic -
284 :
285 :
286 : class SVL_DLLPUBLIC DdeTopic
287 : {
288 : SVL_DLLPRIVATE void _Disconnect( sal_IntPtr );
289 :
290 : public:
291 : void Connect( sal_IntPtr );
292 : void Disconnect( sal_IntPtr );
293 : virtual DdeData* Get(SotClipboardFormatId);
294 : virtual bool Put( const DdeData* );
295 : virtual bool Execute( const OUString* );
296 : // Eventually create a new item. return 0 -> Item creation failed
297 : virtual bool MakeItem( const OUString& rItem );
298 :
299 : // A Warm-/Hot-Link is created. Return true if successful
300 : virtual bool StartAdviseLoop();
301 : bool StopAdviseLoop();
302 :
303 : private:
304 : friend class DdeInternal;
305 : friend class DdeService;
306 : friend class DdeItem;
307 :
308 : private:
309 : DdeString* pName;
310 : OUString aItem;
311 : std::vector<DdeItem*> aItems;
312 : Link<> aConnectLink;
313 : Link<> aDisconnectLink;
314 : Link<> aGetLink;
315 : Link<> aPutLink;
316 : Link<> aExecLink;
317 :
318 : public:
319 : DdeTopic( SAL_UNUSED_PARAMETER const OUString& );
320 : virtual ~DdeTopic();
321 :
322 : const OUString GetName() const;
323 : long GetConvId();
324 :
325 : void SetConnectHdl( const Link<>& rLink ) { aConnectLink = rLink; }
326 : const Link<>& GetConnectHdl() const { return aConnectLink; }
327 : void SetDisconnectHdl( const Link<>& rLink ) { aDisconnectLink = rLink; }
328 : const Link<>& GetDisconnectHdl() const { return aDisconnectLink; }
329 : void SetGetHdl( const Link<>& rLink ) { aGetLink = rLink; }
330 : const Link<>& GetGetHdl() const { return aGetLink; }
331 : void SetPutHdl( const Link<>& rLink ) { aPutLink = rLink; }
332 : const Link<>& GetPutHdl() const { return aPutLink; }
333 : void SetExecuteHdl( const Link<>& rLink ) { aExecLink = rLink; }
334 : const Link<>& GetExecuteHdl() const { return aExecLink; }
335 :
336 : void NotifyClient( const OUString& );
337 : bool IsSystemTopic();
338 :
339 : void InsertItem( DdeItem* ); // For own superclasses
340 : DdeItem* AddItem( const DdeItem& ); // Will be cloned
341 : void RemoveItem( const DdeItem& );
342 : const OUString& GetCurItem() { return aItem; }
343 : const std::vector<DdeItem*>& GetItems() const { return aItems; }
344 :
345 : private:
346 : DdeTopic( const DdeTopic& ) SAL_DELETED_FUNCTION;
347 : const DdeTopic& operator= ( const DdeTopic& ) SAL_DELETED_FUNCTION;
348 : };
349 :
350 :
351 : // - DdeService -
352 :
353 :
354 : class SVL_DLLPUBLIC DdeService
355 : {
356 : friend class DdeInternal;
357 :
358 : public:
359 : bool IsBusy();
360 : OUString GetHelp();
361 : // Eventually creating a new item. return 0 -> Topic creation failed
362 : bool MakeTopic( const OUString& rItem );
363 :
364 : protected:
365 : OUString Topics();
366 : OUString Formats();
367 : OUString SysItems();
368 : OUString Status();
369 : OUString SysTopicGet( const OUString& );
370 : bool SysTopicExecute( const OUString* );
371 :
372 : const DdeTopic* GetSysTopic() const { return pSysTopic; }
373 : private:
374 : std::vector<DdeTopic*> aTopics;
375 : DdeFormats aFormats;
376 : DdeTopic* pSysTopic;
377 : DdeString* pName;
378 : ConvList* pConv;
379 : short nStatus;
380 :
381 : SVL_DLLPRIVATE bool HasCbFormat( sal_uInt16 );
382 :
383 : public:
384 : DdeService( SAL_UNUSED_PARAMETER const OUString& );
385 : virtual ~DdeService();
386 :
387 : const OUString GetName() const;
388 : short GetError() { return nStatus; }
389 :
390 : static DdeServices& GetServices();
391 : std::vector<DdeTopic*>& GetTopics() { return aTopics; }
392 :
393 : void AddTopic( const DdeTopic& );
394 : void RemoveTopic( const DdeTopic& );
395 :
396 : void AddFormat(SotClipboardFormatId);
397 : void RemoveFormat(SotClipboardFormatId);
398 : bool HasFormat(SotClipboardFormatId);
399 :
400 : private:
401 : // DdeService( const DdeService& );
402 : //int operator= ( const DdeService& );
403 : };
404 :
405 :
406 : // - DdeTransaction -
407 :
408 :
409 0 : inline long DdeTransaction::GetError()
410 : {
411 0 : return rDde.GetError();
412 : }
413 : #endif // INCLUDED_SVL_SVDDE_HXX
414 :
415 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|