-rw-r--r-- | rsync/qrsync.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/rsync/qrsync.cpp b/rsync/qrsync.cpp new file mode 100644 index 0000000..fe5f1bc --- a/dev/null +++ b/rsync/qrsync.cpp @@ -0,0 +1,110 @@ +#include "qrsync.h" +#include <stdio.h> +extern "C" { +#include "rsync.h" +} +#include <stdlib.h> + +#include <qfile.h> + +static const char *rdiffNewFile = "/tmp/rdiff/result"; +static size_t block_len = RS_DEFAULT_BLOCK_LEN; +static size_t strong_len = RS_DEFAULT_STRONG_LEN; + + +void QRsync::generateSignature( QString baseFile, QString sigFile ) +{ + + if ( QFile::exists( baseFile ) ) { + FILE *basis_file, *sig_file; + rs_result result; + + basis_file = fopen( baseFile.latin1(), "rb" ); + sig_file = fopen( sigFile.latin1(), "wb" ); + + result = rs_sig_file(basis_file, sig_file, block_len, strong_len, 0); + + fclose( basis_file ); + fclose( sig_file ); + if (result != RS_DONE) + printf("error in rdiffGenSig: %d", result ); + } +} + + +void QRsync::generateDiff( QString baseFile, QString sigFile, QString deltaFile ) +{ + if ( QFile::exists( baseFile ) && QFile::exists( sigFile ) ) { + FILE *sig_file, *new_file, *delta_file; + rs_result result; + rs_signature_t *sumset; + + sig_file = fopen(sigFile.latin1(), "rb"); + new_file = fopen(baseFile.latin1(), "rb"); + delta_file = fopen(deltaFile.latin1(), "wb"); + + result = rs_loadsig_file(sig_file, &sumset, 0); + if (result != RS_DONE) { + qDebug( "rdiffGenDiff: loading of sig file failed, error=%d", result ); + } else { + result = rs_build_hash_table(sumset); + if ( result != RS_DONE) { + qDebug( "rdiffGenDiff: building of hash table failed, error=%d", result ); + } else { + result = rs_delta_file(sumset, new_file, delta_file, 0); + if ( result != RS_DONE) { + qDebug( "rdiffGenDiff: writing of diff file failed, error=%d", result ); + } + } + } + + if ( sumset ) + rs_free_sumset( sumset ); + fclose( new_file ); + fclose( delta_file ); + fclose( sig_file ); + + } +} + +void QRsync::applyDiff( QString baseFile, QString deltaFile ) +{ + if ( QFile::exists( baseFile ) && QFile::exists( deltaFile ) ) { + FILE *basis_file, *delta_file, *new_file; + rs_result result; + + basis_file = fopen(baseFile.latin1(), "rb"); + delta_file = fopen(deltaFile.latin1(), "rb"); +#ifdef Q_WS_WIN + new_file = fopen( (baseFile + ".new").latin1(), "wb" ); +#else + new_file = fopen(rdiffNewFile, "wb"); +#endif + + result = rs_patch_file(basis_file, delta_file, new_file, 0); + + fclose( basis_file ); + fclose( delta_file ); + fclose( new_file ); + + if (result != RS_DONE) { + qDebug( "rdiffApplyDiff failed with result %d", result ); + return; + } + + +#ifdef Q_WS_WIN + QDir dir; + QFile backup = baseFile + "~"; + dir.rename( baseFile, backup ); + dir.rename( (baseFile + ".new"), baseFile ); + dir.remove( backup ); +#else + QString cmd = "mv "; + cmd += rdiffNewFile; + cmd += " " + baseFile; + system( cmd.latin1() ); +#endif + } + +} |