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.
192 lines
6.0 KiB
192 lines
6.0 KiB
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FINDDUPPLICATEIMAGES.CPP
|
|
//
|
|
// Copyright (C) 2001 Richard Groult <rgroult at jalix.org> (from ShowImg project)
|
|
// Copyright (C) 2004 Gilles Caulier <caulier dot gilles at gmail dot com>
|
|
// Copyright (C) 2004 Richard Groult <rgroult at jalix.org>
|
|
//
|
|
// 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, Cambridge, MA 02110-1301, USA.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "fastcompare.h"
|
|
#include "actions.h"
|
|
#include <tqstringlist.h>
|
|
#include <tqapplication.h>
|
|
#include <kdebug.h>
|
|
#include <tqfileinfo.h>
|
|
|
|
KIPIFindDupplicateImagesPlugin::FastCompare::FastCompare( TQObject* parent )
|
|
:m_parent( parent )
|
|
{
|
|
}
|
|
|
|
|
|
TQDict < TQPtrVector < TQFile > > KIPIFindDupplicateImagesPlugin::FastCompare::compare( const TQStringList& filesList )
|
|
{
|
|
TQDict < TQPtrVector < TQFile > > res;
|
|
TQDict < TQPtrVector < TQFile > >*dict = new TQDict < TQPtrVector < TQFile > >;
|
|
dict->setAutoDelete(true);
|
|
TQPtrVector < TQFile > *list;
|
|
|
|
TQString size;
|
|
TQFile *file;
|
|
int nbrF = 0;
|
|
|
|
sendMessage( m_parent, KIPIFindDupplicateImagesPlugin::Progress, TQString(), filesList.count()*2, true, false );
|
|
|
|
kdDebug( 51000 ) << filesList.count() << " images to parse with Fast method..." << endl;
|
|
|
|
for ( TQStringList::ConstIterator item = filesList.begin(); item != filesList.end(); ++item )
|
|
{
|
|
if ( m_stopRequested )
|
|
return TQDict < TQPtrVector < TQFile > >();
|
|
|
|
TQString itemName(*item);
|
|
nbrF++;
|
|
|
|
sendMessage( m_parent, KIPIFindDupplicateImagesPlugin::FastParsing, itemName, 0, true, false );
|
|
|
|
// Create a file
|
|
file = new TQFile( itemName );
|
|
|
|
// Read the file size
|
|
size = TQString::number(TQFileInfo (*file).size ());
|
|
|
|
// if not in the table, we do it
|
|
if ( !dict->find (size) )
|
|
{
|
|
list = new TQPtrVector < TQFile >;
|
|
list->setAutoDelete(true);
|
|
dict->insert (size, list);
|
|
}
|
|
|
|
// Read the list
|
|
list = (TQPtrVector < TQFile > *)dict->find (size);
|
|
|
|
//Add the file
|
|
list->resize (list->size () + 1);
|
|
list->insert (list->size () - 1, file);
|
|
|
|
//sendMessage( m_parent, KIPIFindDupplicateImagesPlugin::FastParsing, itemName, 0, false, true );
|
|
}
|
|
|
|
// For counting the files comparaison tasks.
|
|
int count = 0;
|
|
TQDictIterator < TQPtrVector < TQFile > >itcount (*dict); // Iterator for dict.
|
|
|
|
while (itcount.current ())
|
|
{
|
|
list = (TQPtrVector < TQFile > *)itcount.current ();
|
|
|
|
if (list->size () != 1)
|
|
for (unsigned int i = 0; i < list->size (); i++)
|
|
++count;
|
|
|
|
++itcount;
|
|
}
|
|
|
|
// Files comparison
|
|
TQDictIterator < TQPtrVector < TQFile > >it (*dict); // Iterator for dict.
|
|
|
|
while (it.current ())
|
|
{
|
|
if ( m_stopRequested )
|
|
return TQDict < TQPtrVector < TQFile > >();
|
|
TQDict < TQFile > *fait = new TQDict < TQFile >;
|
|
list = (TQPtrVector < TQFile > *)it.current ();
|
|
|
|
if (list->size () != 1)
|
|
{
|
|
for (unsigned int i = 0; i < list->size (); i++)
|
|
{
|
|
TQFile *file1 = (TQFile *) (list->at (i));
|
|
|
|
sendMessage( m_parent, KIPIFindDupplicateImagesPlugin::Exact,file1->name(),filesList.count() + count, true, false );
|
|
|
|
if (!fait->find (file1->name()))
|
|
{
|
|
for (unsigned int j = i + 1; j < list->size (); j++)
|
|
{
|
|
TQFile *file2 = (TQFile *) (list->at (j));
|
|
|
|
// The files are equals ?
|
|
|
|
if (equals (file1, file2))
|
|
{
|
|
TQPtrVector < TQFile > *vect;
|
|
|
|
// Add the file.
|
|
|
|
if (!res.find (file1->name ()))
|
|
{
|
|
vect = new TQPtrVector < TQFile >;
|
|
vect->setAutoDelete(true);
|
|
res.insert (file1->name (), vect);
|
|
}
|
|
else
|
|
vect = (TQPtrVector < TQFile > *)res.find (file1->name ());
|
|
|
|
vect->resize (vect->size () + 1);
|
|
vect->insert (vect->size () - 1, file2);
|
|
|
|
fait->insert(file2->name(), file2);
|
|
}
|
|
}
|
|
}
|
|
|
|
// sendMessage( m_parent, KIPIFindDupplicateImagesPlugin::Exact, file1->name(), 0, false, true );
|
|
}
|
|
}
|
|
|
|
delete(fait);
|
|
++it;
|
|
}
|
|
|
|
delete (it);
|
|
|
|
return res;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Nota: original source code from ShowImg !
|
|
|
|
bool KIPIFindDupplicateImagesPlugin::FastCompare::equals(TQFile * f1, TQFile * f2)
|
|
{
|
|
if ( TQFileInfo (*f1).size () != TQFileInfo (*f2).size () )
|
|
return false;
|
|
|
|
f1->open (IO_ReadOnly);
|
|
f2->open (IO_ReadOnly);
|
|
|
|
TQDataStream s1 (f1);
|
|
TQDataStream s2 (f2);
|
|
|
|
TQ_INT8 b1, b2;
|
|
bool eq = true;
|
|
|
|
while ( !s1.atEnd () && eq )
|
|
{
|
|
s1 >> b1;
|
|
s2 >> b2;
|
|
eq = (b1 == b2);
|
|
}
|
|
|
|
f1->close ();
|
|
f2->close ();
|
|
return eq;
|
|
}
|