From cd2edba2bdd5e4063cf63accc10c378a1596d7ef Mon Sep 17 00:00:00 2001 From: Oliver Duis Date: Sat, 18 Dec 2010 19:21:17 +0100 Subject: [PATCH] Sorry, forgot to check in a file change for last patch :-( --- {rtgui => rtengine}/safegtk.cc | 468 ++++++++++++++++++--------------- {rtgui => rtengine}/safegtk.h | 72 ++--- 2 files changed, 296 insertions(+), 244 deletions(-) rename {rtgui => rtengine}/safegtk.cc (78%) rename {rtgui => rtengine}/safegtk.h (73%) diff --git a/rtgui/safegtk.cc b/rtengine/safegtk.cc similarity index 78% rename from rtgui/safegtk.cc rename to rtengine/safegtk.cc index 8c441862a..5cf396ddf 100644 --- a/rtgui/safegtk.cc +++ b/rtengine/safegtk.cc @@ -1,210 +1,258 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 Gabor Horvath - * Copyright (c) 2010 Sasha Vasko - * - * RawTherapee 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 3 of the License, or - * (at your option) any later version. - * - * RawTherapee 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 RawTherapee. If not, see . - */ - -#include -#include - -Glib::RefPtr safe_create_from_file(const std::string& filename) -{ - Glib::RefPtr res; -#ifdef GLIBMM_EXCEPTIONS_ENABLED - try { - res = Gdk::Pixbuf::create_from_file (filename); - } - catch (Glib::Exception& ex) { - printf ("%s\n", ex.what().c_str()); - } -#else - std::auto_ptr error; - res = Gdk::Pixbuf::create_from_file (filename, error); - if (error.get()) - printf ("%s\n", error->what().c_str()); -#endif - - return res; -} - -Cairo::RefPtr safe_create_from_png(const std::string& filename) -{ - Cairo::RefPtr res; - - if (!Glib::file_test (filename, Glib::FILE_TEST_EXISTS)) { - printf ("ERROR: File \"%s\" not found.\n", filename.c_str()); - } else { - try { - res = Cairo::ImageSurface::create_from_png (filename); - } catch (...) {} - } - - return res; -} - -Glib::RefPtr safe_query_file_info (Glib::RefPtr &file) -{ - Glib::RefPtr info; -#ifdef GLIBMM_EXCEPTIONS_ENABLED - try { info = file->query_info(); }catch (...) { } -#else - std::auto_ptr error; - info = file->query_info("*", Gio::FILE_QUERY_INFO_NONE, error); -#endif - return info; -} - -#ifdef GLIBMM_EXCEPTIONS_ENABLED -# define SAFE_ENUMERATOR_CODE_START \ - do{try { if ((dirList = dir->enumerate_children ())) \ - for (Glib::RefPtr info = dirList->next_file(); info; info = dirList->next_file()) { - -# define SAFE_ENUMERATOR_CODE_END \ - }} catch (Glib::Exception& ex) { printf ("%s\n", ex.what().c_str()); }}while(0) -#else -# define SAFE_ENUMERATOR_CODE_START \ - do{std::auto_ptr error; Glib::RefPtr cancellable; \ - if ((dirList = dir->enumerate_children (cancellable, "*", Gio::FILE_QUERY_INFO_NONE, error))) \ - for (Glib::RefPtr info = dirList->next_file(cancellable, error); !error.get() && info; info = dirList->next_file(cancellable, error)) { - -# define SAFE_ENUMERATOR_CODE_END } if (error.get()) printf ("%s\n", error->what().c_str());}while (0) -#endif - -void safe_build_file_list (Glib::RefPtr &dir, std::vector &flist) -{ - Glib::RefPtr dirList; - if (dir) { - SAFE_ENUMERATOR_CODE_START - flist.push_back (FileMTimeInfo (removeExtension(info->get_name()), info->modification_time())); - SAFE_ENUMERATOR_CODE_END; - } -} - -void safe_build_file_list (Glib::RefPtr &dir, std::vector &names, const Glib::ustring &directory) -{ - Glib::RefPtr dirList; - if (dir) { - SAFE_ENUMERATOR_CODE_START - names.push_back (Glib::build_filename (directory, info->get_name())); - SAFE_ENUMERATOR_CODE_END; - } -} - - -void safe_build_subdir_list (Glib::RefPtr &dir, std::vector &subDirs, bool add_hidden) -{ - Glib::RefPtr dirList; - if (dir) - { - SAFE_ENUMERATOR_CODE_START - if (info->get_file_type() == Gio::FILE_TYPE_DIRECTORY && (!info->is_hidden() || add_hidden)) - subDirs.push_back (info->get_name()); - SAFE_ENUMERATOR_CODE_END; - } -} - -Glib::ustring safe_locale_to_utf8 (const std::string& src) -{ - Glib::ustring utf8_str; -#ifdef GLIBMM_EXCEPTIONS_ENABLED - try { - utf8_str = Glib::locale_to_utf8(src); - } - catch (const Glib::ConvertError& e) { - utf8_str = Glib::convert_with_fallback(src, "UTF8", "LATIN1","?"); - } -#else - { - std::auto_ptr error; - utf8_str = locale_to_utf8(src, error); - if (error.get()) - utf8_str = Glib::convert_with_fallback(src, "UTF8", "LATIN1","?", error); - } -#endif //GLIBMM_EXCEPTIONS_ENABLED - return utf8_str; -} - -std::string safe_locale_from_utf8 (const Glib::ustring& utf8_str) -{ - std::string str; -#ifdef GLIBMM_EXCEPTIONS_ENABLED - try { - str = Glib::locale_from_utf8(utf8_str); - } - catch (const Glib::ConvertError& e) { - //str = Glib::convert_with_fallback(utf8_str, "LATIN1", "UTF8", "?"); - } -#else - { - std::auto_ptr error; - str = Glib::locale_from_utf8(utf8_str, error); - /*if (error.get()) - {str = Glib::convert_with_fallback(utf8_str, "LATIN1", "UTF8", "?", error);}*/ - } -#endif //GLIBMM_EXCEPTIONS_ENABLED - return str; -} - - -bool safe_spawn_command_line_async (const Glib::ustring& cmd_utf8) -{ - std::string cmd; - bool success = false; -#ifdef GLIBMM_EXCEPTIONS_ENABLED - try { - cmd = Glib::filename_from_utf8(cmd_utf8); - printf ("command line: |%s|\n", cmd.c_str()); - Glib::spawn_command_line_async (cmd); - success = true; - } catch (Glib::Exception& ex) { - printf ("%s\n", ex.what().c_str()); - } -#else - std::auto_ptr error; - cmd = Glib::filename_from_utf8(cmd_utf8, error); - if (!error.get()) { - printf ("command line: |%s|\n", cmd.c_str()); - Glib::spawn_command_line_async (cmd, error); - } - if (error.get()) - printf ("%s\n", error->what().c_str()); - else - success = true; -#endif - return success; -} - -bool safe_spawn_command_line_sync (const Glib::ustring& cmd_utf8) -{ - std::string cmd; - std::string stdOut; - std::string stdErr; - - bool success = false; - - int exitStatus=-1; - try { - cmd = Glib::filename_from_utf8(cmd_utf8); - printf ("command line: |%s|\n", cmd.c_str()); - - // if it crashes here on windows, make sure you have the GTK runtime files gspawn-win32-helper*.exe files in RT directory - Glib::spawn_command_line_sync (cmd,NULL,NULL, &exitStatus); - } catch (Glib::Exception& ex) { - printf ("%s\n", ex.what().c_str()); - } - return (exitStatus==0); -} +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2010 Gabor Horvath + * Copyright (c) 2010 Sasha Vasko + * Copyright (c) 2010 Oliver Duis + * + * RawTherapee 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 3 of the License, or + * (at your option) any later version. + * + * RawTherapee 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 RawTherapee. If not, see . + */ + +#include +#include +#include + + +Glib::RefPtr safe_create_from_file(const std::string& filename) +{ + Glib::RefPtr res; +#ifdef GLIBMM_EXCEPTIONS_ENABLED + try { + res = Gdk::Pixbuf::create_from_file (filename); + } + catch (Glib::Exception& ex) { + printf ("%s\n", ex.what().c_str()); + } +#else + std::auto_ptr error; + res = Gdk::Pixbuf::create_from_file (filename, error); + if (error.get()) + printf ("%s\n", error->what().c_str()); +#endif + + return res; +} + +Cairo::RefPtr safe_create_from_png(const std::string& filename) +{ + Cairo::RefPtr res; + + if (!safe_file_test (filename, Glib::FILE_TEST_EXISTS)) { + printf ("ERROR: File \"%s\" not found.\n", filename.c_str()); + } else { + try { + res = Cairo::ImageSurface::create_from_png (filename); + } catch (...) {} + } + + return res; +} + +Glib::RefPtr safe_query_file_info (Glib::RefPtr &file) +{ + Glib::RefPtr info; +#ifdef GLIBMM_EXCEPTIONS_ENABLED + try { info = file->query_info(); }catch (...) { } +#else + std::auto_ptr error; + info = file->query_info("*", Gio::FILE_QUERY_INFO_NONE, error); +#endif + return info; +} + +#ifdef GLIBMM_EXCEPTIONS_ENABLED +# define SAFE_ENUMERATOR_CODE_START \ + do{try { if ((dirList = dir->enumerate_children ())) \ + for (Glib::RefPtr info = dirList->next_file(); info; info = dirList->next_file()) { + +# define SAFE_ENUMERATOR_CODE_END \ + }} catch (Glib::Exception& ex) { printf ("%s\n", ex.what().c_str()); }}while(0) +#else +# define SAFE_ENUMERATOR_CODE_START \ + do{std::auto_ptr error; Glib::RefPtr cancellable; \ + if ((dirList = dir->enumerate_children (cancellable, "*", Gio::FILE_QUERY_INFO_NONE, error))) \ + for (Glib::RefPtr info = dirList->next_file(cancellable, error); !error.get() && info; info = dirList->next_file(cancellable, error)) { + +# define SAFE_ENUMERATOR_CODE_END } if (error.get()) printf ("%s\n", error->what().c_str());}while (0) +#endif + +void safe_build_file_list (Glib::RefPtr &dir, std::vector &flist) +{ + Glib::RefPtr dirList; + if (dir) { + SAFE_ENUMERATOR_CODE_START + flist.push_back (FileMTimeInfo (removeExtension(info->get_name()), info->modification_time())); + SAFE_ENUMERATOR_CODE_END; + } +} + +void safe_build_file_list (Glib::RefPtr &dir, std::vector &names, const Glib::ustring &directory) +{ + Glib::RefPtr dirList; + if (dir) { + SAFE_ENUMERATOR_CODE_START + names.push_back (Glib::build_filename (directory, info->get_name())); + SAFE_ENUMERATOR_CODE_END; + } +} + + +void safe_build_subdir_list (Glib::RefPtr &dir, std::vector &subDirs, bool add_hidden) +{ + Glib::RefPtr dirList; + if (dir) + { + SAFE_ENUMERATOR_CODE_START + if (info->get_file_type() == Gio::FILE_TYPE_DIRECTORY && (!info->is_hidden() || add_hidden)) + subDirs.push_back (info->get_name()); + SAFE_ENUMERATOR_CODE_END; + } +} + +Glib::ustring safe_locale_to_utf8 (const std::string& src) +{ + Glib::ustring utf8_str; +#ifdef GLIBMM_EXCEPTIONS_ENABLED + try { + utf8_str = Glib::locale_to_utf8(src); + } + catch (const Glib::ConvertError& e) { + utf8_str = Glib::convert_with_fallback(src, "UTF8", "LATIN1","?"); + } +#else + { + std::auto_ptr error; + utf8_str = locale_to_utf8(src, error); + if (error.get()) + utf8_str = Glib::convert_with_fallback(src, "UTF8", "LATIN1","?", error); + } +#endif //GLIBMM_EXCEPTIONS_ENABLED + return utf8_str; +} + +std::string safe_locale_from_utf8 (const Glib::ustring& utf8_str) +{ + std::string str; +#ifdef GLIBMM_EXCEPTIONS_ENABLED + try { + str = Glib::locale_from_utf8(utf8_str); + } + catch (const Glib::ConvertError& e) { + //str = Glib::convert_with_fallback(utf8_str, "LATIN1", "UTF8", "?"); + } +#else + { + std::auto_ptr error; + str = Glib::locale_from_utf8(utf8_str, error); + /*if (error.get()) + {str = Glib::convert_with_fallback(utf8_str, "LATIN1", "UTF8", "?", error);}*/ + } +#endif //GLIBMM_EXCEPTIONS_ENABLED + return str; +} + +std::string safe_filename_from_utf8 (const Glib::ustring& utf8_str) +{ + std::string str; +#ifdef GLIBMM_EXCEPTIONS_ENABLED + try { + str = Glib::filename_from_utf8 (utf8_str); + } + catch (const Glib::ConvertError& e) { + //str = Glib::convert_with_fallback(utf8_str, "LATIN1", "UTF8", "?"); + } +#else + { + std::auto_ptr error; + str = Glib::filename_from_utf8 (utf8_str, error); + /*if (error.get()) + {str = Glib::convert_with_fallback(utf8_str, "LATIN1", "UTF8", "?", error);}*/ + } +#endif //GLIBMM_EXCEPTIONS_ENABLED + return str; +} + +bool safe_spawn_command_line_async (const Glib::ustring& cmd_utf8) +{ + std::string cmd; + bool success = false; +#ifdef GLIBMM_EXCEPTIONS_ENABLED + try { + cmd = Glib::filename_from_utf8(cmd_utf8); + printf ("command line: |%s|\n", cmd.c_str()); + Glib::spawn_command_line_async (cmd); + success = true; + } catch (Glib::Exception& ex) { + printf ("%s\n", ex.what().c_str()); + } +#else + std::auto_ptr error; + cmd = Glib::filename_from_utf8(cmd_utf8, error); + if (!error.get()) { + printf ("command line: |%s|\n", cmd.c_str()); + Glib::spawn_command_line_async (cmd, error); + } + if (error.get()) + printf ("%s\n", error->what().c_str()); + else + success = true; +#endif + return success; +} + +bool safe_spawn_command_line_sync (const Glib::ustring& cmd_utf8) +{ + std::string cmd; + std::string stdOut; + std::string stdErr; + + bool success = false; + + int exitStatus=-1; + try { + cmd = Glib::filename_from_utf8(cmd_utf8); + printf ("command line: |%s|\n", cmd.c_str()); + + // if it crashes here on windows, make sure you have the GTK runtime files gspawn-win32-helper*.exe files in RT directory + Glib::spawn_command_line_sync (cmd,NULL,NULL, &exitStatus); + } catch (Glib::Exception& ex) { + printf ("%s\n", ex.what().c_str()); + } + return (exitStatus==0); +} + +FILE * safe_g_fopen(const Glib::ustring& src,const gchar *mode) +{ + return g_fopen(safe_filename_from_utf8(src).c_str(),mode); +} + +bool safe_file_test (const Glib::ustring& filename, Glib::FileTest test) +{ + return Glib::file_test (safe_filename_from_utf8(filename), test); +} + +int safe_g_remove(const Glib::ustring& filename) +{ + return ::g_remove(safe_filename_from_utf8(filename).c_str()); +} + +int safe_g_rename(const Glib::ustring& oldFilename, const Glib::ustring& newFilename) +{ + return ::g_rename(safe_filename_from_utf8(oldFilename).c_str(), safe_filename_from_utf8(newFilename).c_str()); +} + +int safe_g_mkdir_with_parents(const Glib::ustring& dirName, int mode) +{ + return ::g_mkdir_with_parents(safe_filename_from_utf8(dirName).c_str(), mode); +} \ No newline at end of file diff --git a/rtgui/safegtk.h b/rtengine/safegtk.h similarity index 73% rename from rtgui/safegtk.h rename to rtengine/safegtk.h index b9b597aaa..73f8dfbad 100644 --- a/rtgui/safegtk.h +++ b/rtengine/safegtk.h @@ -1,34 +1,38 @@ -#ifndef SAFE_GTK_H_INCLUDED -#define SAFE_GTK_H_INCLUDED - -#include -#include -#include - -Glib::RefPtr safe_create_from_file(const std::string& filename); -Cairo::RefPtr safe_create_from_png(const std::string& filename); - -class FileMTimeInfo { - - public: - Glib::ustring fname; - Glib::TimeVal mtime; - - FileMTimeInfo (Glib::ustring name, Glib::TimeVal mtime) : fname(name), mtime(mtime) {} - bool operator<(const FileMTimeInfo& other) const { return mtime safe_query_file_info (Glib::RefPtr &file); -void safe_build_file_list (Glib::RefPtr &dir, std::vector &flist); -void safe_build_file_list (Glib::RefPtr &dir, std::vector &names, const Glib::ustring &directory = ""); -void safe_build_subdir_list (Glib::RefPtr &dir, std::vector &subDirs, bool add_hidden); - -bool safe_spawn_command_line_async (const Glib::ustring& cmd_utf8); -bool safe_spawn_command_line_sync (const Glib::ustring& cmd_utf8); - -Glib::ustring safe_locale_to_utf8 (const std::string& src); // from rtengine -std::string safe_locale_from_utf8 (const Glib::ustring& utf8_str); - - - -#endif +#ifndef SAFE_GTK_H_INCLUDED +#define SAFE_GTK_H_INCLUDED + +#include +#include +#include + +Glib::RefPtr safe_create_from_file(const std::string& filename); +Cairo::RefPtr safe_create_from_png(const std::string& filename); + +class FileMTimeInfo { + + public: + Glib::ustring fname; + Glib::TimeVal mtime; + + FileMTimeInfo (Glib::ustring name, Glib::TimeVal mtime) : fname(name), mtime(mtime) {} + bool operator<(const FileMTimeInfo& other) const { return mtime safe_query_file_info (Glib::RefPtr &file); +void safe_build_file_list (Glib::RefPtr &dir, std::vector &flist); +void safe_build_file_list (Glib::RefPtr &dir, std::vector &names, const Glib::ustring &directory = ""); +void safe_build_subdir_list (Glib::RefPtr &dir, std::vector &subDirs, bool add_hidden); + +bool safe_spawn_command_line_async (const Glib::ustring& cmd_utf8); +bool safe_spawn_command_line_sync (const Glib::ustring& cmd_utf8); + +Glib::ustring safe_locale_to_utf8 (const std::string& src); // from rtengine +std::string safe_locale_from_utf8 (const Glib::ustring& utf8_str); +std::string safe_filename_from_utf8 (const Glib::ustring& utf8_str); + +FILE * safe_g_fopen(const Glib::ustring& src,const gchar *mode); +bool safe_file_test (const Glib::ustring& filename, Glib::FileTest test); +int safe_g_remove(const Glib::ustring& filename); +int safe_g_rename(const Glib::ustring& oldFilename, const Glib::ustring& newFilename); +int safe_g_mkdir_with_parents(const Glib::ustring& dirName, int mode); +#endif