summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sd/inc/glob.hrc2
-rw-r--r--sd/source/core/glob.src5
-rw-r--r--sd/source/ui/dlg/RemoteDialog.cxx14
-rw-r--r--sd/source/ui/dlg/RemoteDialogClientBox.cxx92
-rw-r--r--sd/source/ui/dlg/RemoteDialogClientBox.hxx7
-rw-r--r--sd/source/ui/inc/RemoteServer.hxx10
-rw-r--r--sd/source/ui/remotecontrol/Server.cxx55
7 files changed, 158 insertions, 27 deletions
diff --git a/sd/inc/glob.hrc b/sd/inc/glob.hrc
index 3e2d4a41228d..f9fc89e5b4da 100644
--- a/sd/inc/glob.hrc
+++ b/sd/inc/glob.hrc
@@ -148,7 +148,7 @@
#define STR_SLIDE_TRANSITION_PANE RID_GLOB_START+228
#define RID_SLIDESORTER_ICONS RID_GLOB_START+227
-
+#define STR_DEAUTHORISE_CLIENT RID_GLOB_START+229
#endif // _SDGLOB_HRC
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/glob.src b/sd/source/core/glob.src
index bebd5d65c55c..8bdd59ecbedc 100644
--- a/sd/source/core/glob.src
+++ b/sd/source/core/glob.src
@@ -453,4 +453,9 @@ String STR_ENTER_PIN
Text [ en-US ] = "Enter PIN:";
};
+String STR_DEAUTHORISE_CLIENT
+{
+ Text [ en-US ] = "Remove client authorisation";
+};
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/RemoteDialog.cxx b/sd/source/ui/dlg/RemoteDialog.cxx
index 4265bacab957..63edf448475c 100644
--- a/sd/source/ui/dlg/RemoteDialog.cxx
+++ b/sd/source/ui/dlg/RemoteDialog.cxx
@@ -25,20 +25,6 @@ RemoteDialog::RemoteDialog( Window *pWindow )
get(m_pButtonClose, "close");
get(m_pClientBox, "tree");
-#ifdef ENABLE_SDREMOTE
- RemoteServer::ensureDiscoverable();
-
- vector<::boost::shared_ptr<ClientInfo>> aClients( RemoteServer::getClients() );
-
- const vector<::boost::shared_ptr<ClientInfo>>::const_iterator aEnd( aClients.end() );
-
- for ( vector<::boost::shared_ptr<ClientInfo>>::const_iterator aIt( aClients.begin() );
- aIt != aEnd; ++aIt )
- {
- m_pClientBox->addEntry( *aIt );
- }
-#endif
-
m_pButtonConnect->SetClickHdl( LINK( this, RemoteDialog, HandleConnectButton ) );
SetCloseHdl( LINK( this, RemoteDialog, CloseHdl ) );
m_pButtonClose->SetClickHdl( LINK( this, RemoteDialog, CloseHdl ) );
diff --git a/sd/source/ui/dlg/RemoteDialogClientBox.cxx b/sd/source/ui/dlg/RemoteDialogClientBox.cxx
index 22affdb3748a..43ee39488924 100644
--- a/sd/source/ui/dlg/RemoteDialogClientBox.cxx
+++ b/sd/source/ui/dlg/RemoteDialogClientBox.cxx
@@ -17,6 +17,8 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
+#include <vector>
+
#include "svtools/controldims.hrc"
#include "RemoteDialogClientBox.hxx"
@@ -30,6 +32,8 @@
#include "glob.hrc"
+using namespace std;
+
using namespace ::com::sun::star;
namespace sd {
@@ -72,12 +76,15 @@ ClientBox::ClientBox( Window* pParent, WinBits nStyle ) :
m_nActiveHeight( 0 ),
m_nExtraHeight( 2 ),
m_aPinBox( this, 0 ),
+ m_aDeauthoriseButton( this ),
m_aScrollBar( this, WB_VERT )
{
m_aScrollBar.SetScrollHdl( LINK( this, ClientBox, ScrollHdl ) );
m_aScrollBar.EnableDrag();
m_aPinBox.SetUseThousandSep(false);
+ m_aDeauthoriseButton.SetText( SD_RESSTR(STR_DEAUTHORISE_CLIENT) );
+ m_aDeauthoriseButton.SetClickHdl( LINK( this, ClientBox, DeauthoriseHdl ) );
SetPaintTransparent( true );
SetPosPixel( Point( RSC_SP_DLG_INNERBORDER_LEFT, RSC_SP_DLG_INNERBORDER_TOP ) );
@@ -103,6 +110,8 @@ ClientBox::ClientBox( Window* pParent, WinBits nStyle ) :
m_xRemoveListener = new ClientRemovedListener( this );
+ populateEntries();
+
Show();
}
@@ -332,18 +341,30 @@ void ClientBox::DrawRow( const Rectangle& rRect, const TClientBoxEntry pEntry )
Size aSize = LogicToPixel( Size( RSC_CD_PUSHBUTTON_WIDTH, RSC_CD_PUSHBUTTON_HEIGHT ),
MapMode( MAP_APPFONT ) );
m_aPinBox.SetSizePixel( aSize );
+ m_aDeauthoriseButton.SetSizePixel( m_aDeauthoriseButton.GetOptimalSize() );
const Rectangle aRect( GetEntryRect( m_nActive ) );
Size aBtnSize( m_aPinBox.GetSizePixel() );
Point aBtnPos( aRect.Left(),
aRect.Bottom() - TOP_OFFSET - aBtnSize.Height() );
- OUString sPinText(SD_RESSTR(STR_ENTER_PIN));
- DrawText( Rectangle( aBtnPos.X(), aBtnPos.Y(), rRect.Right(), rRect.Bottom() - TOP_OFFSET),
- sPinText, 0 );
- aBtnPos = Point( aRect.Left() + GetTextWidth( sPinText ),
- aRect.Bottom() - TOP_OFFSET - aBtnSize.Height() );
+ bool bAlreadyAuthorised = pEntry->m_pClientInfo->mbIsAlreadyAuthorised;
+
+ if ( !bAlreadyAuthorised )
+ {
+ OUString sPinText(SD_RESSTR(STR_ENTER_PIN));
+ DrawText( Rectangle( aBtnPos.X(), aBtnPos.Y(), rRect.Right(), rRect.Bottom() - TOP_OFFSET),
+ sPinText, 0 );
+ aBtnPos = Point( aRect.Left() + GetTextWidth( sPinText ),
+ aRect.Bottom() - TOP_OFFSET - aBtnSize.Height() );
+
+ }
m_aPinBox.SetPosPixel( aBtnPos );
+ m_aPinBox.Show( !bAlreadyAuthorised );
+
+ aBtnPos.Move( 20, 0 );
+ m_aDeauthoriseButton.SetPosPixel( aBtnPos );
+ m_aDeauthoriseButton.Show( bAlreadyAuthorised );
// long nExtraHeight = 0;
@@ -476,6 +497,15 @@ void ClientBox::Paint( const Rectangle &/*rPaintRect*/ )
const ::osl::MutexGuard aGuard( m_entriesMutex );
+ // If we have just removed the last entry (via deauthorise)
+ // then we need to make sure we hide the button (usually
+ // this would all be dealt with in in DrawRow, but that
+ // won't be called for 0 items).
+ if ( m_vEntries.size() == 0 )
+ {
+ m_aDeauthoriseButton.Show( false );
+ }
+
typedef std::vector< TClientBoxEntry >::iterator ITER;
for ( ITER iIndex = m_vEntries.begin(); iIndex < m_vEntries.end(); ++iIndex )
{
@@ -671,6 +701,44 @@ long ClientBox::addEntry( ::boost::shared_ptr<ClientInfo> pClientInfo )
return nPos;
}
+void ClientBox::clearEntries()
+{
+ selectEntry( -1 );
+ m_bHasActive = false;
+
+ const ::osl::MutexGuard aGuard( m_entriesMutex );
+
+ m_vEntries.clear();
+ if ( IsReallyVisible() )
+ Invalidate();
+ m_bNeedsRecalc = true;
+}
+
+void ClientBox::populateEntries()
+{
+ const ::osl::MutexGuard aGuard( m_entriesMutex );
+
+ clearEntries();
+
+#ifdef ENABLE_SDREMOTE
+ RemoteServer::ensureDiscoverable();
+
+ vector<::boost::shared_ptr<ClientInfo>> aClients( RemoteServer::getClients() );
+
+ const vector<::boost::shared_ptr<ClientInfo>>::const_iterator aEnd( aClients.end() );
+
+ for ( vector<::boost::shared_ptr<ClientInfo>>::const_iterator aIt( aClients.begin() );
+ aIt != aEnd; ++aIt )
+ {
+ addEntry( *aIt );
+ }
+#endif
+
+ if ( IsReallyVisible() )
+ Invalidate();
+ m_bNeedsRecalc = true;
+}
+
void ClientBox::DoScroll( long nDelta )
{
m_nTopIndex += nDelta;
@@ -690,6 +758,20 @@ IMPL_LINK( ClientBox, ScrollHdl, ScrollBar*, pScrBar )
return 1;
}
+IMPL_LINK_NOARG( ClientBox, DeauthoriseHdl )
+{
+ long aSelected = GetActiveEntryIndex();
+ if ( aSelected < 0 )
+ return 1;
+ TClientBoxEntry aEntry = GetEntryData(aSelected);
+
+#ifdef ENABLE_SDREMOTE
+ RemoteServer::deauthoriseClient( aEntry->m_pClientInfo );
+#endif
+ populateEntries();
+ return 1;
+}
+
} //namespace dp_gui
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/RemoteDialogClientBox.hxx b/sd/source/ui/dlg/RemoteDialogClientBox.hxx
index 83295f2ed1d9..0be160628bec 100644
--- a/sd/source/ui/dlg/RemoteDialogClientBox.hxx
+++ b/sd/source/ui/dlg/RemoteDialogClientBox.hxx
@@ -23,6 +23,7 @@
#include "rtl/ustring.hxx"
#include "vcl/scrbar.hxx"
#include "vcl/fixed.hxx"
+#include "vcl/button.hxx"
#include "vcl/dialog.hxx"
#include "vcl/field.hxx"
@@ -98,8 +99,10 @@ class ClientBox:
long m_nExtraHeight;
Size m_aOutputSize;
Link m_aClickHdl;
+ Link m_aDeauthoriseHdl;
NumericBox m_aPinBox;
+ PushButton m_aDeauthoriseButton;
ScrollBar m_aScrollBar;
@@ -125,7 +128,7 @@ class ClientBox:
void DeleteRemoved();
DECL_DLLPRIVATE_LINK( ScrollHdl, ScrollBar* );
-
+ DECL_DLLPRIVATE_LINK( DeauthoriseHdl, void * );
//Index starts with 1.
//Throws an com::sun::star::lang::IllegalArgumentException, when the index is invalid.
void checkIndex(sal_Int32 pos) const;
@@ -158,11 +161,13 @@ public:
long addEntry( ::boost::shared_ptr<ClientInfo> pClientInfo );
void updateEntry( const ::boost::shared_ptr<ClientInfo> pPackageInfo );
void removeEntry( const ::boost::shared_ptr<ClientInfo> pPackageInfo );
+ void clearEntries();
void prepareChecking();
void checkEntries();
OUString getPin();
+ void populateEntries();
};
}
diff --git a/sd/source/ui/inc/RemoteServer.hxx b/sd/source/ui/inc/RemoteServer.hxx
index a17e98426342..91718f9a364e 100644
--- a/sd/source/ui/inc/RemoteServer.hxx
+++ b/sd/source/ui/inc/RemoteServer.hxx
@@ -46,10 +46,15 @@ namespace sd
OUString mName;
OUString mAddress;
+ bool mbIsAlreadyAuthorised;
+
enum PROTOCOL { NETWORK = 1, BLUETOOTH };
- ClientInfo( const OUString& rName, const OUString& rAddress ) :
+ ClientInfo( const OUString& rName,
+ const OUString& rAddress,
+ const bool bIsAlreadyAuthorised ) :
mName( rName ),
- mAddress( rAddress ) {}
+ mAddress( rAddress ),
+ mbIsAlreadyAuthorised( bIsAlreadyAuthorised ) {}
virtual ~ClientInfo() {};
};
@@ -71,6 +76,7 @@ namespace sd
SD_DLLPUBLIC static std::vector< ::boost::shared_ptr< ClientInfo > > getClients();
SD_DLLPUBLIC static bool connectClient( ::boost::shared_ptr< ClientInfo > pClient,
const OUString& aPin );
+ SD_DLLPUBLIC static void deauthoriseClient( ::boost::shared_ptr< ClientInfo > pClient );
/// ensure that discoverability (eg. for Bluetooth) is enabled
SD_DLLPUBLIC static void ensureDiscoverable();
diff --git a/sd/source/ui/remotecontrol/Server.cxx b/sd/source/ui/remotecontrol/Server.cxx
index 038fac63f002..81335374967a 100644
--- a/sd/source/ui/remotecontrol/Server.cxx
+++ b/sd/source/ui/remotecontrol/Server.cxx
@@ -54,9 +54,10 @@ namespace sd {
ClientInfoInternal( const OUString& rName,
const OUString& rAddress,
+ const bool bIsAlreadyAuthorised,
BufferedStreamSocket *pSocket,
const OUString& rPin ):
- ClientInfo( rName, rAddress ),
+ ClientInfo( rName, rAddress, bIsAlreadyAuthorised ),
mpStreamSocket( pSocket ),
mPin( rPin ) {}
};
@@ -127,8 +128,8 @@ void RemoteServer::execute()
::boost::shared_ptr< ClientInfoInternal > pClient(
new ClientInfoInternal(
OStringToOUString( aName, RTL_TEXTENCODING_UTF8 ),
- aAddress, pSocket, OStringToOUString( aPin,
- RTL_TEXTENCODING_UTF8 ) );
+ aAddress, false, pSocket, OStringToOUString( aPin,
+ RTL_TEXTENCODING_UTF8 ) ) );
mAvailableClients.push_back( pClient );
// Read off any additional non-empty lines
@@ -247,6 +248,23 @@ std::vector< ::boost::shared_ptr< ClientInfo > > RemoteServer::getClients()
MutexGuard aGuard( sDataMutex );
aClients.assign( spServer->mAvailableClients.begin(),
spServer->mAvailableClients.end() );
+
+ // We also need to provide authorised clients (no matter whether or not
+ // they are actually available), so that they can be de-authorised if
+ // necessary. We specifically want these to be at the end of the list
+ // since the user is more likely to be trying to connect a new remote
+ // than removing an existing remote.
+ // We can also be sure that pre-authorised clients will not be on the
+ // available clients list, as they get automatially connected if seen.
+ // TODO: we should probably add some sort of extra labelling to mark
+ // authorised AND connected client.
+ Reference< XNameAccess > const xConfig = officecfg::Office::Impress::Misc::AuthorisedRemotes::get();
+ Sequence< OUString > aNames = xConfig->getElementNames();
+ for ( int i = 0; i < aNames.getLength(); i++ )
+ {
+ aClients.push_back( ::boost::shared_ptr< ClientInfo > ( new ClientInfo( aNames[i], "", true ) ) );
+ }
+
return aClients;
}
@@ -257,7 +275,12 @@ bool RemoteServer::connectClient( ::boost::shared_ptr< ClientInfo > pClient, con
return false;
ClientInfoInternal* apClient = dynamic_cast< ClientInfoInternal* >( pClient.get() );
- ClientInfoInternal *apClient = (ClientInfoInternal*) pClient;
+ if ( !apClient )
+ // could happen if we try to "connect" an already authorised client
+ {
+ return false;
+ }
+
if ( apClient->mPin.equals( aPin ) )
{
// Save in settings first
@@ -312,6 +335,30 @@ bool RemoteServer::connectClient( ::boost::shared_ptr< ClientInfo > pClient, con
}
}
+void RemoteServer::deauthoriseClient( ::boost::shared_ptr< ClientInfo > pClient )
+{
+ // TODO: we probably want to forcefully disconnect at this point too?
+ // But possibly via a separate function to allow just disconnecting from
+ // the UI.
+
+ SAL_INFO( "sdremote", "RemoteServer::deauthoriseClient called" );
+ if ( !spServer )
+ return;
+
+ if ( !pClient->mbIsAlreadyAuthorised )
+ // We can't remove unauthorised clients from the authorised list...
+ {
+ return;
+ }
+
+ boost::shared_ptr< ConfigurationChanges > aChanges = ConfigurationChanges::create();
+ Reference< XNameContainer > const xConfig =
+ officecfg::Office::Impress::Misc::AuthorisedRemotes::get( aChanges );
+
+ xConfig->removeByName( pClient->mName );
+ aChanges->commit();
+}
+
void SdDLL::RegisterRemotes()
{
SAL_INFO( "sdremote", "SdDLL::RegisterRemotes called" );