static void load_animation (GInputStream *input_stream, CbMedia *media) { GdkPixbufAnimation *animation; GdkPixbuf *frame; GError *error = NULL; cairo_surface_t *surface; cairo_t *ct; gboolean has_alpha; animation = gdk_pixbuf_animation_new_from_stream (input_stream, NULL, &error); if (error) { g_warning ("Couldn't load pixbuf: %s (%s)", error->message, media->url); mark_invalid (media); g_error_free (error); return; } frame = gdk_pixbuf_animation_get_static_image (animation); if (!gdk_pixbuf_animation_is_static_image (animation)) media->animation = animation; /* Takes ref */ else media->animation = NULL; has_alpha = gdk_pixbuf_get_has_alpha (frame); surface = cairo_image_surface_create (has_alpha ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, gdk_pixbuf_get_width (frame), gdk_pixbuf_get_height (frame)); ct = cairo_create (surface); gdk_cairo_set_source_pixbuf (ct, frame, 0.0, 0.0); cairo_paint (ct); cairo_destroy (ct); media->surface = surface; if (media->surface == NULL) { g_warning ("Surface of %p is null", media); mark_invalid (media); goto out; } media->width = gdk_pixbuf_get_width (frame); media->height = gdk_pixbuf_get_height (frame); media->loaded = TRUE; media->invalid = FALSE; out: if (media->animation == NULL) g_object_unref (animation); cb_media_loading_finished (media); }
static void cb_media_downloader_load_twitter_video (CbMediaDownloader *downloader, CbMedia *media) { SoupMessage *msg = soup_message_new ("GET", media->url); GRegex *regex; GMatchInfo *match_info; soup_session_send_message (downloader->soup_session, msg); if (msg->status_code != SOUP_STATUS_OK) { mark_invalid (media); g_object_unref (msg); return; } regex = g_regex_new ("<img src=\"(.*?)\" class=\"animated-gif-thumbnail", 0, 0, NULL); g_regex_match (regex, (const char *)msg->response_body->data, 0, &match_info); if (g_match_info_get_match_count (match_info) > 0) { g_assert (media->type == CB_MEDIA_TYPE_ANIMATED_GIF); media->url = g_match_info_fetch (match_info, 1); g_regex_unref (regex); g_match_info_free (match_info); g_object_unref (msg); return; } else { g_regex_unref (regex); g_match_info_free (match_info); regex = g_regex_new ("<source video-src=\"(.*?)\"", 0, 0, NULL); g_regex_match (regex, (const char *)msg->response_body->data, 0, &match_info); media->url = g_match_info_fetch (match_info, 1); media->type = CB_MEDIA_TYPE_TWITTER_VIDEO; } g_regex_unref (regex); g_match_info_free (match_info); regex = g_regex_new ("poster=\"(.*?)\"", 0, 0, NULL); g_regex_match (regex, (const char *)msg->response_body->data, 0, &match_info); media->thumb_url = g_match_info_fetch (match_info, 1); g_regex_unref (regex); g_match_info_free (match_info); g_object_unref (msg); }
static void handle_syscall(pid_t child) { if (sc_pending[child]) { sc_pending[child] = false; return; } else { sc_pending[child] = true; } /* IO Syscall require special care */ if (is_syscall_io(child)) { if (tracer_state == TRACER_DUMPING && !is_valid_io(child)) { mark_invalid(); } } }
static void cb_media_downloader_load_threaded (CbMediaDownloader *downloader, CbMedia *media) { const char *url; SoupMessage *msg; GInputStream *input_stream; g_return_if_fail (CB_IS_MEDIA_DOWNLOADER (downloader)); g_return_if_fail (CB_IS_MEDIA (media)); g_return_if_fail (media->url != NULL); g_object_ref (media); url = canonicalize_url (media->url); /* For these, we first need to download some html and get the real URL of the image we want to display */ if (g_str_has_prefix (url, "instagr.am") || g_str_has_prefix (url, "instagram.com/p/")) { cb_media_downloader_get_instagram_url (downloader, media); } else if (g_str_has_prefix (url, "ow.ly/i/") || g_str_has_prefix (url, "flickr.com/photos/") || g_str_has_prefix (url, "flic.kr/p/") || g_str_has_prefix (url, "flic.kr/s/") || g_str_has_prefix (url, "vine.co/v/")) { cb_media_downloader_load_real_url (downloader, media, "<meta property=\"og:image\" content=\"(.*?)\"", 1); } else if (g_str_has_prefix (url, "twitpic.com/")) { cb_media_downloader_load_real_url (downloader, media, "<meta name=\"twitter:image\" value=\"(.*?)\"", 1); } else if (g_str_has_suffix (url, "/photo/1")) { cb_media_downloader_load_twitter_video (downloader, media); } else if (g_str_has_prefix (url, "d.pr/i/")) { cb_media_downloader_load_real_url (downloader, media, "<meta property=\"og:image\"\\s+content=\"(.*?)\"", 1); } if (media->url == NULL) { g_warning ("Media is invalid."); mark_invalid (media); return; } msg = soup_message_new ("GET", media->thumb_url ? media->thumb_url : media->url); if (msg == NULL) { mark_invalid (media); g_warning ("soup_message_new failed for URI '%s'", media->thumb_url ? media->thumb_url : media->url); return; } g_signal_connect (msg, "got-chunk", G_CALLBACK (update_media_progress), media); soup_session_send_message (downloader->soup_session, msg); if (msg->status_code != SOUP_STATUS_OK) { g_debug ("Request on '%s' returned status '%s'", media->thumb_url ? media->thumb_url : media->url, soup_status_get_phrase (msg->status_code)); mark_invalid (media); g_object_unref (msg); return; } input_stream = g_memory_input_stream_new_from_data (msg->response_body->data, msg->response_body->length, NULL); load_animation (input_stream, media); g_input_stream_close (input_stream, NULL, NULL); g_object_unref (input_stream); g_object_unref (msg); }