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.
ktorrent/plugins/ipfilter/convertdialog.cpp

263 lines
7.3 KiB

/***************************************************************************
* Copyright (C) 2005 by Joris Guisson *
* joris.guisson@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "convertdialog.h"
#include <kapplication.h>
#include <kglobal.h>
#include <kstandarddirs.h>
#include <klocale.h>
#include <kurl.h>
#include <kmessagebox.h>
#include <kio/netaccess.h>
#include <kprogress.h>
#include <kmimetype.h>
#include <util/log.h>
#include <util/constants.h>
#include <torrent/globals.h>
#include <interfaces/coreinterface.h>
#include <tqfile.h>
#include <tqstringlist.h>
#include <tqtextstream.h>
#include <tqregexp.h>
#include <tqvalidator.h>
#include <tqlabel.h>
#include <tqpushbutton.h>
#include <tqevent.h>
#include <tqurloperator.h>
#include "antip2p.h"
using namespace bt;
namespace kt
{
Uint32 toUint32(TQString& ip)
{
bool test;
Uint32 ret = ip.section('.',0,0).toULongLong(&test);
ret <<= 8;
ret |= ip.section('.',1,1).toULong(&test);
ret <<= 8;
ret |= ip.section('.',2,2).toULong(&test);
ret <<= 8;
ret |= ip.section('.',3,3).toULong(&test);
return ret;
}
IPBlock RangeToBlock(const TQString& range)
{
IPBlock block;
TQStringList ls = TQStringList::split('-', range);
block.ip1 = toUint32(ls[0]);
block.ip2 = toUint32(ls[1]);
return block;
}
ConvertDialog::ConvertDialog( IPFilterPlugin* p, TQWidget *parent, const char *name )
: ConvertingDlg( parent, name )
{
m_plugin = p;
btnClose->setText(i18n("Convert"));
to_convert = true;
converting = false;
canceled = false;
kProgress1->setEnabled(false);
}
void ConvertDialog::convert()
{
TQFile source( KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.txt" );
TQFile target( KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat" );
TQFile temp( KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat.tmp" );
if(target.exists())
{
//make backup
KIO::NetAccess::file_copy(KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat", KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat.tmp", -1, true);
}
/* READ INPUT FILE */
TQValueList<IPBlock> list;
lbl_progress->setText( i18n( "Loading txt file..." ) );
label1->setText( i18n("Please wait...") );
ulong source_size = source.size();
btnClose->setEnabled( false );
converting = true;
int counter = 0;
if ( source.open( IO_ReadOnly ) )
{
TQTextStream stream( &source );
kProgress1->setEnabled(true);
int i = 0;
TQRegExp rx( "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}-[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" );
TQRegExpValidator v( rx, 0 );
int poz = 0;
while ( !stream.atEnd() )
{
if(canceled)
return;
KApplication::kApplication() ->processEvents();
TQString line = stream.readLine();
i += line.length() * sizeof( char ); //rough estimation of string size
kProgress1->setProgress( i * 100 / source_size );
++i;
TQString ip_part = line.section( ':' , -1 );
if ( v.validate( ip_part, poz ) != TQValidator::Acceptable )
continue;
else
++counter;
list += RangeToBlock(ip_part);
}
source.close();
}
else
{
Out(SYS_IPF|LOG_IMPORTANT) << "Cannot find level1 file" << endl;
btnClose->setEnabled( true );
btnClose->setText(i18n("&Close"));
label1->setText("");
to_convert = false;
converting = false;
return ;
}
if ( counter != 0 )
{
qHeapSort(list);
lbl_progress->setText( i18n( "Converting..." ) );
if ( m_plugin )
m_plugin->unloadAntiP2P();
ulong blocks = list.count();
/** WRITE TO OUTPUT **/
if ( !target.open( IO_WriteOnly ) )
{
Out(SYS_IPF|LOG_IMPORTANT) << "Unable to open file for writing" << endl;
btnClose->setEnabled( true );
btnClose->setText(i18n("&Close"));
label1->setText("");
to_convert = false;
converting = false;
return ;
}
Out(SYS_IPF|LOG_NOTICE) << "Loading finished. Starting conversion..." << endl;
TQValueList<IPBlock>::iterator iter;
int i = 0;
for (iter = list.begin(); iter != list.end(); ++iter, ++i)
{
IPBlock & block = *iter;
target.writeBlock( ( char* ) & block, sizeof( IPBlock ) );
if ( i % 1000 == 0 )
{
kProgress1->setProgress( ( int ) 100 * i / blocks );
if ( i % 10000 == 0 )
Out(SYS_IPF|LOG_DEBUG) << "Block " << i << " written." << endl;
}
KApplication::kApplication()->processEvents();
if(canceled)
return;
}
kProgress1->setProgress(100);
Out(SYS_IPF|LOG_NOTICE) << "Finished converting." << endl;
lbl_progress->setText( i18n( "File converted." ) );
target.close();
}
else
{
lbl_progress->setText( "<font color=\"#ff0000\">" + i18n( "Could not load filter:" ) + "</font>" + i18n( "Bad filter file. It may be corrupted or has a bad format." ) );
target.remove();
source.remove();
btnClose->setEnabled( true );
btnClose->setText(i18n("&Close"));
label1->setText("");
to_convert = false;
converting = false;
}
KApplication::kApplication()->processEvents();
//reload level1 filter
if ( m_plugin )
m_plugin->loadAntiP2P();
btnClose->setEnabled( true );
to_convert = false;
converting = false;
btnClose->setText(i18n("&Close"));
label1->setText("");
}
void ConvertDialog::btnClose_clicked()
{
if(to_convert)
convert();
else
this->close();
}
void ConvertDialog::closeEvent(TQCloseEvent* e)
{
if(!converting)
e->accept();
else
e->ignore();
}
void ConvertDialog::btnCancel_clicked()
{
if(converting)
{
TQFile target( KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat" );
if(target.exists())
target.remove();
TQFile temp( KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat.tmp");
if(temp.exists())
{
KIO::NetAccess::file_copy(KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat.tmp", KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat", -1, true);
temp.remove();
}
canceled = true;
Out(SYS_IPF|LOG_NOTICE) << "Conversion canceled." << endl;
}
this->reject();
}
}
#include "convertdialog.moc"