Kaydet (Commit) f9685dc5 authored tarafından Tor Lillqvist's avatar Tor Lillqvist

More work on the Impress Remote Control Bluetooth code for OS X

Mostly the work of Thorsten, from December, adapted to compile against
the current remote control code, and with one or two crucial things
added. Plus lots of SAL_INFO calls added; once it works well many of
them can be dropped. Does not work properly yet, do not cherry-pick
just this to 4.0.

Change-Id: I53361b49a2b6938c768be1ea0fc17eb5e46b6aa4
üst 3717bbf3
...@@ -543,6 +543,7 @@ else ...@@ -543,6 +543,7 @@ else
$(eval $(call gb_Library_add_objcxxobjects,sd,\ $(eval $(call gb_Library_add_objcxxobjects,sd,\
sd/source/ui/remotecontrol/BluetoothServer \ sd/source/ui/remotecontrol/BluetoothServer \
sd/source/ui/remotecontrol/OSXBluetooth \
)) ))
$(eval $(call gb_Library_add_libs,sd,\ $(eval $(call gb_Library_add_libs,sd,\
......
...@@ -9,7 +9,8 @@ ...@@ -9,7 +9,8 @@
#include "BluetoothServer.hxx" #include "BluetoothServer.hxx"
#include <stdio.h> #include <iostream>
#include <iomanip>
#include <sal/log.hxx> #include <sal/log.hxx>
...@@ -40,6 +41,7 @@ ...@@ -40,6 +41,7 @@
#endif #endif
#ifdef MACOSX #ifdef MACOSX
#include <osl/conditn.hxx> // Include this early to avoid error as check() gets defined by some SDK header to empty
#include <premac.h> #include <premac.h>
#if MACOSX_SDK_VERSION >= 1070 #if MACOSX_SDK_VERSION >= 1070
#import <IOBluetooth/IOBluetooth.h> #import <IOBluetooth/IOBluetooth.h>
...@@ -50,6 +52,8 @@ ...@@ -50,6 +52,8 @@
#import <IOBluetooth/objc/IOBluetoothSDPServiceRecord.h> #import <IOBluetooth/objc/IOBluetoothSDPServiceRecord.h>
#endif #endif
#include <postmac.h> #include <postmac.h>
#import "OSXBluetooth.h"
#include "OSXBluetoothWrapper.hxx"
#endif #endif
#ifdef __MINGW32__ #ifdef __MINGW32__
...@@ -104,6 +108,141 @@ DBusGProxy* bluezGetDefaultAdapter( DBusGConnection* aConnection, ...@@ -104,6 +108,141 @@ DBusGProxy* bluezGetDefaultAdapter( DBusGConnection* aConnection,
} }
#endif // defined(LINUX) && defined(ENABLE_DBUS) #endif // defined(LINUX) && defined(ENABLE_DBUS)
#if defined(MACOSX)
OSXBluetoothWrapper::OSXBluetoothWrapper( IOBluetoothRFCOMMChannel* channel ) :
mpChannel(channel),
mnMTU(0),
mHaveBytes(),
mMutex(),
mBuffer()
{
// silly enough, can't write more than mnMTU bytes at once
mnMTU = [channel getMTU];
SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::OSXBluetoothWrapper(): mnMTU=" << mnMTU );
}
sal_Int32 OSXBluetoothWrapper::readLine( rtl::OString& aLine )
{
SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine()" );
while( true )
{
{
SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine: entering mutex" );
::osl::MutexGuard aQueueGuard( mMutex );
SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine: entered mutex" );
#ifdef SAL_LOG_INFO
// We should have in the sal logging some standard way to
// output char buffers with non-printables escaped.
std::ostringstream s;
for (unsigned char *p = (unsigned char *) mBuffer.data(); p != (unsigned char *) mBuffer.data() + mBuffer.size(); p++)
{
if (*p == '\n')
s << "\\n";
else if (*p < ' ' || (*p >= 0x7F && *p <= 0xFF))
s << "\\0x" << std::hex << std::setw(2) << std::setfill('0') << (int) *p << std::setfill(' ') << std::setw(1) << std::dec;
else
s << *p;
}
SAL_INFO( "sdremote.bluetooth", " mBuffer: \"" << s.str() << "\"" );
#endif
// got enough bytes to return a line?
std::vector<char>::iterator aIt;
if ( (aIt = find( mBuffer.begin(), mBuffer.end(), '\n' ))
!= mBuffer.end() )
{
sal_uInt64 aLocation = aIt - mBuffer.begin();
aLine = OString( &(*mBuffer.begin()), aLocation );
mBuffer.erase( mBuffer.begin(), aIt + 1 ); // Also delete the empty line
// yeps
SAL_INFO( "sdremote.bluetooth", " returning, got \"" << OStringToOUString( aLine, RTL_TEXTENCODING_UTF8 ) << "\"" );
return aLine.getLength() + 1;
}
// nope - wait some more (after releasing the mutex)
SAL_INFO( "sdremote.bluetooth", " resetting mHaveBytes" );
mHaveBytes.reset();
SAL_INFO( "sdremote.bluetooth", " leaving mutex" );
}
SAL_INFO( "sdremote.bluetooth", " waiting for mHaveBytes" );
mHaveBytes.wait();
SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine: got mHaveBytes" );
}
}
sal_Int32 OSXBluetoothWrapper::write( const void* pBuffer, sal_uInt32 n )
{
SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::write(" << pBuffer << ", " << n << ") mpChannel=" << mpChannel );
char* ptr = (char*)pBuffer;
sal_uInt32 nBytesWritten = 0;
while( nBytesWritten < n )
{
int toWrite = n - nBytesWritten;
toWrite = toWrite <= mnMTU ? toWrite : mnMTU;
if ( [mpChannel writeSync:ptr length:toWrite] != kIOReturnSuccess )
{
SAL_INFO( "sdremote.bluetooth", " [mpChannel writeSync:" << (void *) ptr << " length:" << toWrite << "] returned error, total written " << nBytesWritten );
return nBytesWritten;
}
ptr += toWrite;
nBytesWritten += toWrite;
}
SAL_INFO( "sdremote.bluetooth", " total written " << nBytesWritten );
return nBytesWritten;
}
void OSXBluetoothWrapper::appendData(void* pBuffer, size_t len)
{
SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::appendData(" << pBuffer << ", " << len << ")" );
if( len )
{
SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::appendData: entering mutex" );
::osl::MutexGuard aQueueGuard( mMutex );
SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::appendData: entered mutex" );
mBuffer.insert(mBuffer.begin()+mBuffer.size(),
(char*)pBuffer, (char *)pBuffer+len);
SAL_INFO( "sdremote.bluetooth", " setting mHaveBytes" );
mHaveBytes.set();
SAL_INFO( "sdremote.bluetooth", " leaving mutex" );
}
}
void incomingCallback( void *userRefCon,
IOBluetoothUserNotificationRef inRef,
IOBluetoothObjectRef objectRef )
{
(void) inRef;
SAL_INFO( "sdremote.bluetooth", "incomingCallback()" );
BluetoothServer* pServer = (BluetoothServer*)userRefCon;
IOBluetoothRFCOMMChannel* channel = [IOBluetoothRFCOMMChannel withRFCOMMChannelRef:(IOBluetoothRFCOMMChannelRef)objectRef];
OSXBluetoothWrapper* socket = new OSXBluetoothWrapper( channel);
Communicator* pCommunicator = new Communicator( socket );
pServer->addCommunicator( pCommunicator );
ChannelDelegate* delegate = [[ChannelDelegate alloc] initWithCommunicatorAndSocket: pCommunicator socket: socket];
[channel setDelegate: delegate];
[delegate retain];
pCommunicator->launch();
}
#endif // MACOSX
BluetoothServer::BluetoothServer( std::vector<Communicator*>* pCommunicators ) BluetoothServer::BluetoothServer( std::vector<Communicator*>* pCommunicators )
: mpCommunicators( pCommunicators ) : mpCommunicators( pCommunicators )
{ {
...@@ -260,6 +399,11 @@ void BluetoothServer::setDiscoverable( bool aDiscoverable ) ...@@ -260,6 +399,11 @@ void BluetoothServer::setDiscoverable( bool aDiscoverable )
#endif #endif
} }
void BluetoothServer::addCommunicator( Communicator* pCommunicator )
{
mpCommunicators->push_back( pCommunicator );
}
void SAL_CALL BluetoothServer::run() void SAL_CALL BluetoothServer::run()
{ {
SAL_INFO( "sdremote.bluetooth", "BluetoothServer::run called" ); SAL_INFO( "sdremote.bluetooth", "BluetoothServer::run called" );
...@@ -526,7 +670,7 @@ void SAL_CALL BluetoothServer::run() ...@@ -526,7 +670,7 @@ void SAL_CALL BluetoothServer::run()
IOBluetoothSDPServiceRecordRef serviceRecordRef; IOBluetoothSDPServiceRecordRef serviceRecordRef;
IOReturn rc = IOBluetoothAddServiceDict((CFDictionaryRef) dict, &serviceRecordRef); IOReturn rc = IOBluetoothAddServiceDict((CFDictionaryRef) dict, &serviceRecordRef);
SAL_INFO("sd.bluetooth", "IOBluetoothAddServiceDict returned " << rc); SAL_INFO("sdremote.bluetooth", "IOBluetoothAddServiceDict returned " << rc);
if (rc == kIOReturnSuccess) if (rc == kIOReturnSuccess)
{ {
...@@ -539,9 +683,17 @@ void SAL_CALL BluetoothServer::run() ...@@ -539,9 +683,17 @@ void SAL_CALL BluetoothServer::run()
BluetoothSDPServiceRecordHandle serviceRecordHandle; BluetoothSDPServiceRecordHandle serviceRecordHandle;
[serviceRecord getServiceRecordHandle: &serviceRecordHandle]; [serviceRecord getServiceRecordHandle: &serviceRecordHandle];
// Do more... // Register callback for incoming connections
IOBluetoothUserNotificationRef callbackRef =
IOBluetoothRegisterForFilteredRFCOMMChannelOpenNotifications(
incomingCallback,
this,
channelID,
kIOBluetoothUserNotificationChannelDirectionIncoming);
(void) callbackRef;
(void) serviceRecord; [serviceRecord release];
} }
(void) mpCommunicators; (void) mpCommunicators;
#else #else
......
...@@ -24,6 +24,8 @@ namespace sd ...@@ -24,6 +24,8 @@ namespace sd
static bool isDiscoverable(); static bool isDiscoverable();
static void setDiscoverable( bool aDiscoverable ); static void setDiscoverable( bool aDiscoverable );
void addCommunicator( Communicator* pCommunicator );
private: private:
BluetoothServer( std::vector<Communicator*>* pCommunicators ); BluetoothServer( std::vector<Communicator*>* pCommunicators );
~BluetoothServer(); ~BluetoothServer();
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#ifndef _SD_IMPRESSREMOTE_BUFFEREDSTREAMSOCKET_HXX #ifndef _SD_IMPRESSREMOTE_BUFFEREDSTREAMSOCKET_HXX
#define _SD_IMPRESSREMOTE_BUFFEREDSTREAMSOCKET_HXX #define _SD_IMPRESSREMOTE_BUFFEREDSTREAMSOCKET_HXX
#include <boost/noncopyable.hpp> #include "IBluetoothSocket.hxx"
#include <osl/socket.hxx> #include <osl/socket.hxx>
#include <vector> #include <vector>
...@@ -28,8 +28,8 @@ namespace sd ...@@ -28,8 +28,8 @@ namespace sd
* integrated into osl Sockets. * integrated into osl Sockets.
*/ */
class BufferedStreamSocket : class BufferedStreamSocket :
private ::osl::StreamSocket, public IBluetoothSocket,
private ::boost::noncopyable private ::osl::StreamSocket
{ {
public: public:
/** /**
...@@ -47,9 +47,9 @@ namespace sd ...@@ -47,9 +47,9 @@ namespace sd
* Returns whatever the last call of recv returned, i.e. 0 or less * Returns whatever the last call of recv returned, i.e. 0 or less
* if there was a problem in communications. * if there was a problem in communications.
*/ */
sal_Int32 readLine(OString& aLine); virtual sal_Int32 readLine( OString& aLine );
sal_Int32 write( const void* pBuffer, sal_uInt32 n ); virtual sal_Int32 write( const void* pBuffer, sal_uInt32 n );
void getPeerAddr(osl::SocketAddr&); void getPeerAddr(osl::SocketAddr&);
private: private:
......
...@@ -22,7 +22,7 @@ using namespace std; ...@@ -22,7 +22,7 @@ using namespace std;
using namespace com::sun::star; using namespace com::sun::star;
using namespace osl; using namespace osl;
Communicator::Communicator( BufferedStreamSocket *pSocket ): Communicator::Communicator( IBluetoothSocket *pSocket ):
Thread( "CommunicatorThread" ), Thread( "CommunicatorThread" ),
mpSocket( pSocket ), mpSocket( pSocket ),
pTransmitter( 0 ), pTransmitter( 0 ),
......
...@@ -9,20 +9,17 @@ ...@@ -9,20 +9,17 @@
#ifndef _SD_IMPRESSREMOTE_COMMUNICATOR_HXX #ifndef _SD_IMPRESSREMOTE_COMMUNICATOR_HXX
#define _SD_IMPRESSREMOTE_COMMUNICATOR_HXX #define _SD_IMPRESSREMOTE_COMMUNICATOR_HXX
// SERVER
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <sys/types.h>
#include <vector> #include <vector>
#include <osl/socket.hxx>
#include <rtl/ref.hxx> #include <rtl/ref.hxx>
#include <salhelper/thread.hxx> #include <salhelper/thread.hxx>
#include <com/sun/star/presentation/XSlideShowController.hpp> #include <com/sun/star/presentation/XSlideShowController.hpp>
#include "BufferedStreamSocket.hxx" #include "IBluetoothSocket.hxx"
#define CHARSET RTL_TEXTENCODING_UTF8 #define CHARSET RTL_TEXTENCODING_UTF8
namespace sd namespace sd
...@@ -39,7 +36,7 @@ namespace sd ...@@ -39,7 +36,7 @@ namespace sd
class Communicator : public salhelper::Thread class Communicator : public salhelper::Thread
{ {
public: public:
Communicator( BufferedStreamSocket *pSocket ); Communicator( IBluetoothSocket *pSocket );
~Communicator(); ~Communicator();
void presentationStarted( const css::uno::Reference< void presentationStarted( const css::uno::Reference<
...@@ -49,7 +46,7 @@ namespace sd ...@@ -49,7 +46,7 @@ namespace sd
private: private:
void execute(); void execute();
BufferedStreamSocket *mpSocket; IBluetoothSocket *mpSocket;
Transmitter *pTransmitter; Transmitter *pTransmitter;
rtl::Reference<Listener> mListener; rtl::Reference<Listener> mListener;
...@@ -57,4 +54,5 @@ namespace sd ...@@ -57,4 +54,5 @@ namespace sd
} }
#endif // _SD_IMPRESSREMOTE_COMMUNICATOR_HXX #endif // _SD_IMPRESSREMOTE_COMMUNICATOR_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- 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/.
*/
#ifndef _SD_IMPRESSREMOTE_IBLUETOOTHSOCKET_HXX
#define _SD_IMPRESSREMOTE_IBLUETOOTHSOCKET_HXX
#include <rtl/string.hxx>
#include <boost/noncopyable.hpp>
namespace sd
{
/** Interface for bluetooth data io
*/
struct IBluetoothSocket : private boost::noncopyable
{
virtual ~IBluetoothSocket() {}
/** Blocks until a line is read.
@return whatever the last call of recv returned, i.e. 0 or less
if there was a problem in communications.
*/
virtual sal_Int32 readLine(rtl::OString& aLine) = 0;
/** Write a number of bytes
@return number of bytes actually written
*/
virtual sal_Int32 write( const void* pBuffer, sal_uInt32 n ) = 0;
};
}
#endif // _SD_IMPRESSREMOTE_IBLUETOOTHSOCKET_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- Mode: ObjC; 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/.
*/
#ifndef INCLUDED_OSXBLUETOOTH_H
#define INCLUDED_OSXBLUETOOTH_H
#import <IOBluetooth/objc/IOBluetoothRFCOMMChannel.h>
#include "IBluetoothSocket.hxx"
#include "Communicator.hxx"
#include "OSXBluetoothWrapper.hxx"
@interface ChannelDelegate : NSObject<IOBluetoothRFCOMMChannelDelegate>
{
sd::Communicator* pCommunicator;
sd::OSXBluetoothWrapper* pSocket;
}
- (id) initWithCommunicatorAndSocket:(sd::Communicator*)communicator socket:(sd::OSXBluetoothWrapper*)socket;
- (void) rfcommChannelData:(IOBluetoothRFCOMMChannel*)rfcommChannel data:(void *)dataPointer length:(size_t)dataLength;
- (void) rfcommChannelClosed:(IOBluetoothRFCOMMChannel*)rfcommChannel;
@end
#endif /* INCLUDED_OSXBLUETOOTH_H */
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- Mode: ObjC; 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 <osl/conditn.hxx> // Include this early to avoid error as check() gets defined by some SDK header to empty
#include <premac.h>
#import <IOBluetooth/objc/IOBluetoothRFCOMMChannel.h>
#include <postmac.h>
#include "OSXBluetooth.h"
@implementation ChannelDelegate
- (id) initWithCommunicatorAndSocket:(sd::Communicator*)communicator socket:(sd::OSXBluetoothWrapper*)socket
{
pCommunicator = communicator;
pSocket = socket;
return self;
}
- (void) rfcommChannelData:(IOBluetoothRFCOMMChannel*)rfcommChannel data:(void *)dataPointer length:(size_t)dataLength
{
(void) rfcommChannel;
if ( pSocket )
{
pSocket->appendData(dataPointer, dataLength);
}
}
- (void) rfcommChannelClosed:(IOBluetoothRFCOMMChannel*)rfcommChannel
{
(void) rfcommChannel;
// TODO: broadcast premature closing of data channel
pCommunicator = NULL;
pSocket = NULL;
}
@end
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- 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/.
*/
#ifndef _SD_IMPRESSREMOTE_OSXBLUETOOTHWRAPPER_HXX
#define _SD_IMPRESSREMOTE_OSXBLUETOOTHWRAPPER_HXX
#include <rtl/string.hxx>
#include <osl/conditn.hxx>
#include <osl/mutex.hxx>
#include <vector>
#include "IBluetoothSocket.hxx"
namespace sd
{
class OSXBluetoothWrapper : public IBluetoothSocket
{
IOBluetoothRFCOMMChannel* mpChannel;
int mnMTU;
osl::Condition mHaveBytes;
osl::Mutex mMutex;
std::vector<char> mBuffer;
public:
OSXBluetoothWrapper( IOBluetoothRFCOMMChannel* channel );
virtual sal_Int32 readLine( rtl::OString& aLine );
virtual sal_Int32 write( const void* pBuffer, sal_uInt32 len );
void appendData(void* pBuffer, size_t len );
};
}
#endif // _SD_IMPRESSREMOTE_OSXBLUETOOTHWRAPPER_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include "RemoteServer.hxx" #include "RemoteServer.hxx"
#include "BluetoothServer.hxx" #include "BluetoothServer.hxx"
#include "Communicator.hxx" #include "Communicator.hxx"
#include "BufferedStreamSocket.hxx"
using namespace std; using namespace std;
using namespace sd; using namespace sd;
......
...@@ -13,7 +13,7 @@ using namespace std; ...@@ -13,7 +13,7 @@ using namespace std;
using namespace osl; // Sockets etc. using namespace osl; // Sockets etc.
using namespace sd; using namespace sd;
Transmitter::Transmitter( BufferedStreamSocket* aSocket ) Transmitter::Transmitter( IBluetoothSocket* aSocket )
: pStreamSocket( aSocket ), : pStreamSocket( aSocket ),
mQueuesNotEmpty(), mQueuesNotEmpty(),
mFinishRequested(), mFinishRequested(),
......
...@@ -6,12 +6,13 @@ ...@@ -6,12 +6,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
#ifndef _SD_IMPRESSREMOTE_TRANSMITTER_HXX #ifndef _SD_IMPRESSREMOTE_TRANSMITTER_HXX
#define _SD_IMPRESSREMOTE_TRANSMITTER_HXX #define _SD_IMPRESSREMOTE_TRANSMITTER_HXX
#include <osl/conditn.hxx> #include <osl/conditn.hxx>
#include <osl/mutex.hxx> #include <osl/mutex.hxx>
#include "BufferedStreamSocket.hxx" #include "IBluetoothSocket.hxx"
#include <osl/thread.hxx> #include <osl/thread.hxx>
#include <rtl/string.hxx> #include <rtl/string.hxx>
...@@ -25,7 +26,7 @@ class Transmitter ...@@ -25,7 +26,7 @@ class Transmitter
{ {
public: public:
enum Priority { PRIORITY_LOW = 1, PRIORITY_HIGH }; enum Priority { PRIORITY_LOW = 1, PRIORITY_HIGH };
Transmitter( ::sd::BufferedStreamSocket* aSocket ); Transmitter( ::sd::IBluetoothSocket* aSocket );
~Transmitter(); ~Transmitter();
void addMessage( const rtl::OString& aMessage, const Priority aPriority ); void addMessage( const rtl::OString& aMessage, const Priority aPriority );
void notifyFinished(); void notifyFinished();
...@@ -33,7 +34,7 @@ public: ...@@ -33,7 +34,7 @@ public:
private: private:
virtual void SAL_CALL run(); virtual void SAL_CALL run();
::sd::BufferedStreamSocket* pStreamSocket; ::sd::IBluetoothSocket* pStreamSocket;
::osl::Condition mQueuesNotEmpty; ::osl::Condition mQueuesNotEmpty;
::osl::Condition mFinishRequested; ::osl::Condition mFinishRequested;
...@@ -46,4 +47,5 @@ private: ...@@ -46,4 +47,5 @@ private:
} }
#endif // _SD_IMPRESSREMOTE_TRANSMITTER_HXX #endif // _SD_IMPRESSREMOTE_TRANSMITTER_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment