* Added PBD::UUID
authorSakari Bergen <sakari.bergen@beatwaves.net>
Fri, 19 Sep 2008 16:56:01 +0000 (16:56 +0000)
committerSakari Bergen <sakari.bergen@beatwaves.net>
Fri, 19 Sep 2008 16:56:01 +0000 (16:56 +0000)
* uuid headers are needed for building!
* Export presets and format profiles use UUID
* Moved ExportPreset class away from ExportProfileManager
* Workaround for Gtk::NoteBook bug in ExportMainDialog

git-svn-id: svn://localhost/ardour2/branches/3.0@3762 d708f5d6-7413-0410-9779-e7cbd77b26cf

14 files changed:
SConstruct
gtk2_ardour/export_main_dialog.cc
gtk2_ardour/export_main_dialog.h
libs/ardour/SConscript
libs/ardour/ardour/export_format_specification.h
libs/ardour/ardour/export_preset.h [new file with mode: 0644]
libs/ardour/ardour/export_profile_manager.h
libs/ardour/export_format_specification.cc
libs/ardour/export_handler.cc
libs/ardour/export_preset.cc [new file with mode: 0644]
libs/ardour/export_profile_manager.cc
libs/pbd/SConscript
libs/pbd/pbd/uuid.h [new file with mode: 0644]
libs/pbd/uuid.cc [new file with mode: 0644]

index b41b609820c0e081d5fc1b36eeb9241b6895ae5f..37f77a69b132897fb73050e08e345dc720edba31 100644 (file)
@@ -596,6 +596,9 @@ libraries['xml'].ParseConfig('pkg-config --cflags --libs libxml-2.0')
 libraries['xslt'] = LibraryInfo()
 libraries['xslt'].ParseConfig('pkg-config --cflags --libs libxslt')
 
+libraries['uuid'] = LibraryInfo()
+libraries['uuid'].ParseConfig('pkg-config --cflags --libs uuid')
+
 libraries['glib2'] = LibraryInfo()
 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs glib-2.0')
 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gobject-2.0')
index 7a0dd8186f8364ee67d4e22251d0a70dcc9abb28..a9955a395375b59b78f1d793fc290ace9154e4b5 100644 (file)
@@ -30,6 +30,7 @@
 #include <ardour/export_filename.h>
 #include <ardour/export_format_specification.h>
 #include <ardour/export_channel_configuration.h>
+#include <ardour/export_preset.h>
 
 #include "i18n.h"
 
@@ -177,7 +178,7 @@ ExportMainDialog::set_session (ARDOUR::Session* s)
        file_notebook.set_tab_label_packing (new_file_dummy, true, true, Gtk::PACK_START);
        new_file_hbox.show_all_children ();
        
-       file_notebook.signal_switch_page().connect (sigc::mem_fun (*this, &ExportMainDialog::handle_page_change));
+       page_change_connection = file_notebook.signal_switch_page().connect (sigc::mem_fun (*this, &ExportMainDialog::handle_page_change));
        new_file_button.signal_clicked().connect (sigc::mem_fun (*this, &ExportMainDialog::add_new_file_page));
        
        /* Load states */
@@ -217,11 +218,15 @@ ExportMainDialog::close_dialog ()
 void
 ExportMainDialog::sync_with_manager ()
 {
-       /* Clear */
+       /* Clear pages from notebook
+          The page switch handling has to be disabled during removing all pages due to a gtk bug
+        */
 
+       page_change_connection.block();
        while (file_notebook.get_n_pages() > 1) {
                file_notebook.remove_page (0);
        }
+       page_change_connection.block(false);
        
        page_counter = 1;
        last_visible_page = 0;
@@ -603,8 +608,6 @@ ExportMainDialog::update_remove_file_page_sensitivity ()
 void
 ExportMainDialog::handle_page_change (GtkNotebookPage*, uint page)
 {
-       if (file_notebook.get_n_pages() == 2 && page == 0) { return; }
-
        if (page + 1 == (uint32_t) file_notebook.get_n_pages()) {
                file_notebook.set_current_page (last_visible_page);
        } else {
index af795554e157ba0772919f94a7ce851b8ad87f5f..9c4429856de5c78171d87cdcda04b458d959d825 100644 (file)
@@ -181,6 +181,8 @@ class ExportMainDialog : public ArdourDialog {
        void add_file_page (ARDOUR::ExportProfileManager::FormatStatePtr format_state, ARDOUR::ExportProfileManager::FilenameStatePtr filename_state);
        void remove_file_page (FilePage * page);
        void update_remove_file_page_sensitivity ();
+       
+       sigc::connection page_change_connection;
        void handle_page_change (GtkNotebookPage*, uint32_t page);
        
        uint32_t last_visible_page;
index 55e287f46b7c937e8828c565c71482ed7fee2d28..1aa0cd0809b8e5302134fb072fa2f0b53d48d099 100644 (file)
@@ -73,6 +73,7 @@ export_format_manager.cc
 export_formats.cc
 export_format_specification.cc
 export_handler.cc
+export_preset.cc
 export_processor.cc
 export_profile_manager.cc
 export_status.cc
index 41f71e8275a33114d6a6270a88dc232cd887827a..6c195ff1311c35d3627793f14bd5a2e26bf5415b 100644 (file)
@@ -23,6 +23,8 @@
 
 #include <glibmm/ustring.h>
 
+#include <pbd/uuid.h>
+
 #include <ardour/types.h>
 #include <ardour/export_format_base.h>
 
@@ -99,7 +101,7 @@ class ExportFormatSpecification : public ExportFormatBase {
        
        /* Accessing functions */
        
-       uint32_t id () { return _id; }
+       PBD::UUID const & id () { return _id; }
        Glib::ustring const & name () const { return _name; }
        Glib::ustring description ();
        
@@ -150,7 +152,7 @@ class ExportFormatSpecification : public ExportFormatBase {
        /* The variables below have getters and setters */
        
        Glib::ustring   _name;
-       uint32_t        _id;
+       PBD::UUID       _id;
        
        Type            _type;
        DitherType      _dither_type;
@@ -170,13 +172,6 @@ class ExportFormatSpecification : public ExportFormatBase {
        
        void add_option (XMLNode * node, std::string const & name, std::string const & value);
        std::string get_option (XMLNode const * node, std::string const & name);
-       
-  /*** Static stuff for id management, ExportElementFactory will have access to these ***/
-
-       static void init_counter (uint32_t val) { if (val > _counter) { _counter = val; } }
-       static uint32_t counter () { return _counter; }
-
-       static uint32_t _counter;
 
 };
 
diff --git a/libs/ardour/ardour/export_preset.h b/libs/ardour/ardour/export_preset.h
new file mode 100644 (file)
index 0000000..56c27f3
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+    Copyright (C) 2008 Paul Davis
+    Author: Sakari Bergen
+
+    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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __ardour_export_preset_h__
+#define __ardour_export_preset_h__
+
+#include <string>
+
+#include <pbd/uuid.h>
+#include <pbd/xml++.h>
+
+using std::string;
+
+namespace ARDOUR
+{
+
+class Session;
+
+class ExportPreset {
+  public:
+       ExportPreset (string filename, Session & s);
+       ~ExportPreset ();
+
+       PBD::UUID const & id () const { return _id; }
+       string name () const { return _name; }
+
+       void set_name (string const & name);
+
+       // Note: The set_..._state functions take ownership of the XMLNode
+       void set_global_state (XMLNode & state);
+       void set_local_state (XMLNode & state);
+       
+       XMLNode const * get_global_state () const { return global.root(); }
+       XMLNode const * get_local_state () const { return local; }
+       
+       void save () const;
+       void remove_local () const;
+
+  private:
+
+       void set_id (string const & id);
+
+       XMLNode * get_instant_xml () const;
+       void save_instant_xml () const;
+       void remove_instant_xml () const;
+
+       PBD::UUID  _id;
+       string     _name;
+
+       Session &   session;
+       XMLTree     global;
+       XMLNode *   local;
+       
+};
+
+} // namespace ARDOUR
+
+#endif // __ardour_export_preset_h__
index 1a855d68684fc392407f879d6b3f48d17f99bf78..84a5251aa8b30f7b8062158c345df93f400d72ab 100644 (file)
@@ -31,6 +31,7 @@
 #include <sigc++/signal.h>
 #include <glibmm/ustring.h>
 
+#include <pbd/uuid.h>
 #include <pbd/file_utils.h>
 #include <pbd/xml++.h>
 
@@ -50,52 +51,13 @@ class ExportTimespan;
 class ExportChannelConfiguration;
 class ExportFormatSpecification;
 class ExportFilename;
+class ExportPreset;
 class Location;
 class Session;
 
 /// Manages (de)serialization of export profiles and related classes
 class ExportProfileManager
 {
-  public:
-       class Preset {
-         public:
-               Preset (string filename, Session & s);
-               ~Preset ();
-       
-               uint32_t id () const { return _id; }
-               string name () const { return _name; }
-       
-               void set_name (string name);
-               void set_id (uint32_t id);
-       
-               // Note: The set_..._state functions take ownership of the XMLNode
-               void set_global_state (XMLNode & state);
-               void set_local_state (XMLNode & state);
-               
-               XMLNode const * get_global_state () const { return global.root(); }
-               XMLNode const * get_local_state () const { return local; }
-               
-               void save () const;
-               void remove_local () const;
-       
-         private:
-       
-               XMLNode * get_instant_xml () const;
-               void save_instant_xml () const;
-               void remove_instant_xml () const;
-       
-               uint32_t   _id;
-               string     _name;
-       
-               Session &   session;
-               XMLTree     global;
-               XMLNode *   local;
-               
-       };
-
-       typedef boost::shared_ptr<Preset> PresetPtr;
-       typedef std::list<PresetPtr> PresetList;
-
   public:
 
        ExportProfileManager (Session & s);
@@ -104,6 +66,9 @@ class ExportProfileManager
        void load_profile ();
        void prepare_for_export ();
        
+       typedef boost::shared_ptr<ExportPreset> PresetPtr;
+       typedef std::list<PresetPtr> PresetList;
+       
        PresetList const & get_presets () { return preset_list; }
        void load_preset (PresetPtr preset);
        PresetPtr save_preset (string const & name);
@@ -112,14 +77,14 @@ class ExportProfileManager
   private:
        typedef boost::shared_ptr<ExportHandler> HandlerPtr;
 
-       typedef std::pair<uint32_t, PBD::sys::path> FilePair;
-       typedef std::map<uint32_t, PBD::sys::path> FileMap;
+       typedef std::pair<PBD::UUID, PBD::sys::path> FilePair;
+       typedef std::map<PBD::UUID, PBD::sys::path> FileMap;
        
        HandlerPtr  handler;
        Session &   session;
        
        void load_presets ();
-       uint32_t load_preset_from_disk (PBD::sys::path const & path); // Returns preset id
+       void load_preset_from_disk (PBD::sys::path const & path);
        
        void set_state (XMLNode const & root);
        void set_global_state (XMLNode const & root);
@@ -131,7 +96,6 @@ class ExportProfileManager
        
        PresetList preset_list;
        PresetPtr  current_preset;
-       uint32_t   preset_id_counter;
        FileMap    preset_file_map;
        
        std::vector<PBD::sys::path> find_file (std::string const & pattern);
index 61d9bef523e4199a35ef3b7e24a218ecb027058d..c317b38b17bb7c08af24d677db2157c81298c150 100644 (file)
@@ -39,11 +39,6 @@ namespace ARDOUR
 using namespace PBD;
 using std::string;
 
-/* The id counter is initialized to 1000 so that user created profiles have a id > 1000 
- * while ones shipped with ardour have one < 1000
- */
-uint32_t ExportFormatSpecification::_counter = 1000;
-
 ExportFormatSpecification::Time &
 ExportFormatSpecification::Time::operator= (AnyTime const & other)
 {
@@ -189,8 +184,6 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s) :
        sample_formats.insert (SF_None);
        sample_rates.insert (SR_None);
        qualities.insert (Q_None);
-       
-       _id = ++_counter;
 }
 
 ExportFormatSpecification::ExportFormatSpecification (Session & s, XMLNode const & state) :
@@ -210,7 +203,6 @@ ExportFormatSpecification::ExportFormatSpecification (ExportFormatSpecification
   _silence_end (other.session)
 {
        set_name (other.name() + " (copy)");
-       _id = ++_counter;
 
        _format_name = other._format_name;
        has_sample_format = other.has_sample_format;
@@ -250,7 +242,7 @@ ExportFormatSpecification::get_state ()
        XMLNode * root = new XMLNode ("ExportFormatSpecification");
        
        root->add_property ("name", _name);
-       root->add_property ("id", to_string (_id, std::dec));
+       root->add_property ("id", _id.to_s());
        
        node = root->add_child ("Encoding");
        node->add_property ("id", enum_2_string (format_id()));
@@ -313,8 +305,7 @@ ExportFormatSpecification::set_state (const XMLNode & root)
        }
        
        if ((prop = root.property ("id"))) {
-               std::istringstream iss (prop->value());
-               iss >> _id;
+               _id = prop->value();
        }
        
        /* Encoding and SRC */
index 9173449bec373305753f10f44115b2268aa00d2c..fd76b2e9e0d7476ed92d580be912d06284ea194e 100644 (file)
@@ -44,18 +44,12 @@ namespace ARDOUR
 ExportElementFactory::ExportElementFactory (Session & session) :
   session (session)
 {
-       XMLProperty * prop;
-       XMLNode * instant_node = ARDOUR::Config->instant_xml ("ExportFormatSpecification");
-       if (instant_node && (prop = instant_node->property ("id-counter"))) {
-               ExportFormatSpecification::init_counter (atoi (prop->value()));
-       }
+
 }
 
 ExportElementFactory::~ExportElementFactory ()
 {
-       XMLNode * instant_node = new XMLNode ("ExportFormatSpecification");
-       instant_node->add_property ("id-counter", to_string (ExportFormatSpecification::counter(), std::dec));
-       ARDOUR::Config->add_instant_xml (*instant_node);
+
 }
 
 ExportElementFactory::TimespanPtr
diff --git a/libs/ardour/export_preset.cc b/libs/ardour/export_preset.cc
new file mode 100644 (file)
index 0000000..620daa0
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+    Copyright (C) 2008 Paul Davis
+    Author: Sakari Bergen
+
+    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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <ardour/export_preset.h>
+
+#include <ardour/session.h>
+
+using namespace ARDOUR;
+
+ExportPreset::ExportPreset (string filename, Session & s) :
+  session (s), global (filename), local (0)
+{
+       XMLNode * root;
+       if ((root = global.root())) {
+               XMLProperty * prop;
+               if ((prop = root->property ("id"))) {
+                       set_id (prop->value());
+               }
+               if ((prop = root->property ("name"))) {
+                       set_name (prop->value());
+               }
+               
+               XMLNode * instant_xml = get_instant_xml ();
+               if (instant_xml) {
+                       XMLNode * instant_copy = new XMLNode (*instant_xml);
+                       set_local_state (*instant_copy);
+               }
+       }
+}
+
+ExportPreset::~ExportPreset ()
+{
+       if (local) {
+               delete local;
+       }
+}
+
+void
+ExportPreset::set_name (string const & name)
+{
+       _name = name;
+
+       XMLNode * node; 
+       if ((node = global.root())) {
+               node->add_property ("name", name);
+       }
+       if (local) {
+               local->add_property ("name", name);
+       }
+}
+
+void
+ExportPreset::set_id (string const & id)
+{
+       _id = id;
+
+       XMLNode * node;
+       if ((node = global.root())) {
+               node->add_property ("id", id);
+       }
+       if (local) {
+               local->add_property ("id", id);
+       }
+}
+
+void
+ExportPreset::set_global_state (XMLNode & state)
+{
+       delete global.root ();
+       global.set_root (&state);
+       
+       set_id (_id.to_s());
+       set_name (_name);
+}
+
+void
+ExportPreset::set_local_state (XMLNode & state)
+{
+       delete local;
+       local = &state;
+       
+       set_id (_id.to_s());
+       set_name (_name);
+}
+
+void
+ExportPreset::save () const
+{
+       save_instant_xml ();
+       if (global.root()) {
+               global.write ();
+       }
+}
+
+void
+ExportPreset::remove_local () const
+{
+       remove_instant_xml ();
+}
+
+XMLNode *
+ExportPreset::get_instant_xml () const
+{
+       XMLNode * instant_xml;
+       
+       if ((instant_xml = session.instant_xml ("ExportPresets"))) {
+               XMLNodeList children = instant_xml->children ("ExportPreset");
+               for (XMLNodeList::iterator it = children.begin(); it != children.end(); ++it) {
+                       XMLProperty * prop;
+                       if ((prop = (*it)->property ("id")) && _id == PBD::UUID(prop->value())) {
+                               return *it;
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+void
+ExportPreset::save_instant_xml () const
+{
+       if (!local) { return; }
+
+       /* First remove old, then add new */
+       
+       remove_instant_xml ();
+       
+       XMLNode * instant_xml;
+       if ((instant_xml = session.instant_xml ("ExportPresets"))) {
+               instant_xml->add_child_copy (*local);
+       } else {
+               instant_xml = new XMLNode ("ExportPresets");
+               instant_xml->add_child_copy (*local);
+               session.add_instant_xml (*instant_xml, false);
+       }
+}
+
+void
+ExportPreset::remove_instant_xml () const
+{
+       XMLNode * instant_xml;
+       if ((instant_xml = session.instant_xml ("ExportPresets"))) {
+               instant_xml->remove_nodes_and_delete ("id", _id.to_s());
+       }
+}
index 88432bcedc5b7ba95a7de60de3ebb1b3157fd414..7fb1b928d3587b19bbe81ffe37bce502575d12b5 100644 (file)
@@ -35,6 +35,7 @@
 #include <ardour/export_timespan.h>
 #include <ardour/export_channel_configuration.h>
 #include <ardour/export_filename.h>
+#include <ardour/export_preset.h>
 #include <ardour/export_handler.h>
 #include <ardour/session.h>
 
@@ -45,143 +46,6 @@ using namespace PBD;
 namespace ARDOUR
 {
 
-ExportProfileManager::Preset::Preset (string filename, Session & s) :
-  _id (0), session (s), global (filename), local (0)
-{
-       XMLNode * root;
-       if ((root = global.root())) {
-               XMLProperty * prop;
-               if ((prop = root->property ("id"))) {
-                       set_id ((uint32_t) atoi (prop->value()));
-               }
-               if ((prop = root->property ("name"))) {
-                       set_name (prop->value());
-               }
-               
-               XMLNode * instant_xml = get_instant_xml ();
-               if (instant_xml) {
-                       XMLNode * instant_copy = new XMLNode (*instant_xml);
-                       set_local_state (*instant_copy);
-               }
-       }
-}
-
-ExportProfileManager::Preset::~Preset ()
-{
-       if (local) {
-               delete local;
-       }
-}
-
-void
-ExportProfileManager::Preset::set_name (string name)
-{
-       _name = name;
-
-       XMLNode * node; 
-       if ((node = global.root())) {
-               node->add_property ("name", name);
-       }
-       if (local) {
-               local->add_property ("name", name);
-       }
-}
-
-void
-ExportProfileManager::Preset::set_id (uint32_t id)
-{
-       _id = id;
-
-       XMLNode * node;
-       if ((node = global.root())) {
-               node->add_property ("id", id);
-       }
-       if (local) {
-               local->add_property ("id", id);
-       }
-}
-
-void
-ExportProfileManager::Preset::set_global_state (XMLNode & state)
-{
-       delete global.root ();
-       global.set_root (&state);
-       
-       set_id (_id);
-       set_name (_name);
-}
-
-void
-ExportProfileManager::Preset::set_local_state (XMLNode & state)
-{
-       delete local;
-       local = &state;
-       
-       set_id (_id);
-       set_name (_name);
-}
-
-void
-ExportProfileManager::Preset::save () const
-{
-       save_instant_xml ();
-       if (global.root()) {
-               global.write ();
-       }
-}
-
-void
-ExportProfileManager::Preset::remove_local () const
-{
-       remove_instant_xml ();
-}
-
-XMLNode *
-ExportProfileManager::Preset::get_instant_xml () const
-{
-       XMLNode * instant_xml;
-       
-       if ((instant_xml = session.instant_xml ("ExportPresets"))) {
-               XMLNodeList children = instant_xml->children ("ExportPreset");
-               for (XMLNodeList::iterator it = children.begin(); it != children.end(); ++it) {
-                       XMLProperty * prop;
-                       if ((prop = (*it)->property ("id")) && _id == (uint32_t) atoi (prop->value())) {
-                               return *it;
-                       }
-               }
-       }
-       
-       return 0;
-}
-
-void
-ExportProfileManager::Preset::save_instant_xml () const
-{
-       if (!local) { return; }
-
-       /* First remove old, then add new */
-       
-       remove_instant_xml ();
-       
-       XMLNode * instant_xml;
-       if ((instant_xml = session.instant_xml ("ExportPresets"))) {
-               instant_xml->add_child_copy (*local);
-       } else {
-               instant_xml = new XMLNode ("ExportPresets");
-               instant_xml->add_child_copy (*local);
-               session.add_instant_xml (*instant_xml, false);
-       }
-}
-
-void
-ExportProfileManager::Preset::remove_instant_xml () const
-{
-       XMLNode * instant_xml;
-       if ((instant_xml = session.instant_xml ("ExportPresets"))) {
-               instant_xml->remove_nodes_and_delete ("id", to_string (_id, std::dec));
-       }
-}
-
 ExportProfileManager::ExportProfileManager (Session & s) :
   handler (s.get_export_handler()),
   session (s),
@@ -276,12 +140,10 @@ ExportProfileManager::load_preset (PresetPtr preset)
 void
 ExportProfileManager::load_presets ()
 {
-       preset_id_counter = 0;
-       
        vector<sys::path> found = find_file ("*.preset");
 
        for (vector<sys::path>::iterator it = found.begin(); it != found.end(); ++it) {
-               preset_id_counter = std::max (preset_id_counter, load_preset_from_disk (*it));
+               load_preset_from_disk (*it);
        }
 }
 
@@ -289,11 +151,9 @@ ExportProfileManager::PresetPtr
 ExportProfileManager::save_preset (string const & name)
 {
        if (!current_preset) {
-               ++preset_id_counter;
-               string filename = export_config_dir.to_string() + "/" + to_string (preset_id_counter, std::dec) + ".preset";
-               current_preset.reset (new Preset (filename, session));
+               string filename = export_config_dir.to_string() + "/" + name + ".preset";
+               current_preset.reset (new ExportPreset (filename, session));
                preset_list.push_back (current_preset);
-               current_preset->set_id (preset_id_counter);
        }
        
        XMLNode * global_preset = new XMLNode ("ExportPreset");
@@ -333,18 +193,16 @@ ExportProfileManager::remove_preset ()
        current_preset.reset();
 }
 
-uint32_t
+void
 ExportProfileManager::load_preset_from_disk (PBD::sys::path const & path)
 {
-       PresetPtr preset (new Preset (path.to_string(), session));
+       PresetPtr preset (new ExportPreset (path.to_string(), session));
        preset_list.push_back (preset);
        
        /* Handle id to filename mapping */
        
        FilePair pair (preset->id(), path);
        preset_file_map.insert (pair);
-       
-       return preset->id();
 }
 
 void
@@ -731,10 +589,10 @@ ExportProfileManager::FormatStatePtr
 ExportProfileManager::deserialize_format (XMLNode & root)
 {
        XMLProperty * prop;
-       uint32_t id = 0;
+       UUID id;
        
        if ((prop = root.property ("id"))) {
-               id = atoi (prop->value());
+               id = prop->value();
        }
        
        for (FormatList::iterator it = format_list->begin(); it != format_list->end(); ++it) {
@@ -751,7 +609,7 @@ ExportProfileManager::serialize_format (FormatStatePtr state)
 {
        XMLNode * root = new XMLNode ("ExportFormat");
        
-       string id = state->format ? to_string (state->format->id(), std::dec) : "0";
+       string id = state->format ? state->format->id().to_s() : "";
        root->add_property ("id", id);
        
        return *root;
index 4b65e3ee385675ceb7ab19fc67d023ba1085a31c..5f2d20e405b9d5d7d8aad1b6e287a22e3617bf83 100644 (file)
@@ -45,6 +45,7 @@ strsplit.cc
 textreceiver.cc
 transmitter.cc
 undo.cc
+uuid.cc
 version.cc
 whitespace.cc
 xml++.cc
@@ -57,6 +58,7 @@ pbd = conf.Finish()
 
 pbd.Merge ([ libraries['sigc2'],
              libraries['xml'],
+             libraries['uuid'],
              libraries['glibmm2'],
              libraries['glib2'] ])
 
diff --git a/libs/pbd/pbd/uuid.h b/libs/pbd/pbd/uuid.h
new file mode 100644 (file)
index 0000000..16a6743
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+    Copyright (C) 2008 Paul Davis
+    Author: Sakari Bergen
+
+    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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __pbd_uuid_h__
+#define __pbd_uuid_h__
+
+#include <string>
+#include <uuid/uuid.h>
+
+namespace PBD {
+
+class UUID {
+
+  public:
+       UUID () { uuid_generate (id); }
+       UUID (UUID const & other) { uuid_copy (id, other.id); }
+       UUID (std::string const & str) { uuid_parse (str.c_str(), id); }
+       
+       UUID& operator= (std::string const & str);
+       std::string to_s () const;
+       
+       bool operator== (UUID const & other) const { return !uuid_compare (id, other.id); }
+       bool operator!= (UUID const & other) const { return uuid_compare (id, other.id); }
+       bool operator< (UUID const & other) const { return uuid_compare (id, other.id) < 0; }
+       
+       operator bool() const { return !uuid_is_null (id); }
+
+  private:
+       uuid_t id;
+
+};
+
+} // namespace PBD
+
+#endif // __pbd_uuid_h__
diff --git a/libs/pbd/uuid.cc b/libs/pbd/uuid.cc
new file mode 100644 (file)
index 0000000..0ccffa2
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+    Copyright (C) 2008 Paul Davis
+    Author: Sakari Bergen
+
+    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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <pbd/uuid.h>
+
+using namespace PBD;
+
+UUID&
+UUID::operator= (std::string const & str)
+{
+       uuid_parse (str.c_str(), id);
+       return *this;
+}
+
+std::string
+UUID::to_s () const
+{
+       char buf[37];
+       uuid_unparse (id, buf);
+       return std::string (buf);
+}