.second)
{
Glib::ustring hostname;
- video_paths_.push_back(Glib::filename_from_uri(uri, hostname));
+ std::string filename(Glib::filename_from_uri(uri, hostname));
// FIXME: Should check the hostname
+ if (!Glib::file_test(filename, Glib::FILE_TEST_IS_REGULAR))
+ throw std::runtime_error(
+ filename + " is missing or not a regular file");
+ video_paths_.push_back(filename);
}
}
void WebDvdWindow::on_net_state_change(const char * uri,
gint flags, guint status)
{
+# ifdef DEBUG_ON_NET_STATE_CHANGE
+ std::cout << "WebDvdWindow::on_net_state_change(";
+ if (uri)
+ std::cout << '"' << uri << '"';
+ else
+ std::cout << "NULL";
+ std::cout << ", ";
+ {
+ gint flags_left = flags;
+ static const struct {
+ gint value;
+ const char * name;
+ } flag_names[] = {
+ { GTK_MOZ_EMBED_FLAG_START, "STATE_START" },
+ { GTK_MOZ_EMBED_FLAG_REDIRECTING, "STATE_REDIRECTING" },
+ { GTK_MOZ_EMBED_FLAG_TRANSFERRING, "STATE_TRANSFERRING" },
+ { GTK_MOZ_EMBED_FLAG_NEGOTIATING, "STATE_NEGOTIATING" },
+ { GTK_MOZ_EMBED_FLAG_STOP, "STATE_STOP" },
+ { GTK_MOZ_EMBED_FLAG_IS_REQUEST, "STATE_IS_REQUEST" },
+ { GTK_MOZ_EMBED_FLAG_IS_DOCUMENT, "STATE_IS_DOCUMENT" },
+ { GTK_MOZ_EMBED_FLAG_IS_NETWORK, "STATE_IS_NETWORK" },
+ { GTK_MOZ_EMBED_FLAG_IS_WINDOW, "STATE_IS_WINDOW" }
+ };
+ for (int i = 0; i != sizeof(flag_names)/sizeof(flag_names[0]); ++i)
+ {
+ if (flags & flag_names[i].value)
+ {
+ std::cout << flag_names[i].name;
+ flags_left -= flag_names[i].value;
+ if (flags_left)
+ std::cout << " | ";
+ }
+ }
+ if (flags_left)
+ std::cout << "0x" << std::setbase(16) << flags_left;
+ }
+ std::cout << ", " << "0x" << std::setbase(16) << status << ")\n";
+# endif // DEBUG_ON_NET_STATE_CHANGE
+
if (flags & GTK_MOZ_EMBED_FLAG_IS_REQUEST)
{
if (flags & GTK_MOZ_EMBED_FLAG_START)
check(uri->GetPath(path));
// FIXME: This is a bit of a hack. Perhaps we could decide
// later based on the MIME type determined by Mozilla?
- if (path.Length() > 4
- && std::strcmp(path.EndReading() - 4, ".vob") == 0)
+ if ((path.Length() > 4
+ && std::strcmp(path.EndReading() - 4, ".vob") == 0)
+ || (path.Length() > 8
+ && std::strcmp(path.EndReading() - 8, ".voblist")
+ == 0))
{
PRBool is_file;
check(uri->SchemeIs("file", &is_file));
" <titles>\n"
" <pgc>\n"
// Record calling page/menu.
- " <pre> g12 = g1; </pre>\n"
+ " <pre> g12 = g1; </pre>\n";
+
+ // Write a reference to a linked VOB file, or the contents
+ // of a linked VOB list file.
+ const std::string & video_path = video_paths_[video_num - 1];
+ if (video_path.compare(video_path.size() - 4, 4, ".vob") == 0)
+ {
// FIXME: Should XML-escape the path
- " <vob file='" << video_paths_[video_num - 1]
- << "'/>\n"
+ file << " <vob file='" << video_path << "'/>\n";
+ }
+ else
+ {
+ assert(video_path.compare(video_path.size() - 8, 8,
+ ".voblist") == 0);
+ // TODO: Validate the file contents;
+ file << Glib::file_get_contents(video_path);
+ }
+
+ file <<
// If page/menu location has not been changed during the
// video, change the location to be the following
// link/button when returning to it. In any case,