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.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Oct 1 15:19:14 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003