• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kio

sessiondata.cpp

Go to the documentation of this file.
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., 51 Franklin Street,
00018    Fifth Floor, Boston, MA 02110-1301, 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 }

kio

Skip menu "kio"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • dcop
  • DNSSD
  • interfaces
  • Kate
  • kconf_update
  • KDECore
  • KDED
  • kdefx
  • KDEsu
  • kdeui
  • KDocTools
  • KHTML
  • KImgIO
  • KInit
  • kio
  • kioslave
  • KJS
  • KNewStuff
  • KParts
  • KUtils
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal