Warning, /pim/kimap2/README.md is written in an unsupported language. File is not indexed.

0001 # KIMAP2 #
0002 
0003 This library provides a job-based API for interacting with an IMAP4rev1 server.
0004 It manages connections, encryption and parameter quoting and encoding, but
0005 otherwise provides quite a low-level interface to the protocol.  This library
0006 does not implement an IMAP client; it merely makes it easier to do so.
0007 
0008 Users should be familiar with [RFC 3501](http://www.apps.ietf.org/rfc/rfc3501.html "IMAP 4rev1")
0009 as well as [other related RFCs](http://www.iana.org/assignments/imap4-capabilities)
0010 although the library hides some of the nastier details like the encoding and quoting of
0011 strings.
0012 
0013 For development coordination see: https://phabricator.kde.org/tag/kimap2/
0014 
0015 ## Porting from KIMAP(1) ##
0016 The following changes can affect you when porting from KIMAP (this is probably an incomplete list, so beware)
0017 * Reading from the socket and parsing no longer happens in a separate thread. If you don't want to block the main process execute the complete job in a thread. 
0018 * Most deprecated API's have been removed. See especially SearchJob, ListJob and FetchJob.
0019 * Due to the removal of KTcpSocket we no longer integrate with KSslCertificateManager. If that is wanted use Session::sslErrors signal to react to ssl problems:
0020 
0021     QObject::connect(mSession, &KIMAP2::Session::sslErrors, [this](const QList<QSslError> &errors) {
0022         SinkLog() << "Received ssl error: " << errors;
0023         mSession->ignoreErrors(errors);
0024     });
0025 
0026     QSslSocket::addDefaultCaCertificate can be used to add additional certificates to be used.
0027 
0028 * The LoginJob API changed.
0029 
0030 ## Versioning and branching ##
0031 Development happens in master. There is one release branch per minor version (if required).
0032 Every release is tagged with a tag of the form "v.$MAJOR.$MINOR.$PATCH".
0033 
0034 ## Releases ##
0035 KIMAP2 is released as required and does not follow a specific release schedule.
0036 Releases *always* happen directly from a release tag.
0037 
0038 A tarball can be created like so:
0039     git archive --format=tar.xz --prefix=kimap2-0.1.1/ v0.1.1 > kimap2-0.1.1.tar.xz
0040 
0041 You may need to add the following to your ~/.gitconfig for the xz compression to be available:
0042     [tar "tar.xz"]
0043         command = xz -c
0044 
0045 Generate a checksum to be included in the announcement:
0046     sha256sum kimap2-0.1.1.tar.xz
0047 
0048 Tarballs should be uploaded to unstable/kimap2/$VERSION/src/kimap2-$version.tar.xz
0049     curl -T kimap2-0.1.0.tar.xz ftp://upload.kde.org/incoming/
0050 
0051 Request the move to the target location via sysadmin ticket.
0052 
0053 See ftp://upload.kde.org/README
0054 
0055 For more information see techbase.kde.org/ReleasingExtragearSoftware
0056 
0057 ## Key changes from KIMAP(1) ##
0058 
0059 These are some of larger changes that spawned KIMAP2:
0060 
0061 * KIMAP2 is now threading free:
0062 There no longer is a dedicated thread for each socket. The reasoning for
0063 this is manyfold:
0064     * The threading strategy should be up to the application. The
0065     current design imposes additional threads in any case.
0066     * The threading resulted in lot's of subtle bugs and code-complexity
0067     overhead for the synchronization.
0068     * The whole design revolved around the idea that by running the
0069     parser in a thread the parser can be blocking and the network will
0070     always be the limiting factor. That assumption is not necessarily
0071     true and the parser starts to behave very badly if we get data
0072     faster than we can process it (The internal buffer will get large
0073     and a majority of time will be spent on memcopying during the trim()
0074     call).
0075     * This design doesn't allow the consumer to regulate the amount of
0076     data that enters the system. It reads as much into memory as it can,
0077     which again assumes the network is the slowest part.
0078     * During benchmarking of Sink the parser actually became the
0079     bottleneck of the imap resource (because of the pathological
0080     behaviour with memcopy in trim()).
0081 All of this directly leads to the next point.
0082 
0083 * We have now a non-blocking parser:
0084     * The parser operates with two buffers to emulate a ringbuffer =>
0085     fixed memory usage (except for some dynamic allocation for large
0086     literals).
0087     * The parser never reads more data than it can process => If we
0088     can't process fast enough the socket buffer will eventually fill up,
0089     resulting in the server eventually stopping to send more data. Which
0090     is how the network stack is supposed to work IMO.
0091     * We open up possibilities for new streaming API to directly stream
0092     i.e. attachments to disk.
0093     * This resulted in the parser mostly vanishing from benchmarks and
0094     memcpy to vanish entirely.
0095 
0096 * We no longer depend on ki18n:
0097     * This is a protocol implementation and not a place for translated
0098     strings.
0099 
0100 * We no longer depend on kio:
0101     * This was used for ktcpsocket only, and the only remaining benefit
0102     of that was the KSslCertificateManager integration. This can easily
0103     be readded externally by implementing the Session::sslErrors
0104     callback and the Session::ignoreErrors function, as well as
0105     QSslSOckets default ca certificate functions. (We may want to extend
0106     the API there a bit).
0107     * KIO has a whole slew of unrelated dependencies so this was an
0108     important step to make KIMAP2 more selfcontained.
0109 
0110 * I got rid of a lot of the result batching code:
0111     * It complicated the code and was an optimization at the wrong level
0112     IMO to save a couple of function calls.
0113 
0114 * Less overloaded result signals with lot's of parameters. One signal
0115 with a result struct containing all data.
0116 
0117 * The login job has received an overhaul.
0118     * Removed the slightly confused EncryptionMode names that sometime
0119     mixed the excryption and the use of starttls (which are two largely
0120     unrelated things).
0121     * Cleaned up the login logic which was a very complex statemachine
0122     scattered accross different classes and is now only a complex
0123     statemachine scattered over fewer classes =(
0124     * Fixed a potential race-condition where we would send a CAPABILITY
0125     request before receiving the greeting, which some servers seem to
0126     handle anyways but some don't.
0127     * Removed the encryption negotation which is handled by QSslSocket
0128     according to the provided settings, and otherwise fails as it
0129     should.
0130