[SCM] ktp-common-internals packaging branch, master, updated. debian/15.12.1-2-1839-gf0635e9
Maximiliano Curia
maxy at moszumanska.debian.org
Mon May 9 09:08:19 UTC 2016
Gitweb-URL: http://git.debian.org/?p=pkg-kde/applications/ktp-common-internals.git;a=commitdiff;h=3eafd08
The following commit has been merged in the master branch:
commit 3eafd0852a58213ba9eff68bd68b444dc32ca04a
Author: Marcin Ziemiński <zieminn at gmail.com>
Date: Mon Jul 21 20:00:41 2014 +0200
Initialize OTR related classes.
Signed-off-by: Marcin Ziemiński <zieminn at gmail.com>
---
otr-proxy/CMakeLists.txt | 9 +
otr-proxy/KTpProxy/CMakeLists.txt | 3 +
otr-proxy/KTpProxy/main.cpp | 5 +
otr-proxy/KTpProxy/{types.h => otr-config.h} | 30 ++-
.../KTpProxy/{proxy-service.h => otr-handler.h} | 73 ++++---
otr-proxy/KTpProxy/otr-manager.cpp | 212 +++++++++++++++++++++
.../{pending-curry-operation.h => otr-manager.h} | 41 ++--
otr-proxy/KTpProxy/{types.h => otr-message.h} | 20 +-
otr-proxy/KTpProxy/{main.cpp => otr-session.cpp} | 87 +++++----
otr-proxy/KTpProxy/otr-session.h | 88 +++++++++
10 files changed, 462 insertions(+), 106 deletions(-)
diff --git a/otr-proxy/CMakeLists.txt b/otr-proxy/CMakeLists.txt
index 8da7a10..1f03a56 100644
--- a/otr-proxy/CMakeLists.txt
+++ b/otr-proxy/CMakeLists.txt
@@ -2,12 +2,21 @@ project(ktp-proxy)
set(KTP_PROXY_VERSION "0.1.1")
set(KDE_MIN_VERSION "4.13.1")
+
+set(CMAKE_MODULE_PATH
+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
+ ${CMAKE_MODULE_PATH}
+)
+
find_package (KDE4 ${KDE_MIN_VERSION} REQUIRED)
find_package (TelepathyQt4 0.9.1 REQUIRED)
find_package (TelepathyQt4Service 0.9.2.1 REQUIRED)
+find_package (TelepathyQt4Service 0.9.2.1 REQUIRED)
+find_package (LibOTR 4.0.0 REQUIRED)
include_directories (${KDE4_INCLUDES}
${TELEPATHY_QT4_INCLUDE_DIR}
+ ${LIBOTR_INCLUDE_DIR}
)
include (KDE4Defaults)
diff --git a/otr-proxy/KTpProxy/CMakeLists.txt b/otr-proxy/KTpProxy/CMakeLists.txt
index 4f3f99b..564135a 100644
--- a/otr-proxy/KTpProxy/CMakeLists.txt
+++ b/otr-proxy/KTpProxy/CMakeLists.txt
@@ -8,6 +8,8 @@ set(ktp-proxy_SRCS
otr-proxy-channel.cpp
otr-proxy-channel-adaptee.cpp
pending-curry-operation.cpp
+ otr-session.cpp
+ otr-manager.cpp
)
set(ktp-proxy_LIBS
@@ -16,6 +18,7 @@ set(ktp-proxy_LIBS
${KDE4_KIO_LIBS}
${TELEPATHY_QT4_LIBRARIES}
${TELEPATHY_QT4_SERVICE_LIBRARIES}
+ ${LIBOTR_LIBRARY}
)
kde4_add_executable(ktp-proxy ${ktp-proxy_SRCS})
diff --git a/otr-proxy/KTpProxy/main.cpp b/otr-proxy/KTpProxy/main.cpp
index c7b12e0..e58c800 100644
--- a/otr-proxy/KTpProxy/main.cpp
+++ b/otr-proxy/KTpProxy/main.cpp
@@ -33,6 +33,10 @@
#include <TelepathyQt/ClientRegistrar>
#include <TelepathyQt/TextChannel>
+extern "C" {
+#include <libotr/proto.h>
+}
+
int main(int argc, char *argv[])
{
@@ -50,6 +54,7 @@ int main(int argc, char *argv[])
KApplication app(false);
Tp::registerTypes();
+ OTRL_INIT;
Tp::DBusError error;
QDBusConnection dbusConnection = QDBusConnection::sessionBus();
diff --git a/otr-proxy/KTpProxy/types.h b/otr-proxy/KTpProxy/otr-config.h
similarity index 77%
copy from otr-proxy/KTpProxy/types.h
copy to otr-proxy/KTpProxy/otr-config.h
index dfe7ee9..de110ac 100644
--- a/otr-proxy/KTpProxy/types.h
+++ b/otr-proxy/KTpProxy/otr-config.h
@@ -17,17 +17,29 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
-#ifndef KTP_PROXY_TYPES_HEADER
-#define KTP_PROXY_TYPES_HEADER
+#ifndef KTP_PROXY_OTR_CONFIG_HEADER
+#define KTP_PROXY_OTR_CONFIG_HEADER
-#include <TelepathyQt/SharedPtr>
+#include <QString>
-class OtrProxyChannel;
-class ProxyService;
-class ProxyObserver;
+extern "C" {
+#include <libotr/proto.h>
+}
-typedef Tp::SharedPtr<OtrProxyChannel> OtrProxyChannelPtr;
-typedef Tp::SharedPtr<ProxyService> ProxyServicePtr;
-typedef Tp::SharedPtr<ProxyObserver> ProxyObserverPtr;
+namespace OTR
+{
+
+ class Config
+ {
+ public:
+ virtual ~Config() = 0;
+
+ virtual QString saveLocation() = 0;
+ virtual OtrlPolicy getPolicy() const = 0;
+ virtual void setPolicy(OtrlPolicy policy) = 0;
+
+ };
+
+} /* namespace OTR */
#endif
diff --git a/otr-proxy/KTpProxy/proxy-service.h b/otr-proxy/KTpProxy/otr-handler.h
similarity index 55%
copy from otr-proxy/KTpProxy/proxy-service.h
copy to otr-proxy/KTpProxy/otr-handler.h
index d395e3d..4a669ee 100644
--- a/otr-proxy/KTpProxy/proxy-service.h
+++ b/otr-proxy/KTpProxy/otr-handler.h
@@ -17,52 +17,51 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
-#ifndef KTP_PROXY_PROXY_SERVICE_HEADER
-#define KTP_PROXY_PROXY_SERVICE_HEADER
+#ifndef KTP_PROXY_OTR_HANDLER_HEADER
+#define KTP_PROXY_OTR_HANDLER_HEADER
-#include "proxy-service-adaptee.h"
-#include "proxy-observer.h"
-#include "types.h"
+#include "otr-message.h"
-#include <TelepathyQt/AbstractClientObserver>
-#include <TelepathyQt/Types>
-#include <TelepathyQt/DBusService>
+#include <QSharedPointer>
-#include <QDBusConnection>
-#include <QMap>
-
-namespace Tp
+namespace OTR
{
- class PendingOperation;
-}
+ struct SessionContext
+ {
+ const QString accountId;
+ const QString accountName;
+ const QString recipientName;
+ const QString protocol;
+ };
+ class Handler : public QObject
+ {
+ Q_OBJECT
-class ProxyService : public Tp::DBusService
-{
- Q_OBJECT
- Q_DISABLE_COPY(ProxyService)
-
- public:
- ProxyService(const QDBusConnection &dbusConnection);
- ~ProxyService();
+ public:
+ virtual ~Handler();
+ virtual const SessionContext& context() const = 0;
- void addChannel(const Tp::ChannelPtr &channel);
+ virtual void injectMessage(const Message &message) = 0;
+ virtual void handleSmpEvent() = 0;
+ virtual void handleMsgEvent() = 0;
+ virtual void handleError() = 0;
+ /**
+ * State of the recipient
+ * 1 - logged in
+ * 0 - not logged in
+ * -1 - not sure if logged in
+ */
+ virtual int recipientStatus() = 0;
+ virtual void goneSecure() = 0;
+ virtual void goneInsecure() = 0;
- void registerService(Tp::DBusError *error);
+ Q_SIGNALS:
+ void invalidated(SessionContext *context);
- QVariantMap immutableProperties() const;
+ };
- private Q_SLOTS:
- void onChannelProxyClosed();
-
- private Q_SLOTS:
- void onChannelReady(Tp::PendingOperation *pendingChanReady);
-
- private:
- ProxyServiceAdaptee adaptee;
- QMap<OtrProxyChannel*, OtrProxyChannelPtr> channels;
- ProxyObserverPtr observer;
- Tp::ClientRegistrarPtr registrar;
-};
+ typedef QSharedPointer<Handler> HandlerPtr;
+}
#endif
diff --git a/otr-proxy/KTpProxy/otr-manager.cpp b/otr-proxy/KTpProxy/otr-manager.cpp
new file mode 100644
index 0000000..1c6f5f3
--- /dev/null
+++ b/otr-proxy/KTpProxy/otr-manager.cpp
@@ -0,0 +1,212 @@
+/***************************************************************************
+ * Copyright (C) 2014 by Marcin Ziemiński <zieminn at gmail.com> *
+ * *
+ * 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.1 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; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
+ ***************************************************************************/
+
+#include "otr-manager.h"
+#include "otr-session.h"
+
+extern "C" {
+#include <gcrypt.h>
+#include <libotr/privkey.h>
+#include <libotr/proto.h>
+#include <libotr/message.h>
+#include <libotr/userstate.h>
+}
+
+namespace OTR
+{
+
+namespace {
+
+ /** OTR ops functions ------------------------------------------------------------------------- */
+ OtrlPolicy policy(void *opdata, ConnContext *context)
+ {
+ Q_UNUSED(context);
+
+ Session *session = reinterpret_cast<Session*>(opdata);
+ return session->parent()->getPolicy();
+ }
+
+ void create_privkey(void *opdata, const char *accountname, const char *protocol)
+ {
+
+ }
+
+ int is_logged_in(void *opdata, const char *accountname, const char *protocol, const char *recipient)
+ {
+ Q_UNUSED(accountname);
+ Q_UNUSED(protocol);
+ Q_UNUSED(recipient);
+
+ Session *session = reinterpret_cast<Session*>(opdata);
+ return session->handler()->recipientStatus();
+ }
+
+ void inject_message(void *opdata, const char *accountname,
+ const char *protocol, const char *recipient, const char *message)
+ {
+
+ }
+
+ void update_context_list(void *opdata)
+ {
+
+ }
+
+ void new_fingerprint(void *opdata, OtrlUserState us,
+ const char *accountname, const char *protocol,
+ const char *username, unsigned char fingerprint[20])
+ {
+
+ }
+
+ void write_fingerprints(void *opdata)
+ {
+
+ }
+
+ void gone_secure(void *opdata, ConnContext *context)
+ {
+
+ }
+
+ void gone_insecure(void *opdata, ConnContext *context)
+ {
+
+ }
+
+ void still_secure(void *opdata, ConnContext *context, int is_reply)
+ {
+
+ }
+
+ int max_message_size(void *opdata, ConnContext *context)
+ {
+ return 0;
+ }
+
+ const char* otr_error_message(void *opdata, ConnContext *context,
+ OtrlErrorCode err_code)
+ {
+ return 0;
+ }
+
+ void otr_error_message_free(void *opdata, const char *err_msg)
+ {
+
+ }
+
+ const char* resent_msg_prefix(void *opdata, ConnContext *context)
+ {
+ return 0;
+ }
+
+ void resent_msg_prefix_free(void *opdata, const char *prefix)
+ {
+
+ }
+
+ void handle_smp_event(void *opdata, OtrlSMPEvent smp_event,
+ ConnContext *context, unsigned short progress_percent,
+ char *question)
+ {
+
+ }
+
+ void handle_msg_event(void *opdata, OtrlMessageEvent msg_event,
+ ConnContext *context, const char *message,
+ gcry_error_t err)
+ {
+
+ }
+
+ void create_instag(void *opdata, const char *accountname,
+ const char *protocol)
+ {
+
+ }
+
+ void timer_control(void *opdata, unsigned int interval)
+ {
+ Session *session = reinterpret_cast<Session*>(opdata);
+ session->userState()->setInterval(interval);
+ }
+
+ /** OTR ops struct ---------------------------------------------------------------------------- */
+ const OtrlMessageAppOps appOps = {
+ policy,
+ create_privkey,
+ is_logged_in,
+ inject_message,
+ update_context_list,
+ new_fingerprint,
+ write_fingerprints,
+ gone_secure,
+ gone_insecure,
+ still_secure,
+ max_message_size,
+ NULL, /* account_name */
+ NULL, /* account_name_free */
+ NULL, /* received symkey */
+ otr_error_message,
+ otr_error_message_free,
+ resent_msg_prefix,
+ resent_msg_prefix_free,
+ handle_smp_event,
+ handle_msg_event,
+ create_instag,
+ NULL, /* convert_data */
+ NULL, /* convert_data_free */
+ timer_control
+ };
+
+} /* anonymous namespace */
+
+
+/** Manager implementation -------------------------------------------------------------------- */
+Manager::Manager(Config *otrConfig)
+ : config(config)
+{
+
+}
+
+SessionPtr Manager::createSession(const HandlerPtr &handler)
+{
+ auto usIt = userStates.find(handler->context().accountId);
+ if(usIt == userStates.end()) {
+ // initiate new userstate
+ OtrlUserState userstate = otrl_userstate_create();
+
+ QString path = config->saveLocation() + handler->context().accountId + QLatin1String("_privkeys");
+ otrl_privkey_read(userstate, path.toLocal8Bit());
+
+ path = config->saveLocation() + handler->context().accountId + QLatin1String("_fingerprints");
+ otrl_privkey_read_fingerprints(userstate, path.toLocal8Bit(), NULL, NULL);
+
+ path = config->saveLocation() + handler->context().accountId + QLatin1String("_instags");
+ otrl_instag_read(userstate, path.toLocal8Bit());
+
+ UserStateBoxPtr usPtr(new UserStateBox(userstate));
+ userStates.insert(handler->context().accountId, usPtr);
+ return SessionPtr(new Session(handler, usPtr.data(), this));
+ } else {
+ return SessionPtr(new Session(handler, usIt->data(), this));
+ }
+}
+
+} /* namespace OTR */
diff --git a/otr-proxy/KTpProxy/pending-curry-operation.h b/otr-proxy/KTpProxy/otr-manager.h
similarity index 65%
copy from otr-proxy/KTpProxy/pending-curry-operation.h
copy to otr-proxy/KTpProxy/otr-manager.h
index 80e3fcc..1d54f90 100644
--- a/otr-proxy/KTpProxy/pending-curry-operation.h
+++ b/otr-proxy/KTpProxy/otr-manager.h
@@ -17,24 +17,39 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
-#ifndef KTP_PROXY_PENDING_CURRY_OPERATION_HEADER
-#define KTP_PROXY_PENDING_CURRY_OPERATION_HEADER
+#ifndef KTP_PROXY_OTR_MANAGER_HEADER
+#define KTP_PROXY_OTR_MANAGER_HEADER
-#include <TelepathyQt/PendingOperation>
+#include "otr-config.h"
+#include "otr-session.h"
+#include "otr-handler.h"
-class PendingCurryOperation : public Tp::PendingOperation
+extern "C" {
+#include <libotr/proto.h>
+#include <libotr/message.h>
+#include <libotr/userstate.h>
+}
+
+namespace OTR
{
- Q_OBJECT
+ extern const OtrlMessageAppOps appOps;
+
+ class Manager
+ {
+ public:
+ Manager(Config *otrConfig);
+
+ SessionPtr createSession(const HandlerPtr &handler);
- public:
- PendingCurryOperation(Tp::PendingOperation *op, const Tp::SharedPtr<Tp::RefCounted> &obj);
- ~PendingCurryOperation();
+ OtrlPolicy getPolicy() const;
+ void setPolicy(OtrlPolicy policy);
- protected:
- virtual void extract(Tp::PendingOperation *op) = 0;
+ private:
+ Config *config;
+ // TODO - consider clearing states when not in use
+ QMap<QString, UserStateBoxPtr> userStates;
+ };
- private Q_SLOTS:
- void onFinished(Tp::PendingOperation *op);
-};
+} /* namespace OTR */
#endif
diff --git a/otr-proxy/KTpProxy/types.h b/otr-proxy/KTpProxy/otr-message.h
similarity index 81%
copy from otr-proxy/KTpProxy/types.h
copy to otr-proxy/KTpProxy/otr-message.h
index dfe7ee9..9c79926 100644
--- a/otr-proxy/KTpProxy/types.h
+++ b/otr-proxy/KTpProxy/otr-message.h
@@ -17,17 +17,19 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
-#ifndef KTP_PROXY_TYPES_HEADER
-#define KTP_PROXY_TYPES_HEADER
+#ifndef KTP_PROXY_OTR_MESSAGE_HEADER
+#define KTP_PROXY_OTR_MESSAGE_HEADER
-#include <TelepathyQt/SharedPtr>
+#include <TelepathyQt/Message>
-class OtrProxyChannel;
-class ProxyService;
-class ProxyObserver;
+namespace OTR
+{
+ class Message
+ {
-typedef Tp::SharedPtr<OtrProxyChannel> OtrProxyChannelPtr;
-typedef Tp::SharedPtr<ProxyService> ProxyServicePtr;
-typedef Tp::SharedPtr<ProxyObserver> ProxyObserverPtr;
+ private:
+ Tp::MessagePartList message;
+ };
+}
#endif
diff --git a/otr-proxy/KTpProxy/main.cpp b/otr-proxy/KTpProxy/otr-session.cpp
similarity index 53%
copy from otr-proxy/KTpProxy/main.cpp
copy to otr-proxy/KTpProxy/otr-session.cpp
index c7b12e0..98bd632 100644
--- a/otr-proxy/KTpProxy/main.cpp
+++ b/otr-proxy/KTpProxy/otr-session.cpp
@@ -17,53 +17,64 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
-#include "proxy-service.h"
-#include "version.h"
-
-#include <KAboutData>
-#include <KCmdLineArgs>
-#include <KApplication>
-#include <KDebug>
-
-#include <QDBusConnection>
-
-#include <TelepathyQt/AbstractAdaptor>
-#include <TelepathyQt/Channel>
-#include <TelepathyQt/Connection>
-#include <TelepathyQt/ClientRegistrar>
-#include <TelepathyQt/TextChannel>
+#include "otr-session.h"
+extern "C" {
+#include <libotr/privkey.h>
+#include <libotr/proto.h>
+#include <libotr/message.h>
+#include <libotr/userstate.h>
+}
-int main(int argc, char *argv[])
+namespace OTR
{
- KAboutData aboutData("ktp-proxy", 0,
- ki18n("Channel proxy service"),
- KTP_PROXY_VERSION);
+ UserStateBox::UserStateBox(OtrlUserState userState)
+ : us(userState)
+ {
+ uint interval = otrl_message_poll_get_default_interval(us);
+ QObject::connect(&periodicTimer, SIGNAL(timeout()), SLOT(otrlMessagePoll()));
+ periodicTimer.start(interval * 1000);
+ }
- aboutData.addAuthor(ki18n("Marcin Ziemiński"), ki18n("Developer"), "zieminn at gmail.com");
- aboutData.setProductName("telepathy/ktp-proxy");
- aboutData.setLicense(KAboutData::License_GPL_V2);
- aboutData.setProgramIconName(QLatin1String("telepathy-kde"));
+ UserStateBox::~UserStateBox()
+ {
+ otrl_userstate_free(us);
+ }
- KCmdLineArgs::init(argc, argv, &aboutData);
+ void UserStateBox::setInterval(uint interval)
+ {
+ if(interval) {
+ periodicTimer.start(interval * 1000);
+ } else {
+ periodicTimer.stop();
+ }
+ }
- KApplication app(false);
+ void UserStateBox::otrlMessagePoll()
+ {
+ otrl_message_poll(us, 0, 0);
+ }
- Tp::registerTypes();
+ Session::Session(const HandlerPtr &handler, UserStateBox *userstate, Manager *parent)
+ : hd(handler),
+ userstate(userstate),
+ pr(parent)
+ {
+ }
- Tp::DBusError error;
- QDBusConnection dbusConnection = QDBusConnection::sessionBus();
- ProxyService ps(dbusConnection);
- ps.registerService(&error);
+ const HandlerPtr& Session::handler()
+ {
+ return hd;
+ }
- if(error.isValid())
+ UserStateBox* Session::userState()
{
- kError() << "Could not register ProxyService
"
- << "error name: " << error.name() << "
"
- << "error message: " << error.message();
+ return userstate;
+ }
- return 1;
- } else {
- return app.exec();
+ Manager* Session::parent()
+ {
+ return pr;
}
-}
+
+} /* namespace OTR */
diff --git a/otr-proxy/KTpProxy/otr-session.h b/otr-proxy/KTpProxy/otr-session.h
new file mode 100644
index 0000000..2a46181
--- /dev/null
+++ b/otr-proxy/KTpProxy/otr-session.h
@@ -0,0 +1,88 @@
+/***************************************************************************
+ * Copyright (C) 2014 by Marcin Ziemiński <zieminn at gmail.com> *
+ * *
+ * 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.1 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; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
+ ***************************************************************************/
+
+#ifndef KTP_PROXY_OTR_SESSION_HEADER
+#define KTP_PROXY_OTR_SESSION_HEADER
+
+#include "otr-message.h"
+#include "otr-handler.h"
+
+#include <QString>
+#include <QTimer>
+
+extern "C" {
+#include <gcrypt.h>
+#include <libotr/userstate.h>
+}
+
+namespace OTR
+{
+ class Manager;
+
+ class UserStateBox : public QObject
+ {
+ Q_OBJECT
+ public:
+ UserStateBox(OtrlUserState userState);
+ ~UserStateBox();
+
+ OtrlUserState userState();
+ /** if zero timer is stopped */
+ void setInterval(uint interval);
+
+ private Q_SLOTS:
+ void otrlMessagePoll();
+
+ private:
+ OtrlUserState us;
+ QTimer periodicTimer;
+ };
+
+ typedef QSharedPointer<UserStateBox> UserStateBoxPtr;
+
+ class Session : public QObject
+ {
+ Q_OBJECT
+
+ public:
+ Session(const HandlerPtr &handler, UserStateBox *userstate, Manager *parent);
+
+ const HandlerPtr& handler();
+ UserStateBox* userState();
+ Manager* parent();
+
+ void startSession();
+ void stopSession();
+ void encrypt();
+ void decrypt();
+ void verifyFingerprint();
+ void initSMPQuery();
+ void initSMPSecret();
+
+ private:
+ HandlerPtr hd;
+ UserStateBox *userstate;
+ Manager *pr;
+ };
+
+ typedef QSharedPointer<Session> SessionPtr;
+
+} /* namespace OTR */
+
+#endif
--
ktp-common-internals packaging
More information about the pkg-kde-commits
mailing list