Releases: quotient-im/libQuotient
Version 0.5.0.2
Another bugfix release in 0.5.x branch, fixing issues with sending read receipts and redactions in v3 rooms (#300).
Version 0.5.0.1
This version fixes too stringent checks in debug builds that led to assertion crashes upon encounter with upgraded rooms.
Version 0.5
A long time has passed since version 0.4 has been released - more than 200 new commits landed since then so there's quite a lot to share! As usual, the new version includes a few bigger features and plenty of bug fixes, while staying focused on memory footprint and performance.
Thanks to all contributors and testers, as well as users of the library - authors of Matrix clients!
Compatibility
As usual for 0.x versions, 0.5 breaks API compatibility with previous versions; 0.4-compatible clients may or may not need changes in order to compile with version 0.5. As usual, see diffs in header files to track the changes and update the client code accordingly; these release notes highlight most prominent API changes.
Micro-versions in 0.5.y will maintain the API and ABI. Version 0.6 will break either API or ABI or both.
Version tags
Packagers, please update your scripts: from this version onwards, Git tags change naming convention: instead of rc0.x
and v0.x.y
the project will use 0.x-betaN
and 0.x-rcN
for pre-releases and 0.x.y
for releases. The minor version number in the release tag is mandatory now.
Toolchain (see also README.md)
The supported compilers didn't change: GCC 5+, Clang 5+, MSVC 2015+. GCC 4.9.2 and Clang 3.8 still work but no significant effort is put into that. The library uses C++14 for the language standard.
QMatrixClient 0.5 is the last one supported on Qt 5.6, as The Qt Company ends support of this version in March 2019. If you still use Qt 5.6, make utmost effort to upgrade to the later version of Qt in the nearest months (Qt 5.12, the most recent LTS version for now, is recommended). From the next libQMatrixClient version, the officially supported minimum will be Qt 5.9 (the oldest supported LTS version from April), with possible workarounds for as low as Qt 5.7.
Integration
There are no big changes in integration Version 0.5 can be compiled either in static or (Linux-only so far) dynamic linking configuration. QML code can use most library facilities, assuming respective types are registered - you need a shim in C/C++ for that (see the code of uMatriks and Spectral for inspiration).
Same as before, the library includes pre-generated files for CS API; regenerating them requires GTAD from master branch (see also .travis,yml for the library for the general idea and CONTRIBUTING.md for details).
Features and changes
The full list of changes can be found in the commit log; you can also find the list of GitHub issues closed in the release.
New features, along with key library API for them:
- Fresh snapshot of CS API
- Massive changes to the way state is loaded, cached and saved:
- #253: Members are lazy-loaded and room summaries are parsed if the server supports these; the full list of members is only loaded upon calling
Room::getAllMembers()
, or along withRoom::setDisplayed()
(which the clients are supposed to use to let the library know that the room is actually shown on the screen). This method has been there before 0.5 but now there's a really serious reason to use it! Given the massively successful use of lazy-loading, there's no option to switch it off. - #194: previously only the "known" types of state events were cached both to memory and to disk. This has changed - all state events are included into the room's state, not only into the timeline, and are saved to disk accordingly. Thanks to smart sharing of events between the state and the timeline, the memory footprint almost didn't suffer from that; at the same time clients can now process even state events the library doesn't know about (e.g., custom state events). Quaternion 0.0.9.4, for one, uses that to pretty-print TWIM bot state changes.
- #194, #257: since the disk cache size became considerably bigger due to this change, and in order to generally better handle accounts with many (500+) rooms, each room's state is now cached to its separate file. That means that if you have 800 rooms you're going to have a directory with 800 files (which is peanuts for any contemporary file system but avoids the need to create and dump a huge JSON payload).
- #253: Members are lazy-loaded and room summaries are parsed if the server supports these; the full list of members is only loaded upon calling
- #233, #235, #236: the library fully supports room versions and room upgrades - both invocation of those locally (
Room::switchVersion()
) and receiving of tombstone events and indicating that an upgrade happened (Room::upgraded()
). If you callRoom::switchVersion()
, you may also want to connect toRoom::upgradeFailed()
to handle a possible case when the user is not allowed to upgrade a room. Also, checkRoom::isUnstable()
in order to suggest your users to upgrade the room. - #234:
RoomCreateEvent
is now a first-class citizen in the library, with proper accessors to the event data. - #267:
Room::postFile()
, a much better API for sending files. Previously you had to separately callRoom::uploadFile()
and then, once the transfer is done, send a file event.Room::postFile()
does the entire process for you, emitting appropriate signals along the way. - #264:
Connection::roomByAlias()
- a room can now be retrieved by any of its known aliases;Connection::room()
that gets a room by its id, didn't go anywhere either. Searching rooms by a string inside an alias or name is on the way! - Changes in the room state are grouped from every sync and emitted via
Room::changed()
signal. This allows to reduce the number of connections clients need to track the room changes. Room::messageSent()
to make it really easy to connect to the result ofRoom::post<anything>()
Room::fileSource()
to figure out where the up/downloaded file is from.- Fake state events (those without
state_key
) no more trick the library into changing any state.
API breakage and deprecations:
- In simple state events (such as
RoomNameEvent
)content_type
typedef now means the actually enclosed content type, which isSimpleContent<ValueType>
;value_type
is introduced to refer to the actual value type inside the content object. Room::timelineEdge()
is now soft-deprecated (the compiler won't warn you, only the doc-string will); useRoom::historyEdge()
instead. At the same time we now haveRoom::syncEdge()
that returns an iterator after the newest event.Connection::*error()
signals now passQString
instead ofQByteArray
for details (their second parameter)Connection::load/saveState()
no more receives the parameter defining the cache location (because the cache is no more a single file). UsecacheLocation()
if you need to find out where the cache is.GetRoomStateByTypeJob
is broken for now; will be fixed in patch versions of 0.5.Omittable<>
no more implicitly casts tobool
; if there ever was some code using it that code has to be fixed anyway.toJson()/fromJson()
stuff massively refactored - should be much more scalable towards new data types now.SimpleContent
no more derives fromEventContent::Base
(unlikely anybody ever relied on that)
Fixes and smaller things:
- #127:
Connection::joinRoom()
now allows to join rooms on other servers Room::eventsHistoryJob()
is exposed as aQ_PROPERTY
for the sake of checking from QML code- #248: Local echo is no more stuck in the list of pending events
- #258: Banning now correctly removes the user from room members locally, not only on the server
- #273: A workaround has been added for a bug in Synapse that doesn't process retracted invites in some cases. The library will ensure the invite is deleted if the invite is additionally rejected from the local client.
- #274:
Connection::syncLoop()
, to save small glue code in clients connecting the next loop to the completion of the previous one. If you want to do it with time gaps etc., you still have to useConnection::sync()
and your own custom glue code. - #279: event ids with pipes (
|
) and slashes (/
) won't break downloading to a temporary file from these events anymore. - #278: URI schemes except spec-approved
http(s)
,ftp
,mailto
andmagnet
are no more linkified byprettyPrint()
. SyncJob
can now accept a standard CS APIFilter
instead of a genericQString
. TheQString
overload is still there to allow passing filter ids.Connection::nextBatchToken()
, in case you need a token to the (sync-side) end of the timeline.- a new
qt_connection_util.h
header file with two facilities to ease working with QObject connections:connectSingleShot()
andconnectUntil()
.
Version 0.4.2.1
This version of libQMatrixClient contains a single fix: the library no more treats fake state events (that don't have state_key
, even if they have state-related type, e.g., m.room.topic
) as state events, turning them into unknown events instead. It is strongly recommended to upgrade from any 0.4.x version to 0.4.2.
(Update: version 0.4.2 had still the old version number in its CMakeLists.txt; version 0.4.2.1 has the version number correctly updated.)
Version 0.4.1
This is a maintenance release in 0.4.x branch. Notable changes include:
- Fix pending events (aka local echo) not being cleaned up properly
- Fix rooms not being correctly sorted according to their position under tag if using
Connection::roomsByTags()
. - Fix incorrect SOVERSION.
Version 0.4.0
It's been more than 3 months since the last release - it's really a good time to make a new one, especially since we have a new official snapshot of CS API! Coincidentally, both CS API and libQMatrixClient are now at version 0.4.0, with plenty of new functionality available from the server thanks to a massive effort of the Matrix spec core team in August. Several major (and long awaited) features and, of course, bugfixes, have landed in the library, with the memory footprint and performance still being the primary points for which the library is valued.
Thanks
This release is also notable because the developers of all the three active clients based on libQMatrixClient have contributed to it: aside from yours truly (@KitsuneRal), @encombhat of Spectral, and @delijati of uMatriks. Many thanks to you, as well as all users and testers of these clients!
Compatibility
Version 0.4 breaks API compatibility with previous versions; unless your client used very basic functionality, you may need to adapt it to the new interface. As usual, see diffs in header files to track the changes and update the client code accordingly; these release notes highlight most prominent API changes.
Micro-versions in 0.4.x will maintain the API and ABI. Version 0.5 will break either API or ABI or both.
Toolchain (see also README.md)
No changes since version 0.2 - Qt 5.6 is the oldest supported; Qt 5.10 is recommended. GCC 5+, Clang 5+, MSVC 2015+ are officially supported; GCC 4.9.2 and Clang 3.8 still work. The library uses C++14 for the language standard. Beware that the next library version may switch to newer Qt (5.7 or even 5.9).
Integration
Version 0.4 can be compiled either in static or (Linux-only so far) dynamic linking configuration. QML code can use most library facilities, assuming respective types are registered - you need a shim in C/C++ for that (see the code of uMatriks and Spectral for inspiration).
Starting from this version, libQMatrixClient integrates with pkg-config
on Linux - in other words, you can use its .pc
file to find out all necessary paths (thanks to @encombhat).
Note that the compiled library name is capitalised as libQMatrixClient.*
, following Qt's naming conventions, instead of libqmatrixclient.*
used before version 0.2.
The library requires the newest (master
) GTAD to generate job classes; pre-generated files are also supplied with the source code and in the Git tree.
Features
The full list of changes can be found in the commit log; you can also find the list of GitHub issues closed in the release.
New features, along with key library API for them:
- Plenty of new network jobs thanks to the new release of CS API - this commit is the best place to find most of them. Notably, jobs for discovery API (aka
.well-known
, MSC433) have been added to the library, as well as enhancements for registration jobs and third-parties lookup. Room
now knows about VoIP signalling (m.call.*
) events, emittingcallEvent()
so that clients could wire it to whatever WebRTC implementation they have at hand and providingRoom::call*
methods to generate these events. This is based on the earlier work by UBPorts' @mariogrip; special thanks to @delijati for landing it to the master branch!- Events system has been refactored to allow adding custom event types. Previously custom event types (not defined in the library) were second-class citizens; e.g., they could not be added to parsing the response in
SyncJob
. Now library-defined and custom-defined events are completely equal. This required to get away from identifying event types using one common enumeration and switch to identification by strings used for the event type in JSON payloads. If you switched to using the (also relatively recent)TimelineItem::viewAs<>
, you should not need to change your code; otherwise, if you're in C++, you're strongly advised to use it as well as the newly introducedis<>
andeventCast<>
that provide you with a typesafe interface instead of unreliable "check the type id andstatic_cast<>
" antipattern. If you absolutely need the old enumeration-based ids, pass-DENABLE_EVENTTYPE_ALIAS
but be aware that this option will only be there for another release or two. User::ignore()
,User::unmarkIgnore()
andisIgnored()
/ignoredUsers()
/addTo/removeFromIgnoredUsers()
.- Local echo support; most of the interface can be found by looking at
Room::pendingEvent*
symbols; on top of that there areretryMessage()
anddiscardMessage()
. Warning: the functionality is still slightly buggy, pending events may get stuck even after receiving the actual event from the sync. - Room and user avatars are now cached to disk rather than to memory - meaning that they are saved between restarts! Thanks to @encombhat for making it happen.
API changes:
- Instead of
Room::postMessage()
there's a multitude ofRoom::post*
methods, to better support direct invocation of that functionality from QML. - Similarly,
Room::add/removeTag()
are now QML-friendly; and tag order is nowfloat
rather thanQString
- because The Spec says so.
Smaller improvements:
- Autogenerated jobs now come with doc-comments carefully taken directly from API description files (thanks to the new GTAD).
Connection::stateChanged()
to more conveniently track changes in the connection stateSettings::get<>
- a convenience template method that returns you a value of the type you want, rather thanQVariant
.Room::beforeDestruction()
, emitted before deleting the room. Note that even if you inherit from room,beforeDestruction()
will be called before your destructor is even entered, so you can still operate the room's state.Room::usersAtEventId()
- a much better way to find out who's read this event than going through all users and checking their last read events. Thanks to @encombhat for the PR!Room::displayNameAboutToChange()
- Network jobs now try to use HTTP2 if it's available. Thanks to @krombel!
- Left rooms still get account data. Unlikely that you'd notice.
- And the usual bug squashing, leaks plugging and memory saving
Version 0.3.0.1
Minor fix in yet-to-be-used code breaking the MSVC build.
Version 0.3
It didn't take too long since 0.2.1, did it? Despite that, version 0.3 includes 200+ new commits, featuring a lot of new network job classes. In fact, the entire (non-deprecated) CS API, as defined by the newest version of The Spec, is now covered with network jobs! This means that you get full (even if low-level) access to the documented Matrix CS API - be that device and key management, or user registration, or pushrules configuration. This, of course, comes along the usual work on bugfixing and other less prominent features, while keeping memory footprint and performance under control.
GTAD
All those new jobs (and most of older ones added before 0.2.1) are actually generated code. This has been made possible thanks to GTAD - Generate Things from API Descriptions, another project of @KitsuneRal. GTAD 0.6 allows you to get code in C/C++ (and possibly other languages) for the whole CS API using OpenAPI files provided by the Matrix project and Mustache template files you define. Feel free to try it; get help at #gtad:matrix.org.
Compatibility
Version 0.3 breaks API compatibility with previous versions; unless your client used very basic functionality, you may need to adapt it to the new interface. As usual, see diffs in header files to track the changes and update the client code accordingly; these release notes highlight most prominent API changes.
Micro-versions in 0.3.x will maintain the API and ABI. Version 0.4 will break either API or ABI or both.
Toolchain (see also README.md)
No changes since version 0.2 - Qt 5.6 is the oldest supported; Qt 5.10 is recommended. GCC 5+, Clang 5+, MSVC 2015+ are officially supported; GCC 4.9.2 and Clang 3.8 still work. The library uses C++14 for the language standard.
Integration
Version 0.3 can be compiled either in static or (Linux-only so far) dynamic build configuration. QML code can use most library facilities, assuming respective types are registered - you need a shim in C/C++ for that (see the code of uMatriks for an example how to do that).
Note that the compiled library name is capitalised as libQMatrixClient.*
, following Qt's naming conventions, instead of libqmatrixclient.*
used before version 0.2.
Features
The full list of changes can be found in the commit log; you can also find the list of GitHub issues closed in the release.
New features enabled, along with key library API for them:
- New network jobs (#212):
GetNotificationsJob
(/notifications
),GetWhoIsJob
(/admin/whois
),GetEventContextJob
(/context
),SearchJob
(/search
),GetTurnServerJob
(/voip/turn
),PeekEventsJob
(/peek
),ReportContentJob
(/report
),GetOneEventJob
(/events
),GetMembersByRoomJob
(/members
) andGetJoinedMembersByRoomJob
(/joined_members
), jobs for/presence
,/pushrules
,/filter
,/state
,/register
,/devices
,/keys
. - GTAD configuration and templates have been added to the master branch; job classes are now (re-)generated on a regular basis, getting updates from the most recent (or whichever you choose for your branch) OpenAPI files. Note that the current set of job classes in the master branch is generated from QMatrixClient/matrix-doc fork rather than from vanilla files at matrix-org/matrix-doc. Details on how to use GTAD in libQMatrixClient are covered in CONTRIBUTING.md
API changes:
- Most of network job classes (specifically - all classes generated by GTAD) now reside in
csapi/
instead ofjobs/
. A small number of manually written jobs (with better interface than the one provided by generated ones - notably,SyncJob
andMediaThumbnailJob
) stay injobs/
. - If you happened to use
RoomMessagesJob
directly, rather thanRoom::getPreviousContent()
- this job is no more, useGetRoomEventsJob
instead. JoinRoomJob
, while keeping the name, now resides incsapi/joining.h
and accepts a slightly different set of arguments. You better useConnection::joinRoom()
anyway which has been there for some time already.- Similarly,
SetRoomStateJob
is now two jobs residing incsapi/room_state.h
.Room::set*
methods provide a more stable API for you (including the newly introducedRoom::setMemberState()
). EventsBatch<>
template is dismissed, andEventsArray<>
(a typedef forstd::vector
of event pointers) is used instead.Connection::createRoom
now acceptsQStringList
instead ofQVector<QString>
for the list of invitees. Jobs that used to get or returnQVector<QString>
also useQStringList
now (GetVersionsJob
, e.g.).Connection::networkError
now carries the error message and details, in case a client wants to log intermittent errors.- Jobs in
content-repo.*
now return their result indata()
instead ofcontent()
- a side-effect from using a unified name for single return parameters in GTAD. If you usedMediaThumbnailJob
andDownloadFileJob
(or method wrappers inConnection
andRoom
), you're not affected.
Smaller changes:
- Feature (#206): the library now exposes a single signal,
Connection::requestFailed()
, for any failure of a network job that cannot or wasn't fixed by retrying (e.g. malformed requests, trying to send a message over continuously unavailable network, not found resources etc.). Clients can use it to provide error messages to the user in a unified way; just make sure to be not too obtrusive with those. - Feature (#211): a new
Connection::loadedRoomState()
signal is emitted as soon as a new room is not only created but its initial state from the nearest sync is entirely processed. This is useful, e.g., to only show the just-created room after it's been filled with some state. The library uses this signal in its own testsuite,qmc-example
. - Feature:
BaseJob::statusChanged
signal to track job state transitions. - Feature: you can access
isFavourite/isLowPriority
as properties andisDirectChat
as a function from QML. - Enhancement:
TimelineItem
(the wrapper class for events stored in theRoom
timeline) has got a facility methodviewAs<>
that unwraps the event and casts it to the desired pointer type withconst
qualifier. Instead of writingstatic_cast<const WhateverEvent*>(ti->event())
you can just doti->viewAs<WhateverEvent>()
now. - Enhancement (#207): "Consent not given" error has a special status code (
BaseJob::UserConsentRequiredError
);BaseJob::errorUrl()
returns the consent page URL. - Enhancement: network jobs now can be started as either as "foreground" or "background" - generally, the idea is that "foreground" network requests are directly concerned with user interaction, while background requests serve supplementary role.
Connection::sync
and (by default)Connection::getThumbnail
start background requests; others are foreground. Quaternion uses this distinction to decide whether or not an error message from a request should be shown to the user, - More work on improving stability and memory footprint
- More work in .md files, in particular on using GTAD.
Version 0.2.1
This is mostly a bugfix release, fully backwards-compatible with v0.2:
- Fixed an occasional crash due to dangling callbacks in avatar fetching code
- Fixed unreliable network error handling leading to sync loop getting "unlooped" when server is temporarily unavailable
- Fixed a regression leading to bridge postfixes not being removed from user display names
- Fixed a regression manifesting in dysfunctional user name disambiguation
- Added
User::rawName()
to get a user name together with its bridge postfix - Bridge names are now used as the first line of disambiguation, with user ids being the next (and ultimate) fallback.
Version 0.2
A big update over 0.1, 0.2 comes almost 5 months after the previous release. More than 300 commits have landed in the master branch since then, with 50+ feature requests and bugs closed. The primary goal was to get more Matrix features available (notably, CS API coverage is now much wider), with stability and memory footprint being the close second priority.
As the library matures, so the development process around it does. The libqmatrixclient project has been registered at a Core Infrastructure Initiative Best Practices website (under a cool number 1023=210-1) and is now proudly wearing the badge with the Passing status.
Thanks
This release is a collective effort of: Kitsune Ral (@KitsuneRal), Roman Plášil (@Quiark), Lewis Rockliffe (@r0kk3rz) and others. Many thanks to all of you, as well as authors and users of client applications based on libQMatrixClient - your feedback is invaluable!
Compatibility
0.2 breaks API compatibility with 0.1; there's no guarantee that clients compiled with version 0.1 will compile with 0.2. See diffs in header files to track the changes and update the client code accordingly; these release notes highlight most prominent API changes.
Micro-versions in 0.2.x will maintain the API; ABI compatibility is still not enforced (the primary linkage of the library is still static).
Toolchain (see also README.md)
Qt 5.6 is the oldest supported; Qt 5.10 is recommended. GCC 5+, Clang 5+, MSVC 2015+ are officially supported; GCC 4.9.2 and Clang 3.8 still work. The library uses C++14 for the language standard now.
Integration
Same as 0.1, version 0.2 is mainly used in static build configuration but is usable as a dynamic library as well. QML code can use most library facilities, assuming respective types are registered (see the code of uMatriks for an example how to do that).
Note that the compiled library name is now capitalised as libQMatrixClient.*
, following Qt's naming conventions, instead of libqmatrixclient.*
.
Features
The full list of changes can be found in the commit log; you can also find the list of GitHub issues closed in the release.
New features enabled, along with key library API for them:
- Redactions
- Files transfer (only
mxc://
, no freeform URLs - see #153):- Downloading (#121):
GetContent*Job
,DownloadFileJob
,Connection::getContent()
,Connection::downloadFile()
,Room::downloadFile()
,Room::*ToDownload()
(#168) - Uploading (#122):
UploadContentJob
,Connection::uploadContent()
,Connection::uploadFile()
,Room::uploadFile()
- Progress tracking:
Connection::upload/downloadProgress()
,Room::fileTransfer*()
signals family,Room::fileTransferInfo()
,Room::cancelFileTransfer()
- Downloading (#121):
- Setting an avatar from the local file (implicitly uploads the file to content repo (#150):
User::setAvatar()
- Saving the range of shown events in the room object (#151):
Room::*DisplayedEvent*()
accessors and signals - Rooms creation (#34):
CreateRoomJob
,Connection::createRoom()
andConnection::createdRoom()
- Changing the room state:
SetRoomStateJob
,Room::setName()
,Room::setCanonicalAlias()
- Per-room user properties (display names and avatars) support (#141): almost all methods of
User
now get a room object as a parameter; clients are advised to add this parameter to the existing calls ofUser
but the previous signatures work too (handling the most used display name/avatar; before it was the one last encountered in /sync response). - Account data (#123 and #152):
- Room tags support (#134):
TagEvent
, various accessors and signals (Connection::tag*()
andRoom::tag*()
),Connection::roomsWithTag()
,Room::add/removeTag()
,Room::setTags()
,Room::isFavourite()
andRoom::isLowPriority()
(just because The Spec explicitly mentions these two tags) - Server-side read marker support (aka "m.fully_read", #183): no changes to the library read marker API, it's now automatically synchronised with the server;
ReadMarkerEvent
andPostReadMarkersJob
for those who need to deal with the synchronisation logic - Direct chats support (#163):
DirectChatEvent
; inConnection
,directChats()
,directChatUsers()
,addTo/removeFromDirectChats()
,isDirectChat()
(with the counterpart inRoom
),directChatsListChanged()
;requestDirectChat()
to get a hold of the direct chat room object (directChatAvailable()
is the corresponding signal andUser::requestDirectChat()
is a shortcut if you have a user object at hand); alternatively,doInDirectChat()
can be used for continuation-styled operations on a direct chat - Generic account data:
Room::accountData()
andRoom::accountdataChanged()
,SetAccountDataJob
,SetAccountDataPerRoomJob
- Room tags support (#134):
- New CS API coverage (#128, see the issue for specific class names): 3PID administration, room directory, sending typing notifications, getting protocol versions from the server, "whoami" request for access tokens - all this is in addition to operations mentioned above
- Unread messages are counted now:
Room::unreadCount()
(saved in cache so that clients could provide reasonably accurate estimates - "as in Slack or better" - on the next run without saving the messages themselves) - API change: Client callbacks for SSL errors and proxy authentication (#143):
NetworkAccessManager::instance()
andNetworkAccessManager::sslErrors()
- The library no more suppresses self-signed certificate errors etc. (#144), clients should explicitly process those (quotient-im/Quaternion#250 gives an example)
- Speaking of proxy servers, clients can now use the
NetworkSettings
class to store network proxy settings.
- API change: all network request (job) classes now follow the camelCase naming convention (no snake_case parameters sneaking in).
- API change: initial job state is now
Pending
rather thanNoError
(this allows to distinguish between "no result yet" and "good result" but breaks clients that checked forNoError
before job completion).
Other changes:
- Feature: plain text with URLs can be pretty-printed into HTML using
Room::prettyPrint()
- Feature: many more
Q_PROPERTY
s exposed for use in QML - Feature:
Connection::room()
andConnection::invitation()
to get an (existing)Room
object for the specified room id and join state mask; no more need to runConnection::roomMap()
(that has linear complexity, btw) only to access a single room object - Enhancement: bridged Telegram users are recognised as such, with (Telegram) suffix removed from their names
- Enhancement (#109): workaround losing connectivity due to poor Qt bearer management
- Enhancement: network requests (jobs) can now use arbitrary data streams derived from
QIODevice
(including local files) for the request body (enables file uploading mentioned above and other useful cases) - Enhancement:
Room
andUser
objects now haveQObject
names, making them more readable in debugging views of Qt Creator and other Qt-aware IDEs - Enhancement (#179): caching through
Connection::saveState()
now uses Qt's binary representation of JSON (making it unreadable but considerably faster); set "libqmatrixclient/cache_type" (also programmatically accessible throughQMatrixClient::Settings
orQSettings
) to "json" to use the plain-text JSON format for the cache - Enhancement (#186): network requests respect rate limiting imposed by the server and will retry according to the provided timeout (some requests fall victim to matrix-org/synapse#3054 though)
- Fix (#119): homeserver names are resolved properly
- Fix (#115): fake state events (having no state_key) do not cause state changes
- Fix (#148):
prev_content
is properly searched in incoming events - Fix (#138): trying to send a (non-encrypted) message to an encrypted room will cause a complaint in the logs but no observable action; use
Room::usesEncryption()
andRoom::encryption()
to check whether the room is encrypted - Massive work on improving stability and plugging memory leaks; the CI script on Linux and OSX now includes running
qmc-example
under Valgrind; CI for Windows is introduced for the library - More documentation work, both in doc-comments and .md files