00001 #include "qrsync.h"
00002 #include <stdio.h>
00003 extern "C" {
00004 #include "rsync.h"
00005 }
00006 #include <stdlib.h>
00007
00008
00009 #include <opie2/odebug.h>
00010 using namespace Opie::Core;
00011
00012
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 }