You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/kio/kio/sessiondata.cpp

312 lines
7.2 KiB

/* This file is part of the KDE project
Copyright (C) 2000 Dawit Alemayehu <adawit@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License (LGPL) as published by the Free Software Foundation;
either version 2 of the License, or (at your option) any
later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <tqptrlist.h>
#include <tqtextcodec.h>
#include <kdebug.h>
#include <kconfig.h>
#include <kglobal.h>
#include <klocale.h>
#include <kcharsets.h>
#include <dcopclient.h>
#include <kprotocolmanager.h>
#include <kstandarddirs.h>
#include <tdesu/client.h>
#include <kio/slaveconfig.h>
#include <kio/http_slave_defaults.h>
#include "sessiondata.h"
#include "sessiondata.moc"
namespace KIO {
/***************************** SessionData::AuthData ************************/
struct SessionData::AuthData
{
public:
AuthData() {}
AuthData(const TQCString& k, const TQCString& g, bool p) {
key = k;
group = g;
persist = p;
}
bool isKeyMatch( const TQCString& val ) const {
return (val==key);
}
bool isGroupMatch( const TQCString& val ) const {
return (val==group);
}
TQCString key;
TQCString group;
bool persist;
};
/************************* SessionData::AuthDataList ****************************/
class SessionData::AuthDataList : public TQPtrList<SessionData::AuthData>
{
public:
AuthDataList();
~AuthDataList();
void addData( SessionData::AuthData* );
void removeData( const TQCString& );
bool pingCacheDaemon();
void registerAuthData( SessionData::AuthData* );
void unregisterAuthData( SessionData::AuthData* );
void purgeCachedData();
private:
#ifdef Q_OS_UNIX
KDEsuClient * m_tdesuClient;
#endif
};
SessionData::AuthDataList::AuthDataList()
{
#ifdef Q_OS_UNIX
m_tdesuClient = new KDEsuClient;
#endif
setAutoDelete(true);
}
SessionData::AuthDataList::~AuthDataList()
{
purgeCachedData();
#ifdef Q_OS_UNIX
delete m_tdesuClient;
m_tdesuClient = 0;
#endif
}
void SessionData::AuthDataList::addData( SessionData::AuthData* d )
{
TQPtrListIterator<SessionData::AuthData> it ( *this );
for ( ; it.current(); ++it )
{
if ( it.current()->isKeyMatch( d->key ) )
return;
}
registerAuthData( d );
append( d );
}
void SessionData::AuthDataList::removeData( const TQCString& gkey )
{
TQPtrListIterator<SessionData::AuthData> it( *this );
for( ; it.current(); ++it )
{
if ( it.current()->isGroupMatch(gkey) && pingCacheDaemon() )
{
unregisterAuthData( it.current() );
remove( it.current() );
}
}
}
bool SessionData::AuthDataList::pingCacheDaemon()
{
#ifdef Q_OS_UNIX
Q_ASSERT(m_tdesuClient);
int success = m_tdesuClient->ping();
if( success == -1 )
{
success = m_tdesuClient->startServer();
if( success == -1 )
return false;
}
return true;
#else
return false;
#endif
}
void SessionData::AuthDataList::registerAuthData( SessionData::AuthData* d )
{
if( !pingCacheDaemon() )
return;
#ifdef Q_OS_UNIX
bool ok;
TQCString ref_key = d->key + "-refcount";
int count = m_tdesuClient->getVar(ref_key).toInt( &ok );
if( ok )
{
TQCString val;
val.setNum( count+1 );
m_tdesuClient->setVar( ref_key, val, 0, d->group );
}
else
m_tdesuClient->setVar( ref_key, "1", 0, d->group );
#endif
}
void SessionData::AuthDataList::unregisterAuthData( SessionData::AuthData* d )
{
if ( !d || d->persist )
return;
bool ok;
int count;
TQCString ref_key = d->key + "-refcount";
#ifdef Q_OS_UNIX
count = m_tdesuClient->getVar( ref_key ).toInt( &ok );
if ( ok )
{
if ( count > 1 )
{
TQCString val;
val.setNum(count-1);
m_tdesuClient->setVar( ref_key, val, 0, d->group );
}
else
{
m_tdesuClient->delVars(d->key);
}
}
#endif
}
void SessionData::AuthDataList::purgeCachedData()
{
if ( !isEmpty() && pingCacheDaemon() )
{
TQPtrListIterator<SessionData::AuthData> it( *this );
for ( ; it.current(); ++it )
unregisterAuthData( it.current() );
}
}
/********************************* SessionData ****************************/
class SessionData::SessionDataPrivate
{
public:
SessionDataPrivate() {
useCookie = true;
initDone = false;
}
bool initDone;
bool useCookie;
TQString charsets;
TQString language;
};
SessionData::SessionData()
{
authData = 0;
d = new SessionDataPrivate;
}
SessionData::~SessionData()
{
delete d;
delete authData;
d = 0L;
authData = 0L;
}
void SessionData::configDataFor( MetaData &configData, const TQString &proto,
const TQString & )
{
if ( (proto.find("http", 0, false) == 0 ) ||
(proto.find("webdav", 0, false) == 0) )
{
if (!d->initDone)
reset();
// These might have already been set so check first
// to make sure that we do not trumpt settings sent
// by apps or end-user.
if ( configData["Cookies"].isEmpty() )
configData["Cookies"] = d->useCookie ? "true" : "false";
if ( configData["Languages"].isEmpty() )
configData["Languages"] = d->language;
if ( configData["Charsets"].isEmpty() )
configData["Charsets"] = d->charsets;
if ( configData["CacheDir"].isEmpty() )
configData["CacheDir"] = KGlobal::dirs()->saveLocation("cache", "http");
if ( configData["UserAgent"].isEmpty() )
{
configData["UserAgent"] = KProtocolManager::defaultUserAgent();
}
}
}
void SessionData::reset()
{
d->initDone = true;
// Get Cookie settings...
KConfig* cfg = new KConfig("kcookiejarrc", true, false);
cfg->setGroup( "Cookie Policy" );
d->useCookie = cfg->readBoolEntry( "Cookies", true );
delete cfg;
static const TQString & english = KGlobal::staticQString( "en" );
// Get language settings...
TQStringList languageList = KGlobal::locale()->languagesTwoAlpha();
TQStringList::Iterator it = languageList.find( TQString::fromLatin1("C") );
if ( it != languageList.end() )
{
if ( languageList.contains( english ) > 0 )
languageList.remove( it );
else
(*it) = english;
}
if ( !languageList.contains( english ) )
languageList.append( english );
d->language = languageList.join( ", " );
d->charsets = TQString::fromLatin1(TQTextCodec::codecForLocale()->mimeName()).lower();
KProtocolManager::reparseConfiguration();
}
void SessionData::slotAuthData( const TQCString& key, const TQCString& gkey,
bool keep )
{
if (!authData)
authData = new AuthDataList;
authData->addData( new SessionData::AuthData(key, gkey, keep) );
}
void SessionData::slotDelAuthData( const TQCString& gkey )
{
if (!authData)
return;
authData->removeData( gkey );
}
void SessionData::virtual_hook( int, void* )
{ /*BASE::virtual_hook( id, data );*/ }
}