00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include
00020 #include
00021 #include
00022 #include
00023 #include
00024 #include
00025 #include
00026 #include
00027 #include
00028
00029 #include "nntpgrab_plugin_schedular.h"
00030 #include "schedular_plugin.h"
00031
00032 void
00033 decoder_thread_func(gpointer data, gpointer user_data)
00034 {
00035 DecoderData *decoder_data = (DecoderData *) data;
00036 int saved_errno = 0;
00037 static time_t last_timestamp = 0;
00038
00039
00040 g_static_mutex_lock(&decoder_data->schedular->mutex);
00041 if (decoder_data->schedular->abort_flag || decoder_data->file->stop_flag) {
00042 decoder_data->file->now_decoding = FALSE;
00043 g_static_mutex_unlock(&decoder_data->schedular->mutex);
00044 g_slice_free(DecoderData, decoder_data);
00045 return;
00046 }
00047 g_static_mutex_unlock(&decoder_data->schedular->mutex);
00048
00049 imported_funcs_task_state_changed(decoder_data->collection_name, decoder_data->file->subject, decoder_data->file->status, TASK_STATE_DECODING);
00050
00051 g_static_mutex_lock(&decoder_data->schedular->mutex);
00052 decoder_data->file->status = TASK_STATE_DECODING;
00053 g_static_mutex_unlock(&decoder_data->schedular->mutex);
00054
00055
00056 if (!imported_funcs_decode_file(decoder_data->collection_name, decoder_data->file, &saved_errno)) {
00057 if (saved_errno == ENOSPC) {
00058
00059 stop_schedular_from_seperate_thread(strerror(saved_errno));
00060
00061
00062 g_usleep(G_USEC_PER_SEC * 1);
00063
00064 g_static_mutex_lock(&decoder_data->schedular->mutex);
00065 decoder_data->file->now_decoding = FALSE;
00066 imported_funcs_task_state_changed(decoder_data->collection_name, decoder_data->file->subject, decoder_data->file->status, TASK_STATE_WAITING_FOR_DECODE);
00067 decoder_data->file->status = TASK_STATE_WAITING_FOR_DECODE;
00068 g_static_mutex_unlock(&decoder_data->schedular->mutex);
00069
00070 g_slice_free(DecoderData, decoder_data);
00071
00072 return;
00073 } else if (saved_errno == -1) {
00074
00075 } else {
00076
00077 char *msg = g_strdup_printf(_("Unknown decode error occured, %s (%i)"), strerror(saved_errno), saved_errno);
00078 stop_schedular_from_seperate_thread(msg);
00079 g_free(msg);
00080
00081
00082 g_usleep(G_USEC_PER_SEC * 1);
00083
00084 g_static_mutex_lock(&decoder_data->schedular->mutex);
00085 decoder_data->file->now_decoding = FALSE;
00086 imported_funcs_task_state_changed(decoder_data->collection_name, decoder_data->file->subject, decoder_data->file->status, TASK_STATE_WAITING_FOR_DECODE);
00087 decoder_data->file->status = TASK_STATE_WAITING_FOR_DECODE;
00088 g_static_mutex_unlock(&decoder_data->schedular->mutex);
00089
00090 g_slice_free(DecoderData, decoder_data);
00091
00092 return;
00093 }
00094 }
00095
00096
00097 g_static_mutex_lock(&decoder_data->schedular->mutex);
00098
00099
00100 if (decoder_data->file->now_decoding) {
00101
00102 decoder_data->file->file_is_downloaded = TRUE;
00103 decoder_data->file->now_decoding = FALSE;
00104
00105 imported_funcs_task_state_changed(decoder_data->collection_name, decoder_data->file->subject, decoder_data->file->status, TASK_STATE_FINISHED);
00106 decoder_data->file->status = TASK_STATE_FINISHED;
00107 }
00108
00109 g_static_mutex_unlock(&decoder_data->schedular->mutex);
00110
00111
00112
00113 g_slice_free(DecoderData, decoder_data);
00114
00115
00116 if (time(NULL) > last_timestamp + 60) {
00117 schedular_plugin_save_queue(NULL);
00118 last_timestamp = time(NULL);
00119 }
00120 }
00121