diff --git a/kmailicalifaceimpl.cpp b/kmailicalifaceimpl.cpp index 56ec450d1..ea5c56185 100644 --- a/kmailicalifaceimpl.cpp +++ b/kmailicalifaceimpl.cpp @@ -127,41 +127,46 @@ bool KMailICalIfaceImpl::addIncidence( const QString& type, const QString& ical ) { kdDebug(5006) << "KMailICalIfaceImpl::addIncidence( " << type << ", " - << uid << ", " << ical << " )" << endl; + << uid << ", " << ical << " )" << endl; if( !mUseResourceIMAP ) return false; + // Find the folder + KMFolder* f = folderFromType( type, folder ); + if( !f ) { + kdError(5006) << "addIncidence(" << type << "," << folder << ") : Not an IMAP resource folder" << endl; + return false; + } + if ( storageFormat( f ) != StorageIcalVcard ) { + kdError(5006) << "addIncidence(" << type << "," << folder << ") : Folder has wrong storage format " << storageFormat( f ) << endl; + return false; + } + bool rc = false; bool quiet = mResourceQuiet; mResourceQuiet = true; + // Make a new message for the incidence + KMMessage* msg = new KMMessage(); + msg->initHeader(); + msg->setType( DwMime::kTypeText ); + if( f == mContacts ) { + msg->setSubtype( DwMime::kSubtypeXVCard ); + msg->setHeaderField( "Content-Type", "Text/X-VCard; charset=\"utf-8\"" ); + msg->setSubject( "vCard " + uid ); + } else { + msg->setSubtype( DwMime::kSubtypeVCal ); + msg->setHeaderField("Content-Type", + "text/calendar; method=REQUEST; charset=\"utf-8\""); + msg->setSubject( "iCal " + uid ); + } + msg->setBodyEncoded( ical.utf8() ); - // Find the folder - KMFolder* f = folderFromType( type, folder ); - if( f && storageFormat( f ) == StorageIcalVcard ) { - // Make a new message for the incidence - KMMessage* msg = new KMMessage(); - msg->initHeader(); - msg->setType( DwMime::kTypeText ); - if( f == mContacts ) { - msg->setSubtype( DwMime::kSubtypeXVCard ); - msg->setHeaderField( "Content-Type", "Text/X-VCard; charset=\"utf-8\"" ); - msg->setSubject( "vCard " + uid ); - } else { - msg->setSubtype( DwMime::kSubtypeVCal ); - msg->setHeaderField("Content-Type", - "text/calendar; method=REQUEST; charset=\"utf-8\""); - msg->setSubject( "iCal " + uid ); - } - msg->setBodyEncoded( ical.utf8() ); - - // Mark the message as read and store it in the folder - msg->touch(); - f->addMsg( msg ); + // Mark the message as read and store it in the folder + msg->touch(); + f->addMsg( msg ); - rc = true; - } else - kdError(5006) << "Not an IMAP resource folder" << endl; + rc = true; mResourceQuiet = quiet; return rc; @@ -367,17 +372,23 @@ bool KMailICalIfaceImpl::deleteIncidence( const QString& type, kdDebug(5006) << "KMailICalIfaceImpl::deleteIncidence( " << type << ", " << uid << " )" << endl; + // Find the folder + KMFolder* f = folderFromType( type, folder ); + + if( !f ) { + kdError(5006) << "deleteIncidence(" << type << "," << folder << ") : Not an IMAP resource folder" << endl; + return false; + } + if ( storageFormat( f ) != StorageIcalVcard ) { + kdError(5006) << "deleteIncidence(" << type << "," << folder << ") : Folder has wrong storage format " << storageFormat( f ) << endl; + return false; + } + bool rc = false; bool quiet = mResourceQuiet; mResourceQuiet = true; - // Find the folder - KMFolder* f = folderFromType( type, folder ); - if( f && storageFormat( f ) == StorageIcalVcard ) { - rc = deleteIncidence( folder, uid, 0 ); - } - else - kdError(5006) << "Not an IMAP resource folder" << endl; + rc = deleteIncidence( folder, uid, 0 ); mResourceQuiet = quiet; return rc; @@ -392,16 +403,23 @@ bool KMailICalIfaceImpl::deleteIncidenceKolab( const QString& resource, kdDebug(5006) << "KMailICalIfaceImpl::deleteIncidenceKolab( " << resource << ", " << sernum << ")\n"; + + // Find the folder + KMFolder* f = findResourceFolder( resource ); + if( !f ) { + kdError(5006) << "deleteIncidenceKolab(" << resource << ") : Not an IMAP resource folder" << endl; + return false; + } + if ( storageFormat( f ) != StorageXML ) { + kdError(5006) << "deleteIncidenceKolab(" << resource << ") : Folder has wrong storage format " << storageFormat( f ) << endl; + return false; + } + bool rc = false; bool quiet = mResourceQuiet; mResourceQuiet = true; - // Find the folder - KMFolder* f = kmkernel->findFolderById( resource ); - if( f && storageFormat( f ) == StorageXML ) - rc = deleteIncidence( *f, "", sernum ); - else - kdError(5006) << resource << " not an IMAP resource folder" << endl; + rc = deleteIncidence( *f, "", sernum ); mResourceQuiet = quiet; return rc; @@ -419,15 +437,22 @@ QStringList KMailICalIfaceImpl::incidences( const QString& type, QStringList ilist; KMFolder* f = folderFromType( type, folder ); - if( f && storageFormat( f ) == StorageIcalVcard ) { - f->open(); - QString s; - for( int i=0; icount(); ++i ) { - bool unget = !f->isMessage(i); - if( KMGroupware::vPartFoundAndDecoded( f->getMsg( i ), s ) ) - ilist << s; - if( unget ) f->unGetMsg(i); - } + if( !f ) { + kdError(5006) << "incidences(" << type << "," << folder << ") : Not an IMAP resource folder" << endl; + return ilist; + } + if ( storageFormat( f ) != StorageIcalVcard ) { + kdError(5006) << "incidences(" << type << "," << folder << ") : Folder has wrong storage format " << storageFormat( f ) << endl; + return ilist; + } + + f->open(); + QString s; + for( int i=0; icount(); ++i ) { + bool unget = !f->isMessage(i); + if( KMGroupware::vPartFoundAndDecoded( f->getMsg( i ), s ) ) + ilist << s; + if( unget ) f->unGetMsg(i); } return ilist; @@ -448,37 +473,42 @@ QMap KMailICalIfaceImpl::incidencesKolab( const QString& mime << resource << " )" << endl; KMFolder* f = findResourceFolder( resource ); - if( f && storageFormat( f ) == StorageXML ) { - f->open(); - QString s; - for( int i=0; icount(); ++i ) { - bool unget = !f->isMessage(i); - KMMessage* msg = f->getMsg( i ); - if( msg ){ - const int iSlash = mimetype.find('/'); - const QCString sType = mimetype.left( iSlash ).latin1(); - const QCString sSubtype = mimetype.mid( iSlash+1 ).latin1(); - if( sType.isEmpty() || sSubtype.isEmpty() ){ - kdError(5006) << mimetype << " not an type/subtype combination" << endl; + if( !f ) { + kdError(5006) << "incidencesKolab(" << resource << ") : Not an IMAP resource folder" << endl; + return aMap; + } + if ( storageFormat( f ) != StorageXML ) { + kdError(5006) << "incidencesKolab(" << resource << ") : Folder has wrong storage format " << storageFormat( f ) << endl; + return aMap; + } + + f->open(); + QString s; + for( int i=0; icount(); ++i ) { + bool unget = !f->isMessage(i); + KMMessage* msg = f->getMsg( i ); + if( msg ){ + const int iSlash = mimetype.find('/'); + const QCString sType = mimetype.left( iSlash ).latin1(); + const QCString sSubtype = mimetype.mid( iSlash+1 ).latin1(); + if( sType.isEmpty() || sSubtype.isEmpty() ){ + kdError(5006) << mimetype << " not an type/subtype combination" << endl; + }else{ + const int msgType = DwTypeStrToEnum( DwString(sType)); + const int msgSubtype = DwSubtypeStrToEnum(DwString(sSubtype)); + DwBodyPart* dwPart = msg->findDwBodyPart( msgType, + msgSubtype ); + if( dwPart ){ + KMMessagePart msgPart; + KMMessage::bodyPart(dwPart, &msgPart); + aMap.insert(msg->getMsgSerNum(), msgPart.body()); }else{ - const int msgType = DwTypeStrToEnum( DwString(sType)); - const int msgSubtype = DwSubtypeStrToEnum(DwString(sSubtype)); - DwBodyPart* dwPart = msg->findDwBodyPart( msgType, - msgSubtype ); - if( dwPart ){ - KMMessagePart msgPart; - KMMessage::bodyPart(dwPart, &msgPart); - aMap.insert(msg->getMsgSerNum(), msgPart.body()); - }else{ - // This is *not* an error: it may be that not all of the messages - // have a message part that is matching the wanted MIME type - } + // This is *not* an error: it may be that not all of the messages + // have a message part that is matching the wanted MIME type } - if( unget ) f->unGetMsg(i); } + if( unget ) f->unGetMsg(i); } - }else{ - kdError(5006) << resource << " not such IMAP folder found" << endl; } return aMap; } @@ -581,27 +611,31 @@ bool KMailICalIfaceImpl::update( const QString& type, const QString& folder, return false; kdDebug(5006) << "Update( " << type << ", " << folder << ", " << uid << ")\n"; - bool rc = true; - bool quiet = mResourceQuiet; - mResourceQuiet = true; // Find the folder and the incidence in it KMFolder* f = folderFromType( type, folder ); - if( f && storageFormat( f ) == StorageIcalVcard ) { - KMMessage* msg = findMessageByUID( uid, f ); - if( msg ) { - // Message found - update it - deleteMsg( msg ); - addIncidence( type, folder, uid, entry ); - rc = true; - } else { - kdDebug(5006) << type << " not found, cannot update uid " << uid << endl; - // Since it doesn't seem to be there, save it instead - addIncidence( type, folder, uid, entry ); - } + if( !f ) { + kdError(5006) << "update(" << type << "," << folder << ") : Not an IMAP resource folder" << endl; + return false; + } + if ( storageFormat( f ) != StorageIcalVcard ) { + kdError(5006) << "update(" << type << "," << folder << ") : Folder has wrong storage format " << storageFormat( f ) << endl; + return false; + } + + bool rc = true; + bool quiet = mResourceQuiet; + mResourceQuiet = true; + KMMessage* msg = findMessageByUID( uid, f ); + if( msg ) { + // Message found - update it + deleteMsg( msg ); + addIncidence( type, folder, uid, entry ); + rc = true; } else { - kdError(5006) << "Not an IMAP resource folder" << endl; - rc = false; + kdDebug(5006) << type << " not found, cannot update uid " << uid << endl; + // Since it doesn't seem to be there, save it instead + addIncidence( type, folder, uid, entry ); } mResourceQuiet = quiet; @@ -613,6 +647,8 @@ Q_UINT32 KMailICalIfaceImpl::update( const QString& resource, const QStringList& attachments, const QStringList& deletedAttachments ) { + Q_UINT32 rc = 0; + // This finds the message with serial number "id", sets the // xml attachment to hold the contents of "xml", and updates all // attachments. @@ -626,48 +662,52 @@ Q_UINT32 KMailICalIfaceImpl::update( const QString& resource, // number, and the mail is just added instead. In this case // the deletedAttachments can be forgotten. if( !mUseResourceIMAP ) - return false; + return rc; kdDebug(5006) << "KMailICalIfaceImpl::update( " << resource << ", " << sernum << " )\n"; - Q_UINT32 rc = 0; + // Find the folder + KMFolder* f = findResourceFolder( resource ); + if( !f ) { + kdError(5006) << "update(" << resource << ") : Not an IMAP resource folder" << endl; + return rc; + } + if ( storageFormat( f ) != StorageXML ) { + kdError(5006) << "update(" << resource << ") : Folder has wrong storage format " << storageFormat( f ) << endl; + return rc; + } bool quiet = mResourceQuiet; mResourceQuiet = true; - // Find the folder - KMFolder* f = findResourceFolder( resource ); kdDebug(5006) << "Updating in folder " << f << endl; - if( f && storageFormat( f ) == StorageXML ){ - KMMessage* msg = 0; - if ( sernum != 0 ) - msg = findMessageBySerNum( sernum, f ); - if ( msg ) { - // Message found - update it: - - // Delete some attachments according to list - for( QStringList::ConstIterator it = deletedAttachments.begin(); - it != deletedAttachments.end(); - ++it ){ - if( !deleteAttachment( *msg, *it ) ){ - // Note: It is _not_ an error if an attachment was already deleted. - } + KMMessage* msg = 0; + if ( sernum != 0 ) + msg = findMessageBySerNum( sernum, f ); + if ( msg ) { + // Message found - update it: + + // Delete some attachments according to list + for( QStringList::ConstIterator it = deletedAttachments.begin(); + it != deletedAttachments.end(); + ++it ){ + if( !deleteAttachment( *msg, *it ) ){ + // Note: It is _not_ an error if an attachment was already deleted. } + } - // Add all attachments by reading them from their temp. files - for( QStringList::ConstIterator it2 = attachments.begin(); - it2 != attachments.end(); - ++it2 ){ - if( !updateAttachment( *msg, *it2 ) ){ - kdDebug(5006) << "Attachment error, can not add Incidence." << endl; - break; - } + // Add all attachments by reading them from their temp. files + for( QStringList::ConstIterator it2 = attachments.begin(); + it2 != attachments.end(); + ++it2 ){ + if( !updateAttachment( *msg, *it2 ) ){ + kdDebug(5006) << "Attachment error, can not add Incidence." << endl; + break; } - }else{ - // Message not found - store it newly - rc = addIncidence( *f, attachments ); } - }else - kdError(5006) << resource << " not an IMAP resource folder" << endl; + }else{ + // Message not found - store it newly + rc = addIncidence( *f, attachments ); + } mResourceQuiet = quiet; return rc; @@ -681,59 +721,65 @@ KURL KMailICalIfaceImpl::getAttachment( const QString& resource, // temp file and returns a URL to it. It's up to the resource // to delete the tmp file later. if( !mUseResourceIMAP ) - return false; + return KURL(); kdDebug(5006) << "KMailICalIfaceImpl::getAttachment( " << resource << ", " << sernum << ", " << filename << " )\n"; + // Find the folder + KMFolder* f = findResourceFolder( resource ); + if( !f ) { + kdError(5006) << "getAttachment(" << resource << ") : Not an IMAP resource folder" << endl; + return KURL(); + } + if ( storageFormat( f ) != StorageXML ) { + kdError(5006) << "getAttachment(" << resource << ") : Folder has wrong storage format " << storageFormat( f ) << endl; + return KURL(); + } + KURL url; bool bOK = false; bool quiet = mResourceQuiet; mResourceQuiet = true; - // Find the folder - KMFolder* f = kmkernel->findFolderById( resource ); - if( f && storageFormat( f ) == StorageXML ){ - KMMessage* msg = findMessageBySerNum( sernum, f ); - if( msg ) { - // Message found - look for the attachment: - - // quickly searching for our message part: since Kolab parts are - // top-level parts we do *not* have to travel into embedded multiparts - DwBodyPart* part = msg->getFirstDwBodyPart(); - while( part ){ - if( filename == part->partId() ){ - // Save the xml file. Will be deleted at the end of this method - KMMessagePart aPart; - msg->bodyPart( part, &aPart ); - QByteArray rawData( aPart.bodyDecodedBinary() ); - - KTempFile file; - file.setAutoDelete( true ); - QTextStream* stream = file.textStream(); - stream->setEncoding( QTextStream::UnicodeUTF8 ); - stream->writeRawBytes( rawData.data(), rawData.size() ); - file.close(); - - // Compose the return value - url.setPath( file.name() ); - url.setFileEncoding( "UTF-8" ); + KMMessage* msg = findMessageBySerNum( sernum, f ); + if( msg ) { + // Message found - look for the attachment: + + // quickly searching for our message part: since Kolab parts are + // top-level parts we do *not* have to travel into embedded multiparts + DwBodyPart* part = msg->getFirstDwBodyPart(); + while( part ){ + if( filename == part->partId() ){ + // Save the xml file. Will be deleted at the end of this method + KMMessagePart aPart; + msg->bodyPart( part, &aPart ); + QByteArray rawData( aPart.bodyDecodedBinary() ); + + KTempFile file; + file.setAutoDelete( true ); + QTextStream* stream = file.textStream(); + stream->setEncoding( QTextStream::UnicodeUTF8 ); + stream->writeRawBytes( rawData.data(), rawData.size() ); + file.close(); + + // Compose the return value + url.setPath( file.name() ); + url.setFileEncoding( "UTF-8" ); - bOK = true; - break; - } - part = part->Next(); + bOK = true; + break; } + part = part->Next(); + } - if( !bOK ){ - kdDebug(5006) << "Attachment " << filename << " not found." << endl; - } - }else{ - kdDebug(5006) << "Message not found." << endl; + if( !bOK ){ + kdDebug(5006) << "Attachment " << filename << " not found." << endl; } - }else - kdError(5006) << resource << " not an IMAP resource folder" << endl; + }else{ + kdDebug(5006) << "Message not found." << endl; + } mResourceQuiet = quiet; return url; @@ -1262,6 +1308,8 @@ KMFolder* KMailICalIfaceImpl::initFolder( KFolderTreeItem::Type itemType, } else { QString str = configGroup.readEntry( folder->idString() + "-storageFormat", "icalvcard" ); info.mStorageFormat = ( str == "xml" ) ? StorageXML : StorageIcalVcard; + + //kdDebug(5006) << "Found existing folder type " << itemType << " : " << folder->location() << endl; } if( folder->canAccess() != 0 ) {