Switch to use the generated interface from org.kde.KSpeech.xml, instead of manually call the functions.

Keep the TTS interface around (for multiple usage), and delete it when the KTTSD service goes away.

svn path=/trunk/KDE/kdegraphics/okular/; revision=782482
remotes/origin/KDE/4.1
Pino Toscano 18 years ago
parent f407f84d8a
commit a4da9a27dc
  1. 1
      CMakeLists.txt
  2. 91
      ui/tts.cpp
  3. 4
      ui/tts.h

@ -151,6 +151,7 @@ kde4_add_ui_files(okularpart_SRCS
conf/dlgpresentationbase.ui conf/dlgpresentationbase.ui
) )
qt4_add_dbus_interfaces(okularpart_SRCS ${DBUS_INTERFACES_INSTALL_DIR}/org.kde.KSpeech.xml)
kde4_add_plugin(okularpart ${okularpart_SRCS}) kde4_add_plugin(okularpart ${okularpart_SRCS})

@ -9,46 +9,34 @@
#include "tts.h" #include "tts.h"
#include <QtDBus/QDBusConnection>
#include <QtDBus/QDBusConnectionInterface>
#include <QtDBus/QDBusInterface>
#include <QtDBus/QDBusReply>
#include <klocale.h> #include <klocale.h>
#include <ktoolinvocation.h> #include <ktoolinvocation.h>
#include "pageviewutils.h" #include "pageviewutils.h"
#include "kspeechinterface.h"
/* Private storage. */ /* Private storage. */
class OkularTTS::Private class OkularTTS::Private
{ {
public: public:
Private() Private( OkularTTS *qq )
: q( qq ), kspeech( 0 )
{ {
} }
void setupIface();
void teardownIface();
OkularTTS *q;
PageViewMessage *messageWindow; PageViewMessage *messageWindow;
org::kde::KSpeech* kspeech;
}; };
void OkularTTS::Private::setupIface()
OkularTTS::OkularTTS( PageViewMessage *messageWindow, QObject *parent )
: QObject( parent ), d( new Private )
{ {
d->messageWindow = messageWindow; if ( kspeech )
}
OkularTTS::~OkularTTS()
{
delete d;
}
void OkularTTS::say( const QString &text )
{
if ( text.isEmpty() )
return; return;
// Albert says is this ever necessary?
// we already attached on Part constructor
// If KTTSD not running, start it. // If KTTSD not running, start it.
QDBusReply<bool> reply = QDBusConnection::sessionBus().interface()->isServiceRegistered( "org.kde.kttsd" ); QDBusReply<bool> reply = QDBusConnection::sessionBus().interface()->isServiceRegistered( "org.kde.kttsd" );
bool kttsdactive = false; bool kttsdactive = false;
@ -59,7 +47,7 @@ void OkularTTS::say( const QString &text )
QString error; QString error;
if ( KToolInvocation::startServiceByDesktopName( "kttsd", QStringList(), &error ) ) if ( KToolInvocation::startServiceByDesktopName( "kttsd", QStringList(), &error ) )
{ {
d->messageWindow->display( i18n( "Starting KTTSD Failed: %1", error ) ); messageWindow->display( i18n( "Starting KTTSD Failed: %1", error ) );
} }
else else
{ {
@ -69,9 +57,60 @@ void OkularTTS::say( const QString &text )
if ( kttsdactive ) if ( kttsdactive )
{ {
// creating the connection to the kspeech interface // creating the connection to the kspeech interface
QDBusInterface kspeech( "org.kde.kttsd", "/KSpeech", "org.kde.KSpeech" ); kspeech = new org::kde::KSpeech( "org.kde.kttsd", "/KSpeech", QDBusConnection::sessionBus() );
kspeech.call( "setApplicationName", "Okular" ); kspeech->setApplicationName( "Okular" );
kspeech.call( "say", text, 0 ); connect( QDBusConnection::sessionBus().interface(), SIGNAL( serviceUnregistered( const QString & ) ),
q, SLOT( slotServiceUnregistered( const QString & ) ) );
connect( QDBusConnection::sessionBus().interface(), SIGNAL( serviceOwnerChanged( const QString &, const QString &, const QString & ) ),
q, SLOT( slotServiceOwnerChanged( const QString &, const QString &, const QString & ) ) );
}
}
void OkularTTS::Private::teardownIface()
{
disconnect( QDBusConnection::sessionBus().interface(), 0, q, 0 );
delete kspeech;
kspeech = 0;
}
OkularTTS::OkularTTS( PageViewMessage *messageWindow, QObject *parent )
: QObject( parent ), d( new Private( this ) )
{
d->messageWindow = messageWindow;
}
OkularTTS::~OkularTTS()
{
delete d;
}
void OkularTTS::say( const QString &text )
{
if ( text.isEmpty() )
return;
d->setupIface();
if ( d->kspeech )
{
d->kspeech->say( text, 0 );
}
}
void OkularTTS::slotServiceUnregistered( const QString &service )
{
if ( service == QLatin1String( "org.kde.kttsd" ) )
{
d->teardownIface();
}
}
void OkularTTS::slotServiceOwnerChanged( const QString &service, const QString &, const QString &newOwner )
{
if ( service == QLatin1String( "org.kde.kttsd" ) && newOwner.isEmpty() )
{
d->teardownIface();
} }
} }

@ -23,6 +23,10 @@ class OkularTTS : public QObject
void say( const QString &text ); void say( const QString &text );
private slots:
void slotServiceUnregistered( const QString& );
void slotServiceOwnerChanged( const QString&, const QString&, const QString& );
private: private:
// private storage // private storage
class Private; class Private;

Loading…
Cancel
Save