summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@suse.com>2013-02-18 09:24:23 +0000
committerMichael Meeks <michael.meeks@suse.com>2013-02-19 09:12:00 +0000
commitfe72f19a9b80d9cfa2de9a10fa2e0aa0c9a7b4ae (patch)
treecfb7bf844fee1feacb99def99d6c1820ba95f71a
parent3708fe8434ad6f64d527215f4619556b0a5701ff (diff)
improve bluetooth discoverability toggling API.
Change-Id: I289d43fcb173b64b01183a41f780bc74d2ba0abe
-rw-r--r--sd/source/ui/dlg/RemoteDialog.cxx21
-rw-r--r--sd/source/ui/dlg/RemoteDialog.hxx2
-rw-r--r--sd/source/ui/inc/RemoteServer.hxx6
-rw-r--r--sd/source/ui/remotecontrol/BluetoothServer.cxx36
-rw-r--r--sd/source/ui/remotecontrol/BluetoothServer.hxx13
-rw-r--r--sd/source/ui/remotecontrol/Server.cxx14
6 files changed, 52 insertions, 40 deletions
diff --git a/sd/source/ui/dlg/RemoteDialog.cxx b/sd/source/ui/dlg/RemoteDialog.cxx
index d98eda7e3827..2765eb290a47 100644
--- a/sd/source/ui/dlg/RemoteDialog.cxx
+++ b/sd/source/ui/dlg/RemoteDialog.cxx
@@ -22,22 +22,12 @@ RemoteDialog::RemoteDialog( Window *pWindow ) :
ModalDialog( pWindow, SdResId( DLG_PAIR_REMOTE ) ),
mButtonConnect( this, SdResId( BTN_CONNECT ) ),
mButtonCancel( this, SdResId( BTN_CANCEL ) ),
- mClientBox( this, NULL, SdResId( LB_SERVERS ) ),
- mPreviouslyDiscoverable()
+ mClientBox( this, NULL, SdResId( LB_SERVERS ) )
{
- (void) mPreviouslyDiscoverable; // avoid warnings about unused member
-
FreeResource();
#ifdef ENABLE_SDREMOTE
-
-#ifdef ENABLE_SDREMOTE_BLUETOOTH
- mPreviouslyDiscoverable = RemoteServer::isBluetoothDiscoverable();
- if ( !mPreviouslyDiscoverable )
- RemoteServer::setBluetoothDiscoverable( true );
-#else
- RemoteServer::setBluetoothDiscoverable( false );
-#endif
+ RemoteServer::ensureDiscoverable();
vector<ClientInfo*> aClients( RemoteServer::getClients() );
@@ -83,12 +73,7 @@ IMPL_LINK_NOARG(RemoteDialog, HandleConnectButton)
IMPL_LINK_NOARG( RemoteDialog, CloseHdl )
{
-#if defined(ENABLE_SDREMOTE) && defined(ENABLE_SDREMOTE_BLUETOOTH)
- if ( !mPreviouslyDiscoverable )
- {
- RemoteServer::setBluetoothDiscoverable( false );
- }
-#endif
+ RemoteServer::restoreDiscoverable();
Close();
return 0;
}
diff --git a/sd/source/ui/dlg/RemoteDialog.hxx b/sd/source/ui/dlg/RemoteDialog.hxx
index bc4831bd4ab6..882b9c21c343 100644
--- a/sd/source/ui/dlg/RemoteDialog.hxx
+++ b/sd/source/ui/dlg/RemoteDialog.hxx
@@ -27,8 +27,6 @@ private:
OKButton mButtonConnect;
CancelButton mButtonCancel;
ClientBox mClientBox;
- // Whether discoverability was enabled befor the dialog started.
- bool mPreviouslyDiscoverable;
DECL_DLLPRIVATE_LINK( HandleConnectButton, void * );
DECL_LINK( CloseHdl, void * );
diff --git a/sd/source/ui/inc/RemoteServer.hxx b/sd/source/ui/inc/RemoteServer.hxx
index 740465c2934c..f209561fcd49 100644
--- a/sd/source/ui/inc/RemoteServer.hxx
+++ b/sd/source/ui/inc/RemoteServer.hxx
@@ -66,8 +66,10 @@ namespace sd
SD_DLLPUBLIC static sal_Bool connectClient( ClientInfo *pClient,
rtl::OUString aPin );
- SD_DLLPUBLIC static bool isBluetoothDiscoverable();
- SD_DLLPUBLIC static void setBluetoothDiscoverable( bool aDiscoverable );
+ /// ensure that discoverability (eg. for Bluetooth) is enabled
+ SD_DLLPUBLIC static void ensureDiscoverable();
+ /// restore the state of discoverability from before ensureDiscoverable
+ SD_DLLPUBLIC static void restoreDiscoverable();
// For the communicator
static void removeCommunicator( Communicator* pCommunicator );
diff --git a/sd/source/ui/remotecontrol/BluetoothServer.cxx b/sd/source/ui/remotecontrol/BluetoothServer.cxx
index ad6dadf14a61..249178581015 100644
--- a/sd/source/ui/remotecontrol/BluetoothServer.cxx
+++ b/sd/source/ui/remotecontrol/BluetoothServer.cxx
@@ -260,7 +260,8 @@ void incomingCallback( void *userRefCon,
BluetoothServer::BluetoothServer( std::vector<Communicator*>* pCommunicators )
- : mpCommunicators( pCommunicators )
+ : meWasDiscoverable( UNKNOWN ),
+ mpCommunicators( pCommunicators )
{
}
@@ -268,6 +269,27 @@ BluetoothServer::~BluetoothServer()
{
}
+
+void BluetoothServer::ensureDiscoverable()
+{
+ if( !spServer || spServer->meWasDiscoverable != UNKNOWN )
+ return;
+
+ bool bDiscoverable = spServer->isDiscoverable();
+ spServer->meWasDiscoverable = bDiscoverable ? DISCOVERABLE : NOT_DISCOVERABLE;
+ spServer->setDiscoverable( true );
+}
+
+void BluetoothServer::restoreDiscoverable()
+{
+ if(!spServer)
+ return;
+
+ if ( spServer->meWasDiscoverable == NOT_DISCOVERABLE )
+ spServer->setDiscoverable( false );
+ spServer->meWasDiscoverable = UNKNOWN;
+}
+
bool BluetoothServer::isDiscoverable()
{
#if (defined(LINUX) && !defined(__FreeBSD_kernel__)) && defined(ENABLE_DBUS)
@@ -321,7 +343,7 @@ bool BluetoothServer::isDiscoverable()
#endif
}
-void BluetoothServer::setDiscoverable( bool aDiscoverable )
+void BluetoothServer::setDiscoverable( bool bDiscoverable )
{
#if (defined(LINUX) && !defined(__FreeBSD_kernel__)) && defined(ENABLE_DBUS)
SAL_INFO( "sdremote.bluetooth", "BluetoothServer::setDiscoverable called" );
@@ -391,12 +413,12 @@ void BluetoothServer::setDiscoverable( bool aDiscoverable )
return;
}
- GValue aDiscoverableGValue = G_VALUE_INIT;
- g_value_init( &aDiscoverableGValue, G_TYPE_BOOLEAN );
- g_value_set_boolean( &aDiscoverableGValue, aDiscoverable );
+ GValue bDiscoverableGValue = G_VALUE_INIT;
+ g_value_init( &bDiscoverableGValue, G_TYPE_BOOLEAN );
+ g_value_set_boolean( &bDiscoverableGValue, bDiscoverable );
aResult = dbus_g_proxy_call( aAdapter, "SetProperty", &aError,
G_TYPE_STRING, "Discoverable",
- G_TYPE_VALUE, &aDiscoverableGValue, G_TYPE_INVALID, G_TYPE_INVALID);
+ G_TYPE_VALUE, &bDiscoverableGValue, G_TYPE_INVALID, G_TYPE_INVALID);
if ( !aResult || aError )
{
SAL_WARN( "sdremote.bluetooth", "SetProperty(Discoverable) failed" );
@@ -411,7 +433,7 @@ void BluetoothServer::setDiscoverable( bool aDiscoverable )
g_object_unref( G_OBJECT( aAdapter ));
dbus_g_connection_unref( aConnection );
#else // defined(LINUX) && defined(ENABLE_DBUS)
- (void) aDiscoverable; // avoid warnings
+ (void) bDiscoverable; // avoid warnings
#endif
}
diff --git a/sd/source/ui/remotecontrol/BluetoothServer.hxx b/sd/source/ui/remotecontrol/BluetoothServer.hxx
index d8c9879ab59b..5b986fae210c 100644
--- a/sd/source/ui/remotecontrol/BluetoothServer.hxx
+++ b/sd/source/ui/remotecontrol/BluetoothServer.hxx
@@ -22,18 +22,25 @@ namespace sd
public:
static void setup( std::vector<Communicator*>* pCommunicators );
- static bool isDiscoverable();
- static void setDiscoverable( bool aDiscoverable );
+ /// ensure that Bluetooth discoverability is on
+ static void ensureDiscoverable();
+ /// restore the state of discoverability from before ensureDiscoverable
+ static void restoreDiscoverable();
+
void addCommunicator( Communicator* pCommunicator );
private:
BluetoothServer( std::vector<Communicator*>* pCommunicators );
~BluetoothServer();
+
+ bool isDiscoverable();
+ void setDiscoverable( bool bDiscoverable );
+
+ enum { UNKNOWN, DISCOVERABLE, NOT_DISCOVERABLE } meWasDiscoverable;
static BluetoothServer *spServer;
virtual void SAL_CALL run();
std::vector<Communicator*>* mpCommunicators;
-
};
}
diff --git a/sd/source/ui/remotecontrol/Server.cxx b/sd/source/ui/remotecontrol/Server.cxx
index 9989ed05bb57..561dac149cb6 100644
--- a/sd/source/ui/remotecontrol/Server.cxx
+++ b/sd/source/ui/remotecontrol/Server.cxx
@@ -318,21 +318,19 @@ void SdDLL::RegisterRemotes()
sd::DiscoveryService::setup();
}
-bool RemoteServer::isBluetoothDiscoverable()
+void RemoteServer::ensureDiscoverable()
{
+ // FIXME: we could also enable listening on our WiFi
+ // socket here to significantly reduce the attack surface.
#ifdef ENABLE_SDREMOTE_BLUETOOTH
- return BluetoothServer::isDiscoverable();
-#else
- return false;
+ BluetoothServer::ensureDiscoverable();
#endif
}
-void RemoteServer::setBluetoothDiscoverable( bool aDiscoverable )
+void RemoteServer::restoreDiscoverable()
{
#ifdef ENABLE_SDREMOTE_BLUETOOTH
- BluetoothServer::setDiscoverable( aDiscoverable );
-#else
- (void) aDiscoverable;
+ BluetoothServer::restoreDiscoverable();
#endif
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */