static void update_load_file (updateJobPtr job) { gchar *filename = job->request->source; gchar *anchor; job->result = update_result_new (); if (!strncmp (filename, "file://",7)) filename += 7; anchor = strchr (filename, '#'); if (anchor) *anchor = 0; /* strip anchors from filenames */ if (g_file_test (filename, G_FILE_TEST_EXISTS)) { /* we have a file... */ if ((!g_file_get_contents (filename, &(job->result->data), &(job->result->size), NULL)) || (job->result->data[0] == '\0')) { job->result->httpstatus = 403; /* FIXME: maybe setting request->returncode would be better */ liferea_shell_set_status_bar (_("Error: Could not open file \"%s\""), filename); } else { job->result->httpstatus = 200; debug2 (DEBUG_UPDATE, "Successfully read %d bytes from file %s.", job->result->size, filename); } } else { liferea_shell_set_status_bar (_("Error: There is no file \"%s\""), filename); job->result->httpstatus = 404; /* FIXME: maybe setting request->returncode would be better */ } update_process_finished_job (job); }
static gboolean update_dequeue_job (gpointer user_data) { updateJobPtr job; if (!pendingJobs) return FALSE; /* we must be in shutdown */ if (numberOfActiveJobs >= MAX_ACTIVE_JOBS) return FALSE; /* we'll be called again when a job finishes */ job = (updateJobPtr)g_async_queue_try_pop(pendingHighPrioJobs); if (!job) job = (updateJobPtr)g_async_queue_try_pop(pendingJobs); if(!job) return FALSE; /* no request at the moment */ numberOfActiveJobs++; job->state = REQUEST_STATE_PROCESSING; debug1 (DEBUG_UPDATE, "processing request (%s)", job->request->source); if (job->callback == NULL) { update_process_finished_job (job); } else { update_job_run (job); } return TRUE; /* since I got a job now, there may be more in the queue */ }
static void update_exec_cmd (updateJobPtr job) { FILE *f; int status; size_t len; job->result = update_result_new (); /* if the first char is a | we have a pipe else a file */ debug1 (DEBUG_UPDATE, "executing command \"%s\"...", (job->request->source) + 1); f = popen ((job->request->source) + 1, "r"); if (f) { while (!feof (f) && !ferror (f)) { job->result->data = g_realloc (job->result->data, job->result->size + 1025); len = fread (&job->result->data[job->result->size], 1, 1024, f); if (len > 0) job->result->size += len; } status = pclose (f); if (WIFEXITED (status) && WEXITSTATUS (status) == 0) job->result->httpstatus = 200; else job->result->httpstatus = 404; /* FIXME: maybe setting request->returncode would be better */ if (job->result->data) job->result->data[job->result->size] = '\0'; } else { liferea_shell_set_status_bar (_("Error: Could not open pipe \"%s\""), (job->request->source) + 1); job->result->httpstatus = 404; /* FIXME: maybe setting request->returncode would be better */ } update_process_finished_job (job); }
static void network_process_callback (SoupSession *session, SoupMessage *msg, gpointer user_data) { updateJobPtr job = (updateJobPtr)user_data; SoupDate *last_modified; const gchar *tmp = NULL; job->result->source = soup_uri_to_string (soup_message_get_uri(msg), FALSE); if (SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code)) { job->result->returncode = msg->status_code; job->result->httpstatus = 0; } else { job->result->httpstatus = msg->status_code; job->result->returncode = 0; } debug1 (DEBUG_NET, "download status code: %d", msg->status_code); debug1 (DEBUG_NET, "source after download: >>>%s<<<", job->result->source); job->result->data = g_memdup (msg->response_body->data, msg->response_body->length+1); job->result->size = (size_t)msg->response_body->length; debug1 (DEBUG_NET, "%d bytes downloaded", job->result->size); job->result->contentType = g_strdup (soup_message_headers_get_content_type (msg->response_headers, NULL)); /* Update last-modified date */ tmp = soup_message_headers_get_one (msg->response_headers, "Last-Modified"); if (tmp) { /* The string may be badly formatted, which will make * soup_date_new_from_string() return NULL */ last_modified = soup_date_new_from_string (tmp); if (last_modified) { job->result->updateState->lastModified = soup_date_to_time_t (last_modified); soup_date_free (last_modified); } } /* Update ETag value */ tmp = soup_message_headers_get_one (msg->response_headers, "ETag"); if (tmp) { job->result->updateState->etag = g_strdup(tmp); } update_process_finished_job (job); }