kmail Library API Documentation

acljobs.cpp

00001 
00031 #include "acljobs.h"
00032 #include <kio/scheduler.h>
00033 #include <kdebug.h>
00034 
00035 using namespace KMail;
00036 
00037 static unsigned int IMAPRightsToPermission( const QString& str ) {
00038   unsigned int perm = 0;
00039   bool foundSeenPerm = false;
00040   uint len = str.length();
00041   for (uint i = 0; i < len; ++i) {
00042     QChar ch = str[i];
00043     switch ( ch.latin1() ) {
00044     case 'l': perm |= ACLJobs::List; break;
00045     case 'r': perm |= ACLJobs::Read; break;
00046     case 's': foundSeenPerm = true; break;
00047     case 'w': perm |= ACLJobs::WriteFlags; break;
00048     case 'i': perm |= ACLJobs::Insert; break;
00049     case 'p': perm |= ACLJobs::Post; break;
00050     case 'c': perm |= ACLJobs::Create; break;
00051     case 'd': perm |= ACLJobs::Delete; break;
00052     case 'a': perm |= ACLJobs::Administer; break;
00053     default: break;
00054     }
00055   }
00056   if ( ( perm & ACLJobs::Read ) && str.find( 's' ) == -1 ) {
00057     // Reading without 'seen' is, well, annoying. Unusable, even.
00058     // So we treat 'rs' as a single one.
00059     // But if the permissions were set out of kmail, better check that both are set
00060     kdWarning(5006) << "IMAPRightsToPermission: found read (r) but not seen (s). Things will not work well." << endl;
00061     if ( perm & ACLJobs::Administer )
00062       kdWarning(5006) << "You can change this yourself in the ACL dialog" << endl;
00063     else
00064       kdWarning(5006) << "Ask your admin for 's' permissions." << endl;
00065     // Is the above correct enough to be turned into a KMessageBox?
00066   }
00067 
00068   return perm;
00069 }
00070 
00071 static QCString permissionsToIMAPRights( unsigned int permissions ) {
00072   QCString str = "";
00073   if ( permissions & ACLJobs::List )
00074     str += 'l';
00075   if ( permissions & ACLJobs::Read )
00076     str += "rs";
00077   if ( permissions & ACLJobs::WriteFlags )
00078     str += 'w';
00079   if ( permissions & ACLJobs::Insert )
00080     str += 'i';
00081   if ( permissions & ACLJobs::Post )
00082     str += 'p';
00083   if ( permissions & ACLJobs::Create )
00084     str += 'c';
00085   if ( permissions & ACLJobs::Delete )
00086     str += 'd';
00087   if ( permissions & ACLJobs::Administer )
00088     str += 'a';
00089   return str;
00090 }
00091 
00092 #ifndef NDEBUG
00093 QString ACLJobs::permissionsToString( unsigned int permissions )
00094 {
00095   QString str;
00096   if ( permissions & ACLJobs::List )
00097     str += "List ";
00098   if ( permissions & ACLJobs::Read )
00099     str += "Read ";
00100   if ( permissions & ACLJobs::WriteFlags )
00101     str += "Write ";
00102   if ( permissions & ACLJobs::Insert )
00103     str += "Insert ";
00104   if ( permissions & ACLJobs::Post )
00105     str += "Post ";
00106   if ( permissions & ACLJobs::Create )
00107     str += "Create ";
00108   if ( permissions & ACLJobs::Delete )
00109     str += "Delete ";
00110   if ( permissions & ACLJobs::Administer )
00111     str += "Administer ";
00112   if ( !str.isEmpty() )
00113     str.truncate( str.length() - 1 );
00114   return str;
00115 }
00116 #endif
00117 
00118 KIO::SimpleJob* ACLJobs::setACL( KIO::Slave* slave, const KURL& url, const QString& user, unsigned int permissions )
00119 {
00120   QString perm = QString::fromLatin1( permissionsToIMAPRights( permissions ) );
00121 
00122   QByteArray packedArgs;
00123   QDataStream stream( packedArgs, IO_WriteOnly );
00124   stream << (int)'A' << (int)'S' << url << user << perm;
00125 
00126   KIO::SimpleJob* job = KIO::special( url, packedArgs, false );
00127   KIO::Scheduler::assignJobToSlave( slave, job );
00128   return job;
00129 }
00130 
00131 ACLJobs::DeleteACLJob* ACLJobs::deleteACL( KIO::Slave* slave, const KURL& url, const QString& user )
00132 {
00133   QByteArray packedArgs;
00134   QDataStream stream( packedArgs, IO_WriteOnly );
00135   stream << (int)'A' << (int)'D' << url << user;
00136 
00137   ACLJobs::DeleteACLJob* job = new ACLJobs::DeleteACLJob( url, user, packedArgs, false );
00138   KIO::Scheduler::assignJobToSlave( slave, job );
00139   return job;
00140 }
00141 
00142 ACLJobs::GetACLJob* ACLJobs::getACL( KIO::Slave* slave, const KURL& url )
00143 {
00144   QByteArray packedArgs;
00145   QDataStream stream( packedArgs, IO_WriteOnly );
00146   stream << (int)'A' << (int)'G' << url;
00147 
00148   ACLJobs::GetACLJob* job = new ACLJobs::GetACLJob( url, packedArgs, false );
00149   KIO::Scheduler::assignJobToSlave( slave, job );
00150   return job;
00151 }
00152 
00153 ACLJobs::GetUserRightsJob* ACLJobs::getUserRights( KIO::Slave* slave, const KURL& url )
00154 {
00155   QByteArray packedArgs;
00156   QDataStream stream( packedArgs, IO_WriteOnly );
00157   stream << (int)'A' << (int)'M' << url;
00158 
00159   ACLJobs::GetUserRightsJob* job = new ACLJobs::GetUserRightsJob( url, packedArgs, false );
00160   KIO::Scheduler::assignJobToSlave( slave, job );
00161   return job;
00162 }
00163 
00164 ACLJobs::GetACLJob::GetACLJob( const KURL& url, const QByteArray &packedArgs,
00165                                  bool showProgressInfo )
00166   : KIO::SimpleJob( url, KIO::CMD_SPECIAL, packedArgs, showProgressInfo )
00167 {
00168   connect( this, SIGNAL(infoMessage(KIO::Job*,const QString&)),
00169            SLOT(slotInfoMessage(KIO::Job*,const QString&)) );
00170 }
00171 
00172 void ACLJobs::GetACLJob::slotInfoMessage( KIO::Job*, const QString& str )
00173 {
00174   // Parse the result
00175   QStringList lst = QStringList::split( " ", str );
00176   while ( lst.count() >= 2 ) // we take items 2 by 2
00177   {
00178     QString user = lst.front(); lst.pop_front();
00179     QString imapRights = lst.front(); lst.pop_front();
00180     unsigned int perm = IMAPRightsToPermission( imapRights );
00181     m_entries.append( ACLListEntry( user, imapRights, perm ) );
00182   }
00183 }
00184 
00185 ACLJobs::GetUserRightsJob::GetUserRightsJob( const KURL& url, const QByteArray &packedArgs,
00186                                                bool showProgressInfo )
00187   : KIO::SimpleJob( url, KIO::CMD_SPECIAL, packedArgs, showProgressInfo )
00188 {
00189   connect( this, SIGNAL(infoMessage(KIO::Job*,const QString&)),
00190            SLOT(slotInfoMessage(KIO::Job*,const QString&)) );
00191 }
00192 
00193 void ACLJobs::GetUserRightsJob::slotInfoMessage( KIO::Job*, const QString& str )
00194 {
00195   // Parse the result
00196   m_permissions = IMAPRightsToPermission( str );
00197 }
00198 
00199 ACLJobs::DeleteACLJob::DeleteACLJob( const KURL& url, const QString& userId,
00200                                      const QByteArray &packedArgs,
00201                                      bool showProgressInfo )
00202   : KIO::SimpleJob( url, KIO::CMD_SPECIAL, packedArgs, showProgressInfo ),
00203     mUserId( userId )
00204 {
00205 }
00206 
00208 
00209 ACLJobs::MultiSetACLJob::MultiSetACLJob( KIO::Slave* slave, const KURL& url, const ACLList& acl, bool showProgressInfo )
00210   : KIO::Job( showProgressInfo ),
00211     mSlave( slave ),
00212     mUrl( url ), mACLList( acl ), mACLListIterator( acl.begin() )
00213 {
00214   QTimer::singleShot(0, this, SLOT(slotStart()));
00215 }
00216 
00217 void ACLJobs::MultiSetACLJob::slotStart()
00218 {
00219   // Skip over unchanged entries
00220   while ( mACLListIterator != mACLList.end() && !(*mACLListIterator).changed )
00221     ++mACLListIterator;
00222 
00223   if ( mACLListIterator != mACLList.end() )
00224   {
00225     const ACLListEntry& entry = *mACLListIterator;
00226     KIO::Job* job = 0;
00227     if ( entry.permissions > -1 )
00228       job = setACL( mSlave, mUrl, entry.userId, entry.permissions );
00229     else
00230       job = deleteACL( mSlave, mUrl, entry.userId );
00231 
00232     addSubjob( job );
00233   } else { // done!
00234     emitResult();
00235   }
00236 }
00237 
00238 void ACLJobs::MultiSetACLJob::slotResult( KIO::Job *job )
00239 {
00240   if ( job->error() ) {
00241     KIO::Job::slotResult( job ); // will set the error and emit result(this)
00242     return;
00243   }
00244   subjobs.remove(job);
00245   const ACLListEntry& entry = *mACLListIterator;
00246   emit aclChanged( entry.userId, entry.permissions );
00247 
00248   // Move on to next one
00249   ++mACLListIterator;
00250   slotStart();
00251 }
00252 
00253 ACLJobs::MultiSetACLJob* ACLJobs::multiSetACL( KIO::Slave* slave, const KURL& url, const ACLList& acl )
00254 {
00255   return new MultiSetACLJob( slave, url, acl, false /*showProgressInfo*/ );
00256 }
00257 
00258 #include "acljobs.moc"
KDE Logo
This file is part of the documentation for kmail Library Version 3.3.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 22:43:37 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003