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.
tdeadmin/kdat/BackupProfile.cpp

294 lines
6.9 KiB

// KDat - a tar-based DAT archiver
// Copyright (C) 1998-2000 Sean Vyain, svyain@mail.tds.net
// Copyright (C) 2001-2002 Lawrence Widman, kdat@cardiothink.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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <tqfile.h>
#include <kstandarddirs.h>
#include "BackupProfile.h"
#include "BackupProfileManager.h"
#include "Util.h"
BackupProfile::BackupProfile()
{
}
BackupProfile::BackupProfile( const TQString & name )
: _name( name ),
_lastSavedName( name )
{
load();
}
BackupProfile::~BackupProfile()
{
}
void BackupProfile::load()
{
TQString filename = locateLocal( "appdata", _lastSavedName + ".bp");
FILE* fptr = fopen( TQFile::encodeName(filename), "r" );
if ( !fptr ) {
return;
}
char buf[4096];
fgets( buf, 4096, fptr );
int version = 0;
sscanf( buf, "%d", &version );
fgets( buf, 4096, fptr );
_name = buf;
_name.truncate( _name.length() - 1 );
fgets( buf, 4096, fptr );
_archiveName = buf;
_archiveName.truncate( _archiveName.length() - 1 );
fgets( buf, 4096, fptr );
_workingDirectory = buf;
_workingDirectory.truncate( _workingDirectory.length() - 1 );
_absoluteFiles.clear();
fgets( buf, 4096, fptr );
int filecount = 0;
sscanf( buf, "%d", &filecount );
for ( int i = 0; i < filecount; i++ ) {
fgets( buf, 4096, fptr );
TQString filename = buf;
filename.truncate( filename.length() - 1 );
_absoluteFiles.append( filename );
}
calcRelativeFiles();
fgets( buf, 4096, fptr );
int tmpBool = 0;
sscanf( buf, "%d", &tmpBool );
_oneFilesystem = tmpBool;
fgets( buf, 4096, fptr );
sscanf( buf, "%d", &tmpBool );
_incremental = tmpBool;
fgets( buf, 4096, fptr );
_snapshotFile = buf;
_snapshotFile.truncate( _snapshotFile.length() - 1 );
fgets( buf, 4096, fptr );
sscanf( buf, "%d", &tmpBool );
_removeSnapshot = tmpBool;
fclose( fptr );
}
void BackupProfile::save()
{
TQString filename = locateLocal( "appdata", _lastSavedName + ".bp");
bool null_name_p = _lastSavedName.isEmpty();
_lastSavedName = _name.copy();
if( TRUE == null_name_p ){
return;
}
unlink( TQFile::encodeName(filename) );
FILE* fptr = fopen( TQFile::encodeName(filename), "w" );
if ( !fptr ) {
return;
}
fprintf( fptr, "%d\n", 1 ); // Version
fprintf( fptr, "%s\n", _name.utf8().data() );
fprintf( fptr, "%s\n", _archiveName.utf8().data() );
fprintf( fptr, "%s\n", _workingDirectory.utf8().data() );
fprintf( fptr, "%d\n", _absoluteFiles.count() );
for ( TQStringList::Iterator it = _absoluteFiles.begin();
it != _absoluteFiles.end();
++it )
fprintf( fptr, "%s\n", (*it).utf8().data() );
fprintf( fptr, "%d\n", _oneFilesystem );
fprintf( fptr, "%d\n", _incremental );
fprintf( fptr, "%s\n", _snapshotFile.utf8().data() );
fprintf( fptr, "%d\n", _removeSnapshot );
fclose( fptr );
}
TQString BackupProfile::getName()
{
return _name;
}
TQString BackupProfile::getArchiveName()
{
return _archiveName;
}
TQString BackupProfile::getWorkingDirectory()
{
return _workingDirectory;
// LEW: is this fix necessary?
#ifdef LEW
if ( FALSE == _workingDirectory.isEmpty() ) {
return _workingDirectory;
} else {
return 0;
}
#endif
}
const TQStringList& BackupProfile::getRelativeFiles()
{
return _relativeFiles;
}
const TQStringList& BackupProfile::getAbsoluteFiles()
{
return _absoluteFiles;
}
bool BackupProfile::isOneFilesystem()
{
return _oneFilesystem;
}
bool BackupProfile::isIncremental()
{
return _incremental;
}
TQString BackupProfile::getSnapshotFile()
{
return _snapshotFile;
}
bool BackupProfile::getRemoveSnapshot()
{
return _removeSnapshot;
}
void BackupProfile::setName( const TQString & name )
{
_name = name;
BackupProfileManager::instance()->backupProfileModified( this );
}
void BackupProfile::setArchiveName( const TQString & archiveName )
{
_archiveName = archiveName;
BackupProfileManager::instance()->backupProfileModified( this );
}
void BackupProfile::setWorkingDirectory( const TQString & workingDirectory )
{
_workingDirectory = workingDirectory;
// Regenerate the list of relative files.
calcRelativeFiles();
BackupProfileManager::instance()->backupProfileModified( this );
}
void BackupProfile::setAbsoluteFiles( const TQStringList& files )
{
_absoluteFiles = files;
// Make sure working directory is still valid.
TQStringList::Iterator it = _absoluteFiles.begin();
for ( ;
it != _absoluteFiles.end();
++it )
{
if ( *it != _workingDirectory ) {
// Working directory is not a prefix for this file.
break;
}
}
if ( it != _absoluteFiles.end() ) {
// Pick another working directory.
_workingDirectory = Util::longestCommonPath( _absoluteFiles );
}
// Regenerate the list of relative files.
calcRelativeFiles();
BackupProfileManager::instance()->backupProfileModified( this );
}
void BackupProfile::setOneFilesystem( bool oneFilesystem )
{
_oneFilesystem = oneFilesystem;
BackupProfileManager::instance()->backupProfileModified( this );
}
void BackupProfile::setIncremental( bool incremental )
{
_incremental = incremental;
BackupProfileManager::instance()->backupProfileModified( this );
}
void BackupProfile::setSnapshotFile( const TQString & snapshotFile )
{
_snapshotFile = snapshotFile;
BackupProfileManager::instance()->backupProfileModified( this );
}
void BackupProfile::setRemoveSnapshot( bool removeSnapshot )
{
_removeSnapshot = removeSnapshot;
BackupProfileManager::instance()->backupProfileModified( this );
}
void BackupProfile::calcRelativeFiles()
{
_relativeFiles.clear();
int remove = _workingDirectory.length();
if ( remove > 1 ) {
remove++;
}
for ( TQStringList::Iterator it = _absoluteFiles.begin();
it != _absoluteFiles.end();
++it )
{
TQString fn = *it;
fn.remove( 0, remove );
if ( fn.isEmpty() ) {
fn = ".";
}
_relativeFiles.append( fn );
}
}