Fix some FTBFS issues when compiling with GCC 4.3
[synfig.git] / synfig-studio / trunk / src / gtkmm / app.cpp
index aa161fd..a3fb39c 100644 (file)
@@ -33,6 +33,7 @@
 #include <fstream>
 #include <iostream>
 #include <locale>
+#include <cstring>
 
 #ifdef HAVE_SYS_ERRNO_H
 #include <sys/errno.h>
@@ -268,7 +269,7 @@ namespace studio {
 bool
 really_delete_widget(Gtk::Widget *widget)
 {
-       synfig::info("really delete %p", (void*)widget);
+       // synfig::info("really delete %p", (void*)widget);
        delete widget;
        return false;
 }
@@ -279,7 +280,7 @@ really_delete_widget(Gtk::Widget *widget)
 void
 delete_widget(Gtk::Widget *widget)
 {
-       synfig::info("delete %p", (void*)widget);
+       // synfig::info("delete %p", (void*)widget);
        Glib::signal_timeout().connect(sigc::bind(sigc::ptr_fun(&really_delete_widget), widget), 50);
 }
 
@@ -384,157 +385,6 @@ public:
 
 /* === P R O C E D U R E S ================================================= */
 
-typedef unsigned char U8;
-typedef unsigned short U16;
-typedef unsigned long U32;
-
-typedef union {
-       struct {
-               U32 serial;
-               U32 checksum;
-       } element;
-       U8      raw[8];
-} V_KeyUnwound;
-
-static inline U32 hash_U32(U32 i)
-{
-       i=i*1664525+1013904223;
-       i=i*1664525+1013904223;
-       i=i*1664525+1013904223;
-       return i;
-}
-
-#ifdef BIG_ENDIAN
-static const int endian_fix_table[8] = { 3, 2, 1, 0, 7, 6, 5, 4 } ;
-#define endian_fix(x) (endian_fix_table[x])
-#else
-#define endian_fix(x) (x)
-#endif
-
-int v_unwind_key(V_KeyUnwound* unwound, const char* key)
-{
-       int i;
-       unwound->element.serial=0;
-       unwound->element.checksum=0;
-
-       for(i=0;i<16;i++)
-       {
-               U8 data;
-
-               switch(key[i])
-               {
-                       case '0': data=0; break;
-                       case '1': data=1; break;
-                       case '2': data=2; break;
-                       case '3': data=3; break;
-                       case '4': data=4; break;
-                       case '5': data=5; break;
-                       case '6': data=6; break;
-                       case '7': data=7; break;
-                       case '8': data=8; break;
-                       case '9': data=9; break;
-                       case 'a': case 'A':  data=10; break;
-                       case 'b': case 'B':  data=11; break;
-                       case 'c': case 'C':  data=12; break;
-                       case 'd': case 'D':  data=13; break;
-                       case 'e': case 'E':  data=14; break;
-                       case 'f': case 'F':  data=15; break;
-                       default: return 0; break;
-               }
-               int bit=i*2;
-               unwound->element.checksum|=(((U32)data&3)<<bit);
-               unwound->element.serial|=(((U32)(data>>2)&3)<<bit);
-       }
-       return 1;
-}
-
-int v_key_check(const char* key, U32* serial, U32 appid)
-{
-       V_KeyUnwound unwound_key;
-       U32 appid_mask_a=hash_U32(appid);
-       U32 appid_mask_b=hash_U32(appid_mask_a);
-
-       if(!v_unwind_key(&unwound_key, key))
-       {
-               // Invalid characters in key
-               return 0;
-       }
-
-
-       // Undo obfuscation pass
-       {
-               U32 next=hash_U32(unwound_key.raw[endian_fix(7)]);
-               int i;
-               for(i=0;i<7;i++)
-               {
-                       next=hash_U32(next);
-                       unwound_key.raw[endian_fix(i)]^=(next>>24);
-               }
-       }
-
-       unwound_key.element.serial^=appid_mask_a;
-       unwound_key.element.checksum^=appid_mask_b;
-
-       *serial=unwound_key.element.serial;
-
-       return unwound_key.element.checksum==hash_U32(unwound_key.element.serial);
-}
-
-
-#ifdef _WIN32
-# ifdef LICENSE_KEY_REQUIRED
-int check_license(String basedir)
-# else
-int check_license(String /*basedir*/)
-# endif
-#else
-int check_license(String /*basedir*/)
-#endif
-{
-#ifdef LICENSE_KEY_REQUIRED
-       String key;
-       String license_file;
-
-#ifndef _WIN32
-       license_file="/usr/local/etc/.synfiglicense";
-#else
-       license_file=basedir+"\\etc\\.synfiglicense";
-#endif
-
-       try {
-               key=Glib::file_get_contents(license_file);
-       } catch (Glib::FileError) { }
-       U32 serial(0);
-       if(!v_key_check(key.c_str(),&serial,0xdeadbeef))
-       {
-               while(!v_key_check(key.c_str(),&serial,0xdeadbeef))
-               {
-                       key.clear();
-
-                       if(!App::dialog_entry(
-                               _("Synfig Studio Authentication"),
-                               _("Please enter your license key below. You will not\nbe able to use this software without a valid license key."),
-                               key
-                       ))
-                               throw String("No License");
-               }
-
-               FILE* file=fopen(license_file.c_str(),"w");
-               if(file)
-               {
-                       fprintf(file,"%s",key.c_str());
-                       fclose(file);
-               }
-               else
-                       synfig::error("Unable to save license key!");
-       }
-       synfig::info("License Authenticated -- Serial #%05d",serial);
-       return serial;
-#else
-       return 1;
-#endif
-}
-
 /*
 void
 studio::UIManager::insert_action_group (const Glib::RefPtr<Gtk::ActionGroup>& action_group, int pos)
@@ -562,30 +412,24 @@ studio::add_action_group_to_top(Glib::RefPtr<studio::UIManager> ui_manager, Glib
 {
        ui_manager->insert_action_group(group,0);
        return;
-       DEBUGPOINT();
        std::list<Glib::RefPtr<Gtk::ActionGroup> > prev_groups(ui_manager->get_action_groups());
        std::list<Glib::RefPtr<Gtk::ActionGroup> >::reverse_iterator iter;
 
-       DEBUGPOINT();
        for(iter=prev_groups.rbegin();iter!=prev_groups.rend();++iter)
        {
-               DEBUGPOINT();
                if(*iter && (*iter)->get_name()!="menus")
                {
                        synfig::info("Removing action group "+(*iter)->get_name());
                        ui_manager->remove_action_group(*iter);
                }
        }
-       DEBUGPOINT();
        ui_manager->insert_action_group(group,0);
 
-       DEBUGPOINT();
        for(;!prev_groups.empty();prev_groups.pop_front())
        {
                if(prev_groups.front() && prev_groups.front()!=group && prev_groups.front()->get_name()!="menus")
                        ui_manager->insert_action_group(prev_groups.front(),1);
        }
-       DEBUGPOINT();
 }
 */
 class Preferences : public synfigapp::Settings
@@ -748,6 +592,7 @@ init_ui_manager()
 
        DEFINE_ACTION2("keyframe-properties", Gtk::StockID("gtk-properties"), _("Keyframe Properties"));
        DEFINE_ACTION("about", Gtk::StockID("synfig-about"));
+       DEFINE_ACTION("new", Gtk::Stock::NEW);
        DEFINE_ACTION("open", Gtk::Stock::OPEN);
        DEFINE_ACTION("save", Gtk::Stock::SAVE);
        DEFINE_ACTION("save-as", Gtk::Stock::SAVE_AS);
@@ -764,6 +609,7 @@ init_ui_manager()
        DEFINE_ACTION("options", _("Options"));
        DEFINE_ACTION("close", _("Close View"));
        DEFINE_ACTION("close-document", _("Close Document"));
+       DEFINE_ACTION("quit", Gtk::Stock::QUIT);
 
 
        DEFINE_ACTION("undo", Gtk::StockID("gtk-undo"));
@@ -866,6 +712,8 @@ init_ui_manager()
 "      </popup>"
 "      <popup name='menu-main' action='menu-main'>"
 "      <menu action='menu-file'>"
+"              <menuitem action='new' />"
+"              <menuitem action='open' />"
 "              <menuitem action='save' />"
 "              <menuitem action='save-as' />"
 "              <menuitem action='revert' />"
@@ -884,6 +732,7 @@ init_ui_manager()
 "              <menuitem action='options' />"
 "              <menuitem action='close' />"
 "              <menuitem action='close-document' />"
+"              <menuitem action='quit' />"
 "      </menu>"
 "      <menu action='menu-edit'>"
 "              <menuitem action='undo'/>"
@@ -1118,9 +967,6 @@ App::App(int *argc, char ***argv):
 {
        app_base_path_=etl::dirname(etl::dirname((*argv)[0]));
 
-       int serial_;
-       serial_=check_license(app_base_path_);
-
 
        ui_interface_=new GlobalUIInterface();
 
@@ -1146,31 +992,17 @@ App::App(int *argc, char ***argv):
 
        ipc=new IPC();
 
-       try
+       if(!SYNFIG_CHECK_VERSION())
        {
-               if(!SYNFIG_CHECK_VERSION())
-               {
                cerr<<"FATAL: Synfig Version Mismatch"<<endl;
                dialog_error_blocking("Synfig Studio",
                        "This copy of Synfig Studio was compiled against a\n"
                        "different version of libsynfig than what is currently\n"
                        "installed. Synfig Studio will now abort. Try downloading\n"
                        "the latest version from the Synfig website at\n"
-                       "http://www.synfig.com/ "
+                       "http://synfig.org/Download"
                );
                throw 40;
-               }
-       }
-       catch(synfig::SoftwareExpired)
-       {
-               cerr<<"FATAL: Software Expired"<<endl;
-               dialog_error_blocking("Synfig Studio",
-                       "This copy of Synfig Studio has expired.\n"
-                       "Please erase this copy, or download and\n"
-                       "install the latest copy from the Synfig\n"
-                       "website at http://www.synfig.com/ ."
-               );
-               throw 39;
        }
        Glib::set_application_name(_("Synfig Studio"));
 
@@ -1368,6 +1200,10 @@ App::App(int *argc, char ***argv):
 
                toolbox->present();
        }
+       catch(String x)
+       {
+               get_ui_interface()->error(_("Unknown exception caught when constructing App.\nThis software may be unstable.") + String("\n\n") + x);
+       }
        catch(...)
        {
                get_ui_interface()->error(_("Unknown exception caught when constructing App.\nThis software may be unstable."));
@@ -1700,8 +1536,10 @@ static OPENFILENAME ofn={};
 #endif
 
 bool
-App::dialog_open_file(const std::string &title, std::string &filename)
+App::dialog_open_file(const std::string &title, std::string &filename, std::string preference)
 {
+       info("App::dialog_open_file('%s', '%s', '%s')", title.c_str(), filename.c_str(), preference.c_str());
+
 #ifdef USE_WIN32_FILE_DIALOGS
        static TCHAR szFilter[] = TEXT ("All Files (*.*)\0*.*\0\0") ;
 
@@ -1746,26 +1584,36 @@ App::dialog_open_file(const std::string &title, std::string &filename)
 
 #else
        synfig::String prev_path;
-       if(!_preferences.get_value("curr_path",prev_path))
-               prev_path=".";
+
+       if(!_preferences.get_value(preference, prev_path))
+               prev_path = ".";
+
        prev_path = absolute_path(prev_path);
 
-    Gtk::FileChooserDialog *dialog=new Gtk::FileChooserDialog(title,Gtk::FILE_CHOOSER_ACTION_OPEN);
+    Gtk::FileChooserDialog *dialog = new Gtk::FileChooserDialog(title, Gtk::FILE_CHOOSER_ACTION_OPEN);
+
     dialog->set_current_folder(prev_path);
     dialog->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
     dialog->add_button(Gtk::Stock::OPEN,   Gtk::RESPONSE_ACCEPT);
-    if(!filename.empty())
-               if (is_absolute_path(filename))
-                       dialog->set_filename(filename);
-               else
-                       dialog->set_filename(prev_path + ETL_DIRECTORY_SEPARATOR + filename);
-    if(dialog->run()==GTK_RESPONSE_ACCEPT) {
-        filename=dialog->get_filename();
+
+    if (filename.empty())
+               dialog->set_filename(prev_path);
+       else if (is_absolute_path(filename))
+               dialog->set_filename(filename);
+       else
+               dialog->set_filename(prev_path + ETL_DIRECTORY_SEPARATOR + filename);
+
+    if(dialog->run() == GTK_RESPONSE_ACCEPT) {
+        filename = dialog->get_filename();
+               info("Saving preference %s = '%s' in App::dialog_open_file()", preference.c_str(), dirname(filename).c_str());
+               _preferences.set_value(preference, dirname(filename));
         delete dialog;
         return true;
     }
+
     delete dialog;
     return false;
+
     /*
 
        GtkWidget *ok;
@@ -1800,7 +1648,7 @@ App::dialog_open_file(const std::string &title, std::string &filename)
        if(val==1)
        {
                filename=gtk_file_selection_get_filename(GTK_FILE_SELECTION(fileselection));
-               _preferences.set_value("curr_path",dirname(filename));
+               _preferences.set_value(preference,dirname(filename));
        }
        else
        {
@@ -1814,8 +1662,10 @@ App::dialog_open_file(const std::string &title, std::string &filename)
 }
 
 bool
-App::dialog_save_file(const std::string &title, std::string &filename)
+App::dialog_save_file(const std::string &title, std::string &filename, std::string preference)
 {
+       info("App::dialog_save_file('%s', '%s', '%s')", title.c_str(), filename.c_str(), preference.c_str());
+
 #if USE_WIN32_FILE_DIALOGS
        static TCHAR szFilter[] = TEXT ("All Files (*.*)\0*.*\0\0") ;
 
@@ -1854,27 +1704,34 @@ App::dialog_save_file(const std::string &title, std::string &filename)
        if(GetSaveFileName(&ofn))
        {
                filename=szFilename;
-               _preferences.set_value("curr_path",dirname(filename));
+               _preferences.set_value(preference,dirname(filename));
                return true;
        }
        return false;
 #else
        synfig::String prev_path;
-       if(!_preferences.get_value("curr_path",prev_path))
+
+       if(!_preferences.get_value(preference, prev_path))
                prev_path=".";
+
        prev_path = absolute_path(prev_path);
 
-    Gtk::FileChooserDialog *dialog=new Gtk::FileChooserDialog(title,Gtk::FILE_CHOOSER_ACTION_SAVE);
+    Gtk::FileChooserDialog *dialog = new Gtk::FileChooserDialog(title, Gtk::FILE_CHOOSER_ACTION_SAVE);
+
     dialog->set_current_folder(prev_path);
     dialog->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
     dialog->add_button(Gtk::Stock::SAVE,   Gtk::RESPONSE_ACCEPT);
-    if(!filename.empty())
+
+    if (filename.empty())
+               dialog->set_filename(prev_path);
+    else
        {
                std::string full_path;
                if (is_absolute_path(filename))
                        full_path = filename;
                else
                        full_path = prev_path + ETL_DIRECTORY_SEPARATOR + filename;
+
                // select the file if it exists
                dialog->set_filename(full_path);
 
@@ -1883,15 +1740,17 @@ App::dialog_save_file(const std::string &title, std::string &filename)
                if(stat(full_path.c_str(),&s) == -1 && errno == ENOENT)
                        dialog->set_current_name(basename(filename));
        }
-    if(dialog->run()==GTK_RESPONSE_ACCEPT) {
-        filename=dialog->get_filename();
+
+    if(dialog->run() == GTK_RESPONSE_ACCEPT) {
+        filename = dialog->get_filename();
+               info("Saving preference %s = '%s' in App::dialog_save_file()", preference.c_str(), dirname(filename).c_str());
+               _preferences.set_value(preference, dirname(filename));
         delete dialog;
-               _preferences.set_value("curr_path",dirname(filename));
         return true;
     }
+
     delete dialog;
     return false;
-//     return dialog_open_file(title, filename);
 #endif
 }
 
@@ -2047,8 +1906,6 @@ App::open_as(std::string filename,std::string as)
                return false;
        }
 
-       _preferences.set_value("curr_path",dirname(as));
-
        return true;
 }
 
@@ -2085,7 +1942,7 @@ App::dialog_open()
 {
        string filename="*.sif";
 
-       while(dialog_open_file("Open", filename))
+       while(dialog_open_file("Open", filename, ANIMATION_DIR_PREFERENCE))
        {
                // If the filename still has wildcards, then we should
                // continue looking for the file we want
@@ -2149,7 +2006,7 @@ App::set_selected_canvas_view(etl::loose_handle<CanvasView> canvas_view)
 }
 
 etl::loose_handle<Instance>
-App::get_instance(Canvas::Handle canvas)
+App::get_instance(etl::handle<synfig::Canvas> canvas)
 {
        if(!canvas) return 0;
        canvas=canvas->get_root();