blob: fb1a02475847f89f943b19168d4cb54d9bee4aab [file] [log] [blame]
/**************************************************************
*
* 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 <svl/svarray.hxx>
#include <vos/thread.hxx>
#include <vos/mutex.hxx>
#include <vcl/timer.hxx>
#include <automation/simplecm.hxx>
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