1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include <algorithm>
#include <vector>
#include <comphelper/processfactory.hxx>
#include "Communicator.hxx"
#include "Listener.hxx"
#include "Receiver.hxx"
#include "RemoteServer.hxx"
using namespace sd;
using namespace std;
using namespace com::sun::star;
using namespace osl;
Communicator::Communicator( IBluetoothSocket *pSocket ):
Thread( "CommunicatorThread" ),
mpSocket( pSocket ),
pTransmitter( 0 ),
mListener( 0 )
{
}
Communicator::~Communicator()
{
}
// Run as a thread
void Communicator::execute()
{
pTransmitter = new Transmitter( mpSocket );
pTransmitter->create();
pTransmitter->addMessage( "LO_SERVER_SERVER_PAIRED\n\n",
Transmitter::PRIORITY_HIGH );
Receiver aReceiver( pTransmitter );
try {
uno::Reference< lang::XMultiServiceFactory > xServiceManager(
::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
uno::Reference< frame::XFramesSupplier > xFramesSupplier( xServiceManager->createInstance(
"com.sun.star.frame.Desktop" ) , uno::UNO_QUERY_THROW );
uno::Reference< frame::XFrame > xFrame ( xFramesSupplier->getActiveFrame(), uno::UNO_QUERY_THROW );
uno::Reference<presentation::XPresentationSupplier> xPS ( xFrame->getController()->getModel(), uno::UNO_QUERY_THROW);
uno::Reference<presentation::XPresentation2> xPresentation(
xPS->getPresentation(), uno::UNO_QUERY_THROW);
if ( xPresentation->isRunning() )
{
presentationStarted( xPresentation->getController() );
}
else
{
pTransmitter->addMessage( "slideshow_finished\n\n",
Transmitter::PRIORITY_HIGH );
}
}
catch (uno::RuntimeException &)
{
}
sal_uInt64 aRet;
vector<OString> aCommand;
while ( true )
{
OString aLine;
aRet = mpSocket->readLine( aLine );
if ( aRet == 0 )
{
break; // I.e. transmission finished.
}
if ( aLine.getLength() )
{
aCommand.push_back( aLine );
}
else
{
aReceiver.pushCommand( aCommand );
aCommand.clear();
}
}
disposeListener();
pTransmitter->notifyFinished();
pTransmitter->join();
pTransmitter = NULL;
delete mpSocket;
RemoteServer::removeCommunicator( this );
}
void Communicator::informListenerDestroyed()
{
if ( pTransmitter )
pTransmitter->addMessage( "slideshow_finished\n\n",
Transmitter::PRIORITY_HIGH );
mListener.clear();
}
void Communicator::presentationStarted( const css::uno::Reference<
css::presentation::XSlideShowController > &rController )
{
if ( pTransmitter )
{
mListener = rtl::Reference<Listener>( new Listener( this, pTransmitter ) );
mListener->init( rController );
}
}
void Communicator::disposeListener()
{
if ( mListener.is() )
{
mListener->disposing();
mListener = NULL;
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|