aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2022-01-28Merge pull request #525 from quotient-im/kitsune/query-current-stateAlexey Rusakov
Move out current room state to its own class
2022-01-28QUO_IMPLICITAlexey Rusakov
Because Apple Clang choked on `explicit(false)`.
2022-01-23No more default construction of eventsAlexey Rusakov
Default construction was only done to support stubbed state in Room and even that did not really use those, opting to construct an event from an empty QJsonObject instead. Now that Room doesn't have stubbed state, default constructors are even less needed.
2022-01-23Refactor Room::setState()Alexey Rusakov
There are two important aspects here: - Introducing Room::setState(evtType, stateKey, contentJson). These components are ultimately what is getting sent to the homeserver, so it makes sense to expose a respective `setState()` overload. Unlike setState(event) the new overload can be Q_INVOKABLE. - Room::setState() is no more const. Although it doesn't cause any changes in Room class (and only transient changes in Room::Private), it ultimately initiates a change in the room state, so calling it const has always been a bit of hypocrisy. If you relied on that, you most likely do something wrong (see the fix to User::rename() in this very commit for a simple example of such wrongness). Also: the backend is simplified by calling the original templated Room::setState() instead of calling Room::Private::requestSetState() that does exactly the same thing.
2022-01-23Move away Omittable static tests to autotests/Alexey Rusakov
These are not required to build libQuotient, and omittable.cpp entirely consisted of them.
2022-01-23RoomStateViewAlexey Rusakov
This class is called to provide an arbitrary snapshot of a room state; as the first step, Room::currentState() returns an instance of this class that stores, well, the current state. Implelementation-wise it's the same hash map of two-part state event keys to const event pointers; however, RoomStateView provides additional operations: - get(), that deprecates Room::getCurrentState(), returns a pointer to a particular event if the current state has it. Unlike the original method, the pointer returned from this one can be nullptr; this is done to get rid of stubbed state events that have to be created everytime a "state miss" occurred (i.e., when getCurrentState() does not find an existing event in the current state). - eventsOfType() - this is a new place for Room::stateEventsOfType() introduced recently. - query() - this is a way to specify a piece of the state content that you need to retrieve by passing a member function or a function object that retrieves it. That is especially convenient with member functions of the event class; just pass the pointer to this member function, and query() will parse the event type it has to retrieve out of it and call that member function on the event object. Returns an Omittable<>; if the respective piece of state doesn't exist, you'll get `Quotient::none` (the same as `std::nullopt`). - queryOr() - the same but with the fallback value; instead of an Omittable<>, the fallback value will be returned if the needed event is not found.
2022-01-23converters.h: slightly clearer code in _impl::addToAlexey Rusakov
2022-01-23Cleanup some #includesAlexey Rusakov
2022-01-23Omittable: split out from util.h and refreshAlexey Rusakov
Improvements: - Quotient::lift() - a way to invoke a function on an optional (including Omittable) or a pointer if it's 'truthy'. Doesn't need enhanced function_traits<>, only the standard library; works on any number of arguments that can be dereferenced and casted to bool. - then() - the version of lift() as a member function. - edit() was renamed to ensure() (edit() might become a read-write counterpart of then() at some point). It's not really used across libQuotient codebase (or elsewhere) but is staying there just in case. It can also accept an initializer, removing the requirement of default-constructibility. - Quotient::merge() is simplified, with one universal implementation covering both Omittable/optional and plain values. - All that now lives in its dedicated pair of files, further decluttering util.h
2022-01-23Fix visit() return typeAlexey Rusakov
It's too restrictive compared to switchOnType() overloads and doesn't map to the case with a default value.
2022-01-22Quotest: fix changeName testAlexey Rusakov
This test was very unreliable because memberRenamed() signal was emitted upon lazy-loading of past member renames. The new code connects to aboutToAddNewMessages() instead, which should only contain the latest renaming event (past events are delivered in the 'state' object).
2022-01-21Merge: merge event relation structures into oneAlexey Rusakov
2022-01-21Refactor assembleContentJson()Alexey Rusakov
Get rid of that Q_ASSERT() in the middle that only worked in Debug builds anyway.
2022-01-21Redo EventRelation; deprecate RelatesToAlexey Rusakov
RelatesTo and EventRelation have been two means to the same end in two different contexts. (Modernised) EventRelation is the one used now both for ReactionEvent and EventContent::TextContent. The modernisation mostly boils down to using inline variables instead of functions to return relation types and switching to QLatin1String from const char* (because we know exactly that those constants are Latin-1 and QLatin1String is more efficient than const char* to compare/convert to QString).
2022-01-19CMakeLists: Bring back ARCHIVE DESTINATION in install()Alexey Rusakov
The older CMake used by LGTM is still unhappy without it. (See also recent changes to this file.)
2022-01-18Merge branch 'kitsune/cleanup2' into devAlexey Rusakov
2022-01-18Don't use 'static' on top-level/namespace scopeAlexey Rusakov
When internal linkage is necessary, anonymous namespaces fulfil the same purpose in a better way. See also: https://stackoverflow.com/questions/4422507/superiority-of-unnamed-namespace-over-static
2022-01-18Move over non-interface code to QLatin1StringAlexey Rusakov
It's better than const char* because any interaction between const char* and QString assumes that const char* contains UTF-8, which is pessimistic and therefore inefficient; at the same time: - construction of QString from QLatin1String is extremely fast (boiling down to padding null bytes) - "something"_ls is much shorter than QStringLiteral("something") - "something"_ls produces a direct pointer to the literal at compile time, using the benefits of raw string literals (deduplication, e.g.) The library API will also transition to QLatin1String where applicable, likely in 0.8.
2022-01-18Drop unused forward declarationsAlexey Rusakov
2022-01-18Add [[maybe_unused]] to things the lib doesn't useAlexey Rusakov
2022-01-18AccountRegistry: derive from QVector and clean upAlexey Rusakov
Notably, Quotient::AccountRegistry::instance() is now deprecated in favour of Quotient::Accounts inline variable.
2022-01-18.clang-format: try harder to avoid return type on its own lineAlexey Rusakov
In reality it's often not just the return type but the return type and the preceding attribute, in particular [[deprecated("...")]] - and unfortunately this attribute (and any other, actually) cannot be given its own line using ClangFormat. So at least try to glue those two to the function name as much as possible...
2022-01-18Revise inline keyword usageAlexey Rusakov
- Templates and constexpr imply inline - A function called from a single site better be inlined.
2022-01-06Brush up SsoSession; document Connection::prepareForSsoAlexey Rusakov
Although parented to Connection, SsoSession was pretty leaky in that unsuccessful login attempts didn't delete the object and in some errors didn't even close the local HTTP socket (though new connections would no more be accepted). Also, without the documentation it wasn't clear who owns the object returned by Connection::prepareForSso(). Now it is. Unfortunately, it's not easy to cover SsoSession with tests. Basically, it takes a homeserver and a mock "SSO agent" that would check the SSO URL for validity and then both send the login authorisation to the homeserver as well as ping the callback given by SsoSession. Maybe for another time.
2022-01-06Cleanup Room::pinnedEvents()Alexey Rusakov
Use 'auto'; range-for instead of an iterator loop.
2022-01-05Fully-qualify types passed to slotsAlexey Rusakov
2022-01-05DEFINE_EVENT_TYPEID: fix up deprecation warningsAlexey Rusakov
2022-01-05Make TagRecord generally betterAlexey Rusakov
It doesn't need all those things inside - order_type alias is no more in use; operator<() is better outside; QLatin1String is better to compare against than const char* (because const char* is assumed to be UTF-8); and TagRecord is really small so it doesn't need const& for parameters.
2022-01-05Thumbnail: drop unneeded constructorsAlexey Rusakov
Those are already inherited with 'using'.
2022-01-05CMakeLists: add install(TARGETS) components againAlexey Rusakov
Older CMake versions fail if they don't find those (LGTM uses CMake 3.13 and that one does, at least).
2022-01-05Merge pull request #532 from quotient-im/kitsune/implptrAlexey Rusakov
ImplPtr
2022-01-05.clang-format: slightly tweak penaltiesAlexey Rusakov
With the previous settings clang-format seemed too lenient to characters beyond position 80. [skip ci]
2022-01-05Add a comment, as Sonar advisesAlexey Rusakov
2022-01-02Merge pull request #531 from Aksem/fix-qt-6Alexey Rusakov
2022-01-02Merge branch 'quotient-im:dev' into fix-qt-6Hnatiuk Vladyslav
2022-01-02Add ImplPtr and makeImplAlexey Rusakov
The original (more complex and comprehensive) solution belongs to https://oliora.github.io/2015/12/29/pimpl-and-rule-of-zero.html - this commit only provides a small wrapper for non-copyable Private class implementations common throughout libQuotient. Unlike the original, default initialisation is made explicit - you have to pass ZeroImpl<Private>() instead (and I firmly believe it's a good thing: normally pointers to Private should not remain nullptr). The reason ZeroImpl<> is not a template variable is quite simple: unique_ptr is non-copyable and so cannot be initialised from; while a template function will initialise the value in-place thanks to copy elision.
2022-01-02Manage symbols visibility for dynamic linkingAlexey Rusakov
2022-01-01Fix enum in room Notification structVladyslav Hnatiuk
2022-01-01Only test dynamic linking on LinuxAlexey Rusakov
On Windows and macOS, the assumed practice is to package things up in a monolithic distribution package. On Linux, fine-grained library packages are installed. After adding CMAKE_INSTALL_RPATH_USE_LINK_PATH dynamic linkage is testable on macOS but that's not the "proper" way to install things on the platform, anyway. It also probably works on Windows but I couldn't get a workable setup for quotest after a few attempts. Perhaps it's a matter of running windeployqt instead of trying to figure out and add to PATH all the locations needed; or maybe not; I don't have the motivation to explore this further.
2022-01-01CMakeLists: Drop unneeded parts from install(TARGETS)Alexey Rusakov
Those DESTINATION specifications match precisely what CMake does by default (on Linux at least); what's worse is that they prevent CMake to install the DLL file on Windows.
2022-01-01Fix more Sonar warningsAlexey Rusakov
2022-01-01Don't use QUOTIENT_API inside REGISTER_EVENT_TYPEAlexey Rusakov
On Windows QUOTIENT_API expands to different things depending on whether the library is built or used. This results in confusing statements (and MSVC erroring out on them, in some cases - see below - quite legitimately) not only when the application includes Quotient headers but also when the application defines custom events and uses REGISTER_EVENT_TYPE to make them creatable from /sync responses. To avoid repeated registration when dynamic linking is involved, EventFactory<>::addMethod() now bluntly looks up the method for this type in the vector of already registered methods. It would surely be quicker to use a static variable instead; but since the refreshed API for addMethod returns a reference to the factory method it's necessary to do this lookup anyway. Once the primary goal of this branch is achieved across platforms I might experiment with lighter ways to register factory methods; for now here's a minimal change to make the code build on Windows.
2022-01-01Drop inline next to constexprAlexey Rusakov
Thanks to Sonar for reminding that constexpr implies inline.
2022-01-01Define destructors out-of-line when unique/scoped ptr are involvedAlexey Rusakov
Once visibility kicks in, MSVC changes its ways and tries to instantiate Private classes wrapped in smart pointers upon their occurence in the header file - which leads to build breakage because of a missing destructor. Usually making the outer class destructor out-of-line helps to fix this (see RoomEvent, for one example).
2022-01-01Try to fix building with MSVC with Qt pre-5.14Alexey Rusakov
MSVC is quite picky to redeclaration with __declspec(dllexport), judging it as changing the class of storage. This commit tries to reorder declarations so that MSVC is made aware of dllexport attribute on the first encounter rather than the second one.
2022-01-01Quotest: build with hidden visibility tooAlexey Rusakov
2022-01-01BUILD_SHARED_LIBS in most jobs; fix not finding libQuotient.so.*Alexey Rusakov
2022-01-01CI: add events.debug to QT_LOGGING_RULESAlexey Rusakov
2022-01-01Merge pull request #530 from quotient-im/kitsune/lgtm-clangAlexey Rusakov
Get LGTM working again
2022-01-01Get LGTM working againAlexey Rusakov
Unfortunately LGTM still sits on Ubuntu 19.10 (not even LTS) which really limits the choice of compilers: the newest GCC is of version 9 and the newest Clang seems to be version 9 as well - both are quite old and giving when it comes to modern features support. The latest error is GCC 9 tripping over the assignment of the function specialisation to std::function. Clang 9 doesn't and otherwise seems fine.