Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

qrsync.cpp

Go to the documentation of this file.
00001 #include "qrsync.h"
00002 #include <stdio.h>
00003 extern "C" {
00004 #include "rsync.h"
00005 }
00006 #include <stdlib.h>
00007 
00008 /* OPIE */
00009 #include <opie2/odebug.h>
00010 using namespace Opie::Core;
00011 
00012 /* QT */
00013 #include <qfile.h>
00014 
00015 static const char *rdiffNewFile = "/tmp/rdiff/result";
00016 static size_t block_len = RS_DEFAULT_BLOCK_LEN;
00017 static size_t strong_len = RS_DEFAULT_STRONG_LEN;
00018 
00019 
00020 void QRsync::generateSignature( QString baseFile, QString sigFile )
00021 {
00022     
00023     if ( QFile::exists( baseFile ) ) {
00024         FILE *basis_file, *sig_file;
00025         rs_result       result;
00026             
00027         basis_file = fopen( baseFile.latin1(), "rb" );
00028         sig_file = fopen( sigFile.latin1(), "wb" );
00029 
00030         result = rs_sig_file(basis_file, sig_file, block_len, strong_len, 0);
00031 
00032         fclose( basis_file );
00033         fclose( sig_file );
00034         if (result != RS_DONE)
00035             printf("error in rdiffGenSig: %d", result );
00036     }
00037 }
00038 
00039 
00040 void QRsync::generateDiff( QString baseFile, QString sigFile, QString deltaFile )
00041 {
00042     if ( QFile::exists( baseFile ) && QFile::exists( sigFile ) ) {
00043         FILE            *sig_file, *new_file, *delta_file;
00044         rs_result       result;
00045         rs_signature_t  *sumset;
00046 
00047         sig_file = fopen(sigFile.latin1(), "rb");
00048         new_file = fopen(baseFile.latin1(), "rb");
00049         delta_file = fopen(deltaFile.latin1(), "wb");
00050 
00051         result = rs_loadsig_file(sig_file, &sumset, 0);
00052         if (result != RS_DONE) {
00053             odebug << "rdiffGenDiff: loading of sig file failed, error=" << result << "" << oendl; 
00054         } else {
00055             result = rs_build_hash_table(sumset);
00056             if ( result != RS_DONE) {
00057                 odebug << "rdiffGenDiff: building of hash table failed, error=" << result << "" << oendl; 
00058             } else {
00059                 result = rs_delta_file(sumset, new_file, delta_file, 0);
00060                 if ( result != RS_DONE) {
00061                     odebug << "rdiffGenDiff: writing of diff file failed, error=" << result << "" << oendl; 
00062                 }
00063             }
00064         }
00065         
00066         if ( sumset )
00067             rs_free_sumset( sumset );
00068         fclose( new_file );
00069         fclose( delta_file );
00070         fclose( sig_file );
00071 
00072     }
00073 }
00074 
00075 void QRsync::applyDiff( QString baseFile, QString deltaFile )
00076 {
00077     if ( QFile::exists( baseFile ) && QFile::exists( deltaFile ) ) {
00078         FILE               *basis_file, *delta_file, *new_file;
00079         rs_result           result;
00080 
00081         basis_file = fopen(baseFile.latin1(), "rb");
00082         delta_file = fopen(deltaFile.latin1(), "rb");
00083 #ifdef Q_WS_WIN
00084         new_file = fopen( (baseFile + ".new").latin1(), "wb" );
00085 #else
00086         new_file =   fopen(rdiffNewFile, "wb");
00087 #endif  
00088 
00089         result = rs_patch_file(basis_file, delta_file, new_file, 0);
00090 
00091         fclose( basis_file );
00092         fclose( delta_file );
00093         fclose( new_file );
00094 
00095         if (result != RS_DONE) {
00096             odebug << "rdiffApplyDiff failed with result " << result << "" << oendl; 
00097             return;
00098         }
00099 
00100 
00101 #ifdef Q_WS_WIN 
00102         QDir dir;
00103         QFile backup = baseFile + "~";
00104         dir.rename( baseFile, backup );
00105         dir.rename( (baseFile + ".new"), baseFile );
00106         dir.remove( backup );
00107 #else
00108         QString cmd = "mv ";
00109         cmd += rdiffNewFile;
00110         cmd += " " + baseFile;
00111         system( cmd.latin1() );
00112 #endif
00113     }
00114 
00115 }

Generated on Sat Nov 5 16:18:35 2005 for OPIE by  doxygen 1.4.2