diff options
-rw-r--r-- | TelepathyQt/base-channel-internal.h | 41 | ||||
-rw-r--r-- | TelepathyQt/base-channel.cpp | 201 | ||||
-rw-r--r-- | TelepathyQt/base-channel.h | 56 | ||||
-rw-r--r-- | TelepathyQt/service-types.h | 2 |
4 files changed, 300 insertions, 0 deletions
diff --git a/TelepathyQt/base-channel-internal.h b/TelepathyQt/base-channel-internal.h index 543d7592..bd010c24 100644 --- a/TelepathyQt/base-channel-internal.h +++ b/TelepathyQt/base-channel-internal.h @@ -115,4 +115,45 @@ public: BaseChannelTextType *mInterface; }; +class TP_QT_NO_EXPORT BaseChannelMessagesInterface::Adaptee : public QObject +{ + Q_OBJECT + Q_PROPERTY(QStringList supportedContentTypes READ supportedContentTypes) + Q_PROPERTY(Tp::UIntList messageTypes READ messageTypes) + Q_PROPERTY(uint messagePartSupportFlags READ messagePartSupportFlags) + Q_PROPERTY(Tp::MessagePartListList pendingMessages READ pendingMessages) + Q_PROPERTY(uint deliveryReportingSupport READ deliveryReportingSupport) +public: + Adaptee(BaseChannelMessagesInterface *interface); + ~Adaptee(); + + QStringList supportedContentTypes() { + return mInterface->supportedContentTypes(); + } + Tp::UIntList messageTypes() { + return mInterface->messageTypes(); + } + uint messagePartSupportFlags() { + return mInterface->messagePartSupportFlags(); + } + uint deliveryReportingSupport() { + return mInterface->deliveryReportingSupport(); + } + Tp::MessagePartListList pendingMessages() { + return mInterface->pendingMessages(); + } + +public slots: + void sendMessage(const Tp::MessagePartList &message, uint flags, const Tp::Service::ChannelInterfaceMessagesAdaptor::SendMessageContextPtr &context); +//deprecated, never implemented: + //void getPendingMessageContent(uint messageID, const Tp::UIntList &parts, const Tp::Service::ChannelInterfaceMessagesAdaptor::GetPendingMessageContentContextPtr &context); +signals: + void messageSent(const Tp::MessagePartList &content, uint flags, const QString &messageToken); + void pendingMessagesRemoved(const Tp::UIntList &messageIDs); + void messageReceived(const Tp::MessagePartList &message); + +public: + BaseChannelMessagesInterface *mInterface; +}; + } diff --git a/TelepathyQt/base-channel.cpp b/TelepathyQt/base-channel.cpp index b41b4847..93f73aa0 100644 --- a/TelepathyQt/base-channel.cpp +++ b/TelepathyQt/base-channel.cpp @@ -529,4 +529,205 @@ void BaseChannelTextType::sent(uint timestamp, uint type, QString text) emit mPriv->adaptee->sent(timestamp, type, text); } + +// Chan.I.Messages +BaseChannelMessagesInterface::Adaptee::Adaptee(BaseChannelMessagesInterface *interface) + : QObject(interface), + mInterface(interface) +{ +} + +BaseChannelMessagesInterface::Adaptee::~Adaptee() +{ +} + +void BaseChannelMessagesInterface::Adaptee::sendMessage(const Tp::MessagePartList &message, uint flags, + const Tp::Service::ChannelInterfaceMessagesAdaptor::SendMessageContextPtr &context) +{ + DBusError error; + QString token = mInterface->sendMessage(message, flags, &error); + if (error.isValid()) { + context->setFinishedWithError(error.name(), error.message()); + return; + } + context->setFinished(token); +} + +struct TP_QT_NO_EXPORT BaseChannelMessagesInterface::Private { + Private(BaseChannelMessagesInterface *parent, + BaseChannelTextType* textTypeInterface, + QStringList supportedContentTypes, + Tp::UIntList messageTypes, + uint messagePartSupportFlags, + uint deliveryReportingSupport) + : textTypeInterface(textTypeInterface), + supportedContentTypes(supportedContentTypes), + messageTypes(messageTypes), + messagePartSupportFlags(messagePartSupportFlags), + deliveryReportingSupport(deliveryReportingSupport), + adaptee(new BaseChannelMessagesInterface::Adaptee(parent)) { + } + + BaseChannelTextType* textTypeInterface; + QStringList supportedContentTypes; + Tp::UIntList messageTypes; + uint messagePartSupportFlags; + uint deliveryReportingSupport; + SendMessageCallback sendMessageCB; + BaseChannelMessagesInterface::Adaptee *adaptee; +}; + +/** + * \class BaseChannelMessagesInterface + * \ingroup servicecm + * \headerfile TelepathyQt/base-channel.h <TelepathyQt/BaseChannel> + * + * \brief Base class for implementations of Channel.Interface.Messages + * + */ + +/** + * Class constructor. + */ +BaseChannelMessagesInterface::BaseChannelMessagesInterface(BaseChannelTextType *textType, + QStringList supportedContentTypes, + UIntList messageTypes, + uint messagePartSupportFlags, + uint deliveryReportingSupport) + : AbstractChannelInterface(TP_QT_IFACE_CHANNEL_INTERFACE_MESSAGES), + mPriv(new Private(this, textType, supportedContentTypes, messageTypes, + messagePartSupportFlags, deliveryReportingSupport)) +{ +} + +/** + * Class destructor. + */ +BaseChannelMessagesInterface::~BaseChannelMessagesInterface() +{ + delete mPriv; +} + +/** + * Return the immutable properties of this interface. + * + * Immutable properties cannot change after the interface has been registered + * on a service on the bus with registerInterface(). + * + * \return The immutable properties of this interface. + */ +QVariantMap BaseChannelMessagesInterface::immutableProperties() const +{ + QVariantMap map; + + map.insert(TP_QT_IFACE_CHANNEL_INTERFACE_MESSAGES + QLatin1String(".SupportedContentTypes"), + QVariant::fromValue(mPriv->adaptee->supportedContentTypes())); + map.insert(TP_QT_IFACE_CHANNEL_INTERFACE_MESSAGES + QLatin1String(".MessageTypes"), + QVariant::fromValue(mPriv->adaptee->messageTypes())); + map.insert(TP_QT_IFACE_CHANNEL_INTERFACE_MESSAGES + QLatin1String(".MessagePartSupportFlags"), + QVariant::fromValue(mPriv->adaptee->messagePartSupportFlags())); + map.insert(TP_QT_IFACE_CHANNEL_INTERFACE_MESSAGES + QLatin1String(".DeliveryReportingSupport"), + QVariant::fromValue(mPriv->adaptee->deliveryReportingSupport())); + return map; +} + +void BaseChannelMessagesInterface::createAdaptor() +{ + (void) new Service::ChannelInterfaceMessagesAdaptor(dbusObject()->dbusConnection(), + mPriv->adaptee, dbusObject()); +} + +QStringList BaseChannelMessagesInterface::supportedContentTypes() +{ + return mPriv->supportedContentTypes; +} + +Tp::UIntList BaseChannelMessagesInterface::messageTypes() +{ + return mPriv->messageTypes; +} + +uint BaseChannelMessagesInterface::messagePartSupportFlags() +{ + return mPriv->messagePartSupportFlags; +} + +uint BaseChannelMessagesInterface::deliveryReportingSupport() +{ + return mPriv->deliveryReportingSupport; +} + +Tp::MessagePartListList BaseChannelMessagesInterface::pendingMessages() +{ + return mPriv->textTypeInterface->pendingMessages(); +} + +void BaseChannelMessagesInterface::messageSent(const Tp::MessagePartList &content, uint flags, const QString &messageToken) +{ + emit mPriv->adaptee->messageSent(content, flags, messageToken); +} + +void BaseChannelMessagesInterface::pendingMessagesRemoved(const Tp::UIntList &messageIDs) +{ + emit mPriv->adaptee->pendingMessagesRemoved(messageIDs); +} + +void BaseChannelMessagesInterface::messageReceived(const Tp::MessagePartList &message) +{ + emit mPriv->adaptee->messageReceived(message); +} + +void BaseChannelMessagesInterface::setSendMessageCallback(const SendMessageCallback &cb) +{ + mPriv->sendMessageCB = cb; +} + +QString BaseChannelMessagesInterface::sendMessage(const Tp::MessagePartList &message, uint flags, DBusError* error) +{ + if (!mPriv->sendMessageCB.isValid()) { + error->set(TP_QT_ERROR_NOT_IMPLEMENTED, QLatin1String("Not implemented")); + return QString(); + } + QString token = mPriv->sendMessageCB(message, flags, error); + + //emit after return + QMetaObject::invokeMethod(mPriv->adaptee, "messageSent", + Qt::QueuedConnection, + Q_ARG(Tp::MessagePartList, message), + Q_ARG(uint, flags), + Q_ARG(QString, token)); + + if (message.empty()) { + warning() << "Sending empty message"; + return token; + } + const MessagePart &header = message.front(); + + uint timestamp = 0; + if (header.count(QLatin1String("message-received"))) + timestamp = header[QLatin1String("message-received")].variant().toUInt(); + + uint type = ChannelTextMessageTypeNormal; + if (header.count(QLatin1String("message-type"))) + type = header[QLatin1String("message-type")].variant().toUInt(); + + QString content; + for (MessagePartList::const_iterator i = message.begin() + 1; i != message.end(); ++i) + if (i->count(QLatin1String("content-type")) + && i->value(QLatin1String("content-type")).variant().toString() == QLatin1String("text/plain") + && i->count(QLatin1String("content"))) { + content = i->value(QLatin1String("content")).variant().toString(); + break; + } + //emit after return + QMetaObject::invokeMethod(mPriv->textTypeInterface, "sent", + Qt::QueuedConnection, + Q_ARG(uint, timestamp), + Q_ARG(uint, type), + Q_ARG(QString, content)); + return token; +} + + + } diff --git a/TelepathyQt/base-channel.h b/TelepathyQt/base-channel.h index c6cc7bdc..0f39a705 100644 --- a/TelepathyQt/base-channel.h +++ b/TelepathyQt/base-channel.h @@ -156,5 +156,61 @@ private: Private *mPriv; }; +class TP_QT_EXPORT BaseChannelMessagesInterface : public AbstractChannelInterface +{ + Q_OBJECT + Q_DISABLE_COPY(BaseChannelMessagesInterface) + +public: + static BaseChannelMessagesInterfacePtr create(BaseChannelTextType* textTypeInterface, + QStringList supportedContentTypes, + UIntList messageTypes, + uint messagePartSupportFlags, + uint deliveryReportingSupport) { + return BaseChannelMessagesInterfacePtr(new BaseChannelMessagesInterface(textTypeInterface, + supportedContentTypes, + messageTypes, + messagePartSupportFlags, + deliveryReportingSupport)); + } + template<typename BaseChannelMessagesInterfaceSubclass> + static SharedPtr<BaseChannelMessagesInterfaceSubclass> create() { + return SharedPtr<BaseChannelMessagesInterfaceSubclass>( + new BaseChannelMessagesInterfaceSubclass()); + } + virtual ~BaseChannelMessagesInterface(); + + QVariantMap immutableProperties() const; + + QStringList supportedContentTypes(); + Tp::UIntList messageTypes(); + uint messagePartSupportFlags(); + uint deliveryReportingSupport(); + Tp::MessagePartListList pendingMessages(); + + void messageSent(const Tp::MessagePartList &content, uint flags, const QString &messageToken); + + typedef Callback3<QString, const Tp::MessagePartList&, uint, DBusError*> SendMessageCallback; + void setSendMessageCallback(const SendMessageCallback &cb); +protected: + QString sendMessage(const Tp::MessagePartList &message, uint flags, DBusError* error); +private Q_SLOTS: + void pendingMessagesRemoved(const Tp::UIntList &messageIDs); + void messageReceived(const Tp::MessagePartList &message); +private: + BaseChannelMessagesInterface(BaseChannelTextType* textType, + QStringList supportedContentTypes, + Tp::UIntList messageTypes, + uint messagePartSupportFlags, + uint deliveryReportingSupport); + void createAdaptor(); + + class Adaptee; + friend class Adaptee; + struct Private; + friend struct Private; + Private *mPriv; +}; + } #endif diff --git a/TelepathyQt/service-types.h b/TelepathyQt/service-types.h index bb19d292..56dbbb10 100644 --- a/TelepathyQt/service-types.h +++ b/TelepathyQt/service-types.h @@ -45,6 +45,7 @@ class BaseProtocolAvatarsInterface; class BaseProtocolPresenceInterface; class BaseChannel; class BaseChannelTextType; +class BaseChannelMessagesInterface; class DBusService; #ifndef DOXYGEN_SHOULD_SKIP_THIS @@ -62,6 +63,7 @@ typedef SharedPtr<BaseProtocolAvatarsInterface> BaseProtocolAvatarsInterfacePtr; typedef SharedPtr<BaseProtocolPresenceInterface> BaseProtocolPresenceInterfacePtr; typedef SharedPtr<BaseChannel> BaseChannelPtr; typedef SharedPtr<BaseChannelTextType> BaseChannelTextTypePtr; +typedef SharedPtr<BaseChannelMessagesInterface> BaseChannelMessagesInterfacePtr; typedef SharedPtr<DBusService> DBusServicePtr; #endif /* DOXYGEN_SHOULD_SKIP_THIS */ |