Webkit GTK :: Comment détecter la fin d’un téléchargement?

Je me demandais s’il existe un moyen de savoir quand un téléchargement Webkit est terminé sans erreur. J’utilise l’API C. J’espérais qu’un signal serait émis (similaire au début du téléchargement), mais cela ne semble pas être le cas.

En recherchant l’index de l’API webkit, je ne vois aucun signal qui puisse être pertinent: http://webkitgtk.org/reference/index-all.html

Dois-je vraiment interroger chaque téléchargement de kit Web jusqu’à la fin?

À votre santé

    Un signal est émis à la fin du téléchargement. Le signal est WebKitWebView “chargement terminé”, vous pouvez également surveiller les modifications de propriété de “état du chargement” toujours dans l’object WebKitWebView.

    Le code C suivant vous montre comment:

    #include  #include  static void destroy_cb(GtkWidget* widget, gpointer data) { gtk_main_quit(); } static void load_finished_cb(WebKitWebView *web_view, WebKitWebFrame *web_frame, gpointer data) { printf("Finished downloading %s\n", webkit_web_view_get_uri(web_view)); } static void load_status_cb(GObject* object, GParamSpec* pspec, gpointer data) { WebKitWebView *web_view; WebKitLoadStatus status; const gchar *uri; web_view = WEBKIT_WEB_VIEW(object); status = webkit_web_view_get_load_status(web_view); uri = webkit_web_view_get_uri(web_view); switch (status) { case WEBKIT_LOAD_PROVISIONAL: printf("Load provisional: %s\n", uri); break; case WEBKIT_LOAD_COMMITTED: printf("Load commited: %s\n", uri); break; case WEBKIT_LOAD_FIRST_VISUALLY_NON_EMPTY_LAYOUT: printf("Load first visually non empty layout: %s\n", uri); break; case WEBKIT_LOAD_FINISHED: printf("Load finished: %s\n", uri); break; default: g_assert_not_reached(); } } int main(int argc, char* argv[]) { const char *uri; GtkWidget* window; WebKitWebView* web_view; gtk_init(&argc, &argv); if (argc == 1) { printf("Usage: URI\n"); return 1; } uri = argv[1]; if(!g_thread_supported()) g_thread_init(NULL); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(window), 600, 400); g_signal_connect(window, "destroy", G_CALLBACK(destroy_cb), NULL); web_view = web_view = WEBKIT_WEB_VIEW(webkit_web_view_new()); webkit_web_view_set_transparent(web_view, TRUE); /* Register a callback that gets invoked each time that a page is finished downloading */ g_signal_connect(web_view, "load-finished", G_CALLBACK(load_finished_cb), NULL); /* Register a callback that gets invoked each time that the load status changes */ g_object_connect(web_view, "signal::notify::load-status", G_CALLBACK(load_status_cb), NULL); webkit_web_view_load_uri(web_view, uri); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(web_view)); gtk_widget_grab_focus(GTK_WIDGET(web_view)); gtk_widget_show_all(window); gtk_main(); return 0; } 

    Vous pouvez utiliser le signal WebView “demandé par téléchargement” pour obtenir un WebKitDownload . Utilisez ensuite un signal WebKitDownload ‘informer’ de la même manière que vous le feriez avec le changement d’état de chargement de votre WebView .

    Je me suis heurté à cela en Python, je vais donc commencer par cela au cas où je ferais une mauvaise traduction ci-dessous.

     def on_download_requested(webview, download): #set the destination uri (downloads folder, etc) ... #connect the status change handler download.connect('notify::status', on_download_status_change) return True def on_download_status_change(download, status): #get the status from download, since the provided status is a little weird #(i think this is specific to the binding) if download.get_status().value_name == 'WEBKIT_DOWNLOAD_STATUS_ERROR': #error handling ... elif download.get_status().value_name == 'WEBKIT_DOWNLOAD_STATUS_FINISHED': #the download is finished! ... else: ... 

    Ou, modifier la réponse de @ potyl pour une version C … cela semble assez simple.

     #include  #include  static void destroy_cb(GtkWidget* widget, gpointer data) { gtk_main_quit(); } static void download_status_cb(GObject* object, GParamSpec* pspec, gpointer data){ //WebKitDownload *download, GObject* object, GParamSpec* pspec, gpointer data) { WebKitDownload *download; WebKitDownloadStatus status; concst gchar *uri; download = WEBKIT_DOWNLOAD(object); status = webkit_download_get_status(download); uri = webkit_download_get_uri(download): switch (status) { case WEBKIT_DOWNLOAD_STATUS_ERROR: printf("download error: %s\n", uri); break; case WEBKIT_DOWNLOAD_STATUS_CREATED: printf("download created: %s\n", uri); break; case WEBKIT_DOWNLOAD_STATUS_STARTED: printf("download started: %s\n", uri); break; case WEBKIT_DOWNLOAD_STATUS_CANCELLED: printf("download cancelled: %s\n", uri); break; case WEBKIT_DOWNLOAD_STATUS_FINISHED: printf("download finished!: %s\n", uri); break; default: g_assert_not_reached(); } } static void download_requested_cb(WebKitWebView *web_view, WebKitDownload *download) { const char *filename; //note that if the suggested filename has spaces, it'll cause trouble below filename = webkit_download_get_suggested_filename(); //set the destination uri (eg, send the file to a downloads folder) webkit_download_set_destination_uri(download,"file:///some/place/for/your/Downloads/test.mp3"); //connect the status callback g_object_connect(download, "signal::notify::status", G_CALLBACK(download_status_cb), NULL); return true; //if we return false, the download will be cancelled } int main(int argc, char* argv[]) { const char *uri; GtkWidget* window; WebKitWebView* web_view; gtk_init(&argc, &argv); if (argc == 1) { printf("Usage: URI\n"); return 1; } uri = argv[1]; if(!g_thread_supported()) g_thread_init(NULL); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(window), 600, 400); g_signal_connect(window, "destroy", G_CALLBACK(destroy_cb), NULL); web_view = web_view = WEBKIT_WEB_VIEW(webkit_web_view_new()); webkit_web_view_set_transparent(web_view, TRUE); /* Register a callback that gets invoked each time that a page is finished downloading */ g_signal_connect(web_view, "load-finished", G_CALLBACK(load_finished_cb), NULL); /* Register a callback that gets invoked each time a download is requested */ g_object_connect(web_view, "download-requested", G_CALLBACK(download_requested_cb), NULL); webkit_web_view_load_uri(web_view, uri); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(web_view)); gtk_widget_grab_focus(GTK_WIDGET(web_view)); gtk_widget_show_all(window); gtk_main(); return 0; } 

    J’espère que la traduction C laide et non testée aide 🙂

    On dirait que vous devez interroger le WebKitDownload à la main:

     WebKitDownloadStatus s = webkit_download_get_status(downloader); if(s == WEBKIT_DOWNLOAD_STATUS_FINISHED) { /* The download has successfully finished. */ } else if(s == WEBKIT_DOWNLOAD_STATUS_STARTED) { /* Still going, 100*webkit_download_get_progress(downloader) percent complete. */ }