You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
5.3 KiB
178 lines
5.3 KiB
/* |
|
* KFontInst - KDE Font Installer |
|
* |
|
* Copyright 2003-2009 Craig Drummond <craig@kde.org> |
|
* |
|
* ---- |
|
* |
|
* This program is free software; you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation; either version 2 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
* General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with this program; see the file COPYING. If not, write to |
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
|
* Boston, MA 02110-1301, USA. |
|
*/ |
|
|
|
#include "FontInstInterface.h" |
|
#include "FontinstIface.h" |
|
#include "FontInst.h" |
|
#include <kio/global.h> |
|
#include <QDebug> |
|
#include <QProcess> |
|
#include <QDBusServiceWatcher> |
|
#include "config-fontinst.h" |
|
#include "debug.h" |
|
|
|
#define KFI_DBUG qCDebug(KCM_KFONTINST_KIO) << '(' << time(NULL) << ')' |
|
|
|
namespace KFI |
|
{ |
|
|
|
FontInstInterface::FontInstInterface() |
|
: itsInterface(new OrgKdeFontinstInterface(OrgKdeFontinstInterface::staticInterfaceName(), |
|
FONTINST_PATH, |
|
QDBusConnection::sessionBus(), nullptr)) |
|
, itsActive(false) |
|
{ |
|
KFI_DBUG; |
|
FontInst::registerTypes(); |
|
|
|
QDBusServiceWatcher *watcher = new QDBusServiceWatcher(QLatin1String(OrgKdeFontinstInterface::staticInterfaceName()), |
|
QDBusConnection::sessionBus(), |
|
QDBusServiceWatcher::WatchForOwnerChange, this); |
|
|
|
connect(watcher, &QDBusServiceWatcher::serviceOwnerChanged, this, &FontInstInterface::dbusServiceOwnerChanged); |
|
connect(itsInterface, &OrgKdeFontinstInterface::status, this, &FontInstInterface::status); |
|
connect(itsInterface, &OrgKdeFontinstInterface::fontList, this, &FontInstInterface::fontList); |
|
connect(itsInterface, &OrgKdeFontinstInterface::fontStat, this, &FontInstInterface::fontStat); |
|
|
|
if (!QDBusConnection::sessionBus().interface()->isServiceRegistered(OrgKdeFontinstInterface::staticInterfaceName())) |
|
QProcess::startDetached(QLatin1String(KFONTINST_LIB_EXEC_DIR"/fontinst"), QStringList()); |
|
} |
|
|
|
FontInstInterface::~FontInstInterface() |
|
{ |
|
KFI_DBUG; |
|
} |
|
|
|
int FontInstInterface::install(const QString &file, bool toSystem) |
|
{ |
|
KFI_DBUG; |
|
itsInterface->install(file, true, toSystem, getpid(), true); |
|
return waitForResponse(); |
|
} |
|
|
|
int FontInstInterface::uninstall(const QString &name, bool fromSystem) |
|
{ |
|
KFI_DBUG; |
|
itsInterface->uninstall(name, fromSystem, getpid(), true); |
|
return waitForResponse(); |
|
} |
|
|
|
int FontInstInterface::reconfigure() |
|
{ |
|
KFI_DBUG; |
|
itsInterface->reconfigure(getpid(), false); |
|
return waitForResponse(); |
|
} |
|
|
|
Families FontInstInterface::list(bool system) |
|
{ |
|
KFI_DBUG; |
|
Families rv; |
|
itsInterface->list(system ? FontInst::SYS_MASK : FontInst::USR_MASK, getpid()); |
|
if(FontInst::STATUS_OK==waitForResponse()) |
|
{ |
|
rv=itsFamilies; |
|
itsFamilies=Families(); |
|
} |
|
return rv; |
|
} |
|
|
|
Family FontInstInterface::statFont(const QString &file, bool system) |
|
{ |
|
KFI_DBUG; |
|
Family rv; |
|
itsInterface->statFont(file, system ? FontInst::SYS_MASK : FontInst::USR_MASK, getpid()); |
|
if(FontInst::STATUS_OK==waitForResponse()) |
|
{ |
|
rv=*itsFamilies.items.begin(); |
|
itsFamilies=Families(); |
|
} |
|
return rv; |
|
} |
|
|
|
QString FontInstInterface::folderName(bool sys) |
|
{ |
|
if(!itsInterface) |
|
return QString(); |
|
|
|
QDBusPendingReply<QString> reply=itsInterface->folderName(sys); |
|
|
|
reply.waitForFinished(); |
|
return reply.isError() ? QString() : reply.argumentAt<0>(); |
|
} |
|
|
|
int FontInstInterface::waitForResponse() |
|
{ |
|
KFI_DBUG; |
|
itsStatus=FontInst::STATUS_OK; |
|
itsFamilies=Families(); |
|
itsActive=true; |
|
|
|
itsEventLoop.exec(); |
|
KFI_DBUG << "Loop finished"; |
|
return itsStatus; |
|
} |
|
|
|
void FontInstInterface::dbusServiceOwnerChanged(const QString &name, const QString &from, const QString &to) |
|
{ |
|
if(itsActive && to.isEmpty() && !from.isEmpty() && name==QLatin1String(OrgKdeFontinstInterface::staticInterfaceName())) |
|
{ |
|
KFI_DBUG << "Service died :-("; |
|
itsStatus=FontInst::STATUS_SERVICE_DIED; |
|
itsEventLoop.quit(); |
|
} |
|
} |
|
|
|
void FontInstInterface::status(int pid, int value) |
|
{ |
|
if(itsActive && pid==getpid()) |
|
{ |
|
KFI_DBUG << "Status:" << value; |
|
itsStatus=value; |
|
itsEventLoop.quit(); |
|
} |
|
} |
|
|
|
void FontInstInterface::fontList(int pid, const QList<KFI::Families> &families) |
|
{ |
|
if(itsActive && pid==getpid()) |
|
{ |
|
KFI_DBUG; |
|
itsFamilies=1==families.count() ? *families.begin() : Families(); |
|
itsStatus=1==families.count() ? (int)FontInst::STATUS_OK : (int)KIO::ERR_DOES_NOT_EXIST; |
|
itsEventLoop.quit(); |
|
} |
|
} |
|
|
|
void FontInstInterface::fontStat(int pid, const KFI::Family &font) |
|
{ |
|
if(itsActive && pid==getpid()) |
|
{ |
|
KFI_DBUG; |
|
itsFamilies=Families(font, false); |
|
itsStatus=font.styles().count()>0 ? (int)FontInst::STATUS_OK : (int)KIO::ERR_DOES_NOT_EXIST; |
|
itsEventLoop.quit(); |
|
} |
|
} |
|
|
|
}
|
|
|