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 KDEsuClient * m_kdesuClient; 00085 }; 00086 00087 SessionData::AuthDataList::AuthDataList() 00088 { 00089 m_kdesuClient = new KDEsuClient; 00090 setAutoDelete(true); 00091 } 00092 00093 SessionData::AuthDataList::~AuthDataList() 00094 { 00095 purgeCachedData(); 00096 delete m_kdesuClient; 00097 m_kdesuClient = 0; 00098 } 00099 00100 void SessionData::AuthDataList::addData( SessionData::AuthData* d ) 00101 { 00102 QPtrListIterator<SessionData::AuthData> it ( *this ); 00103 for ( ; it.current(); ++it ) 00104 { 00105 if ( it.current()->isKeyMatch( d->key ) ) 00106 return; 00107 } 00108 registerAuthData( d ); 00109 append( d ); 00110 } 00111 00112 void SessionData::AuthDataList::removeData( const QCString& gkey ) 00113 { 00114 QPtrListIterator<SessionData::AuthData> it( *this ); 00115 for( ; it.current(); ++it ) 00116 { 00117 if ( it.current()->isGroupMatch(gkey) && pingCacheDaemon() ) 00118 { 00119 unregisterAuthData( it.current() ); 00120 remove( it.current() ); 00121 } 00122 } 00123 } 00124 00125 bool SessionData::AuthDataList::pingCacheDaemon() 00126 { 00127 Q_ASSERT(m_kdesuClient); 00128 00129 int success = m_kdesuClient->ping(); 00130 if( success == -1 ) 00131 { 00132 success = m_kdesuClient->startServer(); 00133 if( success == -1 ) 00134 return false; 00135 } 00136 return true; 00137 } 00138 00139 void SessionData::AuthDataList::registerAuthData( SessionData::AuthData* d ) 00140 { 00141 if( !pingCacheDaemon() ) 00142 return; 00143 00144 bool ok; 00145 QCString ref_key = d->key + "-refcount"; 00146 int count = m_kdesuClient->getVar(ref_key).toInt( &ok ); 00147 if( ok ) 00148 { 00149 QCString val; 00150 val.setNum( count+1 ); 00151 m_kdesuClient->setVar( ref_key, val, 0, d->group ); 00152 } 00153 else 00154 m_kdesuClient->setVar( ref_key, "1", 0, d->group ); 00155 } 00156 00157 void SessionData::AuthDataList::unregisterAuthData( SessionData::AuthData* d ) 00158 { 00159 if ( !d || d->persist ) 00160 return; 00161 00162 bool ok; 00163 int count; 00164 QCString ref_key = d->key + "-refcount"; 00165 00166 count = m_kdesuClient->getVar( ref_key ).toInt( &ok ); 00167 if ( ok ) 00168 { 00169 if ( count > 1 ) 00170 { 00171 QCString val; 00172 val.setNum(count-1); 00173 m_kdesuClient->setVar( ref_key, val, 0, d->group ); 00174 } 00175 else 00176 { 00177 m_kdesuClient->delVars(d->key); 00178 } 00179 } 00180 } 00181 00182 void SessionData::AuthDataList::purgeCachedData() 00183 { 00184 if ( !isEmpty() && pingCacheDaemon() ) 00185 { 00186 QPtrListIterator<SessionData::AuthData> it( *this ); 00187 for ( ; it.current(); ++it ) 00188 unregisterAuthData( it.current() ); 00189 } 00190 } 00191 00192 /********************************* SessionData ****************************/ 00193 00194 class SessionData::SessionDataPrivate 00195 { 00196 public: 00197 SessionDataPrivate() { 00198 useCookie = true; 00199 initDone = false; 00200 } 00201 00202 bool initDone; 00203 bool useCookie; 00204 QString charsets; 00205 QString language; 00206 }; 00207 00208 SessionData::SessionData() 00209 { 00210 authData = 0; 00211 d = new SessionDataPrivate; 00212 } 00213 00214 SessionData::~SessionData() 00215 { 00216 delete d; 00217 delete authData; 00218 d = 0L; 00219 authData = 0L; 00220 } 00221 00222 void SessionData::configDataFor( MetaData &configData, const QString &proto, 00223 const QString & ) 00224 { 00225 if ( (proto.find("http", 0, false) == 0 ) || 00226 (proto.find("webdav", 0, false) == 0) ) 00227 { 00228 if (!d->initDone) 00229 reset(); 00230 00231 // These might have already been set so check first 00232 // to make sure that we do not trumpt settings sent 00233 // by apps or end-user. 00234 if ( configData["Cookies"].isEmpty() ) 00235 configData["Cookies"] = d->useCookie ? "true" : "false"; 00236 if ( configData["Languages"].isEmpty() ) 00237 configData["Languages"] = d->language; 00238 if ( configData["Charsets"].isEmpty() ) 00239 configData["Charsets"] = d->charsets; 00240 if ( configData["CacheDir"].isEmpty() ) 00241 configData["CacheDir"] = KGlobal::dirs()->saveLocation("cache", "http"); 00242 if ( configData["UserAgent"].isEmpty() ) 00243 { 00244 configData["UserAgent"] = KProtocolManager::defaultUserAgent(); 00245 } 00246 } 00247 } 00248 00249 void SessionData::reset() 00250 { 00251 d->initDone = true; 00252 // Get Cookie settings... 00253 KConfig* cfg = new KConfig("kcookiejarrc", true, false); 00254 cfg->setGroup( "Cookie Policy" ); 00255 d->useCookie = cfg->readBoolEntry( "Cookies", true ); 00256 delete cfg; 00257 00258 static const QString & english = KGlobal::staticQString( "en" ); 00259 00260 // Get language settings... 00261 QStringList languageList = KGlobal::locale()->languagesTwoAlpha(); 00262 QStringList::Iterator it = languageList.find( QString::fromLatin1("C") ); 00263 if ( it != languageList.end() ) 00264 { 00265 if ( languageList.contains( english ) > 0 ) 00266 languageList.remove( it ); 00267 else 00268 (*it) = english; 00269 } 00270 if ( !languageList.contains( english ) ) 00271 languageList.append( english ); 00272 00273 d->language = languageList.join( ", " ); 00274 00275 d->charsets = QString::fromLatin1(QTextCodec::codecForLocale()->mimeName()).lower(); 00276 KProtocolManager::reparseConfiguration(); 00277 } 00278 00279 void SessionData::slotAuthData( const QCString& key, const QCString& gkey, 00280 bool keep ) 00281 { 00282 if (!authData) 00283 authData = new AuthDataList; 00284 authData->addData( new SessionData::AuthData(key, gkey, keep) ); 00285 } 00286 00287 void SessionData::slotDelAuthData( const QCString& gkey ) 00288 { 00289 if (!authData) 00290 return; 00291 authData->removeData( gkey ); 00292 } 00293 00294 void SessionData::virtual_hook( int, void* ) 00295 { /*BASE::virtual_hook( id, data );*/ } 00296 00297 }
KDE Logo
This file is part of the documentation for kio Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Mon Aug 30 22:54:43 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003