20 #include "setmetadatajob.h"
22 #include <KDE/KLocale>
25 #include "metadatajobbase_p.h"
26 #include "message_p.h"
27 #include "session_p.h"
32 class SetMetaDataJobPrivate :
public MetaDataJobBasePrivate
35 SetMetaDataJobPrivate( Session *session,
const QString& name ) : MetaDataJobBasePrivate( session, name ), metaDataErrors( 0 ), maxAcceptedSize( -1 ) { }
36 ~SetMetaDataJobPrivate() { }
38 QMap<QByteArray, QByteArray> entries;
39 QMap<QByteArray, QByteArray>::ConstIterator entriesIt;
41 SetMetaDataJob::MetaDataErrors metaDataErrors;
42 qint64 maxAcceptedSize;
46 using namespace KIMAP;
48 SetMetaDataJob::SetMetaDataJob( Session *session )
49 :
MetaDataJobBase( *new SetMetaDataJobPrivate( session, i18n(
"SetMetaData" ) ) )
53 SetMetaDataJob::~SetMetaDataJob()
57 void SetMetaDataJob::doStart()
60 QByteArray parameters;
61 parameters =
'\"' + KIMAP::encodeImapFolderName( d->mailBox.toUtf8() ) +
"\" ";
62 d->entriesIt = d->entries.constBegin();
64 QByteArray command =
"SETMETADATA";
66 command =
"SETANNOTATION";
67 parameters +=
'\"' + d->entryName +
"\" (";
68 d->m_name = i18n(
"SetAnnotation" );
69 if ( !d->entries.isEmpty() ) {
70 for ( ; d->entriesIt != d->entries.constEnd(); ++d->entriesIt ) {
71 parameters +=
'\"' + d->entriesIt.key() +
"\" \"" + d->entriesIt.value() +
"\" ";
73 parameters[parameters.length() - 1] =
')';
77 if ( !d->entries.isEmpty() ) {
78 parameters +=
'\"' + d->entriesIt.key() +
'\"';
80 parameters +=
" {" + QByteArray::number( d->entriesIt.value().size() ) +
'}';
84 if ( d->entries.isEmpty() ) {
88 d->tags << d->sessionInternal()->sendCommand( command, parameters );
92 void SetMetaDataJob::handleResponse(
const Message &response )
97 if ( !response.content.isEmpty() &&
98 d->tags.contains( response.content.first().toString() ) ) {
99 if ( response.content[1].toString() ==
"NO" ) {
100 setError( UserDefinedError );
101 setErrorText( i18n(
"%1 failed, server replied: %2", d->m_name, response.toString().constData() ) );
102 if ( response.content[2].toString() ==
"[ANNOTATEMORE TOOMANY]" ||
103 response.content[2].toString() ==
"[METADATA TOOMANY]" ) {
105 }
else if ( response.content[2].toString() ==
"[ANNOTATEMORE TOOBIG]" ||
106 response.content[2].toString().startsWith(
"[METADATA MAXSIZE" ) ) {
107 d->metaDataErrors |=
TooBig;
108 d->maxAcceptedSize = -1;
109 if ( response.content[2].toString().startsWith(
"[METADATA MAXSIZE" ) ) {
110 QByteArray max = response.content[2].toString();
111 max.replace(
"[METADATA MAXSIZE",
"" );
112 max.replace(
"]",
"" );
113 d->maxAcceptedSize = max.toLongLong();
115 }
else if ( response.content[2].toString() ==
"[METADATA NOPRIVATE]" ) {
118 }
else if ( response.content.size() < 2 ) {
119 setErrorText( i18n(
"%1 failed, malformed reply from the server.", d->m_name ) );
120 }
else if ( response.content[1].toString() !=
"OK" ) {
121 setError( UserDefinedError );
122 setErrorText( i18n(
"%1 failed, server replied: %2", d->m_name, response.toString().constData() ) );
125 }
else if ( d->serverCapability ==
Metadata && response.content[0].toString() ==
"+" ) {
126 QByteArray content = d->entriesIt.value();
128 if ( d->entriesIt == d->entries.constEnd() ) {
131 content +=
" {" + QByteArray::number( d->entriesIt.value().size() ) +
'}';
134 d->sessionInternal()->sendData( content );
141 d->entries[name] = value;
147 d->entryName = entry;
153 return d->metaDataErrors;