1*9d1279ecSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*9d1279ecSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*9d1279ecSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*9d1279ecSAndrew Rist * distributed with this work for additional information 6*9d1279ecSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*9d1279ecSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*9d1279ecSAndrew Rist * "License"); you may not use this file except in compliance 9*9d1279ecSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*9d1279ecSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*9d1279ecSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*9d1279ecSAndrew Rist * software distributed under the License is distributed on an 15*9d1279ecSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*9d1279ecSAndrew Rist * KIND, either express or implied. See the License for the 17*9d1279ecSAndrew Rist * specific language governing permissions and limitations 18*9d1279ecSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*9d1279ecSAndrew Rist *************************************************************/ 21*9d1279ecSAndrew Rist 22*9d1279ecSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_automation.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir 28cdf0e10cSrcweir #define ENABLE_BYTESTRING_STREAM_OPERATORS 29cdf0e10cSrcweir #include <tools/solar.h> 30cdf0e10cSrcweir #include <automation/simplecm.hxx> 31cdf0e10cSrcweir 32cdf0e10cSrcweir #include <automation/commdefines.hxx> 33cdf0e10cSrcweir #include "packethandler.hxx" 34cdf0e10cSrcweir #include "tcpio.hxx" 35cdf0e10cSrcweir 36cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 37cdf0e10cSrcweir #include <stdio.h> 38cdf0e10cSrcweir void debug_printf( const char *chars ) 39cdf0e10cSrcweir { 40cdf0e10cSrcweir static sal_Bool bPrint = (getenv("DEBUG") != NULL); 41cdf0e10cSrcweir if ( bPrint ) 42cdf0e10cSrcweir { 43cdf0e10cSrcweir printf( chars ); 44cdf0e10cSrcweir fflush( stdout ); 45cdf0e10cSrcweir } 46cdf0e10cSrcweir } 47cdf0e10cSrcweir #endif 48cdf0e10cSrcweir 49cdf0e10cSrcweir CommunicationLink::CommunicationLink( CommunicationManager *pMan ) 50cdf0e10cSrcweir : pMyManager(pMan) 51cdf0e10cSrcweir , pServiceData(NULL) 52cdf0e10cSrcweir , nServiceProtocol( 0 ) 53cdf0e10cSrcweir , bIsInsideCallback( sal_False ) 54cdf0e10cSrcweir , nTotalBytes( 0 ) 55cdf0e10cSrcweir , maApplication("Undefined") 56cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 57cdf0e10cSrcweir , bFlag( sal_False ) 58cdf0e10cSrcweir , nSomething( 0 ) 59cdf0e10cSrcweir #endif 60cdf0e10cSrcweir { 61cdf0e10cSrcweir } 62cdf0e10cSrcweir 63cdf0e10cSrcweir CommunicationLink::~CommunicationLink() 64cdf0e10cSrcweir { 65cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 66cdf0e10cSrcweir if ( !bFlag ) // bFlag will be set if deletion is expected else we can set a breakpoint 67cdf0e10cSrcweir bFlag = sal_False; 68cdf0e10cSrcweir #endif 69cdf0e10cSrcweir if ( pMyManager ) 70cdf0e10cSrcweir pMyManager->DestroyingLink( this ); 71cdf0e10cSrcweir } 72cdf0e10cSrcweir 73cdf0e10cSrcweir void CommunicationLink::CallInfoMsg( InfoString aMsg ) 74cdf0e10cSrcweir { 75cdf0e10cSrcweir if ( pMyManager ) 76cdf0e10cSrcweir pMyManager->InfoMsg( aMsg ); 77cdf0e10cSrcweir }; 78cdf0e10cSrcweir 79cdf0e10cSrcweir CM_InfoType CommunicationLink::GetInfoType() 80cdf0e10cSrcweir { 81cdf0e10cSrcweir if ( pMyManager ) 82cdf0e10cSrcweir return pMyManager->GetInfoType(); 83cdf0e10cSrcweir else 84cdf0e10cSrcweir return CM_NO_TEXT; 85cdf0e10cSrcweir } 86cdf0e10cSrcweir 87cdf0e10cSrcweir IMPL_LINK( CommunicationLink, ConnectionClosed, void*, EMPTYARG ) 88cdf0e10cSrcweir { 89cdf0e10cSrcweir if ( pMyManager ) 90cdf0e10cSrcweir pMyManager->CallConnectionClosed( this ); 91cdf0e10cSrcweir return 1; 92cdf0e10cSrcweir } 93cdf0e10cSrcweir 94cdf0e10cSrcweir IMPL_LINK( CommunicationLink, DataReceived, void*, EMPTYARG ) 95cdf0e10cSrcweir { 96cdf0e10cSrcweir if ( pMyManager ) 97cdf0e10cSrcweir pMyManager->CallDataReceived( this ); 98cdf0e10cSrcweir return 1; 99cdf0e10cSrcweir } 100cdf0e10cSrcweir 101cdf0e10cSrcweir sal_Bool CommunicationLink::DoTransferDataStream( SvStream *pDataStream, CMProtocol nProtocol ) 102cdf0e10cSrcweir { 103cdf0e10cSrcweir INFO_MSG( CByteString("S :").Append( GetCommunicationPartner( CM_FQDN ) ), 104cdf0e10cSrcweir CByteString("Daten Senden:").Append( GetCommunicationPartner( CM_FQDN ) ), 105cdf0e10cSrcweir CM_SEND, this ); 106cdf0e10cSrcweir sal_Bool bWasError = sal_False; 107cdf0e10cSrcweir 108cdf0e10cSrcweir sal_uInt32 nBuffer; 109cdf0e10cSrcweir nBuffer = pDataStream->SeekRel(0) +1; 110cdf0e10cSrcweir bWasError = pPacketHandler->TransferData( ((SvMemoryStream*)pDataStream)->GetData(), nBuffer, nProtocol ) != C_ERROR_NONE; 111cdf0e10cSrcweir 112cdf0e10cSrcweir if ( bWasError ) 113cdf0e10cSrcweir { 114cdf0e10cSrcweir INFO_MSG( CByteString("Send Failed:").Append( GetCommunicationPartner( CM_FQDN ) ), 115cdf0e10cSrcweir CByteString( "Socket wird wegen Fehlers beim Senden geschlossen: ").Append( GetCommunicationPartner( CM_FQDN ) ), 116cdf0e10cSrcweir CM_ERROR, this ); 117cdf0e10cSrcweir ShutdownCommunication(); 118cdf0e10cSrcweir } 119cdf0e10cSrcweir return !bWasError; 120cdf0e10cSrcweir } 121cdf0e10cSrcweir 122cdf0e10cSrcweir sal_Bool CommunicationLink::TransferDataStream( SvStream *pDataStream, CMProtocol nProtocol ) 123cdf0e10cSrcweir { 124cdf0e10cSrcweir aLastAccess = DateTime(); 125cdf0e10cSrcweir nTotalBytes += pDataStream->Seek( STREAM_SEEK_TO_END ); 126cdf0e10cSrcweir return DoTransferDataStream( pDataStream, nProtocol ); 127cdf0e10cSrcweir } 128cdf0e10cSrcweir 129cdf0e10cSrcweir void CommunicationLink::SetApplication( const ByteString& aApp ) 130cdf0e10cSrcweir { 131cdf0e10cSrcweir maApplication = aApp; 132cdf0e10cSrcweir } 133cdf0e10cSrcweir 134cdf0e10cSrcweir 135cdf0e10cSrcweir SimpleCommunicationLinkViaSocket::SimpleCommunicationLinkViaSocket( CommunicationManager *pMan, vos::OStreamSocket *pSocket ) 136cdf0e10cSrcweir : CommunicationLink( pMan ) 137cdf0e10cSrcweir , aCommunicationPartner() 138cdf0e10cSrcweir , aMyName() 139cdf0e10cSrcweir , pStreamSocket( pSocket ) 140cdf0e10cSrcweir , pReceiveStream( NULL ) 141cdf0e10cSrcweir , bIsRequestShutdownPending( sal_False ) 142cdf0e10cSrcweir { 143cdf0e10cSrcweir pTCPIO = new TCPIO( pStreamSocket ); 144cdf0e10cSrcweir pPacketHandler = new PacketHandler( (ITransmiter*) pTCPIO, pTCPIO, pMyManager->IsMultiChannel() ); 145cdf0e10cSrcweir } 146cdf0e10cSrcweir 147cdf0e10cSrcweir SimpleCommunicationLinkViaSocket::~SimpleCommunicationLinkViaSocket() 148cdf0e10cSrcweir { 149cdf0e10cSrcweir delete pPacketHandler; 150cdf0e10cSrcweir pPacketHandler = NULL; 151cdf0e10cSrcweir delete pTCPIO; 152cdf0e10cSrcweir pTCPIO = NULL; 153cdf0e10cSrcweir delete pStreamSocket; 154cdf0e10cSrcweir pStreamSocket = NULL; 155cdf0e10cSrcweir } 156cdf0e10cSrcweir 157cdf0e10cSrcweir void SimpleCommunicationLinkViaSocket::SetStreamSocket( vos::OStreamSocket* pSocket ) 158cdf0e10cSrcweir { 159cdf0e10cSrcweir if ( pTCPIO ) 160cdf0e10cSrcweir pTCPIO->SetStreamSocket( pSocket ); 161cdf0e10cSrcweir pStreamSocket = pSocket; 162cdf0e10cSrcweir } 163cdf0e10cSrcweir 164cdf0e10cSrcweir sal_Bool SimpleCommunicationLinkViaSocket::StopCommunication() 165cdf0e10cSrcweir { 166cdf0e10cSrcweir CommunicationLinkRef rHold(this); // avoid deleting this link before the end of the method 167cdf0e10cSrcweir if ( !IsCommunicationError() ) // Meaning that the Communication is still runnung 168cdf0e10cSrcweir { 169cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 170cdf0e10cSrcweir debug_printf("Sending REQUEST_ShutdownLink\n"); 171cdf0e10cSrcweir #endif 172cdf0e10cSrcweir SendHandshake( CH_REQUEST_ShutdownLink ); 173cdf0e10cSrcweir } 174cdf0e10cSrcweir WaitForShutdown(); 175cdf0e10cSrcweir return sal_True; 176cdf0e10cSrcweir } 177cdf0e10cSrcweir 178cdf0e10cSrcweir void SimpleCommunicationLinkViaSocket::SetFinalRecieveTimeout() 179cdf0e10cSrcweir { 180cdf0e10cSrcweir if ( !IsCommunicationError() ) 181cdf0e10cSrcweir { 182cdf0e10cSrcweir TimeValue aTime = {30, 0}; // 30 seconds 183cdf0e10cSrcweir pStreamSocket->setRecvTimeout( &aTime ); 184cdf0e10cSrcweir } 185cdf0e10cSrcweir } 186cdf0e10cSrcweir 187cdf0e10cSrcweir sal_Bool SimpleCommunicationLinkViaSocket::IsCommunicationError() 188cdf0e10cSrcweir { 189cdf0e10cSrcweir return !pStreamSocket; 190cdf0e10cSrcweir } 191cdf0e10cSrcweir 192cdf0e10cSrcweir ByteString SimpleCommunicationLinkViaSocket::GetCommunicationPartner( CM_NameType eType ) 193cdf0e10cSrcweir { 194cdf0e10cSrcweir if ( pStreamSocket ) 195cdf0e10cSrcweir { 196cdf0e10cSrcweir switch ( eType ) 197cdf0e10cSrcweir { 198cdf0e10cSrcweir case CM_DOTTED: 199cdf0e10cSrcweir { 200cdf0e10cSrcweir rtl::OUString aDotted; 201cdf0e10cSrcweir vos::OSocketAddr *pPeerAdr = new vos::OSocketAddr; 202cdf0e10cSrcweir pStreamSocket->getPeerAddr( *pPeerAdr ); 203cdf0e10cSrcweir ((vos::OInetSocketAddr*)pPeerAdr)->getDottedAddr( aDotted ); 204cdf0e10cSrcweir delete pPeerAdr; 205cdf0e10cSrcweir return ByteString( UniString(aDotted), RTL_TEXTENCODING_UTF8 ); 206cdf0e10cSrcweir } 207cdf0e10cSrcweir //break; 208cdf0e10cSrcweir case CM_FQDN: 209cdf0e10cSrcweir { 210cdf0e10cSrcweir if ( !aCommunicationPartner.Len() ) 211cdf0e10cSrcweir { 212cdf0e10cSrcweir rtl::OUString aFQDN; 213cdf0e10cSrcweir pStreamSocket->getPeerHost( aFQDN ); 214cdf0e10cSrcweir aCommunicationPartner = ByteString( UniString(aFQDN), RTL_TEXTENCODING_UTF8 ); 215cdf0e10cSrcweir } 216cdf0e10cSrcweir return aCommunicationPartner; 217cdf0e10cSrcweir } 218cdf0e10cSrcweir //break; 219cdf0e10cSrcweir } 220cdf0e10cSrcweir } 221cdf0e10cSrcweir return CByteString( "Unknown" ); 222cdf0e10cSrcweir } 223cdf0e10cSrcweir 224cdf0e10cSrcweir ByteString SimpleCommunicationLinkViaSocket::GetMyName( CM_NameType eType ) 225cdf0e10cSrcweir { 226cdf0e10cSrcweir if ( pStreamSocket ) 227cdf0e10cSrcweir { 228cdf0e10cSrcweir switch ( eType ) 229cdf0e10cSrcweir { 230cdf0e10cSrcweir case CM_DOTTED: 231cdf0e10cSrcweir { 232cdf0e10cSrcweir rtl::OUString aDotted; 233cdf0e10cSrcweir vos::OSocketAddr *pPeerAdr = new vos::OSocketAddr; 234cdf0e10cSrcweir pStreamSocket->getLocalAddr( *pPeerAdr ); 235cdf0e10cSrcweir ((vos::OInetSocketAddr*)pPeerAdr)->getDottedAddr( aDotted ); 236cdf0e10cSrcweir delete pPeerAdr; 237cdf0e10cSrcweir return ByteString( UniString(aDotted), RTL_TEXTENCODING_UTF8 ); 238cdf0e10cSrcweir } 239cdf0e10cSrcweir //break; 240cdf0e10cSrcweir case CM_FQDN: 241cdf0e10cSrcweir { 242cdf0e10cSrcweir if ( !aMyName.Len() ) 243cdf0e10cSrcweir { 244cdf0e10cSrcweir rtl::OUString aFQDN; 245cdf0e10cSrcweir pStreamSocket->getLocalHost( aFQDN ); 246cdf0e10cSrcweir aMyName = ByteString( UniString(aFQDN), RTL_TEXTENCODING_UTF8 ); 247cdf0e10cSrcweir } 248cdf0e10cSrcweir return aMyName; 249cdf0e10cSrcweir } 250cdf0e10cSrcweir //break; 251cdf0e10cSrcweir } 252cdf0e10cSrcweir } 253cdf0e10cSrcweir return CByteString( "Error" ); 254cdf0e10cSrcweir } 255cdf0e10cSrcweir 256cdf0e10cSrcweir SvStream* SimpleCommunicationLinkViaSocket::GetBestCommunicationStream() 257cdf0e10cSrcweir { 258cdf0e10cSrcweir SvStream* pStream = new SvMemoryStream; 259cdf0e10cSrcweir // pStream->SetNumberFormatInt( NUMBERFORMAT_INT_BIGENDIAN ); 260cdf0e10cSrcweir return pStream; 261cdf0e10cSrcweir } 262cdf0e10cSrcweir 263cdf0e10cSrcweir #define READ_SOCKET( pBuffer, nLength )\ 264cdf0e10cSrcweir if ( !bWasError )\ 265cdf0e10cSrcweir {bWasError |= pTCPIO->ReceiveBytes( pBuffer, nLength ) != C_ERROR_NONE;} 266cdf0e10cSrcweir 267cdf0e10cSrcweir #define READ_SOCKET_LEN( pBuffer, nLength, nTotal )\ 268cdf0e10cSrcweir READ_SOCKET( pBuffer, nLength );\ 269cdf0e10cSrcweir if ( !bWasError )\ 270cdf0e10cSrcweir {nTotal += nLength;} 271cdf0e10cSrcweir 272cdf0e10cSrcweir sal_Bool SimpleCommunicationLinkViaSocket::DoReceiveDataStream() 273cdf0e10cSrcweir { 274cdf0e10cSrcweir sal_Bool bWasError = sal_False; 275cdf0e10cSrcweir void* pBuffer = NULL; 276cdf0e10cSrcweir comm_UINT32 nLen; 277cdf0e10cSrcweir bWasError = pPacketHandler->ReceiveData( pBuffer, nLen ) != C_ERROR_NONE; 278cdf0e10cSrcweir if ( !bWasError ) 279cdf0e10cSrcweir { 280cdf0e10cSrcweir pReceiveStream = GetBestCommunicationStream(); 281cdf0e10cSrcweir DBG_ASSERT( pReceiveStream->IsA() == ID_MEMORYSTREAM, "CommunicationStream is not an SvMemoryStream. Communication has to be reimplemented here!"); 282cdf0e10cSrcweir if ( pReceiveStream->IsA() == ID_MEMORYSTREAM ) 283cdf0e10cSrcweir ((SvMemoryStream*)pReceiveStream)->SetBuffer( pBuffer, nLen, sal_True, nLen ); 284cdf0e10cSrcweir DBG_ASSERT( pReceiveStream, "Datastream is NULL"); 285cdf0e10cSrcweir } 286cdf0e10cSrcweir 287cdf0e10cSrcweir return !bWasError; 288cdf0e10cSrcweir } 289cdf0e10cSrcweir 290cdf0e10cSrcweir void SimpleCommunicationLinkViaSocket::SetApplication( const ByteString& aApp ) 291cdf0e10cSrcweir { 292cdf0e10cSrcweir CommunicationLink::SetApplication( aApp ); 293cdf0e10cSrcweir SvStream* pData = GetBestCommunicationStream(); 294cdf0e10cSrcweir *pData << aApp; 295cdf0e10cSrcweir SendHandshake( CH_SetApplication, pData ); 296cdf0e10cSrcweir delete pData; 297cdf0e10cSrcweir } 298cdf0e10cSrcweir 299cdf0e10cSrcweir void SimpleCommunicationLinkViaSocket::SetNewPacketAsCurrent() 300cdf0e10cSrcweir { 301cdf0e10cSrcweir pServiceData = pReceiveStream; 302cdf0e10cSrcweir nServiceProtocol = pPacketHandler->GetReceiveProtocol(); 303cdf0e10cSrcweir nServiceHeaderType = pPacketHandler->GetReceiveHeaderType(); 304cdf0e10cSrcweir } 305cdf0e10cSrcweir 306cdf0e10cSrcweir sal_Bool SimpleCommunicationLinkViaSocket::SendHandshake( HandshakeType aHandshakeType, SvStream* pData ) 307cdf0e10cSrcweir { 308cdf0e10cSrcweir sal_Bool bWasError; 309cdf0e10cSrcweir 310cdf0e10cSrcweir if ( pData ) 311cdf0e10cSrcweir { 312cdf0e10cSrcweir sal_uInt32 nBuffer; 313cdf0e10cSrcweir nBuffer = pData->Seek( STREAM_SEEK_TO_END ); 314cdf0e10cSrcweir bWasError = !pPacketHandler->SendHandshake( aHandshakeType, ((SvMemoryStream*)pData)->GetData(), nBuffer ); 315cdf0e10cSrcweir } 316cdf0e10cSrcweir else 317cdf0e10cSrcweir bWasError = !pPacketHandler->SendHandshake( aHandshakeType ); 318cdf0e10cSrcweir 319cdf0e10cSrcweir 320cdf0e10cSrcweir if ( bWasError ) 321cdf0e10cSrcweir { 322cdf0e10cSrcweir INFO_MSG( CByteString("Send Failed:").Append( GetCommunicationPartner( CM_FQDN ) ), 323cdf0e10cSrcweir CByteString( "Socket wird wegen Fehlers beim Senden geschlossen: ").Append( GetCommunicationPartner( CM_FQDN ) ), 324cdf0e10cSrcweir CM_ERROR, this ); 325cdf0e10cSrcweir ShutdownCommunication(); 326cdf0e10cSrcweir } 327cdf0e10cSrcweir else 328cdf0e10cSrcweir { // set new status 329cdf0e10cSrcweir switch ( aHandshakeType ) 330cdf0e10cSrcweir { 331cdf0e10cSrcweir case CH_REQUEST_HandshakeAlive: 332cdf0e10cSrcweir break; 333cdf0e10cSrcweir case CH_RESPONSE_HandshakeAlive: 334cdf0e10cSrcweir break; 335cdf0e10cSrcweir case CH_REQUEST_ShutdownLink: 336cdf0e10cSrcweir bIsRequestShutdownPending = sal_True; 337cdf0e10cSrcweir break; 338cdf0e10cSrcweir case CH_ShutdownLink: 339cdf0e10cSrcweir break; 340cdf0e10cSrcweir case CH_SUPPORT_OPTIONS: 341cdf0e10cSrcweir break; 342cdf0e10cSrcweir case CH_SetApplication: 343cdf0e10cSrcweir break; 344cdf0e10cSrcweir default: 345cdf0e10cSrcweir DBG_ERROR("Unknown HandshakeType"); 346cdf0e10cSrcweir } 347cdf0e10cSrcweir } 348cdf0e10cSrcweir return !bWasError; 349cdf0e10cSrcweir } 350cdf0e10cSrcweir 351cdf0e10cSrcweir SimpleCommunicationLinkViaSocketWithReceiveCallbacks::SimpleCommunicationLinkViaSocketWithReceiveCallbacks( CommunicationManager *pMan, vos::OStreamSocket *pSocket ) 352cdf0e10cSrcweir : SimpleCommunicationLinkViaSocket( pMan, pSocket ) 353cdf0e10cSrcweir { 354cdf0e10cSrcweir } 355cdf0e10cSrcweir 356cdf0e10cSrcweir SimpleCommunicationLinkViaSocketWithReceiveCallbacks::~SimpleCommunicationLinkViaSocketWithReceiveCallbacks() 357cdf0e10cSrcweir { 358cdf0e10cSrcweir if ( pMyManager && pMyManager->IsLinkValid( this ) && !bIsRequestShutdownPending ) 359cdf0e10cSrcweir StopCommunication(); 360cdf0e10cSrcweir } 361cdf0e10cSrcweir 362cdf0e10cSrcweir void SimpleCommunicationLinkViaSocketWithReceiveCallbacks::WaitForShutdown() 363cdf0e10cSrcweir { 364cdf0e10cSrcweir CommunicationLinkRef rHold(this); // avoid deleting this link before the end of the method 365cdf0e10cSrcweir SetFinalRecieveTimeout(); 366cdf0e10cSrcweir while ( pMyManager && !IsCommunicationError() ) 367cdf0e10cSrcweir ReceiveDataStream(); 368cdf0e10cSrcweir } 369cdf0e10cSrcweir 370cdf0e10cSrcweir sal_Bool SimpleCommunicationLinkViaSocketWithReceiveCallbacks::ReceiveDataStream() 371cdf0e10cSrcweir { 372cdf0e10cSrcweir if ( DoReceiveDataStream() ) 373cdf0e10cSrcweir { 374cdf0e10cSrcweir SetNewPacketAsCurrent(); 375cdf0e10cSrcweir StartCallback(); 376cdf0e10cSrcweir DataReceived(); 377cdf0e10cSrcweir return sal_True; 378cdf0e10cSrcweir } 379cdf0e10cSrcweir else 380cdf0e10cSrcweir { 381cdf0e10cSrcweir StartCallback(); 382cdf0e10cSrcweir ShutdownCommunication(); 383cdf0e10cSrcweir return sal_False; 384cdf0e10cSrcweir } 385cdf0e10cSrcweir } 386cdf0e10cSrcweir 387cdf0e10cSrcweir sal_Bool SimpleCommunicationLinkViaSocketWithReceiveCallbacks::ShutdownCommunication() 388cdf0e10cSrcweir { 389cdf0e10cSrcweir if ( GetStreamSocket() ) 390cdf0e10cSrcweir GetStreamSocket()->shutdown(); 391cdf0e10cSrcweir 392cdf0e10cSrcweir if ( GetStreamSocket() ) 393cdf0e10cSrcweir GetStreamSocket()->close(); 394cdf0e10cSrcweir 395cdf0e10cSrcweir vos::OStreamSocket *pTempSocket = GetStreamSocket(); 396cdf0e10cSrcweir SetStreamSocket( NULL ); 397cdf0e10cSrcweir delete pTempSocket; 398cdf0e10cSrcweir 399cdf0e10cSrcweir ConnectionClosed(); 400cdf0e10cSrcweir 401cdf0e10cSrcweir return sal_True; 402cdf0e10cSrcweir } 403cdf0e10cSrcweir 404cdf0e10cSrcweir 405cdf0e10cSrcweir 406cdf0e10cSrcweir CommunicationManager::CommunicationManager( sal_Bool bUseMultiChannel ) 407cdf0e10cSrcweir : nInfoType( CM_NONE ) 408cdf0e10cSrcweir , bIsCommunicationRunning( sal_False ) 409cdf0e10cSrcweir , maApplication("Unknown") 410cdf0e10cSrcweir , bIsMultiChannel( bUseMultiChannel ) 411cdf0e10cSrcweir { 412cdf0e10cSrcweir } 413cdf0e10cSrcweir 414cdf0e10cSrcweir CommunicationManager::~CommunicationManager() 415cdf0e10cSrcweir { 416cdf0e10cSrcweir xLastNewLink.Clear(); 417cdf0e10cSrcweir } 418cdf0e10cSrcweir 419cdf0e10cSrcweir sal_Bool CommunicationManager::StartCommunication( String aApp, String aParams ) 420cdf0e10cSrcweir { 421cdf0e10cSrcweir (void) aApp; /* avoid warning about unused parameter */ 422cdf0e10cSrcweir (void) aParams; /* avoid warning about unused parameter */ 423cdf0e10cSrcweir return sal_False; 424cdf0e10cSrcweir } 425cdf0e10cSrcweir 426cdf0e10cSrcweir sal_Bool CommunicationManager::StartCommunication( ByteString aHost, sal_uLong nPort ) 427cdf0e10cSrcweir { 428cdf0e10cSrcweir (void) aHost; /* avoid warning about unused parameter */ 429cdf0e10cSrcweir (void) nPort; /* avoid warning about unused parameter */ 430cdf0e10cSrcweir return sal_False; 431cdf0e10cSrcweir } 432cdf0e10cSrcweir 433cdf0e10cSrcweir ByteString CommunicationManager::GetMyName( CM_NameType ) 434cdf0e10cSrcweir { 435cdf0e10cSrcweir rtl::OUString aHostname; 436cdf0e10cSrcweir vos::OSocketAddr::getLocalHostname( aHostname ); 437cdf0e10cSrcweir return ByteString( UniString(aHostname), RTL_TEXTENCODING_UTF8 ); 438cdf0e10cSrcweir } 439cdf0e10cSrcweir 440cdf0e10cSrcweir void CommunicationManager::CallConnectionOpened( CommunicationLink* pCL ) 441cdf0e10cSrcweir { 442cdf0e10cSrcweir pCL->StartCallback(); // Sollte bereits vor dem Aufruf gerufen werden 443cdf0e10cSrcweir pCL->aStart = DateTime(); 444cdf0e10cSrcweir pCL->aLastAccess = pCL->aStart; 445cdf0e10cSrcweir bIsCommunicationRunning = sal_True; 446cdf0e10cSrcweir pCL->SetApplication( GetApplication() ); 447cdf0e10cSrcweir 448cdf0e10cSrcweir xLastNewLink = pCL; 449cdf0e10cSrcweir 450cdf0e10cSrcweir INFO_MSG( CByteString("C+:").Append( pCL->GetCommunicationPartner( CM_FQDN ) ), 451cdf0e10cSrcweir CByteString("Verbindung aufgebaut: ").Append( pCL->GetCommunicationPartner( CM_FQDN ) ), 452cdf0e10cSrcweir CM_OPEN, pCL ); 453cdf0e10cSrcweir ConnectionOpened( pCL ); 454cdf0e10cSrcweir pCL->FinishCallback(); 455cdf0e10cSrcweir } 456cdf0e10cSrcweir 457cdf0e10cSrcweir void CommunicationManager::CallConnectionClosed( CommunicationLink* pCL ) 458cdf0e10cSrcweir { 459cdf0e10cSrcweir pCL->StartCallback(); // Sollte bereits vor dem Aufruf gerufen werden 460cdf0e10cSrcweir pCL->aLastAccess = DateTime(); 461cdf0e10cSrcweir 462cdf0e10cSrcweir INFO_MSG( CByteString("C-:").Append( pCL->GetCommunicationPartner( CM_FQDN ) ), 463cdf0e10cSrcweir CByteString("Verbindung abgebrochen: ").Append( pCL->GetCommunicationPartner( CM_FQDN ) ), 464cdf0e10cSrcweir CM_CLOSE, pCL ); 465cdf0e10cSrcweir ConnectionClosed( pCL ); 466cdf0e10cSrcweir 467cdf0e10cSrcweir if ( xLastNewLink == pCL ) 468cdf0e10cSrcweir xLastNewLink.Clear(); 469cdf0e10cSrcweir 470cdf0e10cSrcweir pCL->FinishCallback(); 471cdf0e10cSrcweir // delete pCL; 472cdf0e10cSrcweir } 473cdf0e10cSrcweir 474cdf0e10cSrcweir void CommunicationManager::CallDataReceived( CommunicationLink* pCL ) 475cdf0e10cSrcweir { 476cdf0e10cSrcweir pCL->StartCallback(); // Sollte bereits vor dem Aufruf gerufen werden 477cdf0e10cSrcweir pCL->aLastAccess = DateTime(); 478cdf0e10cSrcweir CommunicationLinkRef rHold(pCL); // H�lt den Zeiger bis zum Ende des calls 479cdf0e10cSrcweir 480cdf0e10cSrcweir // should be impossible but happens for mysterious reasons 481cdf0e10cSrcweir if ( !pCL->pServiceData ) 482cdf0e10cSrcweir { 483cdf0e10cSrcweir DBG_ERROR( "Datastream is NULL" ); 484cdf0e10cSrcweir pCL->FinishCallback(); 485cdf0e10cSrcweir return; 486cdf0e10cSrcweir } 487cdf0e10cSrcweir 488cdf0e10cSrcweir 489cdf0e10cSrcweir if ( CH_Handshake == pCL->nServiceHeaderType ) 490cdf0e10cSrcweir { 491cdf0e10cSrcweir SvStream *pData = pCL->GetServiceData(); 492cdf0e10cSrcweir sal_uInt16 nType; 493cdf0e10cSrcweir pData->SetNumberFormatInt( NUMBERFORMAT_INT_BIGENDIAN ); // Unfortulately it is written this way :(( 494cdf0e10cSrcweir *pData >> nType; 495cdf0e10cSrcweir pData->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN ); 496cdf0e10cSrcweir switch ( nType ) 497cdf0e10cSrcweir { 498cdf0e10cSrcweir case CH_REQUEST_HandshakeAlive: 499cdf0e10cSrcweir { 500cdf0e10cSrcweir pCL->SendHandshake( CH_RESPONSE_HandshakeAlive ); 501cdf0e10cSrcweir } 502cdf0e10cSrcweir break; 503cdf0e10cSrcweir case CH_REQUEST_ShutdownLink: 504cdf0e10cSrcweir { 505cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 506cdf0e10cSrcweir debug_printf("Sending ShutdownLink\n"); 507cdf0e10cSrcweir #endif 508cdf0e10cSrcweir pCL->SendHandshake( CH_ShutdownLink ); 509cdf0e10cSrcweir } 510cdf0e10cSrcweir break; 511cdf0e10cSrcweir case CH_ShutdownLink: 512cdf0e10cSrcweir { 513cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 514cdf0e10cSrcweir debug_printf("Executing ShutdownLink\n"); 515cdf0e10cSrcweir #endif 516cdf0e10cSrcweir pCL->ShutdownCommunication(); 517cdf0e10cSrcweir } 518cdf0e10cSrcweir break; 519cdf0e10cSrcweir case CH_SetApplication: 520cdf0e10cSrcweir { 521cdf0e10cSrcweir ByteString aApplication; 522cdf0e10cSrcweir *pData >> aApplication; 523cdf0e10cSrcweir pCL->CommunicationLink::SetApplication( aApplication ); 524cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 525cdf0e10cSrcweir debug_printf( "Setting Application to " ); 526cdf0e10cSrcweir debug_printf( aApplication.GetBuffer() ); 527cdf0e10cSrcweir debug_printf( "\n" ); 528cdf0e10cSrcweir #endif 529cdf0e10cSrcweir } 530cdf0e10cSrcweir break; 531cdf0e10cSrcweir 532cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 533cdf0e10cSrcweir default: 534cdf0e10cSrcweir { 535cdf0e10cSrcweir debug_printf("Unknown Handshake received\n"); 536cdf0e10cSrcweir } 537cdf0e10cSrcweir #endif 538cdf0e10cSrcweir } 539cdf0e10cSrcweir delete pData; 540cdf0e10cSrcweir } 541cdf0e10cSrcweir else 542cdf0e10cSrcweir { 543cdf0e10cSrcweir if ( pCL->pServiceData ) 544cdf0e10cSrcweir { 545cdf0e10cSrcweir pCL->nTotalBytes += pCL->pServiceData->Seek( STREAM_SEEK_TO_END ); 546cdf0e10cSrcweir pCL->pServiceData->Seek( STREAM_SEEK_TO_BEGIN ); 547cdf0e10cSrcweir } 548cdf0e10cSrcweir 549cdf0e10cSrcweir INFO_MSG( CByteString("D :").Append( pCL->GetCommunicationPartner( CM_FQDN ) ), 550cdf0e10cSrcweir CByteString("Daten Empfangen:").Append( pCL->GetCommunicationPartner( CM_FQDN ) ), 551cdf0e10cSrcweir CM_RECEIVE, pCL ); 552cdf0e10cSrcweir DataReceived( pCL ); 553cdf0e10cSrcweir } 554cdf0e10cSrcweir delete pCL->GetServiceData(); 555cdf0e10cSrcweir pCL->FinishCallback(); 556cdf0e10cSrcweir } 557cdf0e10cSrcweir 558cdf0e10cSrcweir void CommunicationManager::CallInfoMsg( InfoString aMsg ) 559cdf0e10cSrcweir { 560cdf0e10cSrcweir // Hier wird es wohl kein Housekeeping geben 561cdf0e10cSrcweir InfoMsg( aMsg ); 562cdf0e10cSrcweir } 563cdf0e10cSrcweir 564cdf0e10cSrcweir void CommunicationManager::SetApplication( const ByteString& aApp, sal_Bool bRunningLinks ) 565cdf0e10cSrcweir { 566cdf0e10cSrcweir maApplication = aApp; 567cdf0e10cSrcweir if ( bRunningLinks ) 568cdf0e10cSrcweir { 569cdf0e10cSrcweir sal_uInt16 i; 570cdf0e10cSrcweir for ( i = 0 ; i < GetCommunicationLinkCount() ; i++ ) 571cdf0e10cSrcweir GetCommunicationLink( i )->SetApplication( aApp ); 572cdf0e10cSrcweir } 573cdf0e10cSrcweir } 574cdf0e10cSrcweir 575cdf0e10cSrcweir 576cdf0e10cSrcweir 577cdf0e10cSrcweir SingleCommunicationManager::SingleCommunicationManager( sal_Bool bUseMultiChannel ) 578cdf0e10cSrcweir : CommunicationManager( bUseMultiChannel ) 579cdf0e10cSrcweir { 580cdf0e10cSrcweir xActiveLink = NULL; 581cdf0e10cSrcweir pInactiveLink = NULL; 582cdf0e10cSrcweir } 583cdf0e10cSrcweir 584cdf0e10cSrcweir SingleCommunicationManager::~SingleCommunicationManager() 585cdf0e10cSrcweir { 586cdf0e10cSrcweir StopCommunication(); 587cdf0e10cSrcweir if ( pInactiveLink ) 588cdf0e10cSrcweir pInactiveLink->InvalidateManager(); 589cdf0e10cSrcweir } 590cdf0e10cSrcweir 591cdf0e10cSrcweir sal_Bool SingleCommunicationManager::StopCommunication() 592cdf0e10cSrcweir { 593cdf0e10cSrcweir if ( xActiveLink.Is() ) 594cdf0e10cSrcweir { 595cdf0e10cSrcweir sal_Bool bSuccess = xActiveLink->StopCommunication(); 596cdf0e10cSrcweir if ( pInactiveLink ) 597cdf0e10cSrcweir pInactiveLink->InvalidateManager(); 598cdf0e10cSrcweir pInactiveLink = xActiveLink; 599cdf0e10cSrcweir xActiveLink.Clear(); 600cdf0e10cSrcweir return bSuccess; 601cdf0e10cSrcweir } 602cdf0e10cSrcweir return sal_True; 603cdf0e10cSrcweir } 604cdf0e10cSrcweir 605cdf0e10cSrcweir sal_Bool SingleCommunicationManager::IsLinkValid( CommunicationLink* pCL ) 606cdf0e10cSrcweir { 607cdf0e10cSrcweir return &xActiveLink == pCL; 608cdf0e10cSrcweir } 609cdf0e10cSrcweir 610cdf0e10cSrcweir sal_uInt16 SingleCommunicationManager::GetCommunicationLinkCount() 611cdf0e10cSrcweir { 612cdf0e10cSrcweir return IsCommunicationRunning()?1:0; 613cdf0e10cSrcweir } 614cdf0e10cSrcweir 615cdf0e10cSrcweir CommunicationLinkRef SingleCommunicationManager::GetCommunicationLink( sal_uInt16 ) 616cdf0e10cSrcweir { 617cdf0e10cSrcweir return xActiveLink; 618cdf0e10cSrcweir } 619cdf0e10cSrcweir 620cdf0e10cSrcweir void SingleCommunicationManager::CallConnectionOpened( CommunicationLink* pCL ) 621cdf0e10cSrcweir { 622cdf0e10cSrcweir DBG_ASSERT( !xActiveLink.Is(), "Es ist bereits ein CommunicationLink aktiv"); 623cdf0e10cSrcweir if ( xActiveLink.Is() ) 624cdf0e10cSrcweir { 625cdf0e10cSrcweir if ( pInactiveLink ) 626cdf0e10cSrcweir pInactiveLink->InvalidateManager(); 627cdf0e10cSrcweir pInactiveLink = xActiveLink; 628cdf0e10cSrcweir xActiveLink->StopCommunication(); // Den alten Link brutal abw�rgen 629cdf0e10cSrcweir } 630cdf0e10cSrcweir xActiveLink = pCL; 631cdf0e10cSrcweir CommunicationManager::CallConnectionOpened( pCL ); 632cdf0e10cSrcweir } 633cdf0e10cSrcweir 634cdf0e10cSrcweir void SingleCommunicationManager::CallConnectionClosed( CommunicationLink* pCL ) 635cdf0e10cSrcweir { 636cdf0e10cSrcweir CommunicationManager::CallConnectionClosed( pCL ); 637cdf0e10cSrcweir 638cdf0e10cSrcweir DBG_ASSERT( pCL == xActiveLink, "SingleCommunicationManager::CallConnectionClosed mit fremdem Link"); 639cdf0e10cSrcweir if ( pInactiveLink ) 640cdf0e10cSrcweir pInactiveLink->InvalidateManager(); 641cdf0e10cSrcweir pInactiveLink = xActiveLink; 642cdf0e10cSrcweir xActiveLink.Clear(); 643cdf0e10cSrcweir bIsCommunicationRunning = sal_False; 644cdf0e10cSrcweir } 645cdf0e10cSrcweir 646cdf0e10cSrcweir void SingleCommunicationManager::DestroyingLink( CommunicationLink *pCL ) 647cdf0e10cSrcweir { 648cdf0e10cSrcweir pInactiveLink = NULL; 649cdf0e10cSrcweir pCL->InvalidateManager(); 650cdf0e10cSrcweir } 651cdf0e10cSrcweir 652cdf0e10cSrcweir 653cdf0e10cSrcweir SingleCommunicationManagerClientViaSocket::SingleCommunicationManagerClientViaSocket( ByteString aHost, sal_uLong nPort, sal_Bool bUseMultiChannel ) 654cdf0e10cSrcweir : SingleCommunicationManager( bUseMultiChannel ) 655cdf0e10cSrcweir , aHostToTalk( aHost ) 656cdf0e10cSrcweir , nPortToTalk( nPort ) 657cdf0e10cSrcweir { 658cdf0e10cSrcweir } 659cdf0e10cSrcweir 660cdf0e10cSrcweir 661cdf0e10cSrcweir SingleCommunicationManagerClientViaSocket::SingleCommunicationManagerClientViaSocket( sal_Bool bUseMultiChannel ) 662cdf0e10cSrcweir : SingleCommunicationManager( bUseMultiChannel ) 663cdf0e10cSrcweir , aHostToTalk() 664cdf0e10cSrcweir , nPortToTalk( 0 ) 665cdf0e10cSrcweir { 666cdf0e10cSrcweir } 667cdf0e10cSrcweir 668cdf0e10cSrcweir 669cdf0e10cSrcweir sal_Bool CommonSocketFunctions::DoStartCommunication( CommunicationManager *pCM, ICommunicationManagerClient *pCMC, ByteString aHost, sal_uLong nPort ) 670cdf0e10cSrcweir { 671cdf0e10cSrcweir vos::OInetSocketAddr Addr; 672cdf0e10cSrcweir vos::OConnectorSocket *pConnSocket; 673cdf0e10cSrcweir 674cdf0e10cSrcweir Addr.setAddr( rtl::OUString( UniString( aHost, RTL_TEXTENCODING_UTF8 ) ) ); 675cdf0e10cSrcweir Addr.setPort( nPort ); 676cdf0e10cSrcweir 677cdf0e10cSrcweir TimeValue aTV; 678cdf0e10cSrcweir aTV.Seconds = 10; // Warte 10 Sekunden 679cdf0e10cSrcweir aTV.Nanosec = 0; 680cdf0e10cSrcweir do 681cdf0e10cSrcweir { 682cdf0e10cSrcweir pConnSocket = new vos::OConnectorSocket(); 683cdf0e10cSrcweir pConnSocket->setTcpNoDelay( 1 ); 684cdf0e10cSrcweir if ( pConnSocket->connect( Addr, &aTV ) == vos::ISocketTypes::TResult_Ok ) 685cdf0e10cSrcweir { 686cdf0e10cSrcweir pConnSocket->setTcpNoDelay( 1 ); 687cdf0e10cSrcweir 688cdf0e10cSrcweir pCM->CallConnectionOpened( CreateCommunicationLink( pCM, pConnSocket ) ); 689cdf0e10cSrcweir return sal_True; 690cdf0e10cSrcweir } 691cdf0e10cSrcweir else 692cdf0e10cSrcweir delete pConnSocket; 693cdf0e10cSrcweir 694cdf0e10cSrcweir } while ( pCMC->RetryConnect() ); 695cdf0e10cSrcweir 696cdf0e10cSrcweir return sal_False; 697cdf0e10cSrcweir } 698cdf0e10cSrcweir 699