From 3aa895a3012db38e9528c59211f5314d77c5f8f7 Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Sat, 7 Jul 2007 14:03:23 +0000 Subject: [PATCH] Added URI of current link (if any) to error messages. Replaced warning about use of non-file scheme for video link with an error, since this definitely should not be ignored. Changed messages involving URIs to consistently enclose them in angle brackets. --- videolink.cpp | 123 ++++++++++++++++++++++++++++---------------------- 1 file changed, 69 insertions(+), 54 deletions(-) diff --git a/videolink.cpp b/videolink.cpp index b4210a1..112125a 100644 --- a/videolink.cpp +++ b/videolink.cpp @@ -236,6 +236,9 @@ namespace { return pending_window_update_ || pending_req_count_; } + // Try to do as much processing as possible. Quit if done; + // report and quit if an exception occurs. + void try_process(); // Do as much processing as possible. Return a flag indicating // whether to call again once the browser is idle. bool process(); @@ -343,7 +346,7 @@ namespace { assert(!page_queue_.empty()); const std::string & uri = page_queue_.front(); - std::cout << "INFO: Loading " << uri << std::endl; + std::cout << "INFO: Loading <" << uri << ">" << std::endl; browser_widget_.load_uri(uri); } @@ -430,32 +433,7 @@ namespace } if (!browser_is_busy()) - { - try - { - if (!process()) - { - finished_ = true; - Gtk::Main::quit(); - } - } - catch (std::exception & e) - { - if (!page_queue_.empty()) - std::cerr << "ERROR: While processing <" - << page_queue_.front() << ">:\n"; - std::cerr << "ERROR: " << e.what() << "\n"; - Gtk::Main::quit(); - } - catch (Glib::Exception & e) - { - if (!page_queue_.empty()) - std::cerr << "ERROR: While processing <" - << page_queue_.front() << ">:\n"; - std::cerr << "ERROR: " << e.what() << "\n"; - Gtk::Main::quit(); - } - } + try_process(); } struct conversion_window::page_state @@ -478,9 +456,54 @@ namespace link_iterator links_it, links_end; rectangle link_rect; + std::string link_target; bool link_changing; }; + void conversion_window::try_process() + { + try + { + if (!process()) + { + finished_ = true; + Gtk::Main::quit(); + } + } + catch (...) + { + // Print context of exception. + if (!page_queue_.empty()) + { + std::cerr << "ERROR: While processing page <" + << page_queue_.front() << ">:\n"; + if (page_state_.get() && !page_state_->link_target.empty()) + std::cerr << "ERROR: While processing link to <" + << page_state_->link_target << ">:\n"; + } + + // Print exception message. + try + { + throw; + } + catch (std::exception & e) + { + std::cerr << "ERROR: " << e.what() << "\n"; + } + catch (Glib::Exception & e) + { + std::cerr << "ERROR: " << e.what() << "\n"; + } + catch (...) + { + std::cerr << "ERROR: Unknown exception\n"; + } + + Gtk::Main::quit(); + } + } + bool conversion_window::process() { assert(!page_queue_.empty()); @@ -499,31 +522,26 @@ namespace check(dom_window->GetDocument(getter_AddRefs(basic_doc))); // Start or continue processing links. - std::auto_ptr state(page_state_); - if (!state.get()) - state.reset( + if (!page_state_.get()) + page_state_.reset( new page_state( get_screenshot(), basic_doc, frame_params_.width, frame_params_.height)); - if (process_links( - state.get(), + if (!process_links( + page_state_.get(), basic_doc, pres_shell, pres_context, dom_window)) - { - // Save iteration state for later. - page_state_ = state; - } - else { // We've finished work on the links so generate the // menu VOB. - quantise_rgba_pixbuf(state->diff_pixbuf, + quantise_rgba_pixbuf(page_state_->diff_pixbuf, dvd::button_n_colours); generator_.generate_menu_vob( resource_map_[page_queue_.front()].index, - state->norm_pixbuf, state->diff_pixbuf); + page_state_->norm_pixbuf, page_state_->diff_pixbuf); // Move on to the next page, if any, or else generate // the DVD filesystem. + page_state_.reset(); page_queue_.pop(); if (!page_queue_.empty()) { @@ -591,17 +609,17 @@ namespace assert(link); nsCOMPtr uri_iface; check(link->GetHrefURI(getter_AddRefs(uri_iface))); - std::string uri_and_fragment, uri, fragment; + std::string uri, fragment; { - nsCString uri_and_fragment_ns; - check(uri_iface->GetSpec(uri_and_fragment_ns)); - uri_and_fragment.assign(uri_and_fragment_ns.BeginReading(), - uri_and_fragment_ns.EndReading()); + nsCString link_target_ns; + check(uri_iface->GetSpec(link_target_ns)); + state->link_target.assign(link_target_ns.BeginReading(), + link_target_ns.EndReading()); - std::size_t hash_pos = uri_and_fragment.find('#'); - uri.assign(uri_and_fragment, 0, hash_pos); + std::size_t hash_pos = state->link_target.find('#'); + uri.assign(state->link_target, 0, hash_pos); if (hash_pos != std::string::npos) - fragment.assign(uri_and_fragment, + fragment.assign(state->link_target, hash_pos + 1, std::string::npos); } @@ -617,8 +635,8 @@ namespace if (state->link_rect.empty()) { - std::cerr << "WARN: Ignoring invisible link to " - << uri_and_fragment << "\n"; + std::cerr << "WARN: Ignoring invisible link to <" + << state->link_target << ">\n"; continue; } @@ -632,11 +650,8 @@ namespace PRBool is_file; check(uri_iface->SchemeIs("file", &is_file)); if (!is_file) - { - std::cerr << "WARN: Ignoring non-file link to " - << uri_and_fragment << "\n"; - continue; - } + throw std::runtime_error( + "Link to video does not use file: scheme"); target = add_title(uri, format); target.sub_index = std::strtoul(fragment.c_str(), NULL, 10); -- 2.39.2