summaryrefslogtreecommitdiffstats
path: root/kopete/plugins/history/converter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kopete/plugins/history/converter.cpp')
-rw-r--r--kopete/plugins/history/converter.cpp341
1 files changed, 341 insertions, 0 deletions
diff --git a/kopete/plugins/history/converter.cpp b/kopete/plugins/history/converter.cpp
new file mode 100644
index 00000000..22f662bc
--- /dev/null
+++ b/kopete/plugins/history/converter.cpp
@@ -0,0 +1,341 @@
+//Olivier Goffart <ogoffart @ kde.org>
+// 2003 06 26
+
+#include "historyplugin.h" //just needed because we are a member of this class
+ // we don't use any history function here
+
+/**-----------------------------------------------------------
+ * CONVERTER from the old kopete history.
+ * it port history from kopete 0.6, 0.5 and above the actual
+ * this should be placed in a perl script handled by KConf_update
+ * but i need to acess to some info i don't have with perl, like
+ * the accountId, to know each protocol id, and more
+ *-----------------------------------------------------------*/
+
+#include "kopetepluginmanager.h"
+#include "kopeteaccount.h"
+#include "kopeteaccountmanager.h"
+#include "kopetecontact.h"
+#include "kopetemessage.h"
+#include "kopeteprotocol.h"
+#include "kopeteuiglobal.h"
+
+#include <kconfig.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kmessagebox.h>
+#include <kprogress.h>
+#include <kapplication.h>
+#include <ksavefile.h>
+#include <qdir.h>
+#include <qdom.h>
+#include <qregexp.h>
+
+#define CBUFLENGTH 512 // buffer length for fgets()
+
+void HistoryPlugin::convertOldHistory()
+{
+ bool deleteFiles= KMessageBox::questionYesNo( Kopete::UI::Global::mainWidget(),
+ i18n( "Would you like to remove old history files?" ) , i18n( "History Converter" ), KStdGuiItem::del(), i18n("Keep") ) == KMessageBox::Yes;
+
+ KProgressDialog *progressDlg=new KProgressDialog(Kopete::UI::Global::mainWidget() , "history_progress_dlg" , i18n( "History converter" ) ,
+ QString::null , true); //modal to make sure the user will not doing stupid things (we have a kapp->processEvents())
+ progressDlg->setAllowCancel(false); //because i am too lazy to allow to cancel
+
+
+ QString kopetedir=locateLocal( "data", QString::fromLatin1( "kopete"));
+ QDir d( kopetedir ); //d should point to ~/.kde/share/apps/kopete/
+
+ d.setFilter( QDir::Dirs );
+
+ const QFileInfoList *list = d.entryInfoList();
+ QFileInfoListIterator it( *list );
+ QFileInfo *fi;
+ while ( (fi = it.current()) != 0 )
+ {
+ QString protocolId;
+ QString accountId;
+
+ if( Kopete::Protocol *p = dynamic_cast<Kopete::Protocol *>( Kopete::PluginManager::self()->plugin( fi->fileName() ) ) )
+ {
+ protocolId=p->pluginId();
+ QDictIterator<Kopete::Account> it(Kopete::AccountManager::self()->accounts(p));
+ Kopete::Account *a = it.current();
+ if(a)
+ accountId=a->accountId();
+ }
+
+ if(accountId.isNull() || protocolId.isNull())
+ {
+ if(fi->fileName() == "MSNProtocol" || fi->fileName() == "msn_logs" )
+ {
+ protocolId="MSNProtocol";
+ KGlobal::config()->setGroup("MSN");
+ accountId=KGlobal::config()->readEntry( "UserID" );
+ }
+ else if(fi->fileName() == "ICQProtocol" || fi->fileName() == "icq_logs" )
+ {
+ protocolId="ICQProtocol";
+ KGlobal::config()->setGroup("ICQ");
+ accountId=KGlobal::config()->readEntry( "UIN" );
+ }
+ else if(fi->fileName() == "AIMProtocol" || fi->fileName() == "aim_logs" )
+ {
+ protocolId="AIMProtocol";
+ KGlobal::config()->setGroup("AIM");
+ accountId=KGlobal::config()->readEntry( "UserID" );
+ }
+ else if(fi->fileName() == "OscarProtocol" )
+ {
+ protocolId="AIMProtocol";
+ KGlobal::config()->setGroup("OSCAR");
+ accountId=KGlobal::config()->readEntry( "UserID" );
+ }
+ else if(fi->fileName() == "JabberProtocol" || fi->fileName() == "jabber_logs")
+ {
+ protocolId="JabberProtocol";
+ KGlobal::config()->setGroup("Jabber");
+ accountId=KGlobal::config()->readEntry( "UserID" );
+ }
+ //TODO: gadu, wp
+ }
+
+ if(!protocolId.isEmpty() || !accountId.isEmpty())
+ {
+ QDir d2( fi->absFilePath() );
+ d2.setFilter( QDir::Files );
+ d2.setNameFilter("*.log");
+ const QFileInfoList *list = d2.entryInfoList();
+ QFileInfoListIterator it2( *list );
+ QFileInfo *fi2;
+
+ progressDlg->progressBar()->reset();
+ progressDlg->progressBar()->setTotalSteps(d2.count());
+ progressDlg->setLabel(i18n("Parsing old history in %1").arg(fi->fileName()));
+ progressDlg->show(); //if it was not already showed...
+
+ while ( (fi2 = it2.current()) != 0 )
+ {
+ //we assume that all "-" are dots. (like in hotmail.com)
+ QString contactId=fi2->fileName().replace(".log" , QString::null).replace("-" , ".");
+
+ if(!contactId.isEmpty() )
+ {
+ progressDlg->setLabel(i18n("Parsing old history in %1:\n%2").arg(fi->fileName()).arg(contactId));
+ kapp->processEvents(0); //make sure the text is updated in the progressDlg
+
+ int month=0;
+ int year=0;
+ QDomDocument doc;
+ QDomElement docElem;
+
+ QDomElement msgelement;
+ QDomNode node;
+ QDomDocument xmllist;
+ Kopete::Message::MessageDirection dir;
+ QString body, date, nick;
+ QString buffer, msgBlock;
+ char cbuf[CBUFLENGTH]; // buffer for the log file
+
+ QString logFileName = fi2->absFilePath();
+
+ // open the file
+ FILE *f = fopen(QFile::encodeName(logFileName), "r");
+
+ // create a new <message> block
+ while ( ! feof( f ) )
+ {
+ fgets(cbuf, CBUFLENGTH, f);
+ buffer = QString::fromUtf8(cbuf);
+
+ while ( strchr(cbuf, '\n') == NULL && !feof(f) )
+ {
+ fgets( cbuf, CBUFLENGTH, f );
+ buffer += QString::fromUtf8(cbuf);
+ }
+
+ if( buffer.startsWith( QString::fromLatin1( "<message " ) ) )
+ {
+ msgBlock = buffer;
+
+ // find the end of the message block
+ while( !feof( f ) && buffer != QString::fromLatin1( "</message>\n" ) /*strcmp("</message>\n", cbuf )*/ )
+ {
+ fgets(cbuf, CBUFLENGTH, f);
+ buffer = QString::fromUtf8(cbuf);
+
+ while ( strchr(cbuf, '\n') == NULL && !feof(f) )
+ {
+ fgets( cbuf, CBUFLENGTH, f );
+ buffer += QString::fromUtf8(cbuf);
+ }
+ msgBlock.append(buffer);
+ }
+
+ // now let's work on this new block
+ xmllist.setContent(msgBlock, false);
+ msgelement = xmllist.documentElement();
+ node = msgelement.firstChild();
+
+ if( msgelement.attribute( QString::fromLatin1( "direction" ) ) == QString::fromLatin1( "inbound" ) )
+ dir = Kopete::Message::Inbound;
+ else
+ dir = Kopete::Message::Outbound;
+
+ // Read all the elements.
+ QString tagname;
+ QDomElement element;
+
+ while ( ! node.isNull() )
+ {
+ if ( node.isElement() )
+ {
+ element = node.toElement();
+ tagname = element.tagName();
+
+ if( tagname == QString::fromLatin1( "srcnick" ) )
+ nick = element.text();
+
+ else if( tagname == QString::fromLatin1( "date" ) )
+ date = element.text();
+ else if( tagname == QString::fromLatin1( "body" ) )
+ body = element.text().stripWhiteSpace();
+ }
+
+ node = node.nextSibling();
+ }
+ //FIXME!! The date in logs writed with kopete running with QT 3.0 is Localised.
+ // so QT can't parse it correctly.
+ QDateTime dt=QDateTime::fromString(date);
+ if(dt.date().month() != month || dt.date().year() != year)
+ {
+ if(!docElem.isNull())
+ {
+ QDate date(year,month,1);
+ QString name = protocolId.replace( QRegExp( QString::fromLatin1( "[./~?*]" ) ), QString::fromLatin1( "-" ) ) +
+ QString::fromLatin1( "/" ) +
+ contactId.replace( QRegExp( QString::fromLatin1( "[./~?*]" ) ), QString::fromLatin1( "-" ) ) +
+ date.toString(".yyyyMM");
+ KSaveFile file( locateLocal( "data", QString::fromLatin1( "kopete/logs/" ) + name+ QString::fromLatin1( ".xml" ) ) );
+ if( file.status() == 0 )
+ {
+ QTextStream *stream = file.textStream();
+ //stream->setEncoding( QTextStream::UnicodeUTF8 ); //???? oui ou non?
+ doc.save( *stream , 1 );
+ file.close();
+ }
+ }
+
+
+ month=dt.date().month();
+ year=dt.date().year();
+ docElem=QDomElement();
+ }
+
+ if(docElem.isNull())
+ {
+ doc=QDomDocument("Kopete-History");
+ docElem= doc.createElement( "kopete-history" );
+ docElem.setAttribute ( "version" , "0.7" );
+ doc.appendChild( docElem );
+ QDomElement headElem = doc.createElement( "head" );
+ docElem.appendChild( headElem );
+ QDomElement dateElem = doc.createElement( "date" );
+ dateElem.setAttribute( "year", QString::number(year) );
+ dateElem.setAttribute( "month", QString::number(month) );
+ headElem.appendChild(dateElem);
+ QDomElement myselfElem = doc.createElement( "contact" );
+ myselfElem.setAttribute( "type", "myself" );
+ myselfElem.setAttribute( "contactId", accountId );
+ headElem.appendChild(myselfElem);
+ QDomElement contactElem = doc.createElement( "contact" );
+ contactElem.setAttribute( "contactId", contactId );
+ headElem.appendChild(contactElem);
+ QDomElement importElem = doc.createElement( "imported" );
+ importElem.setAttribute( "from", fi->fileName() );
+ importElem.setAttribute( "date", QDateTime::currentDateTime().toString() );
+ headElem.appendChild(importElem);
+ }
+ QDomElement msgElem = doc.createElement( "msg" );
+ msgElem.setAttribute( "in", dir==Kopete::Message::Outbound ? "0" : "1" );
+ msgElem.setAttribute( "from", dir==Kopete::Message::Outbound ? accountId : contactId );
+ msgElem.setAttribute( "nick", nick ); //do we have to set this?
+ msgElem.setAttribute( "time", QString::number(dt.date().day()) + " " + QString::number(dt.time().hour()) + ":" + QString::number(dt.time().minute()) );
+ QDomText msgNode = doc.createTextNode( body.stripWhiteSpace() );
+ docElem.appendChild( msgElem );
+ msgElem.appendChild( msgNode );
+ }
+ }
+
+ fclose( f );
+ if(deleteFiles)
+ d2.remove(fi2->fileName() , false);
+
+ if(!docElem.isNull())
+ {
+ QDate date(year,month,1);
+ QString name = protocolId.replace( QRegExp( QString::fromLatin1( "[./~?*]" ) ), QString::fromLatin1( "-" ) ) +
+ QString::fromLatin1( "/" ) +
+ contactId.replace( QRegExp( QString::fromLatin1( "[./~?*]" ) ), QString::fromLatin1( "-" ) ) +
+ date.toString(".yyyyMM");
+ KSaveFile file( locateLocal( "data", QString::fromLatin1( "kopete/logs/" ) + name+ QString::fromLatin1( ".xml" ) ) );
+ if( file.status() == 0 )
+ {
+ QTextStream *stream = file.textStream();
+ //stream->setEncoding( QTextStream::UnicodeUTF8 ); //???? oui ou non?
+ doc.save( *stream ,1 );
+ file.close();
+ }
+ }
+
+ }
+ progressDlg->progressBar()->setProgress(progressDlg->progressBar()->progress()+1);
+ ++it2;
+ }
+ }
+ ++it;
+ }
+ delete progressDlg;
+
+}
+
+
+bool HistoryPlugin::detectOldHistory()
+{
+ KGlobal::config()->setGroup("History Plugin");
+ QString version=KGlobal::config()->readEntry( "Version" ,"0.6" );
+
+ if(version != "0.6")
+ return false;
+
+
+ QDir d( locateLocal( "data", QString::fromLatin1( "kopete/logs")) );
+ d.setFilter( QDir::Dirs );
+ if(d.count() >= 3) // '.' and '..' are included
+ return false; //the new history already exists
+
+ QDir d2( locateLocal( "data", QString::fromLatin1( "kopete")) );
+ d2.setFilter( QDir::Dirs );
+ const QFileInfoList *list = d2.entryInfoList();
+ QFileInfoListIterator it( *list );
+ QFileInfo *fi;
+ while ( (fi = it.current()) != 0 )
+ {
+ if( dynamic_cast<Kopete::Protocol *>( Kopete::PluginManager::self()->plugin( fi->fileName() ) ) )
+ return true;
+
+ if(fi->fileName() == "MSNProtocol" || fi->fileName() == "msn_logs" )
+ return true;
+ else if(fi->fileName() == "ICQProtocol" || fi->fileName() == "icq_logs" )
+ return true;
+ else if(fi->fileName() == "AIMProtocol" || fi->fileName() == "aim_logs" )
+ return true;
+ else if(fi->fileName() == "OscarProtocol" )
+ return true;
+ else if(fi->fileName() == "JabberProtocol" || fi->fileName() == "jabber_logs")
+ return true;
+ ++it;
+ }
+ return false;
+}