Blame synfig-studio/src/gui/autorecover.cpp

Carlos Lopez a09598
/* === S Y N F I G ========================================================= */
Carlos Lopez a09598
/*!	\file autorecover.cpp
Carlos Lopez a09598
**	\brief Template File
Carlos Lopez a09598
**
Carlos Lopez a09598
**	$Id$
Carlos Lopez a09598
**
Carlos Lopez a09598
**	\legal
Carlos Lopez a09598
**	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
Carlos Lopez a09598
**	Copyright (c) 2008 Chris Moore
Carlos Lopez a09598
**
Carlos Lopez a09598
**	This package is free software; you can redistribute it and/or
Carlos Lopez a09598
**	modify it under the terms of the GNU General Public License as
Carlos Lopez a09598
**	published by the Free Software Foundation; either version 2 of
Carlos Lopez a09598
**	the License, or (at your option) any later version.
Carlos Lopez a09598
**
Carlos Lopez a09598
**	This package is distributed in the hope that it will be useful,
Carlos Lopez a09598
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
Carlos Lopez a09598
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Carlos Lopez a09598
**	General Public License for more details.
Carlos Lopez a09598
**	\endlegal
Carlos Lopez a09598
*/
Carlos Lopez a09598
/* ========================================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === H E A D E R S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
#ifdef USING_PCH
Carlos Lopez a09598
#	include "pch.h"
Carlos Lopez a09598
#else
Carlos Lopez a09598
#ifdef HAVE_CONFIG_H
Carlos Lopez a09598
#	include <config.h></config.h>
Carlos Lopez a09598
#endif
Carlos Lopez a09598
48f525
#include <glibmm miscutils.h=""></glibmm>
48f525
#include <glibmm main.h=""></glibmm>
48f525
bw 94d8a6
#include <synfig general.h=""></synfig>
0dde72
#include <synfig filesystemtemporary.h=""></synfig>
bw 94d8a6
abdbf2
#include <gui localization.h=""></gui>
Carlos Lopez a09598
0dde72
#include "app.h"
0dde72
#include "instance.h"
0dde72
0dde72
#include "autorecover.h"
0dde72
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
/* === U S I N G =========================================================== */
Carlos Lopez a09598
Carlos Lopez a09598
using namespace std;
Carlos Lopez a09598
using namespace etl;
Carlos Lopez a09598
using namespace synfig;
Carlos Lopez a09598
using namespace studio;
Carlos Lopez a09598
Carlos Lopez a09598
/* === M A C R O S ========================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === G L O B A L S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === P R O C E D U R E S ================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === M E T H O D S ======================================================= */
Carlos Lopez a09598
[d.j.a.y] Jerome Blanchi 8923f4
AutoRecover::AutoRecover():
a05eaa
	enabled(1),
a05eaa
	timeout_ms(15000)
0dde72
{ }
Carlos Lopez a09598
Carlos Lopez a09598
AutoRecover::~AutoRecover()
Carlos Lopez a09598
{
0dde72
	set_timer(false, 0);
[d.j.a.y] Jerome Blanchi 8923f4
}
[d.j.a.y] Jerome Blanchi 8923f4
Carlos Lopez a09598
void
0dde72
AutoRecover::set_timer(bool enabled, int timeout_ms)
Carlos Lopez a09598
{
0dde72
	if (timeout_ms < 0) timeout_ms = 0;
0dde72
	if (this->enabled != enabled || this->timeout_ms != timeout_ms)
Carlos Lopez a09598
	{
0dde72
		bool env_enabled = !getenv("SYNFIG_DISABLE_AUTO_SAVE");
0dde72
		if (this->enabled && this->timeout_ms > 0 && env_enabled)
0dde72
			connection.disconnect();
0dde72
0dde72
		this->enabled = enabled;
0dde72
		this->timeout_ms = timeout_ms;
0dde72
0dde72
		if (this->enabled && this->timeout_ms > 0 && env_enabled)
0dde72
			connection = Glib::signal_timeout().connect(
0dde72
				sigc::bind_return(
0dde72
					sigc::mem_fun(*this, &AutoRecover::auto_backup),
0dde72
					true ),
0dde72
				this->timeout_ms );
Carlos Lopez a09598
	}
Carlos Lopez a09598
}
Carlos Lopez a09598
0dde72
void
Carlos Lopez a09598
AutoRecover::auto_backup()
Carlos Lopez a09598
{
0dde72
	int total = (int)App::instance_list.size();
0dde72
	int count = 0;
0dde72
	try
Carlos Lopez a09598
	{
0dde72
		for(std::list< etl::handle<instance> >::iterator i = App::instance_list.begin(); i != App::instance_list.end(); ++i)</instance>
0dde72
			try
Carlos Lopez a09598
			{
0dde72
				if ((*i)->backup())
0dde72
					++count;
0dde72
			}
0dde72
			catch(...)
0dde72
			{
0dde72
				synfig::error("AutoRecover::auto_backup(): UNKNOWN EXCEPTION THROWN.");
Carlos Lopez a09598
			}
Carlos Lopez a09598
	}
0dde72
	catch(...)
0dde72
	{
0dde72
		synfig::error("AutoRecover::auto_backup(): UNKNOWN EXCEPTION THROWN.");
0dde72
	}
Carlos Lopez a09598
Carlos Lopez a09598
	// Also go ahead and save the settings
Carlos Lopez a09598
	App::save_settings();
Carlos Lopez a09598
0dde72
	//if (count)
0dde72
	//	synfig::info("AutoRecover::auto_backup(): %d Files backed up.", count);
0dde72
	if (count != total)
0dde72
		synfig::error("AutoRecover::auto_backup(): %d FILES NOT BACKED UP.", total - count);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
bool
Carlos Lopez a09598
AutoRecover::recovery_needed()const
Carlos Lopez a09598
{
0dde72
	FileSystem::FileList files;
0dde72
	FileSystemTemporary::scan_temporary_directory("instance", files, App::get_temporary_directory());
0dde72
	return !files.empty();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
bool
0dde72
AutoRecover::recover(int &number_recovered)
Carlos Lopez a09598
{
0dde72
	bool success = false;
Carlos Lopez a09598
	number_recovered = 0;
Carlos Lopez a09598
0dde72
	FileSystem::FileList files;
0dde72
	if (FileSystemTemporary::scan_temporary_directory("instance", files, App::get_temporary_directory()))
Carlos Lopez a09598
	{
0dde72
		success = true;
0dde72
		for(FileSystem::FileList::const_iterator i = files.begin(); i != files.end(); ++i)
0dde72
			if (App::open_from_temporary_filesystem(App::get_temporary_directory() + ETL_DIRECTORY_SEPARATOR + *i))
0dde72
				++number_recovered;
0dde72
			else
0dde72
				success=false;
Carlos Lopez a09598
	}
Carlos Lopez a09598
	return success;
Carlos Lopez a09598
}
Carlos Lopez a09598
0dde72
bool
0dde72
AutoRecover::clear_backups()
Carlos Lopez a09598
{
0dde72
	bool success = false;
0dde72
	FileSystem::FileList files;
0dde72
	if (FileSystemTemporary::scan_temporary_directory("instance", files, App::get_temporary_directory()))
0dde72
	{
0dde72
		success = true;
0dde72
		for(FileSystem::FileList::const_iterator i = files.begin(); i != files.end(); ++i)
0dde72
		{
0dde72
			// FileSystemTemporary will clear opened temporary files in destructor
0dde72
			String filename = App::get_temporary_directory() + ETL_DIRECTORY_SEPARATOR + *i;
0dde72
			bool s = false;
e03d87
			try { s = FileSystemTemporary("").open_temporary(filename); }
e03d87
			catch (...)
e03d87
			{
93f253
				synfig::warning("Autobackup file is not recoverable. Forcing to remove.");
93f253
			}
0dde72
			if (!s)
0dde72
			{
0dde72
				FileSystemNative::instance()->file_remove(filename);
0dde72
				success = false;
0dde72
			}
0dde72
		}
0dde72
	}
0dde72
	return success;
Carlos Lopez a09598
}