kio Library API Documentation

sessiondata.cpp

00001 /* This file is part of the KDE project 00002 Copyright (C) 2000 Dawit Alemayehu <adawit@kde.org> 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Lesser General Public 00006 License (LGPL) as published by the Free Software Foundation; 00007 either version 2 of the License, or (at your option) any 00008 later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Lesser General Public 00016 License along with this library; see the file COPYING.LIB. If not, 00017 write to the Free Software Foundation, Inc., 59 Temple Place - 00018 Suite 330, Boston, MA 02111-1307, USA. 00019 */ 00020 00021 #include <qptrlist.h> 00022 #include <qtextcodec.h> 00023 00024 #include <kdebug.h> 00025 #include <kconfig.h> 00026 #include <kglobal.h> 00027 #include <klocale.h> 00028 #include <kcharsets.h> 00029 #include <dcopclient.h> 00030 #include <kprotocolmanager.h> 00031 #include <kstandarddirs.h> 00032 00033 #include <kdesu/client.h> 00034 #include <kio/slaveconfig.h> 00035 #include <kio/http_slave_defaults.h> 00036 00037 #include "sessiondata.h" 00038 #include "sessiondata.moc" 00039 00040 namespace KIO { 00041 00042 /***************************** SessionData::AuthData ************************/ 00043 struct SessionData::AuthData 00044 { 00045 00046 public: 00047 AuthData() {} 00048 00049 AuthData(const QCString& k, const QCString& g, bool p) { 00050 key = k; 00051 group = g; 00052 persist = p; 00053 } 00054 00055 bool isKeyMatch( const QCString& val ) const { 00056 return (val==key); 00057 } 00058 00059 bool isGroupMatch( const QCString& val ) const { 00060 return (val==group); 00061 } 00062 00063 QCString key; 00064 QCString group; 00065 bool persist; 00066 }; 00067 00068 /************************* SessionData::AuthDataList ****************************/ 00069 class SessionData::AuthDataList : public QPtrList<SessionData::AuthData> 00070 { 00071 public: 00072 AuthDataList(); 00073 ~AuthDataList(); 00074 00075 void addData( SessionData::AuthData* ); 00076 void removeData( const QCString& ); 00077 00078 bool pingCacheDaemon(); 00079 void registerAuthData( SessionData::AuthData* ); 00080 void unregisterAuthData( SessionData::AuthData* ); 00081 void purgeCachedData(); 00082 00083 private: 00084 #ifdef Q_OS_UNIX 00085 KDEsuClient * m_kdesuClient; 00086 #endif 00087 }; 00088 00089 SessionData::AuthDataList::AuthDataList() 00090 { 00091 #ifdef Q_OS_UNIX 00092 m_kdesuClient = new KDEsuClient; 00093 #endif 00094 setAutoDelete(true); 00095 } 00096 00097 SessionData::AuthDataList::~AuthDataList() 00098 { 00099 purgeCachedData(); 00100 #ifdef Q_OS_UNIX 00101 delete m_kdesuClient; 00102 m_kdesuClient = 0; 00103 #endif 00104 } 00105 00106 void SessionData::AuthDataList::addData( SessionData::AuthData* d ) 00107 { 00108 QPtrListIterator<SessionData::AuthData> it ( *this ); 00109 for ( ; it.current(); ++it ) 00110 { 00111 if ( it.current()->isKeyMatch( d->key ) ) 00112 return; 00113 } 00114 registerAuthData( d ); 00115 append( d ); 00116 } 00117 00118 void SessionData::AuthDataList::removeData( const QCString& gkey ) 00119 { 00120 QPtrListIterator<SessionData::AuthData> it( *this ); 00121 for( ; it.current(); ++it ) 00122 { 00123 if ( it.current()->isGroupMatch(gkey) && pingCacheDaemon() ) 00124 { 00125 unregisterAuthData( it.current() ); 00126 remove( it.current() ); 00127 } 00128 } 00129 } 00130 00131 bool SessionData::AuthDataList::pingCacheDaemon() 00132 { 00133 #ifdef Q_OS_UNIX 00134 Q_ASSERT(m_kdesuClient); 00135 00136 int success = m_kdesuClient->ping(); 00137 if( success == -1 ) 00138 { 00139 success = m_kdesuClient->startServer(); 00140 if( success == -1 ) 00141 return false; 00142 } 00143 return true; 00144 #else 00145 return false; 00146 #endif 00147 } 00148 00149 void SessionData::AuthDataList::registerAuthData( SessionData::AuthData* d ) 00150 { 00151 if( !pingCacheDaemon() ) 00152 return; 00153 00154 #ifdef Q_OS_UNIX 00155 bool ok; 00156 QCString ref_key = d->key + "-refcount"; 00157 int count = m_kdesuClient->getVar(ref_key).toInt( &ok ); 00158 if( ok ) 00159 { 00160 QCString val; 00161 val.setNum( count+1 ); 00162 m_kdesuClient->setVar( ref_key, val, 0, d->group ); 00163 } 00164 else 00165 m_kdesuClient->setVar( ref_key, "1", 0, d->group ); 00166 #endif 00167 } 00168 00169 void SessionData::AuthDataList::unregisterAuthData( SessionData::AuthData* d ) 00170 { 00171 if ( !d || d->persist ) 00172 return; 00173 00174 bool ok; 00175 int count; 00176 QCString ref_key = d->key + "-refcount"; 00177 00178 #ifdef Q_OS_UNIX 00179 count = m_kdesuClient->getVar( ref_key ).toInt( &ok ); 00180 if ( ok ) 00181 { 00182 if ( count > 1 ) 00183 { 00184 QCString val; 00185 val.setNum(count-1); 00186 m_kdesuClient->setVar( ref_key, val, 0, d->group ); 00187 } 00188 else 00189 { 00190 m_kdesuClient->delVars(d->key); 00191 } 00192 } 00193 #endif 00194 } 00195 00196 void SessionData::AuthDataList::purgeCachedData() 00197 { 00198 if ( !isEmpty() && pingCacheDaemon() ) 00199 { 00200 QPtrListIterator<SessionData::AuthData> it( *this ); 00201 for ( ; it.current(); ++it ) 00202 unregisterAuthData( it.current() ); 00203 } 00204 } 00205 00206 /********************************* SessionData ****************************/ 00207 00208 class SessionData::SessionDataPrivate 00209 { 00210 public: 00211 SessionDataPrivate() { 00212 useCookie = true; 00213 initDone = false; 00214 } 00215 00216 bool initDone; 00217 bool useCookie; 00218 QString charsets; 00219 QString language; 00220 }; 00221 00222 SessionData::SessionData() 00223 { 00224 authData = 0; 00225 d = new SessionDataPrivate; 00226 } 00227 00228 SessionData::~SessionData() 00229 { 00230 delete d; 00231 delete authData; 00232 d = 0L; 00233 authData = 0L; 00234 } 00235 00236 void SessionData::configDataFor( MetaData &configData, const QString &proto, 00237 const QString & ) 00238 { 00239 if ( (proto.find("http", 0, false) == 0 ) || 00240 (proto.find("webdav", 0, false) == 0) ) 00241 { 00242 if (!d->initDone) 00243 reset(); 00244 00245 // These might have already been set so check first 00246 // to make sure that we do not trumpt settings sent 00247 // by apps or end-user. 00248 if ( configData["Cookies"].isEmpty() ) 00249 configData["Cookies"] = d->useCookie ? "true" : "false"; 00250 if ( configData["Languages"].isEmpty() ) 00251 configData["Languages"] = d->language; 00252 if ( configData["Charsets"].isEmpty() ) 00253 configData["Charsets"] = d->charsets; 00254 if ( configData["CacheDir"].isEmpty() ) 00255 configData["CacheDir"] = KGlobal::dirs()->saveLocation("cache", "http"); 00256 if ( configData["UserAgent"].isEmpty() ) 00257 { 00258 configData["UserAgent"] = KProtocolManager::defaultUserAgent(); 00259 } 00260 } 00261 } 00262 00263 void SessionData::reset() 00264 { 00265 d->initDone = true; 00266 // Get Cookie settings... 00267 KConfig* cfg = new KConfig("kcookiejarrc", true, false); 00268 cfg->setGroup( "Cookie Policy" ); 00269 d->useCookie = cfg->readBoolEntry( "Cookies", true ); 00270 delete cfg; 00271 00272 static const QString & english = KGlobal::staticQString( "en" ); 00273 00274 // Get language settings... 00275 QStringList languageList = KGlobal::locale()->languagesTwoAlpha(); 00276 QStringList::Iterator it = languageList.find( QString::fromLatin1("C") ); 00277 if ( it != languageList.end() ) 00278 { 00279 if ( languageList.contains( english ) > 0 ) 00280 languageList.remove( it ); 00281 else 00282 (*it) = english; 00283 } 00284 if ( !languageList.contains( english ) ) 00285 languageList.append( english ); 00286 00287 d->language = languageList.join( ", " ); 00288 00289 d->charsets = QString::fromLatin1(QTextCodec::codecForLocale()->mimeName()).lower(); 00290 KProtocolManager::reparseConfiguration(); 00291 } 00292 00293 void SessionData::slotAuthData( const QCString& key, const QCString& gkey, 00294 bool keep ) 00295 { 00296 if (!authData) 00297 authData = new AuthDataList; 00298 authData->addData( new SessionData::AuthData(key, gkey, keep) ); 00299 } 00300 00301 void SessionData::slotDelAuthData( const QCString& gkey ) 00302 { 00303 if (!authData) 00304 return; 00305 authData->removeData( gkey ); 00306 } 00307 00308 void SessionData::virtual_hook( int, void* ) 00309 { /*BASE::virtual_hook( id, data );*/ } 00310 00311 }
KDE Logo
This file is part of the documentation for kio Library Version 3.4.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Apr 12 23:09:32 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003