]> git.decadent.org.uk Git - videolink.git/commitdiff
Added URI of current link (if any) to error messages.
authorBen Hutchings <ben@decadent.org.uk>
Sat, 7 Jul 2007 14:03:23 +0000 (14:03 +0000)
committerBen Hutchings <ben@decadent.org.uk>
Sun, 2 Nov 2008 23:58:14 +0000 (23:58 +0000)
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

index b4210a181dbbac5c8c0cf9f2ce95d079ee2becb9..112125ad2b27e47c2ab8e8ef1d3e08b76fb080cc 100644 (file)
@@ -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<page_state> 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<nsIURI> 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);