// Appended entries works as follows: When an mbox file is loaded from disk, // d->mInitialMboxFileSize is set to the file size at that moment. New entries // are stored in memory (d->mAppendedEntries). The initial file size and the size // of the buffer determine the offset for the next message to append. MBoxEntry MBox::appendMessage( const KMime::Message::Ptr &entry ) { // It doesn't make sense to add entries when we don't have an reference file. Q_ASSERT( !d->mMboxFile.fileName().isEmpty() ); const QByteArray rawEntry = MBoxPrivate::escapeFrom( entry->encodedContent() ); if ( rawEntry.size() <= 0 ) { kDebug() << "Message added to folder `" << d->mMboxFile.fileName() << "' contains no data. Ignoring it."; return MBoxEntry(); } int nextOffset = d->mAppendedEntries.size(); // Offset of the appended message // Make sure the byte array is large enough to check for an end character. // Then check if the required newlines are there. if ( nextOffset < 1 && d->mMboxFile.size() > 0 ) { // Empty, add one empty line d->mAppendedEntries.append( "\n" ); ++nextOffset; } else if ( nextOffset == 1 && d->mAppendedEntries.at( 0 ) != '\n' ) { // This should actually not happen, but catch it anyway. if ( d->mMboxFile.size() < 0 ) { d->mAppendedEntries.append( "\n" ); ++nextOffset; } } else if ( nextOffset >= 2 ) { if ( d->mAppendedEntries.at( nextOffset - 1 ) != '\n' ) { if ( d->mAppendedEntries.at( nextOffset ) != '\n' ) { d->mAppendedEntries.append( "\n\n" ); nextOffset += 2; } else { d->mAppendedEntries.append( "\n" ); ++nextOffset; } } } const QByteArray separator = MBoxPrivate::mboxMessageSeparator( rawEntry ); d->mAppendedEntries.append( separator ); d->mAppendedEntries.append( rawEntry ); if ( rawEntry[rawEntry.size() - 1] != '\n' ) { d->mAppendedEntries.append( "\n\n" ); } else { d->mAppendedEntries.append( "\n" ); } MBoxEntry resultEntry; resultEntry.d->mOffset = d->mInitialMboxFileSize + nextOffset; resultEntry.d->mMessageSize = rawEntry.size(); resultEntry.d->mSeparatorSize = separator.size(); d->mEntries << resultEntry; return resultEntry; }
void EwsMtaResource::sendItem(const Akonadi::Item &item) { qDebug() << "sendItem" << item.remoteId(); if (!connectEws()) { itemSent(item, TransportFailed, i18n("Unable to connect to master EWS resource")); return; } mItemHash.insert(item.remoteId(), item); KMime::Message::Ptr msg = item.payload<KMime::Message::Ptr>(); QByteArray mimeContent = msg->encodedContent(true); mEwsResource->sendMessage(item.remoteId(), mimeContent); }