summaryrefslogtreecommitdiff
path: root/extensions/source/plugin/unx/mediator.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/plugin/unx/mediator.cxx')
-rw-r--r--extensions/source/plugin/unx/mediator.cxx312
1 files changed, 0 insertions, 312 deletions
diff --git a/extensions/source/plugin/unx/mediator.cxx b/extensions/source/plugin/unx/mediator.cxx
deleted file mode 100644
index e44c1b3d9..000000000
--- a/extensions/source/plugin/unx/mediator.cxx
+++ /dev/null
@@ -1,312 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_extensions.hxx"
-#include <errno.h>
-#include <unistd.h>
-
-#include <plugin/unx/mediator.hxx>
-#include <vcl/svapp.hxx>
-
-#define MEDIATOR_MAGIC 0xf7a8d2f4
-
-Mediator::Mediator( int nSocket ) :
- m_nSocket( nSocket ),
- m_pListener( NULL ),
- m_nCurrentID( 1 ),
- m_bValid( true )
-{
- m_pListener = new MediatorListener( this );
- m_pListener->create();
-}
-
-Mediator::~Mediator()
-{
- if( m_pListener )
- {
- {
- ::osl::MutexGuard aGuard( m_pListener->m_aMutex );
- m_pListener->m_pMediator = NULL;
- }
- m_pListener = NULL;
- if( m_bValid )
- {
- sal_uLong aHeader[3];
- aHeader[0] = 0;
- aHeader[1] = 0;
- aHeader[2] = MEDIATOR_MAGIC;
- write( m_nSocket, aHeader, sizeof( aHeader ) );
- }
- // kick the thread out of its run method; it deletes itself
- close( m_nSocket );
- }
- else
- close( m_nSocket );
- for( std::vector< MediatorMessage* >::iterator it = m_aMessageQueue.begin();
- it != m_aMessageQueue.end(); ++it )
- {
- delete *it;
- }
-}
-
-
-sal_uLong Mediator::SendMessage( sal_uLong nBytes, const char* pBytes, sal_uLong nMessageID )
-{
- if( ! m_pListener )
- return 0;
-
- osl::MutexGuard aGuard( m_aSendMutex );
- if( ! nMessageID )
- nMessageID = m_nCurrentID;
-
- m_nCurrentID++;
- if( m_nCurrentID >= 1 << 24 ) // protection against overflow
- m_nCurrentID = 1;
-
- if( ! m_bValid )
- return nMessageID;
-
- sal_uLong* pBuffer = new sal_uLong[ (nBytes/sizeof(sal_uLong)) + 4 ];
- pBuffer[ 0 ] = nMessageID;
- pBuffer[ 1 ] = nBytes;
- pBuffer[ 2 ] = MEDIATOR_MAGIC;
- memcpy( &pBuffer[3], pBytes, (size_t)nBytes );
- write( m_nSocket, pBuffer, nBytes + 3*sizeof( sal_uLong ) );
- delete [] pBuffer;
-
- return nMessageID;
-}
-
-sal_Bool Mediator::WaitForMessage( sal_uLong nTimeOut )
-{
- if( ! m_pListener )
- return sal_False;
-
- size_t nItems = m_aMessageQueue.size();
-
- if( ! nTimeOut && nItems > 0 )
- return sal_True;
-
- TimeValue aValue;
- aValue.Seconds = nTimeOut/1000;
- aValue.Nanosec = ( nTimeOut % 1000 ) * 1000;
-
- while( m_aMessageQueue.size() == nItems )
- {
- m_aNewMessageCdtn.wait( & aValue );
- m_aNewMessageCdtn.reset();
- if( nTimeOut && m_aMessageQueue.size() == nItems )
- return sal_False;
- }
- return sal_True;
-}
-
-MediatorMessage* Mediator::WaitForAnswer( sal_uLong nMessageID )
-{
- nMessageID &= 0x00ffffff;
- while( m_pListener )
- {
- {
- osl::MutexGuard aGuard( m_aQueueMutex );
- for( size_t i = 0; i < m_aMessageQueue.size(); i++ )
- {
- MediatorMessage* pMessage = m_aMessageQueue[ i ];
- sal_uLong nID = pMessage->m_nID;
- if( ( nID & 0xff000000 ) &&
- ( ( nID & 0x00ffffff ) == nMessageID ) )
- {
- m_aMessageQueue.erase( m_aMessageQueue.begin() + i );
- return pMessage;
- }
- }
- }
- WaitForMessage( 10 );
- }
- return NULL;
-}
-
-MediatorMessage* Mediator::GetNextMessage( sal_Bool bWait )
-{
- while( m_pListener )
- {
- {
- // guard must be after WaitForMessage, else the listener
- // cannot insert a new one -> deadlock
- osl::MutexGuard aGuard( m_aQueueMutex );
- for( size_t i = 0; i < m_aMessageQueue.size(); i++ )
- {
- MediatorMessage* pMessage = m_aMessageQueue[ i ];
- if( ! ( pMessage->m_nID & 0xff000000 ) )
- {
- m_aMessageQueue.erase( m_aMessageQueue.begin() + i );
- return pMessage;
- }
- }
- if( ! bWait )
- return NULL;
- }
- WaitForMessage();
- }
- return NULL;
-}
-
-MediatorMessage* Mediator::TransactMessage( sal_uLong nBytes, char* pBytes )
-{
- sal_uLong nID = SendMessage( nBytes, pBytes );
- return WaitForAnswer( nID );
-}
-
-MediatorListener::MediatorListener( Mediator* pMediator ) :
- m_pMediator( pMediator )
-{
-}
-
-MediatorListener::~MediatorListener()
-{
-}
-
-void MediatorListener::run()
-{
- bool bRun = true;
- while( schedule() && m_pMediator && bRun )
- {
- sal_uLong nHeader[ 3 ];
- int nBytes;
-
- if( m_pMediator && ( nBytes = read( m_pMediator->m_nSocket, nHeader, sizeof( nHeader ) ) ) == sizeof( nHeader ) && nHeader[2] == MEDIATOR_MAGIC)
- {
- if( nHeader[ 0 ] == 0 && nHeader[ 1 ] == 0 )
- return;
- char* pBuffer = new char[ nHeader[ 1 ] ];
- if( m_pMediator && (sal_uLong)read( m_pMediator->m_nSocket, pBuffer, nHeader[ 1 ] ) == nHeader[ 1 ] )
- {
- ::osl::MutexGuard aMyGuard( m_aMutex );
- {
- osl::MutexGuard
- aGuard( m_pMediator->m_aQueueMutex );
- MediatorMessage* pMessage =
- new MediatorMessage( nHeader[ 0 ], nHeader[ 1 ], pBuffer );
- m_pMediator->m_aMessageQueue.push_back( pMessage );
- }
- m_pMediator->m_aNewMessageCdtn.set();
- m_pMediator->m_aNewMessageHdl.Call( m_pMediator );
- }
- else
- {
- medDebug( 1, "got incomplete MediatorMessage: { %d, %d, %*s }\n",
- nHeader[0], nHeader[1], nHeader[1], pBuffer );
- bRun = false;
- }
- delete [] pBuffer;
- }
- else
- {
- medDebug( 1, "got incomplete message header of %d bytes ( nHeader = [ %u, %u ] ), errno is %d\n",
- nBytes, nHeader[ 0 ], nHeader[ 1 ], (int)errno );
- bRun = false;
- }
- }
-}
-
-void MediatorListener::onTerminated()
-{
- if( m_pMediator )
- {
- m_pMediator->m_aConnectionLostHdl.Call( m_pMediator );
- m_pMediator->m_pListener = NULL;
- }
- delete this;
-}
-
-sal_uLong MediatorMessage::ExtractULONG()
-{
- if( ! m_pRun )
- m_pRun = m_pBytes;
-
- medDebug( (sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "Overflow in MediatorMessage::ExtractULONG\n" );
- sal_uLong nCount;
- memcpy( &nCount, m_pRun, sizeof( sal_uLong ) );
- m_pRun += sizeof( sal_uLong );
- return nCount;
-}
-
-void* MediatorMessage::GetBytes( sal_uLong& rBytes )
-{
- if( ! m_pRun )
- m_pRun = m_pBytes;
-
- medDebug( (sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "Overflow in MediatorMessage::GetBytes\n" );
- sal_uLong nBytes = ExtractULONG();
-
- if( nBytes == 0 )
- return NULL;
-
- medDebug( (sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "Overflow in MediatorMessage::GetBytes\n" );
- char* pBuffer = new char[ nBytes ];
- memcpy( pBuffer, m_pRun, nBytes );
- m_pRun += nBytes;
- rBytes = nBytes;
- return pBuffer;
-}
-
-char* MediatorMessage::GetString()
-{
- if( ! m_pRun )
- m_pRun = m_pBytes;
-
- medDebug( (sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "Overflow in MediatorMessage::GetString\n" );
- sal_uLong nBytes = ExtractULONG();
-
- if( nBytes == 0 )
- return NULL;
-
- medDebug( (sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "Overflow in MediatorMessage::GetString\n" );
- char* pBuffer = new char[ nBytes+1 ];
- memcpy( pBuffer, m_pRun, nBytes );
- pBuffer[ nBytes ] = 0;
- m_pRun += nBytes;
- return pBuffer;
-}
-
-sal_uInt32 MediatorMessage::GetUINT32()
-{
- if( ! m_pRun )
- m_pRun = m_pBytes;
-
- medDebug( (sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "Overflow in MediatorMessage::GetUINT32\n" );
- sal_uLong nBytes = ExtractULONG();
- medDebug( nBytes != sizeof( sal_uInt32 ), "No sal_uInt32 in MediatorMessage::GetUINT32\n" );
- medDebug( (sal_uLong)(m_pRun - m_pBytes) >= m_nBytes, "Overflow in MediatorMessage::GetUINT32\n" );
- sal_uInt32 nRet;
- memcpy( &nRet, m_pRun, sizeof( nRet ) );
- m_pRun += sizeof( sal_uInt32 );
- return nRet;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */