/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef _COMMUNI_HXX #define _COMMUNI_HXX #include #include #include #include #include class SvStream; class SvMemoryStream; //class Application; class CommunicationManagerServerAcceptThread; SV_DECL_PTRARR_SORT( CommunicationLinkList, CommunicationLink*, 1, 10 ) class MultiCommunicationManager : public CommunicationManager { public: MultiCommunicationManager( sal_Bool bUseMultiChannel = sal_False ); virtual ~MultiCommunicationManager(); virtual sal_Bool StopCommunication(); // Hält alle CommunicationLinks an virtual sal_Bool IsLinkValid( CommunicationLink* pCL ); virtual sal_uInt16 GetCommunicationLinkCount(); virtual CommunicationLinkRef GetCommunicationLink( sal_uInt16 nNr ); void DoQuickShutdown( sal_Bool bQuickShutdown = sal_True) { bGracefullShutdown = !bQuickShutdown; } protected: virtual void CallConnectionOpened( CommunicationLink* pCL ); virtual void CallConnectionClosed( CommunicationLink* pCL ); CommunicationLinkList *ActiveLinks; CommunicationLinkList *InactiveLinks; /// Hier sind die CommunicationLinks drin, die sich noch nicht selbst abgemeldet haben. /// allerdings schon ein StopCommunication gekriegt haben, bzw ein ConnectionTerminated virtual void DestroyingLink( CommunicationLink *pCL ); // Link trägt sich im Destruktor aus sal_Bool bGracefullShutdown; }; class CommunicationManagerServer : public MultiCommunicationManager { public: CommunicationManagerServer( sal_Bool bUseMultiChannel = sal_False ):MultiCommunicationManager( bUseMultiChannel ){;} }; class CommunicationManagerClient : public MultiCommunicationManager, public ICommunicationManagerClient { public: CommunicationManagerClient( sal_Bool bUseMultiChannel = sal_False ); }; class CommunicationLinkViaSocket : public SimpleCommunicationLinkViaSocket, public vos::OThread { public: CommunicationLinkViaSocket( CommunicationManager *pMan, vos::OStreamSocket *pSocket ); virtual ~CommunicationLinkViaSocket(); virtual sal_Bool IsCommunicationError(); virtual sal_Bool DoTransferDataStream( SvStream *pDataStream, CMProtocol nProtocol = CM_PROTOCOL_OLDSTYLE ); // Diese sind Virtuelle Links!!!! virtual long ConnectionClosed( void* = NULL ); virtual long DataReceived( void* = NULL ); virtual sal_Bool StopCommunication(); void SetPutDataReceivedHdl( Link lPutDataReceived ){ mlPutDataReceived = lPutDataReceived; } Link GetDataReceivedLink () {Link aLink = LINK( this, CommunicationLinkViaSocket, DataReceived ); return aLink;} DECL_LINK( PutDataReceivedHdl, CommunicationLinkViaSocket* ); protected: virtual void SAL_CALL run(); virtual sal_Bool ShutdownCommunication(); sal_uLong nConnectionClosedEventId; sal_uLong nDataReceivedEventId; vos::OMutex aMConnectionClosed; // Notwendig, da Event verarbeitet werden kann bevor Variable gesetzt ist vos::OMutex aMDataReceived; // Notwendig, da Event verarbeitet werden kann bevor Variable gesetzt ist virtual void WaitForShutdown(); DECL_LINK( ShutdownLink, void* ); Timer aShutdownTimer; sal_Bool bShutdownStarted; sal_Bool bDestroying; Link mlPutDataReceived; }; class CommunicationManagerServerViaSocket : public CommunicationManagerServer { friend class CommunicationManagerServerAcceptThread; public: using CommunicationManager::StartCommunication; CommunicationManagerServerViaSocket( sal_uLong nPort, sal_uInt16 nMaxCon, sal_Bool bUseMultiChannel = sal_False ); virtual ~CommunicationManagerServerViaSocket(); virtual sal_Bool StartCommunication(); virtual sal_Bool StopCommunication(); protected: sal_uLong nPortToListen; sal_uInt16 nMaxConnections; private: CommunicationManagerServerAcceptThread *pAcceptThread; void AddConnection( CommunicationLink *pNewConnection ); }; class CommunicationManagerServerAcceptThread: public vos::OThread { public: CommunicationManagerServerAcceptThread( CommunicationManagerServerViaSocket* pServer, sal_uLong nPort, sal_uInt16 nMaxCon = CM_UNLIMITED_CONNECTIONS ); virtual ~CommunicationManagerServerAcceptThread(); CommunicationLinkRef GetNewConnection(){ CommunicationLinkRef xTemp = xmNewConnection; xmNewConnection.Clear(); return xTemp; } protected: virtual void SAL_CALL run(); private: CommunicationManagerServerViaSocket* pMyServer; vos::OAcceptorSocket *pAcceptorSocket; sal_uLong nPortToListen; sal_uInt16 nMaxConnections; sal_uLong nAddConnectionEventId; vos::OMutex aMAddConnection; // Notwendig, da Event verarbeitet werden kann bevor Variable gesetzt ist void CallInfoMsg( InfoString aMsg ){ pMyServer->CallInfoMsg( aMsg ); } CM_InfoType GetInfoType(){ return pMyServer->GetInfoType(); } // Diese beiden werden zum Transport der Connection vom Thread zum Mainthread verwendet. CommunicationLinkRef xmNewConnection; DECL_LINK( AddConnection, void* ); }; class CommunicationManagerClientViaSocket : public CommunicationManagerClient, CommonSocketFunctions { public: using CommunicationManager::StartCommunication; CommunicationManagerClientViaSocket( ByteString aHost, sal_uLong nPort, sal_Bool bUseMultiChannel = sal_False ); CommunicationManagerClientViaSocket( sal_Bool bUseMultiChannel = sal_False ); virtual ~CommunicationManagerClientViaSocket(); virtual sal_Bool StartCommunication(){ return StartCommunication( aHostToTalk, nPortToTalk );} virtual sal_Bool StartCommunication( ByteString aHost, sal_uLong nPort ){ return DoStartCommunication( this, (ICommunicationManagerClient*) this, aHost, nPort );} private: ByteString aHostToTalk; sal_uLong nPortToTalk; protected: virtual CommunicationLink *CreateCommunicationLink( CommunicationManager *pCM, vos::OConnectorSocket *pCS ){ return new CommunicationLinkViaSocket( pCM, pCS ); } }; #endif