/* This file is part of Ingen. * Copyright (C) 2007-2009 Dave Robillard * * Ingen 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. * * Ingen 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 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 St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef THREADEDLOADER_H #define THREADEDLOADER_H #include #include #include #include #include "raul/Thread.hpp" #include "raul/Slave.hpp" #include #include "interface/EngineInterface.hpp" #include "client/DeprecatedLoader.hpp" #include "serialisation/Serialiser.hpp" #include "serialisation/Parser.hpp" using std::string; using std::list; using boost::optional; namespace Ingen { using namespace Shared; using namespace Client; using namespace Serialisation; namespace GUI { /** Thread for loading patch files. * * This is a seperate thread so it can send all the loading message without * blocking everything else, so the app can respond to the incoming events * caused as a result of the patch loading, while the patch loads. * * Implemented as a slave with a list of closures (events) which processes * all events in the (mutex protected) list each time it's whipped. * * \ingroup GUI */ class ThreadedLoader : public Raul::Slave { public: ThreadedLoader(SharedPtr engine); void load_patch(bool merge, const Glib::ustring& document_uri, optional data_path, optional engine_parent, optional engine_symbol, optional engine_data); void save_patch(SharedPtr model, const string& filename); SharedPtr parser(); private: void save_patch_event(SharedPtr model, const string& filename); /** Returns nothing and takes no parameters (because they have all been bound) */ typedef sigc::slot Closure; void _whipped(); SharedPtr _engine; DeprecatedLoader _deprecated_loader; Glib::Mutex _mutex; list _events; }; } // namespace GUI } // namespace Ingen #endif // LOADERRTHREAD_H