# kio Library API Documentation

Overview | Class Hierarchy | Classes | Classes (annotated) | Members | Namespaces | Source Files

# 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 }

This file is part of the documentation for kio Library Version 3.4.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat Jun 11 20:24:07 2005 by doxygen 1.4.1 written by Dimitri van Heesch, © 1997-2003