1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _COMMUNI_HXX
25 #define _COMMUNI_HXX
26 
27 #include <svl/svarray.hxx>
28 #include <vos/thread.hxx>
29 #include <vos/mutex.hxx>
30 #include <vcl/timer.hxx>
31 #include <automation/simplecm.hxx>
32 #include <automation/automationdllapi.h>
33 
34 class SvStream;
35 class SvMemoryStream;
36 //class Application;
37 
38 class CommunicationManagerServerAcceptThread;
39 SV_DECL_PTRARR_SORT( CommunicationLinkList, CommunicationLink*, 1, 10 )
40 
41 class AUTOMATION_DLLPUBLIC MultiCommunicationManager : public CommunicationManager
42 {
43 public:
44 	MultiCommunicationManager( sal_Bool bUseMultiChannel = sal_False );
45 	virtual ~MultiCommunicationManager();
46 	virtual sal_Bool StopCommunication();		// H�lt alle CommunicationLinks an
47 	virtual sal_Bool IsLinkValid( CommunicationLink* pCL );
48 	virtual sal_uInt16 GetCommunicationLinkCount();
49 	virtual CommunicationLinkRef GetCommunicationLink( sal_uInt16 nNr );
50 
DoQuickShutdown(sal_Bool bQuickShutdown=sal_True)51     void DoQuickShutdown( sal_Bool bQuickShutdown = sal_True) { bGracefullShutdown = !bQuickShutdown; }
52 
53 protected:
54 	virtual void CallConnectionOpened( CommunicationLink* pCL );
55 	virtual void CallConnectionClosed( CommunicationLink* pCL );
56 	CommunicationLinkList *ActiveLinks;
57 	CommunicationLinkList *InactiveLinks;		/// Hier sind die CommunicationLinks drin, die sich noch nicht selbst abgemeldet haben.
58 												/// allerdings schon ein StopCommunication gekriegt haben, bzw ein ConnectionTerminated
59 	virtual void DestroyingLink( CommunicationLink *pCL );	// Link tr�gt sich im Destruktor aus
60 
61     sal_Bool bGracefullShutdown;
62 };
63 
64 class AUTOMATION_DLLPUBLIC CommunicationManagerServer : public MultiCommunicationManager
65 {
66 public:
CommunicationManagerServer(sal_Bool bUseMultiChannel=sal_False)67 	CommunicationManagerServer( sal_Bool bUseMultiChannel = sal_False ):MultiCommunicationManager( bUseMultiChannel ){;}
68 };
69 
70 class AUTOMATION_DLLPUBLIC CommunicationManagerClient : public MultiCommunicationManager, public ICommunicationManagerClient
71 {
72 public:
73 	CommunicationManagerClient( sal_Bool bUseMultiChannel = sal_False );
74 };
75 
76 class AUTOMATION_DLLPUBLIC CommunicationLinkViaSocket : public SimpleCommunicationLinkViaSocket, public vos::OThread
77 {
78 public:
79 	CommunicationLinkViaSocket( CommunicationManager *pMan, vos::OStreamSocket *pSocket );
80 	virtual ~CommunicationLinkViaSocket();
81 
82 	virtual sal_Bool IsCommunicationError();
83 	virtual sal_Bool DoTransferDataStream( SvStream *pDataStream, CMProtocol nProtocol = CM_PROTOCOL_OLDSTYLE );
84 
85 	// Diese sind Virtuelle Links!!!!
86 	virtual long ConnectionClosed( void* = NULL );
87 	virtual long DataReceived( void* = NULL );
88 
89 	virtual sal_Bool StopCommunication();
90 
SetPutDataReceivedHdl(Link lPutDataReceived)91     void SetPutDataReceivedHdl( Link lPutDataReceived ){ mlPutDataReceived = lPutDataReceived; }
GetDataReceivedLink()92     Link GetDataReceivedLink () {Link aLink = LINK( this, CommunicationLinkViaSocket, DataReceived ); return aLink;}
93     DECL_LINK( PutDataReceivedHdl, CommunicationLinkViaSocket* );
94 
95 protected:
96 	virtual void SAL_CALL run();
97 
98 	virtual sal_Bool ShutdownCommunication();
99 	sal_uLong nConnectionClosedEventId;
100 	sal_uLong nDataReceivedEventId;
101 	vos::OMutex aMConnectionClosed;	// Notwendig, da Event verarbeitet werden kann bevor Variable gesetzt ist
102 	vos::OMutex aMDataReceived;		// Notwendig, da Event verarbeitet werden kann bevor Variable gesetzt ist
103 	virtual void WaitForShutdown();
104 
105     DECL_LINK( ShutdownLink, void* );
106    	Timer aShutdownTimer;
107     sal_Bool bShutdownStarted;
108     sal_Bool bDestroying;
109     Link mlPutDataReceived;
110 };
111 
112 class AUTOMATION_DLLPUBLIC CommunicationManagerServerViaSocket : public CommunicationManagerServer
113 {
114 	friend class CommunicationManagerServerAcceptThread;
115 public:
116     using CommunicationManager::StartCommunication;
117 
118 	CommunicationManagerServerViaSocket( sal_uLong nPort, sal_uInt16 nMaxCon, sal_Bool bUseMultiChannel = sal_False );
119 	virtual ~CommunicationManagerServerViaSocket();
120 
121 	virtual sal_Bool StartCommunication();
122 	virtual sal_Bool StopCommunication();
123 
124 protected:
125 	sal_uLong nPortToListen;
126 	sal_uInt16 nMaxConnections;
127 
128 private:
129 	CommunicationManagerServerAcceptThread *pAcceptThread;
130 	void AddConnection( CommunicationLink *pNewConnection );
131 };
132 
133 class AUTOMATION_DLLPUBLIC CommunicationManagerServerAcceptThread: public vos::OThread
134 {
135 public:
136 	CommunicationManagerServerAcceptThread( CommunicationManagerServerViaSocket* pServer, sal_uLong nPort, sal_uInt16 nMaxCon = CM_UNLIMITED_CONNECTIONS );
137 	virtual ~CommunicationManagerServerAcceptThread();
GetNewConnection()138 	CommunicationLinkRef GetNewConnection(){ CommunicationLinkRef xTemp = xmNewConnection; xmNewConnection.Clear(); return xTemp; }
139 
140 protected:
141 	virtual void SAL_CALL run();
142 
143 private:
144 	CommunicationManagerServerViaSocket* pMyServer;
145 	vos::OAcceptorSocket *pAcceptorSocket;
146 	sal_uLong nPortToListen;
147 	sal_uInt16 nMaxConnections;
148 	sal_uLong nAddConnectionEventId;
149 	vos::OMutex aMAddConnection;	// Notwendig, da Event verarbeitet werden kann bevor Variable gesetzt ist
CallInfoMsg(InfoString aMsg)150 	void CallInfoMsg( InfoString aMsg ){ pMyServer->CallInfoMsg( aMsg ); }
GetInfoType()151 	CM_InfoType GetInfoType(){ return pMyServer->GetInfoType(); }
152 
153 	// Diese beiden werden zum Transport der Connection vom Thread zum Mainthread verwendet.
154 	CommunicationLinkRef xmNewConnection;
155 	DECL_LINK( AddConnection, void* );
156 };
157 
158 class AUTOMATION_DLLPUBLIC CommunicationManagerClientViaSocket : public CommunicationManagerClient, CommonSocketFunctions
159 {
160 public:
161     using CommunicationManager::StartCommunication;
162 
163 	CommunicationManagerClientViaSocket( ByteString aHost, sal_uLong nPort, sal_Bool bUseMultiChannel = sal_False );
164 	CommunicationManagerClientViaSocket( sal_Bool bUseMultiChannel = sal_False );
165 	virtual ~CommunicationManagerClientViaSocket();
166 
StartCommunication()167 	virtual sal_Bool StartCommunication(){ return StartCommunication( aHostToTalk, nPortToTalk );}
StartCommunication(ByteString aHost,sal_uLong nPort)168 	virtual sal_Bool StartCommunication( ByteString aHost, sal_uLong nPort ){ return DoStartCommunication( this, (ICommunicationManagerClient*) this, aHost, nPort  );}
169 
170 private:
171 	ByteString aHostToTalk;
172 	sal_uLong nPortToTalk;
173 protected:
CreateCommunicationLink(CommunicationManager * pCM,vos::OConnectorSocket * pCS)174 	virtual CommunicationLink *CreateCommunicationLink( CommunicationManager *pCM, vos::OConnectorSocket *pCS ){ return new CommunicationLinkViaSocket( pCM, pCS ); }
175 };
176 
177 #endif
178