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.
tdenetwork/kopete/kopete/tdeconf_update/kopete-account-tdeconf_upda...

245 lines
6.4 KiB

/*
tdeconf_update app for migrating kopete 0.6.x accounts to 0.7. Code is
not up to my normal standards, but it does the job, and since it's
supposed to run exactly once on each system that's good enough for me :)
Copyright (c) 2003 by Martijn Klingens <klingens@kde.org>
Kopete (c) 2002-2003 by the Kopete developers <kopete-devel@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 as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
*************************************************************************
*/
#include <tqmap.h>
#include <tqtextstream.h>
#include <tqregexp.h>
static TQTextStream qcin ( stdin, IO_ReadOnly );
static TQTextStream qcout( stdout, IO_WriteOnly );
static TQTextStream qcerr( stderr, IO_WriteOnly );
// Group cache. Yes, I know global vars are ugly :)
bool needFlush = false;
TQString accountId;
TQString password;
TQString autoConnect;
TQString protocol;
TQMap<TQString, TQString> pluginData;
// Global vars to hold separate IRC vars until we have read all of them
TQString ircNick;
TQString ircServer;
TQString ircPort;
/*
* Function for (en/de)crypting strings for config file, taken from KMail
* Author: Stefan Taferner <taferner@alpin.or.at>
*/
TQString cryptStr(const TQString &aStr)
{
TQString result;
for (unsigned int i = 0; i < aStr.length(); i++)
result += (aStr[i].unicode() < 0x20) ? aStr[i] :
TQChar(0x1001F - aStr[i].unicode());
return result;
}
void parseGroup( const TQString &group, const TQString &rawLine )
{
// Groups that are converted can almost certainly be removed entirely
if ( group == "MSN" || group == "ICQ" || group == "Oscar" || group == "Gadu" || group == "Jabber" || group == "IRC" )
{
accountId = "EMPTY";
autoConnect = "true";
if ( group == "Oscar" )
protocol = "AIMProtocol";
else
protocol = group + "Protocol";
password = TQString();
pluginData.clear();
needFlush = true;
qcout << "# DELETEGROUP [" << group << "]" << endl;
}
else
{
// Groups we don't convert. Output the raw line instead.
qcout << rawLine << endl;
}
}
void parseKey( const TQString &group, const TQString &key, const TQString &value, const TQString &rawLine )
{
//qcerr << "*** group='" << group << "'" << endl;
if ( group == "MSN" )
{
if ( key == "UserID" )
accountId = value;
else if ( key == "Password" )
password = value;
else if ( key == "AutoConnect" )
autoConnect = value;
else if ( key == "Nick" )
pluginData[ "displayName" ] = value;
// All other keys are ignored for MSN, as these apply to stuff that's
// now in libkopete (and the main app) instead.
}
else if ( group == "ICQ" )
{
if ( key == "UIN" )
accountId = value;
else if ( key == "Password" )
password = value;
else if ( key == "AutoConnect" )
autoConnect = value;
else if ( key == "Nick" )
pluginData[ "NickName" ] = value;
else if ( key == "Server" )
pluginData[ key ] = value;
else if ( key == "Port" )
pluginData[ key ] = value;
}
else if ( group == "Oscar" )
{
if ( key == "ScreenName" )
accountId = value;
else if ( key == "Password" )
password = value;
else if ( key == "Server" )
pluginData[ key ] = value;
else if ( key == "Port" )
pluginData[ key ] = value;
}
else if ( group == "Jabber" )
{
if ( key == "UserID" )
accountId = value;
else if ( key == "Password" )
password = value;
if ( key == "Server" ||
key == "Port" || key == "UseSSL" || key == "Resource" )
pluginData[ key ] = value;
}
else if ( group == "Gadu" )
{
if ( key == "UIN" )
accountId = value;
else if ( key == "Password" )
password = value;
else if ( key == "Nick" )
pluginData[ "displayName" ] = value;
}
else if ( group == "IRC" )
{
if ( key == "Nickname" )
ircNick = value;
if ( key == "Server" )
ircServer = value;
if ( key == "Port" )
ircPort = value;
if ( accountId == "EMPTY" &&
!ircNick.isEmpty( ) && !ircServer.isEmpty() &&
!ircPort.isEmpty() )
{
accountId = TQString::fromLatin1( "%1@%2:%3" ).arg( ircNick, ircServer, ircPort );
}
}
/*
fixme: insert all other plugins here - martijn
*/
else if ( key == "Modules" )
{
TQString newValue = value;
newValue.replace ( ".plugin", ".desktop" );
qcout << "Plugins=" << newValue;
}
else
{
// groups we don't convert. output the raw line instead.
qcout << rawLine << endl;
}
}
void flushData( const TQString &group )
{
qcout << "[Account_" << protocol << "_" << accountId << "]" << endl;
qcout << "Protocol=" << protocol << endl;
if( group == "Jabber" )
qcout << "AccountId=" << accountId << "@" << pluginData["Server"] << endl;
else
qcout << "AccountId=" << accountId << endl;
qcout << "Password=" << cryptStr( password ) << endl;
qcout << "AutoConnect=" << autoConnect << endl;
TQMap<TQString, TQString>::ConstIterator it;
for ( it = pluginData.begin(); it != pluginData.end(); ++it )
qcout << "PluginData_" << protocol << "_" << it.key() << "=" << it.data() << endl;
}
int main()
{
qcin.setEncoding( TQTextStream::UnicodeUTF8 );
qcout.setEncoding( TQTextStream::UnicodeUTF8 );
TQString curGroup;
TQRegExp groupRegExp( "^\\[(.*)\\]" );
TQRegExp keyRegExp( "^([a-zA-Z0-9:, _-]*)\\s*=\\s*(.*)\\s*" );
TQRegExp commentRegExp( "^(#.*)?$" );
while ( !qcin.atEnd() )
{
TQString line = qcin.readLine();
if ( commentRegExp.exactMatch( line ) )
{
// We found a comment, leave unchanged
qcout << line << endl;
}
else if ( groupRegExp.exactMatch( line ) )
{
// We found the start of a group, parse it
if ( needFlush )
{
// ... but we were already working on a group, so finish what
// we were doing - flush existing group first
flushData ( curGroup );
needFlush = false;
}
curGroup = groupRegExp.capturedTexts()[ 1 ];
parseGroup( curGroup, line );
}
else if ( keyRegExp.exactMatch( line ) )
{
// We found the a key line
parseKey( curGroup, keyRegExp.capturedTexts()[ 1 ], keyRegExp.capturedTexts()[ 2 ], line );
}
else
{
qcerr << "** Unknown input line: " << line << endl;
}
}
if ( needFlush )
flushData ( curGroup );
return 0;
}