aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Rusakov <Kitsune-Ral@users.sf.net>2021-12-29 15:59:58 +0100
committerAlexey Rusakov <Kitsune-Ral@users.sf.net>2021-12-29 18:07:21 +0100
commit7350fe82953cf6274b8845a890eafb21a09b9931 (patch)
treee802f22bd64b9cdd83b48e257629787a57352be3
parent02fdd08b98d878168eb81376a44586176dfd9576 (diff)
downloadlibquotient-7350fe82953cf6274b8845a890eafb21a09b9931.tar.gz
libquotient-7350fe82953cf6274b8845a890eafb21a09b9931.zip
Add QUOTIENT_API throughout non-generated code
This include all (hopefully) classes/structures and functions that have non-inline definitions, as well as namespaces with Q_NAMESPACE since those have non-inline (as of Qt 5.15) QMetaObject - for that a new macro, QUO_NAMESPACE, has been devised to accommodate the lack of Q_NAMESPACE_EXPORT in Qt before 5.14.
-rw-r--r--lib/accountregistry.h4
-rw-r--r--lib/avatar.h4
-rw-r--r--lib/connection.h2
-rw-r--r--lib/converters.h6
-rw-r--r--lib/eventitem.cpp4
-rw-r--r--lib/eventitem.h9
-rw-r--r--lib/events/accountdataevents.h2
-rw-r--r--lib/events/callanswerevent.h3
-rw-r--r--lib/events/callhangupevent.h2
-rw-r--r--lib/events/callinviteevent.h2
-rw-r--r--lib/events/directchatevent.h2
-rw-r--r--lib/events/encryptedevent.h2
-rw-r--r--lib/events/encryptionevent.h5
-rw-r--r--lib/events/event.h23
-rw-r--r--lib/events/eventcontent.h19
-rw-r--r--lib/events/reactionevent.h6
-rw-r--r--lib/events/receiptevent.h2
-rw-r--r--lib/events/roomavatarevent.h3
-rw-r--r--lib/events/roomcreateevent.h2
-rw-r--r--lib/events/roomevent.h4
-rw-r--r--lib/events/roomkeyevent.h2
-rw-r--r--lib/events/roommemberevent.h5
-rw-r--r--lib/events/roommessageevent.h8
-rw-r--r--lib/events/roompowerlevelsevent.h8
-rw-r--r--lib/events/roomtombstoneevent.h2
-rw-r--r--lib/events/simplestateevents.h3
-rw-r--r--lib/events/stateevent.h2
-rw-r--r--lib/events/stickerevent.h2
-rw-r--r--lib/events/typingevent.h2
-rw-r--r--lib/eventstats.h4
-rw-r--r--lib/jobs/basejob.h4
-rw-r--r--lib/jobs/downloadfilejob.h2
-rw-r--r--lib/jobs/mediathumbnailjob.h2
-rw-r--r--lib/jobs/requestdata.h4
-rw-r--r--lib/mxcreply.h4
-rw-r--r--lib/networkaccessmanager.h4
-rw-r--r--lib/networksettings.h2
-rw-r--r--lib/quotient_common.h17
-rw-r--r--lib/room.h8
-rw-r--r--lib/settings.h8
-rw-r--r--lib/ssosession.h4
-rw-r--r--lib/syncdata.h2
-rw-r--r--lib/uri.h2
-rw-r--r--lib/uriresolver.h6
-rw-r--r--lib/user.h3
-rw-r--r--lib/util.h22
46 files changed, 138 insertions, 100 deletions
diff --git a/lib/accountregistry.h b/lib/accountregistry.h
index 5efda459..f7a864df 100644
--- a/lib/accountregistry.h
+++ b/lib/accountregistry.h
@@ -4,6 +4,8 @@
#pragma once
+#include "quotient_export.h"
+
#include <QtCore/QObject>
#include <QtCore/QList>
#include <QtCore/QAbstractListModel>
@@ -11,7 +13,7 @@
namespace Quotient {
class Connection;
-class AccountRegistry : public QAbstractListModel {
+class QUOTIENT_API AccountRegistry : public QAbstractListModel {
Q_OBJECT
public:
enum EventRoles {
diff --git a/lib/avatar.h b/lib/avatar.h
index d4634aea..93f43948 100644
--- a/lib/avatar.h
+++ b/lib/avatar.h
@@ -3,6 +3,8 @@
#pragma once
+#include "quotient_export.h"
+
#include <QtCore/QUrl>
#include <QtGui/QIcon>
@@ -12,7 +14,7 @@
namespace Quotient {
class Connection;
-class Avatar {
+class QUOTIENT_API Avatar {
public:
explicit Avatar();
explicit Avatar(QUrl url);
diff --git a/lib/connection.h b/lib/connection.h
index 0713af16..d669462e 100644
--- a/lib/connection.h
+++ b/lib/connection.h
@@ -105,7 +105,7 @@ using DirectChatsMap = QMultiHash<const User*, QString>;
using DirectChatUsersMap = QMultiHash<QString, User*>;
using IgnoredUsersList = IgnoredUsersEvent::content_type;
-class Connection : public QObject {
+class QUOTIENT_API Connection : public QObject {
Q_OBJECT
Q_PROPERTY(User* localUser READ user NOTIFY stateChanged)
diff --git a/lib/converters.h b/lib/converters.h
index 9c3d5749..a6028f1b 100644
--- a/lib/converters.h
+++ b/lib/converters.h
@@ -183,7 +183,7 @@ struct JsonConverter<QUrl> {
};
template <>
-struct JsonConverter<QVariant> {
+struct QUOTIENT_API JsonConverter<QVariant> {
static QJsonValue dump(const QVariant& v);
static QVariant load(const QJsonValue& jv);
};
@@ -281,9 +281,9 @@ template <typename T>
struct JsonObjectConverter<QHash<QString, T>>
: public HashMapFromJson<QHash<QString, T>> {};
-QJsonObject toJson(const QVariantHash& vh);
+QJsonObject QUOTIENT_API toJson(const QVariantHash& vh);
template <>
-QVariantHash fromJson(const QJsonValue& jv);
+QVariantHash QUOTIENT_API fromJson(const QJsonValue& jv);
// Conditional insertion into a QJsonObject
diff --git a/lib/eventitem.cpp b/lib/eventitem.cpp
index 4f1595bc..a2d65d8d 100644
--- a/lib/eventitem.cpp
+++ b/lib/eventitem.cpp
@@ -25,3 +25,7 @@ void PendingEventItem::setFileUploaded(const QUrl& remoteUrl)
}
setStatus(EventStatus::FileUploaded);
}
+
+// Not exactly sure why but this helps with the linker not finding
+// Quotient::EventStatus::staticMetaObject when building Quaternion
+#include "moc_eventitem.cpp"
diff --git a/lib/eventitem.h b/lib/eventitem.h
index 0ab1a01d..2f1e72cc 100644
--- a/lib/eventitem.h
+++ b/lib/eventitem.h
@@ -4,6 +4,7 @@
#pragma once
#include "events/stateevent.h"
+#include "quotient_common.h"
#include <any>
#include <utility>
@@ -11,7 +12,7 @@
namespace Quotient {
namespace EventStatus {
- Q_NAMESPACE
+ QUO_NAMESPACE
/** Special marks an event can assume
*
@@ -33,7 +34,7 @@ namespace EventStatus {
Q_ENUM_NS(Code)
} // namespace EventStatus
-class EventItemBase {
+class QUOTIENT_API EventItemBase {
public:
explicit EventItemBase(RoomEventPtr&& e) : evt(std::move(e))
{
@@ -74,7 +75,7 @@ private:
std::any data;
};
-class TimelineItem : public EventItemBase {
+class QUOTIENT_API TimelineItem : public EventItemBase {
public:
// For compatibility with Qt containers, even though we use
// a std:: container now for the room timeline
@@ -103,7 +104,7 @@ inline const CallEventBase* EventItemBase::viewAs<CallEventBase>() const
return evt->isCallEvent() ? weakPtrCast<const CallEventBase>(evt) : nullptr;
}
-class PendingEventItem : public EventItemBase {
+class QUOTIENT_API PendingEventItem : public EventItemBase {
public:
using EventItemBase::EventItemBase;
diff --git a/lib/events/accountdataevents.h b/lib/events/accountdataevents.h
index 9cf77be3..c0f2202d 100644
--- a/lib/events/accountdataevents.h
+++ b/lib/events/accountdataevents.h
@@ -50,7 +50,7 @@ struct JsonObjectConverter<TagRecord> {
using TagsMap = QHash<QString, TagRecord>;
#define DEFINE_SIMPLE_EVENT(_Name, _TypeId, _ContentType, _ContentKey) \
- class _Name : public Event { \
+ class QUOTIENT_API _Name : public Event { \
public: \
using content_type = _ContentType; \
DEFINE_EVENT_TYPEID(_TypeId, _Name) \
diff --git a/lib/events/callanswerevent.h b/lib/events/callanswerevent.h
index 4c01c941..8ffe60f2 100644
--- a/lib/events/callanswerevent.h
+++ b/lib/events/callanswerevent.h
@@ -7,7 +7,7 @@
#include "roomevent.h"
namespace Quotient {
-class CallAnswerEvent : public CallEventBase {
+class QUOTIENT_API CallAnswerEvent : public CallEventBase {
public:
DEFINE_EVENT_TYPEID("m.call.answer", CallAnswerEvent)
@@ -26,6 +26,5 @@ public:
return contentPart<QJsonObject>("answer"_ls).value("sdp"_ls).toString();
}
};
-
REGISTER_EVENT_TYPE(CallAnswerEvent)
} // namespace Quotient
diff --git a/lib/events/callhangupevent.h b/lib/events/callhangupevent.h
index f3f82833..b0017c59 100644
--- a/lib/events/callhangupevent.h
+++ b/lib/events/callhangupevent.h
@@ -7,7 +7,7 @@
#include "roomevent.h"
namespace Quotient {
-class CallHangupEvent : public CallEventBase {
+class QUOTIENT_API CallHangupEvent : public CallEventBase {
public:
DEFINE_EVENT_TYPEID("m.call.hangup", CallHangupEvent)
diff --git a/lib/events/callinviteevent.h b/lib/events/callinviteevent.h
index 80b7d651..47362b5c 100644
--- a/lib/events/callinviteevent.h
+++ b/lib/events/callinviteevent.h
@@ -7,7 +7,7 @@
#include "roomevent.h"
namespace Quotient {
-class CallInviteEvent : public CallEventBase {
+class QUOTIENT_API CallInviteEvent : public CallEventBase {
public:
DEFINE_EVENT_TYPEID("m.call.invite", CallInviteEvent)
diff --git a/lib/events/directchatevent.h b/lib/events/directchatevent.h
index e2143779..2018d3d6 100644
--- a/lib/events/directchatevent.h
+++ b/lib/events/directchatevent.h
@@ -6,7 +6,7 @@
#include "event.h"
namespace Quotient {
-class DirectChatEvent : public Event {
+class QUOTIENT_API DirectChatEvent : public Event {
public:
DEFINE_EVENT_TYPEID("m.direct", DirectChatEvent)
diff --git a/lib/events/encryptedevent.h b/lib/events/encryptedevent.h
index de89a7c6..81343a29 100644
--- a/lib/events/encryptedevent.h
+++ b/lib/events/encryptedevent.h
@@ -25,7 +25,7 @@ namespace Quotient {
* in general. It's possible, because RoomEvent interface is similar to Event's
* one and doesn't add new restrictions, just provides additional features.
*/
-class EncryptedEvent : public RoomEvent {
+class QUOTIENT_API EncryptedEvent : public RoomEvent {
public:
DEFINE_EVENT_TYPEID("m.room.encrypted", EncryptedEvent)
diff --git a/lib/events/encryptionevent.h b/lib/events/encryptionevent.h
index 14439fcc..dfb28b2f 100644
--- a/lib/events/encryptionevent.h
+++ b/lib/events/encryptionevent.h
@@ -8,7 +8,7 @@
#include "stateevent.h"
namespace Quotient {
-class EncryptionEventContent : public EventContent::Base {
+class QUOTIENT_API EncryptionEventContent : public EventContent::Base {
public:
enum EncryptionType : size_t { MegolmV1AesSha2 = 0, Undefined };
@@ -26,7 +26,7 @@ protected:
using EncryptionType = EncryptionEventContent::EncryptionType;
-class EncryptionEvent : public StateEvent<EncryptionEventContent> {
+class QUOTIENT_API EncryptionEvent : public StateEvent<EncryptionEventContent> {
Q_GADGET
public:
DEFINE_EVENT_TYPEID("m.room.encryption", EncryptionEvent)
@@ -51,6 +51,5 @@ public:
int rotationPeriodMs() const { return content().rotationPeriodMs; }
int rotationPeriodMsgs() const { return content().rotationPeriodMsgs; }
};
-
REGISTER_EVENT_TYPE(EncryptionEvent)
} // namespace Quotient
diff --git a/lib/events/event.h b/lib/events/event.h
index 8f62872d..8a0076d0 100644
--- a/lib/events/event.h
+++ b/lib/events/event.h
@@ -60,14 +60,14 @@ inline QJsonObject basicEventJson(const QString& matrixType,
using event_type_t = size_t;
using event_mtype_t = const char*;
-class EventTypeRegistry {
+class QUOTIENT_API EventTypeRegistry {
public:
~EventTypeRegistry() = default;
static event_type_t initializeTypeId(event_mtype_t matrixTypeId);
template <typename EventT>
- static inline event_type_t initializeTypeId()
+ static event_type_t initializeTypeId()
{
return initializeTypeId(EventT::matrixTypeId());
}
@@ -190,7 +190,7 @@ namespace _impl {
// === Event ===
-class Event {
+class QUOTIENT_API Event {
public:
using Type = event_type_t;
static inline _impl::EventFactory<Event> factory { "Event" };
@@ -243,7 +243,7 @@ public:
return fromJson<T>(unsignedJson()[std::forward<KeyT>(key)]);
}
- friend QDebug operator<<(QDebug dbg, const Event& e)
+ friend QUOTIENT_API QDebug operator<<(QDebug dbg, const Event& e)
{
QDebugStateSaver _dss { dbg };
dbg.noquote().nospace() << e.matrixType() << '(' << e.type() << "): ";
@@ -272,17 +272,20 @@ using Events = EventsArray<Event>;
// This macro should be used in a public section of an event class to
// provide matrixTypeId() and typeId().
-#define DEFINE_EVENT_TYPEID(_Id, _Type) \
- static constexpr event_mtype_t matrixTypeId() { return _Id; } \
- static auto typeId() { return Quotient::typeId<_Type>(); } \
+#define DEFINE_EVENT_TYPEID(_Id, _Type) \
+ static QUOTIENT_EXPORT constexpr event_mtype_t matrixTypeId() \
+ { \
+ return _Id; \
+ } \
+ static QUOTIENT_EXPORT auto typeId() { return Quotient::typeId<_Type>(); } \
// End of macro
// This macro should be put after an event class definition (in .h or .cpp)
// to enable its deserialisation from a /sync and other
// polymorphic event arrays
-#define REGISTER_EVENT_TYPE(_Type) \
- [[maybe_unused]] inline const auto _factoryAdded##_Type = \
- _Type::factory.addMethod<_Type>(); \
+#define REGISTER_EVENT_TYPE(_Type) \
+ [[maybe_unused]] QUOTIENT_API inline const auto _factoryAdded##_Type = \
+ _Type::factory.addMethod<_Type>(); \
// End of macro
// === Event loading ===
diff --git a/lib/events/eventcontent.h b/lib/events/eventcontent.h
index f609a603..bfa7d926 100644
--- a/lib/events/eventcontent.h
+++ b/lib/events/eventcontent.h
@@ -6,14 +6,15 @@
// This file contains generic event content definitions, applicable to room
// message events as well as other events (e.g., avatars).
+#include "encryptedfile.h"
+#include "quotient_export.h"
+
#include <QtCore/QJsonObject>
#include <QtCore/QMimeType>
#include <QtCore/QSize>
#include <QtCore/QUrl>
#include <QtCore/QMetaType>
-#include "encryptedfile.h"
-
class QFileInfo;
namespace Quotient {
@@ -28,7 +29,7 @@ namespace EventContent {
* assumed but not required that a content object can also be created
* from plain data.
*/
- class Base {
+ class QUOTIENT_API Base {
public:
explicit Base(QJsonObject o = {}) : originalJson(std::move(o)) {}
virtual ~Base() = default;
@@ -76,7 +77,7 @@ namespace EventContent {
*
* This class is not polymorphic.
*/
- class FileInfo {
+ class QUOTIENT_API FileInfo {
public:
FileInfo() = default;
explicit FileInfo(const QFileInfo& fi);
@@ -121,7 +122,7 @@ namespace EventContent {
/**
* A content info class for image content types: image, thumbnail, video
*/
- class ImageInfo : public FileInfo {
+ class QUOTIENT_API ImageInfo : public FileInfo {
public:
ImageInfo() = default;
explicit ImageInfo(const QFileInfo& fi, QSize imageSize = {});
@@ -146,7 +147,7 @@ namespace EventContent {
* the JSON representation of event content; namely,
* "info/thumbnail_url" and "info/thumbnail_info" fields are used.
*/
- class Thumbnail : public ImageInfo {
+ class QUOTIENT_API Thumbnail : public ImageInfo {
public:
Thumbnail() = default; // Allow empty thumbnails
Thumbnail(const QJsonObject& infoJson, const Omittable<EncryptedFile> &file = none);
@@ -160,7 +161,7 @@ namespace EventContent {
void fillInfoJson(QJsonObject* infoJson) const;
};
- class TypedBase : public Base {
+ class QUOTIENT_API TypedBase : public Base {
public:
virtual QMimeType type() const = 0;
virtual const FileInfo* fileInfo() const { return nullptr; }
@@ -183,7 +184,7 @@ namespace EventContent {
* \tparam InfoT base info class
*/
template <class InfoT>
- class UrlBasedContent : public TypedBase, public InfoT {
+ class QUOTIENT_API UrlBasedContent : public TypedBase, public InfoT {
public:
using InfoT::InfoT;
explicit UrlBasedContent(const QJsonObject& json)
@@ -215,7 +216,7 @@ namespace EventContent {
};
template <typename InfoT>
- class UrlWithThumbnailContent : public UrlBasedContent<InfoT> {
+ class QUOTIENT_API UrlWithThumbnailContent : public UrlBasedContent<InfoT> {
public:
// NB: when using inherited constructors, thumbnail has to be
// initialised separately
diff --git a/lib/events/reactionevent.h b/lib/events/reactionevent.h
index 5a2b98c4..ce11eaed 100644
--- a/lib/events/reactionevent.h
+++ b/lib/events/reactionevent.h
@@ -7,7 +7,7 @@
namespace Quotient {
-struct EventRelation {
+struct QUOTIENT_API EventRelation {
using reltypeid_t = const char*;
static constexpr reltypeid_t Reply() { return "m.in_reply_to"; }
static constexpr reltypeid_t Annotation() { return "m.annotation"; }
@@ -31,12 +31,12 @@ struct EventRelation {
}
};
template <>
-struct JsonObjectConverter<EventRelation> {
+struct QUOTIENT_API JsonObjectConverter<EventRelation> {
static void dumpTo(QJsonObject& jo, const EventRelation& pod);
static void fillFrom(const QJsonObject& jo, EventRelation& pod);
};
-class ReactionEvent : public RoomEvent {
+class QUOTIENT_API ReactionEvent : public RoomEvent {
public:
DEFINE_EVENT_TYPEID("m.reaction", ReactionEvent)
diff --git a/lib/events/receiptevent.h b/lib/events/receiptevent.h
index 9683deef..5e077e47 100644
--- a/lib/events/receiptevent.h
+++ b/lib/events/receiptevent.h
@@ -19,7 +19,7 @@ struct ReceiptsForEvent {
};
using EventsWithReceipts = QVector<ReceiptsForEvent>;
-class ReceiptEvent : public Event {
+class QUOTIENT_API ReceiptEvent : public Event {
public:
DEFINE_EVENT_TYPEID("m.receipt", ReceiptEvent)
explicit ReceiptEvent(const EventsWithReceipts& ewrs);
diff --git a/lib/events/roomavatarevent.h b/lib/events/roomavatarevent.h
index 8618ba31..c54b5801 100644
--- a/lib/events/roomavatarevent.h
+++ b/lib/events/roomavatarevent.h
@@ -7,7 +7,8 @@
#include "stateevent.h"
namespace Quotient {
-class RoomAvatarEvent : public StateEvent<EventContent::ImageContent> {
+class QUOTIENT_API RoomAvatarEvent
+ : public StateEvent<EventContent::ImageContent> {
// It's a bit of an overkill to use a full-fledged ImageContent
// because in reality m.room.avatar usually only has a single URL,
// without a thumbnail. But The Spec says there be thumbnails, and
diff --git a/lib/events/roomcreateevent.h b/lib/events/roomcreateevent.h
index b3ad287c..016855b9 100644
--- a/lib/events/roomcreateevent.h
+++ b/lib/events/roomcreateevent.h
@@ -7,7 +7,7 @@
#include "quotient_common.h"
namespace Quotient {
-class RoomCreateEvent : public StateEventBase {
+class QUOTIENT_API RoomCreateEvent : public StateEventBase {
public:
DEFINE_EVENT_TYPEID("m.room.create", RoomCreateEvent)
diff --git a/lib/events/roomevent.h b/lib/events/roomevent.h
index 8be58481..3fbb247e 100644
--- a/lib/events/roomevent.h
+++ b/lib/events/roomevent.h
@@ -11,7 +11,7 @@ namespace Quotient {
class RedactionEvent;
/** This class corresponds to m.room.* events */
-class RoomEvent : public Event {
+class QUOTIENT_API RoomEvent : public Event {
public:
static inline _impl::EventFactory<RoomEvent> factory { "RoomEvent" };
@@ -70,7 +70,7 @@ using RoomEventPtr = event_ptr_tt<RoomEvent>;
using RoomEvents = EventsArray<RoomEvent>;
using RoomEventsRange = Range<RoomEvents>;
-class CallEventBase : public RoomEvent {
+class QUOTIENT_API CallEventBase : public RoomEvent {
public:
CallEventBase(Type type, event_mtype_t matrixType, const QString& callId,
int version, const QJsonObject& contentJson = {});
diff --git a/lib/events/roomkeyevent.h b/lib/events/roomkeyevent.h
index d021fbec..c4df7936 100644
--- a/lib/events/roomkeyevent.h
+++ b/lib/events/roomkeyevent.h
@@ -6,7 +6,7 @@
#include "event.h"
namespace Quotient {
-class RoomKeyEvent : public Event
+class QUOTIENT_API RoomKeyEvent : public Event
{
public:
DEFINE_EVENT_TYPEID("m.room_key", RoomKeyEvent)
diff --git a/lib/events/roommemberevent.h b/lib/events/roommemberevent.h
index 0fb464d4..5e446dbe 100644
--- a/lib/events/roommemberevent.h
+++ b/lib/events/roommemberevent.h
@@ -10,7 +10,7 @@
#include "quotient_common.h"
namespace Quotient {
-class MemberEventContent : public EventContent::Base {
+class QUOTIENT_API MemberEventContent : public EventContent::Base {
public:
using MembershipType
[[deprecated("Use Quotient::Membership instead")]] = Membership;
@@ -33,7 +33,7 @@ protected:
using MembershipType [[deprecated("Use Membership instead")]] = Membership;
-class RoomMemberEvent : public StateEvent<MemberEventContent> {
+class QUOTIENT_API RoomMemberEvent : public StateEvent<MemberEventContent> {
Q_GADGET
public:
DEFINE_EVENT_TYPEID("m.room.member", RoomMemberEvent)
@@ -95,6 +95,5 @@ doLoadEvent<RoomMemberEvent>(const QJsonObject& json, const QString& matrixType)
return makeEvent<RoomMemberEvent>(json);
return makeEvent<RoomMemberEvent>(unknownEventTypeId(), json);
}
-
REGISTER_EVENT_TYPE(RoomMemberEvent)
} // namespace Quotient
diff --git a/lib/events/roommessageevent.h b/lib/events/roommessageevent.h
index 56597ddc..0c901b7a 100644
--- a/lib/events/roommessageevent.h
+++ b/lib/events/roommessageevent.h
@@ -16,7 +16,7 @@ namespace MessageEventContent = EventContent; // Back-compatibility
/**
* The event class corresponding to m.room.message events
*/
-class RoomMessageEvent : public RoomEvent {
+class QUOTIENT_API RoomMessageEvent : public RoomEvent {
Q_GADGET
public:
DEFINE_EVENT_TYPEID("m.room.message", RoomMessageEvent)
@@ -120,7 +120,7 @@ namespace EventContent {
* Available fields: mimeType, body. The body can be either rich text
* or plain text, depending on what mimeType specifies.
*/
- class TextContent : public TypedBase {
+ class QUOTIENT_API TextContent : public TypedBase {
public:
TextContent(QString text, const QString& contentType,
Omittable<RelatesTo> relatesTo = none);
@@ -149,7 +149,7 @@ namespace EventContent {
* - thumbnail.mimeType
* - thumbnail.imageSize
*/
- class LocationContent : public TypedBase {
+ class QUOTIENT_API LocationContent : public TypedBase {
public:
LocationContent(const QString& geoUri, const Thumbnail& thumbnail = {});
explicit LocationContent(const QJsonObject& json);
@@ -168,7 +168,7 @@ namespace EventContent {
* A base class for info types that include duration: audio and video
*/
template <typename ContentT>
- class PlayableContent : public ContentT {
+ class QUOTIENT_API PlayableContent : public ContentT {
public:
using ContentT::ContentT;
PlayableContent(const QJsonObject& json)
diff --git a/lib/events/roompowerlevelsevent.h b/lib/events/roompowerlevelsevent.h
index 0346fc0d..80e27048 100644
--- a/lib/events/roompowerlevelsevent.h
+++ b/lib/events/roompowerlevelsevent.h
@@ -7,7 +7,7 @@
#include "stateevent.h"
namespace Quotient {
-class PowerLevelsEventContent : public EventContent::Base {
+class QUOTIENT_API PowerLevelsEventContent : public EventContent::Base {
public:
struct Notifications {
int room;
@@ -34,7 +34,8 @@ protected:
void fillJson(QJsonObject* o) const override;
};
-class RoomPowerLevelsEvent : public StateEvent<PowerLevelsEventContent> {
+class QUOTIENT_API RoomPowerLevelsEvent
+ : public StateEvent<PowerLevelsEventContent> {
Q_GADGET
public:
DEFINE_EVENT_TYPEID("m.room.power_levels", RoomPowerLevelsEvent)
@@ -61,9 +62,6 @@ public:
int powerLevelForEvent(const QString& eventId) const;
int powerLevelForState(const QString& eventId) const;
int powerLevelForUser(const QString& userId) const;
-
-private:
};
-
REGISTER_EVENT_TYPE(RoomPowerLevelsEvent)
} // namespace Quotient
diff --git a/lib/events/roomtombstoneevent.h b/lib/events/roomtombstoneevent.h
index 30e53738..e336c448 100644
--- a/lib/events/roomtombstoneevent.h
+++ b/lib/events/roomtombstoneevent.h
@@ -6,7 +6,7 @@
#include "stateevent.h"
namespace Quotient {
-class RoomTombstoneEvent : public StateEventBase {
+class QUOTIENT_API RoomTombstoneEvent : public StateEventBase {
public:
DEFINE_EVENT_TYPEID("m.room.tombstone", RoomTombstoneEvent)
diff --git a/lib/events/simplestateevents.h b/lib/events/simplestateevents.h
index 9ce78609..d6557012 100644
--- a/lib/events/simplestateevents.h
+++ b/lib/events/simplestateevents.h
@@ -30,7 +30,8 @@ namespace EventContent {
} // namespace EventContent
#define DEFINE_SIMPLE_STATE_EVENT(_Name, _TypeId, _ValueType, _ContentKey) \
- class _Name : public StateEvent<EventContent::SimpleContent<_ValueType>> { \
+ class QUOTIENT_API _Name \
+ : public StateEvent<EventContent::SimpleContent<_ValueType>> { \
public: \
using value_type = content_type::value_type; \
DEFINE_EVENT_TYPEID(_TypeId, _Name) \
diff --git a/lib/events/stateevent.h b/lib/events/stateevent.h
index c37965aa..6095d628 100644
--- a/lib/events/stateevent.h
+++ b/lib/events/stateevent.h
@@ -17,7 +17,7 @@ inline QJsonObject basicStateEventJson(const QString& matrixTypeId,
{ ContentKey, content } };
}
-class StateEventBase : public RoomEvent {
+class QUOTIENT_API StateEventBase : public RoomEvent {
public:
static inline _impl::EventFactory<StateEventBase> factory { "StateEvent" };
diff --git a/lib/events/stickerevent.h b/lib/events/stickerevent.h
index 93671086..0957dca3 100644
--- a/lib/events/stickerevent.h
+++ b/lib/events/stickerevent.h
@@ -11,7 +11,7 @@ namespace Quotient {
/// Sticker messages are specialised image messages that are displayed without
/// controls (e.g. no "download" link, or light-box view on click, as would be
/// displayed for for m.image events).
-class StickerEvent : public RoomEvent
+class QUOTIENT_API StickerEvent : public RoomEvent
{
public:
DEFINE_EVENT_TYPEID("m.sticker", StickerEvent)
diff --git a/lib/events/typingevent.h b/lib/events/typingevent.h
index 7456100a..522f7e42 100644
--- a/lib/events/typingevent.h
+++ b/lib/events/typingevent.h
@@ -6,7 +6,7 @@
#include "event.h"
namespace Quotient {
-class TypingEvent : public Event {
+class QUOTIENT_API TypingEvent : public Event {
public:
DEFINE_EVENT_TYPEID("m.typing", TypingEvent)
diff --git a/lib/eventstats.h b/lib/eventstats.h
index 77c661a7..a10c81fb 100644
--- a/lib/eventstats.h
+++ b/lib/eventstats.h
@@ -16,7 +16,7 @@ namespace Quotient {
//! \note It's just a simple grouping of counters and is not automatically
//! updated from the room as subsequent syncs arrive.
//! \sa Room::unreadStats, Room::partiallyReadStats, Room::isEventNotable
-struct EventStats {
+struct QUOTIENT_API EventStats {
Q_GADGET
Q_PROPERTY(qsizetype notableCount MEMBER notableCount CONSTANT)
Q_PROPERTY(qsizetype highlightCount MEMBER highlightCount CONSTANT)
@@ -109,6 +109,6 @@ public:
bool isValidFor(const Room* room, const marker_t& marker) const;
};
-QDebug operator<<(QDebug dbg, const EventStats& es);
+QUOTIENT_API QDebug operator<<(QDebug dbg, const EventStats& es);
}
diff --git a/lib/jobs/basejob.h b/lib/jobs/basejob.h
index ddf243ed..f41fc63c 100644
--- a/lib/jobs/basejob.h
+++ b/lib/jobs/basejob.h
@@ -20,7 +20,7 @@ class ConnectionData;
enum class HttpVerb { Get, Put, Post, Delete };
-class BaseJob : public QObject {
+class QUOTIENT_API BaseJob : public QObject {
Q_OBJECT
Q_PROPERTY(QUrl requestUrl READ requestUrl CONSTANT)
Q_PROPERTY(int maxRetries READ maxRetries WRITE setMaxRetries)
@@ -470,7 +470,7 @@ private:
QScopedPointer<Private> d;
};
-inline bool isJobPending(BaseJob* job)
+inline bool QUOTIENT_API isJobPending(BaseJob* job)
{
return job && job->error() == BaseJob::Pending;
}
diff --git a/lib/jobs/downloadfilejob.h b/lib/jobs/downloadfilejob.h
index 0752af89..d9f3b686 100644
--- a/lib/jobs/downloadfilejob.h
+++ b/lib/jobs/downloadfilejob.h
@@ -6,7 +6,7 @@
#include "csapi/content-repo.h"
namespace Quotient {
-class DownloadFileJob : public GetContentJob {
+class QUOTIENT_API DownloadFileJob : public GetContentJob {
public:
using GetContentJob::makeRequestUrl;
static QUrl makeRequestUrl(QUrl baseUrl, const QUrl& mxcUri);
diff --git a/lib/jobs/mediathumbnailjob.h b/lib/jobs/mediathumbnailjob.h
index 3183feb1..c9f6da35 100644
--- a/lib/jobs/mediathumbnailjob.h
+++ b/lib/jobs/mediathumbnailjob.h
@@ -8,7 +8,7 @@
#include <QtGui/QPixmap>
namespace Quotient {
-class MediaThumbnailJob : public GetContentThumbnailJob {
+class QUOTIENT_API MediaThumbnailJob : public GetContentThumbnailJob {
public:
using GetContentThumbnailJob::makeRequestUrl;
static QUrl makeRequestUrl(QUrl baseUrl, const QUrl& mxcUri,
diff --git a/lib/jobs/requestdata.h b/lib/jobs/requestdata.h
index 4f05e5ff..41ad833a 100644
--- a/lib/jobs/requestdata.h
+++ b/lib/jobs/requestdata.h
@@ -3,6 +3,8 @@
#pragma once
+#include "quotient_export.h"
+
#include <QtCore/QByteArray>
#include <memory>
@@ -19,7 +21,7 @@ namespace Quotient {
* as well as JSON (and possibly other structures in the future) to
* a QByteArray consumed by QNetworkAccessManager request methods.
*/
-class RequestData {
+class QUOTIENT_API RequestData {
public:
RequestData(const QByteArray& a = {});
RequestData(const QJsonObject& jo);
diff --git a/lib/mxcreply.h b/lib/mxcreply.h
index efaf01c6..23049b7d 100644
--- a/lib/mxcreply.h
+++ b/lib/mxcreply.h
@@ -3,13 +3,15 @@
#pragma once
+#include "quotient_export.h"
+
#include <QtNetwork/QNetworkReply>
#include <memory>
namespace Quotient {
class Room;
-class MxcReply : public QNetworkReply
+class QUOTIENT_API MxcReply : public QNetworkReply
{
public:
explicit MxcReply();
diff --git a/lib/networkaccessmanager.h b/lib/networkaccessmanager.h
index 87bc12a1..d06f9736 100644
--- a/lib/networkaccessmanager.h
+++ b/lib/networkaccessmanager.h
@@ -3,6 +3,8 @@
#pragma once
+#include "quotient_export.h"
+
#include <QtNetwork/QNetworkAccessManager>
#include <memory>
@@ -10,7 +12,7 @@
namespace Quotient {
class Room;
class Connection;
-class NetworkAccessManager : public QNetworkAccessManager {
+class QUOTIENT_API NetworkAccessManager : public QNetworkAccessManager {
Q_OBJECT
public:
NetworkAccessManager(QObject* parent = nullptr);
diff --git a/lib/networksettings.h b/lib/networksettings.h
index df11a9c8..c1446355 100644
--- a/lib/networksettings.h
+++ b/lib/networksettings.h
@@ -10,7 +10,7 @@
Q_DECLARE_METATYPE(QNetworkProxy::ProxyType)
namespace Quotient {
-class NetworkSettings : public SettingsGroup {
+class QUOTIENT_API NetworkSettings : public SettingsGroup {
Q_OBJECT
QTNT_DECLARE_SETTING(QNetworkProxy::ProxyType, proxyType, setProxyType)
QTNT_DECLARE_SETTING(QString, proxyHostName, setProxyHostName)
diff --git a/lib/quotient_common.h b/lib/quotient_common.h
index 0e3e2a40..a5926e8c 100644
--- a/lib/quotient_common.h
+++ b/lib/quotient_common.h
@@ -3,6 +3,8 @@
#pragma once
+#include "quotient_export.h"
+
#include <qobjectdefs.h>
#include <array>
@@ -26,8 +28,21 @@
#define DECL_DEPRECATED_ENUMERATOR(Deprecated, Recommended) \
Deprecated Q_DECL_ENUMERATOR_DEPRECATED_X("Use " #Recommended) = Recommended
+#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
+// The first line is a usual way to indicate a namespace to moc;
+// the second line redeclares the namespace static metaobject with
+// QUOTIENT_API so that dynamically linked clients could serialise
+// flag/enum values from the namespace.
+#define QUO_NAMESPACE \
+Q_NAMESPACE \
+extern QUOTIENT_API const QMetaObject staticMetaObject;
+#else
+// Since Qt 5.14.0, it's all packed in a single macro
+#define QUO_NAMESPACE Q_NAMESPACE_EXPORT(QUOTIENT_API)
+#endif
+
namespace Quotient {
-Q_NAMESPACE
+QUO_NAMESPACE
// std::array {} needs explicit template parameters on macOS because
// Apple stdlib doesn't have deduction guides for std::array. C++20 has
diff --git a/lib/room.h b/lib/room.h
index 85c51a87..63a4aaea 100644
--- a/lib/room.h
+++ b/lib/room.h
@@ -45,7 +45,7 @@ class RedactEventJob;
* This is specifically tuned to work with QML exposing all traits as
* Q_PROPERTY values.
*/
-class FileTransferInfo {
+class QUOTIENT_API FileTransferInfo {
Q_GADGET
Q_PROPERTY(bool isUpload MEMBER isUpload CONSTANT)
Q_PROPERTY(bool active READ active CONSTANT)
@@ -73,7 +73,7 @@ public:
//! \brief Data structure for a room member's read receipt
//! \sa Room::lastReadReceipt
-class ReadReceipt {
+class QUOTIENT_API ReadReceipt {
Q_GADGET
Q_PROPERTY(QString eventId MEMBER eventId CONSTANT)
Q_PROPERTY(QDateTime timestamp MEMBER timestamp CONSTANT)
@@ -110,7 +110,7 @@ private:
Q_PROPERTY(Type type MEMBER type CONSTANT)
};
-class Room : public QObject {
+class QUOTIENT_API Room : public QObject {
Q_OBJECT
Q_PROPERTY(Connection* connection READ connection CONSTANT)
Q_PROPERTY(User* localUser READ localUser CONSTANT)
@@ -1037,7 +1037,7 @@ private:
void setJoinState(JoinState state);
};
-class MemberSorter {
+class QUOTIENT_API MemberSorter {
public:
explicit MemberSorter(const Room* r) : room(r) {}
diff --git a/lib/settings.h b/lib/settings.h
index efd0d714..b66879c5 100644
--- a/lib/settings.h
+++ b/lib/settings.h
@@ -3,6 +3,8 @@
#pragma once
+#include "quotient_export.h"
+
#include <QtCore/QSettings>
#include <QtCore/QUrl>
#include <QtCore/QVector>
@@ -11,7 +13,7 @@ class QVariant;
namespace Quotient {
-class Settings : public QSettings {
+class QUOTIENT_API Settings : public QSettings {
Q_OBJECT
public:
/// Add a legacy organisation/application name to migrate settings from
@@ -76,7 +78,7 @@ protected:
QSettings legacySettings { legacyOrganizationName, legacyApplicationName };
};
-class SettingsGroup : public Settings {
+class QUOTIENT_API SettingsGroup : public Settings {
public:
explicit SettingsGroup(QString path, QObject* parent = nullptr)
: Settings(parent)
@@ -124,7 +126,7 @@ private:
setValue(QStringLiteral(qsettingname), std::move(newValue)); \
}
-class AccountSettings : public SettingsGroup {
+class QUOTIENT_API AccountSettings : public SettingsGroup {
Q_OBJECT
Q_PROPERTY(QString userId READ userId CONSTANT)
QTNT_DECLARE_SETTING(QString, deviceId, setDeviceId)
diff --git a/lib/ssosession.h b/lib/ssosession.h
index 72dd60c4..a658c043 100644
--- a/lib/ssosession.h
+++ b/lib/ssosession.h
@@ -3,6 +3,8 @@
#pragma once
+#include "quotient_export.h"
+
#include <QtCore/QUrl>
#include <QtCore/QObject>
@@ -29,7 +31,7 @@ class Connection;
* connection->prepareForSso(initialDeviceName)->ssoUrl());
* \endcode
*/
-class SsoSession : public QObject {
+class QUOTIENT_API SsoSession : public QObject {
Q_OBJECT
Q_PROPERTY(QUrl ssoUrl READ ssoUrl CONSTANT)
Q_PROPERTY(QUrl callbackUrl READ callbackUrl CONSTANT)
diff --git a/lib/syncdata.h b/lib/syncdata.h
index 36d2e0bf..e29540c2 100644
--- a/lib/syncdata.h
+++ b/lib/syncdata.h
@@ -22,7 +22,7 @@ constexpr auto HighlightCountKey = "highlight_count"_ls;
* means that nothing has come from the server; heroes.value().isEmpty()
* means a peculiar case of a room with the only member - the current user.
*/
-struct RoomSummary {
+struct QUOTIENT_API RoomSummary {
Omittable<int> joinedMemberCount;
Omittable<int> invitedMemberCount;
Omittable<QStringList> heroes; //< mxids of users to take part in the room
diff --git a/lib/uri.h b/lib/uri.h
index d8b892b6..78cd27c8 100644
--- a/lib/uri.h
+++ b/lib/uri.h
@@ -23,7 +23,7 @@ namespace Quotient {
* its type, and obtain components, also in either unencoded (for displaying)
* or encoded (for APIs) form.
*/
-class Uri : private QUrl {
+class QUOTIENT_API Uri : private QUrl {
Q_GADGET
public:
enum Type : char {
diff --git a/lib/uriresolver.h b/lib/uriresolver.h
index ff97324a..9140046c 100644
--- a/lib/uriresolver.h
+++ b/lib/uriresolver.h
@@ -25,7 +25,7 @@ class User;
* gradual implementation. Derived classes are encouraged to override as many
* of them as possible.
*/
-class UriResolverBase {
+class QUOTIENT_API UriResolverBase {
public:
/*! \brief Resolve the resource and dispatch an action depending on its type
*
@@ -105,7 +105,7 @@ protected:
*
* \sa UriResolverBase, UriDispatcher
*/
-UriResolveResult
+QUOTIENT_API UriResolveResult
visitResource(Connection* account, const Uri& uri,
std::function<UriResolveResult(User*, QString)> userHandler,
std::function<void(Room*, QString)> roomEventHandler,
@@ -141,7 +141,7 @@ inline UriResolveResult checkResource(Connection* account, const Uri& uri)
* synchronously - the returned value is the result of resolving the URI,
* not acting on it.
*/
-class UriDispatcher : public QObject, public UriResolverBase {
+class QUOTIENT_API UriDispatcher : public QObject, public UriResolverBase {
Q_OBJECT
public:
explicit UriDispatcher(QObject* parent = nullptr) : QObject(parent) {}
diff --git a/lib/user.h b/lib/user.h
index 78b72bf2..435304ce 100644
--- a/lib/user.h
+++ b/lib/user.h
@@ -5,6 +5,7 @@
#pragma once
#include "avatar.h"
+#include "quotient_export.h"
#include <QtCore/QObject>
@@ -13,7 +14,7 @@ class Connection;
class Room;
class RoomMemberEvent;
-class User : public QObject {
+class QUOTIENT_API User : public QObject {
Q_OBJECT
Q_PROPERTY(QString id READ id CONSTANT)
Q_PROPERTY(bool isGuest READ isGuest CONSTANT)
diff --git a/lib/util.h b/lib/util.h
index 97f0ecbc..399f93c2 100644
--- a/lib/util.h
+++ b/lib/util.h
@@ -4,6 +4,8 @@
#pragma once
+#include "quotient_export.h"
+
#include <QtCore/QLatin1String>
#include <QtCore/QHashFunctions>
@@ -244,26 +246,26 @@ inline std::pair<InputIt, ForwardIt> findFirstOf(InputIt first, InputIt last,
}
/** Convert what looks like a URL or a Matrix ID to an HTML hyperlink */
-void linkifyUrls(QString& htmlEscapedText);
+QUOTIENT_API void linkifyUrls(QString& htmlEscapedText);
/** Sanitize the text before showing in HTML
*
* This does toHtmlEscaped() and removes Unicode BiDi marks.
*/
-QString sanitized(const QString& plainText);
+QUOTIENT_API QString sanitized(const QString& plainText);
/** Pretty-print plain text into HTML
*
* This includes HTML escaping of <,>,",& and calling linkifyUrls()
*/
-QString prettyPrint(const QString& plainText);
+QUOTIENT_API QString prettyPrint(const QString& plainText);
/** Return a path to cache directory after making sure that it exists
*
* The returned path has a trailing slash, clients don't need to append it.
* \param dir path to cache directory relative to the standard cache path
*/
-QString cacheLocation(const QString& dirName);
+QUOTIENT_API QString cacheLocation(const QString& dirName);
/** Hue color component of based of the hash of the string.
*
@@ -272,13 +274,13 @@ QString cacheLocation(const QString& dirName);
* Naming and range are the same as QColor's hueF method:
* https://doc.qt.io/qt-5/qcolor.html#integer-vs-floating-point-precision
*/
-qreal stringToHueF(const QString& s);
+QUOTIENT_API qreal stringToHueF(const QString& s);
/** Extract the serverpart from MXID */
-QString serverPart(const QString& mxId);
+QUOTIENT_API QString serverPart(const QString& mxId);
-QString versionString();
-int majorVersion();
-int minorVersion();
-int patchVersion();
+QUOTIENT_API QString versionString();
+QUOTIENT_API int majorVersion();
+QUOTIENT_API int minorVersion();
+QUOTIENT_API int patchVersion();
} // namespace Quotient