#include <sys/types.h>
#include <cstdio>
#include <cstdlib>
-#include <fstream>
+
+#include <glib.h>
+#include "pbd/gstdio_compat.h"
#ifdef HAVE_LRDF
#include <lrdf.h>
#include "fst.h"
#include "pbd/basename.h"
#include <cstring>
+
+// dll-info
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdint.h>
+
#endif // WINDOWS_VST_SUPPORT
#ifdef LXVST_SUPPORT
#include <cstring>
#endif //LXVST_SUPPORT
-#include <pbd/gstdio_compat.h>
#include <glibmm/miscutils.h>
#include <glibmm/pattern.h>
#include <glibmm/fileutils.h>
if (!cache_only) {
string fn = Glib::build_filename (ARDOUR::user_cache_directory(), VST_BLACKLIST);
if (Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) {
- std::string bl;
- std::ifstream ifs (fn.c_str ());
- bl.assign ((std::istreambuf_iterator<char> (ifs)), (std::istreambuf_iterator<char> ()));
- PBD::info << _("VST Blacklist:") << "\n" << bl << "-----" << endmsg;
+ gchar *bl = NULL;
+ if (g_file_get_contents(fn.c_str (), &bl, NULL, NULL)) {
+ if (Config->get_verbose_plugin_scan()) {
+ PBD::info << _("VST Blacklist: ") << fn << "\n" << bl << "-----" << endmsg;
+ } else {
+ PBD::info << _("VST Blacklist:") << "\n" << bl << "-----" << endmsg;
+ }
+ g_free (bl);
+ }
}
}
#endif
return ret;
}
+static std::string dll_info (std::string path) {
+ std::string rv;
+ uint8_t buf[68];
+ uint16_t type = 0;
+ off_t pe_hdr_off = 0;
+
+ int fd = g_open(path.c_str(), O_RDONLY, 0444);
+
+ if (fd < 0) {
+ return _("cannot open dll"); // TODO strerror()
+ }
+
+ if (68 != read (fd, buf, 68)) {
+ rv = _("invalid dll, file too small");
+ goto errorout;
+ }
+ if (buf[0] != 'M' && buf[1] != 'Z') {
+ rv = _("not a dll");
+ goto errorout;
+ }
+
+ pe_hdr_off = *((int32_t*) &buf[60]);
+ if (pe_hdr_off !=lseek (fd, pe_hdr_off, SEEK_SET)) {
+ rv = _("cannot determine dll type");
+ goto errorout;
+ }
+ if (6 != read (fd, buf, 6)) {
+ rv = _("cannot read dll PE header");
+ goto errorout;
+ }
+
+ if (buf[0] != 'P' && buf[1] != 'E') {
+ rv = _("invalid dll PE header");
+ goto errorout;
+ }
+
+ type = *((uint16_t*) &buf[4]);
+ switch (type) {
+ case 0x014c:
+ rv = _("i386 (32-bit)");
+ break;
+ case 0x0200:
+ rv = _("Itanium");
+ break;
+ case 0x8664:
+ rv = _("x64 (64-bit)");
+ break;
+ case 0:
+ rv = _("Native Architecture");
+ break;
+ default:
+ rv = _("Unknown Architecture");
+ break;
+ }
+errorout:
+ assert (rv.length() > 0);
+ close (fd);
+ return rv;
+}
+
int
PluginManager::windows_vst_discover (string path, bool cache_only)
{
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("windows_vst_discover '%1'\n", path));
if (Config->get_verbose_plugin_scan()) {
- info << string_compose (_(" * %1 %2"), path, (cache_only ? _(" (cache only)") : "")) << endmsg;
+ if (cache_only) {
+ info << string_compose (_(" * %1 (cache only)"), path) << endmsg;
+ } else {
+ info << string_compose (_(" * %1 - %2"), path, dll_info (path)) << endmsg;
+ }
}
_cancel_timeout = false;
void
PluginManager::save_statuses ()
{
- ofstream ofs;
std::string path = Glib::build_filename (user_config_directory(), "plugin_statuses");
-
- ofs.open (path.c_str(), ios_base::openmode (ios::out|ios::trunc));
-
- if (!ofs) {
- return;
- }
+ stringstream ofs;
for (PluginStatusList::iterator i = statuses.begin(); i != statuses.end(); ++i) {
switch ((*i).type) {
case LXVST:
ofs << "LXVST";
break;
+ case Lua:
+ assert (0);
+ continue;
+ break;
}
ofs << ' ';
ofs << (*i).unique_id;;
ofs << endl;
}
-
- ofs.close ();
+ g_file_set_contents (path.c_str(), ofs.str().c_str(), -1, NULL);
+ PluginStatusesChanged (); /* EMIT SIGNAL */
}
void
PluginManager::load_statuses ()
{
std::string path = Glib::build_filename (user_config_directory(), "plugin_statuses");
- ifstream ifs (path.c_str());
-
- if (!ifs) {
+ gchar *fbuf = NULL;
+ if (!g_file_get_contents (path.c_str(), &fbuf, NULL, NULL)) {
return;
}
+ stringstream ifs (fbuf);
+ g_free (fbuf);
std::string stype;
std::string sstatus;
strip_whitespace_edges (id);
set_status (type, id, status);
}
-
- ifs.close ();
}
void