21 #include "itemcreatejob.h"
23 #include "collection.h"
24 #include "imapparser_p.h"
26 #include "itemserializer_p.h"
28 #include "protocolhelper_p.h"
30 #include <QtCore/QDateTime>
34 using namespace Akonadi;
36 class Akonadi::ItemCreateJobPrivate :
public JobPrivate
46 QSet<QByteArray> mParts;
53 :
Job( new ItemCreateJobPrivate( this ), parent )
57 Q_ASSERT( !item.
mimeType().isEmpty() );
60 d->mCollection = collection;
73 QList<QByteArray> flags;
74 flags.append(
"\\MimeType[" + d->mItem.mimeType().toLatin1() +
']' );
75 if ( !d->mItem.remoteId().isEmpty() )
76 flags.append( ImapParser::quote(
"\\RemoteId[" + d->mItem.remoteId().toUtf8() +
']' ) );
77 if ( !d->mItem.remoteRevision().isEmpty() )
78 flags.append( ImapParser::quote(
"\\RemoteRevision[" + d->mItem.remoteRevision().toUtf8() +
']' ) );
79 flags += d->mItem.flags().toList();
82 if ( d->mItem.attributes().isEmpty() && ( d->mParts.isEmpty() || (d->mParts.size() == 1 && d->mParts.contains(
Item::FullPayload )) ) ) {
83 if ( d->mItem.hasPayload() ) {
87 int dataSize = d->mData.size();
89 d->writeData( d->newTag() +
" APPEND " + QByteArray::number( d->mCollection.id() )
90 +
' ' + QByteArray::number( d->mItem.size() )
91 +
" (" + ImapParser::join( flags,
" " ) +
") {"
92 + QByteArray::number( dataSize ) +
"}\n" );
95 QByteArray command = d->newTag() +
" X-AKAPPEND " + QByteArray::number( d->mCollection.id() )
96 +
' ' + QByteArray::number( d->mItem.size() )
97 +
" (" + ImapParser::join( flags,
" " ) +
") ";
99 QList<QByteArray> partSpecs;
101 foreach (
const QByteArray &partName, d->mParts ) {
105 totalSize += partData.size();
107 partSpecs.append( ImapParser::quote( partId ) +
':' + QByteArray::number( partData.size() ) );
108 d->mData += partData;
110 foreach (
const Attribute* attr, d->mItem.attributes() ) {
112 totalSize += data.size();
114 partSpecs.append( ImapParser::quote( partId ) +
':' + QByteArray::number( data.size() ) );
117 command +=
'(' + ImapParser::join( partSpecs,
"," ) +
") " +
118 '{' + QByteArray::number( totalSize ) +
"}\n";
120 d->writeData( command );
129 d->writeData( d->mData );
130 if ( !d->mData.endsWith(
'\n' ) )
131 d->writeData(
"\n" );
134 if ( tag == d->tag() ) {
135 int uidNextPos = data.indexOf(
"UIDNEXT" );
136 if ( uidNextPos != -1 ) {
138 ImapParser::parseNumber( data, d->mUid, &ok, uidNextPos + 7 );
140 kDebug() <<
"Invalid UIDNEXT response to APPEND command: "
144 int dateTimePos = data.indexOf(
"DATETIME" );
145 if ( dateTimePos != -1 ) {
146 int resultPos = ImapParser::parseDateTime( data, d->mDatetime, dateTimePos + 8 );
147 if ( resultPos == (dateTimePos + 8) ) {
148 kDebug() <<
"Invalid DATETIME response to APPEND command: "
163 item.
setId( d->mUid );
167 item.setStorageCollectionId( d->mCollection.id() );