// See the file "COPYING" for licence details.
#include <cassert>
+#include <cstring>
#include <exception>
#include <fstream>
#include <iomanip>
#include <string>
#include <stdlib.h>
-#include <unistd.h>
#include <boost/shared_ptr.hpp>
#include <nsIContent.h>
#include <nsIDocShell.h>
#include <nsIDOMAbstractView.h>
+#include <nsIDOMBarProp.h>
#include <nsIDOMDocumentEvent.h>
#include <nsIDOMDocumentView.h>
#include <nsIDOMElement.h>
std::vector<std::string> video_paths_;
bool pending_window_update_;
int pending_req_count_;
+ bool have_tweaked_page_;
std::auto_ptr<temp_file> background_temp_;
struct page_state;
std::auto_ptr<page_state> page_state_;
output_dir_(output_dir),
stylesheet_(load_css("file://" WEBDVD_LIB_DIR "/webdvd.css")),
pending_window_update_(false),
- pending_req_count_(0)
+ pending_req_count_(0),
+ have_tweaked_page_(false)
{
set_size_request(frame_params_.width, frame_params_.height);
set_resizable(false);
video_paths_.size() + 1)))
.second)
{
- // FIXME: Should accept some slightly different URI prefixes
- // (e.g. file://localhost/) and decode any URI-escaped
- // characters in the path.
- assert(uri.compare(0, 8, "file:///") == 0);
- video_paths_.push_back(uri.substr(7));
+ Glib::ustring 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);
}
}
resource_map_[uri].second = ++page_count;
page_links_.resize(page_count);
- pending_window_update_ = true;
browser_widget_.load_uri(uri);
}
}
}
- if (flags & GTK_MOZ_EMBED_FLAG_STOP
- && flags & GTK_MOZ_EMBED_FLAG_IS_WINDOW)
+ if (flags & GTK_MOZ_EMBED_FLAG_IS_DOCUMENT
+ && flags & GTK_MOZ_EMBED_FLAG_START)
+ {
+ pending_window_update_ = true;
+ have_tweaked_page_ = false;
+ }
+
+ if (flags & GTK_MOZ_EMBED_FLAG_IS_WINDOW
+ && flags & GTK_MOZ_EMBED_FLAG_STOP)
{
// Check whether the load was successful, ignoring this
// pseudo-error.
nsCOMPtr<nsIDOMWindow> dom_window;
check(browser->GetContentDOMWindow(getter_AddRefs(dom_window)));
- if (output_dir_.empty())
+ // If we haven't done so already, apply the stylesheet and
+ // disable scrollbars.
+ if (!have_tweaked_page_)
{
- // In preview mode, just apply the stylesheet and let the
- // user select links.
apply_style_sheet(stylesheet_, pres_shell);
+
+ // This actually only needs to be done once.
+ nsCOMPtr<nsIDOMBarProp> dom_bar_prop;
+ check(dom_window->GetScrollbars(getter_AddRefs(dom_bar_prop)));
+ check(dom_bar_prop->SetVisible(false));
+
+ have_tweaked_page_ = true;
+
+ // Might need to wait a while for things to load or more
+ // likely for a re-layout.
+ if (pending_req_count_ > 0)
+ return true;
}
- else
+
+ // All further work should only be done if we're not in preview mode.
+ if (!output_dir_.empty())
{
- // If we haven't already started work on this page, apply
- // the stylesheet and save a screenshot of its normal
- // appearance.
+ // If we haven't already started work on this page, save a
+ // screenshot of its normal appearance.
if (!page_state_.get())
- {
- apply_style_sheet(stylesheet_, pres_shell);
save_screenshot();
- }
// Start or continue processing links.
process_links(pres_shell, pres_context, dom_window);
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,
{
video::frame_params frame_params = video::pal_params;
bool preview_mode = false;
+ std::string menu_url;
+ std::string output_dir;
- // Do initial argument parsing. We have to do this before
+ // Do initial option parsing. We have to do this before
// letting Gtk parse the arguments since we may need to spawn
// Xvfb first.
int argi = 1;
// Initialise Gtk
Gtk::Main kit(argc, argv);
- // Complete argument parsing with Gtk's options out of the way.
+ // Complete option parsing with Gtk's options out of the way.
argi = 1;
while (argi != argc)
{
break;
}
}
- if (argc - argi != (preview_mode ? 1 : 2))
+
+ // Look for a starting URL or filename and (except in preview
+ // mode) an output directory after the options.
+ if (argc - argi != (preview_mode ? 1 : 2))
{
print_usage(std::cerr, argv[0]);
return EXIT_FAILURE;
}
+ if (std::strstr(argv[argi], "://"))
+ {
+ // It appears to be an absolute URL, so use it as-is.
+ menu_url = argv[argi];
+ }
+ else
+ {
+ // Assume it's a filename. Resolve it to an absolute URL.
+ std::string path(argv[argi]);
+ if (!Glib::path_is_absolute(path))
+ path = Glib::build_filename(Glib::get_current_dir(), path);
+ menu_url = Glib::filename_to_uri(path);
+ }
+ if (!preview_mode)
+ output_dir = argv[argi + 1];
// Initialise Mozilla
BrowserWidget::init();
- WebDvdWindow window(frame_params,
- argv[argi],
- preview_mode ? "" : argv[argi + 1]);
+ // Run the browser/converter
+ WebDvdWindow window(frame_params, menu_url, output_dir);
Gtk::Main::run(window);
}
catch (std::exception & e)