Репозитории ALT
S: | 0.99-alt3.qa2 |
5.1: | 0.99-alt3 |
4.1: | 0.99-alt1 |
4.0: | 0.99-alt0.1 |
3.0: | 0.99-alt0.1 |
Группа :: Разработка/C
Пакет: libtranslate
Главная Изменения Спек Патчи Sources Загрузить Gear Bugs and FR Repocop
Патч: libtranslate-ds-timed.patch
Скачать
Скачать
diff -dPNur libtranslate-0.99/src/modules/translate-generic-service.c libtranslate-0.99-new/src/modules/translate-generic-service.c
--- libtranslate-0.99/src/modules/translate-generic-service.c 2005-01-17 17:46:38.000000000 +0100
+++ libtranslate-0.99-new/src/modules/translate-generic-service.c 2005-07-27 22:13:33.000000000 +0200
@@ -131,6 +131,7 @@
const char *post_content_type,
const GSList *headers,
TransferFlags flags,
+ GTimeVal *deadline,
TranslateProgressFunc progress_func,
gpointer user_data,
GError **err);
@@ -181,6 +182,15 @@
gpointer user_data,
GError **err);
+static char *translate_generic_service_timed_translate_text (TranslateService *service,
+ const char *text,
+ const char *from,
+ const char *to,
+ GTimeVal *deadline,
+ TranslateProgressFunc progress_func,
+ gpointer user_data,
+ GError **err);
+
char *translate_generic_service_expand (const char *warning_prefix,
const char *str,
...);
@@ -248,6 +258,7 @@
service_class->get_pairs = translate_generic_service_get_pairs;
service_class->translate_text = translate_generic_service_translate_text;
+ service_class->timed_translate_text = translate_generic_service_timed_translate_text;
service_class->translate_web_page = translate_generic_service_translate_web_page;
g_object_class_install_property(object_class,
@@ -387,12 +398,18 @@
return TRUE; /* continue */
}
+static void send_message_cb(SoupMessage *req, gpointer user_data) {
+ g_object_ref(req);
+ *(gboolean*)user_data = TRUE;
+}
+
static char *
translate_generic_service_get (const char *uri,
const char *post,
const char *post_content_type,
const GSList *headers,
TransferFlags flags,
+ GTimeVal *deadline,
TranslateProgressFunc progress_func,
gpointer user_data,
GError **err)
@@ -400,6 +417,8 @@
TransferInfo info;
SoupMessage *message;
const GSList *l;
+ GTimeVal tv;
+ gboolean completed = 0, canceled = 0;
char *response = NULL;
g_return_val_if_fail(uri != NULL, FALSE);
@@ -479,9 +498,27 @@
if (translate_generic_debug_flags & TRANSLATE_GENERIC_DEBUG_LOG_TRANSFERS)
translate_generic_service_log_connect(message);
+ if (deadline) {
+ soup_session_queue_message(info.session, message, send_message_cb, &completed);
+
+ do {
+ g_main_iteration (FALSE);
+ if (completed) break;
+
+ g_get_current_time(&tv);
+ } while ((tv.tv_sec < deadline->tv_sec)||((tv.tv_sec == deadline->tv_sec)&&(tv.tv_usec < deadline->tv_usec)));
+
+ if (!completed) {
+ soup_session_cancel_message(info.session, message);
+ canceled = 1;
+ }
+ } else
soup_session_send_message(info.session, message);
g_object_unref(info.session);
+ if (canceled)
+ g_set_error(err, TRANSLATE_ERROR, TRANSLATE_ERROR_CANCELLED, _("Timeout"));
+ else
if (SOUP_STATUS_IS_SUCCESSFUL(message->status_code))
{
const char *charset = NULL;
@@ -833,10 +870,11 @@
}
static char *
-translate_generic_service_translate_text (TranslateService *service,
+translate_generic_service_timed_translate_text (TranslateService *service,
const char *text,
const char *from,
const char *to,
+ GTimeVal *deadline,
TranslateProgressFunc progress_func,
gpointer user_data,
GError **err)
@@ -882,16 +920,16 @@
headers = g_slist_copy(group->http_headers);
headers = g_slist_concat(headers, g_slist_copy(group->text_location->http_headers));
-
+
response = translate_generic_service_get(url,
post,
group->text_location->content_type,
headers,
TRANSFER_FOLLOW_REFRESH | TRANSFER_CONVERT,
+ deadline,
progress_func,
user_data,
err);
-
g_free(url);
g_free(post);
g_slist_free(headers);
@@ -991,6 +1029,18 @@
return answer ? g_string_free(answer, FALSE) : NULL;
}
+static char *
+translate_generic_service_translate_text (TranslateService *service,
+ const char *text,
+ const char *from,
+ const char *to,
+ TranslateProgressFunc progress_func,
+ gpointer user_data,
+ GError **err)
+{
+ return translate_generic_service_timed_translate_text(service, text, from, to, NULL, progress_func, user_data, err);
+}
+
char *
translate_generic_service_expand (const char *warning_prefix,
const char *str,
@@ -1252,6 +1302,7 @@
group->web_page_location->content_type,
headers,
0,
+ NULL,
progress_func,
user_data,
err);
@@ -1311,7 +1362,7 @@
g_free(proxy_text_uri);
}
- session = soup_session_sync_new_with_options(SOUP_SESSION_PROXY_URI, proxy_uri, NULL);
+ session = soup_session_async_new_with_options(SOUP_SESSION_PROXY_URI, proxy_uri, NULL);
if (proxy_uri)
soup_uri_free(proxy_uri);
diff -dPNur libtranslate-0.99/src/translate-service.c libtranslate-0.99-new/src/translate-service.c
--- libtranslate-0.99/src/translate-service.c 2005-01-17 17:45:23.000000000 +0100
+++ libtranslate-0.99-new/src/translate-service.c 2005-07-27 17:18:07.000000000 +0200
@@ -372,6 +372,28 @@
}
char *
+translate_service_timed_translate_text (TranslateService *service,
+ const char *text,
+ const char *from,
+ const char *to,
+ GTimeVal *deadline,
+ TranslateProgressFunc progress_func,
+ gpointer user_data,
+ GError **err)
+{
+ g_return_val_if_fail(TRANSLATE_IS_SERVICE(service), NULL);
+ g_return_val_if_fail(TRANSLATE_SERVICE_GET_CLASS(service)->translate_text != NULL, NULL);
+ g_return_val_if_fail(text != NULL, NULL);
+ g_return_val_if_fail(from != NULL, NULL);
+ g_return_val_if_fail(to != NULL, NULL);
+
+ if (TRANSLATE_SERVICE_GET_CLASS(service)->timed_translate_text)
+ return TRANSLATE_SERVICE_GET_CLASS(service)->timed_translate_text(service, text, from, to, deadline, progress_func, user_data, err);
+
+ return TRANSLATE_SERVICE_GET_CLASS(service)->translate_text(service, text, from, to, progress_func, user_data, err);
+}
+
+char *
translate_service_translate_web_page (TranslateService *service,
const char *url,
const char *from,
diff -dPNur libtranslate-0.99/src/translate-service.h libtranslate-0.99-new/src/translate-service.h
--- libtranslate-0.99/src/translate-service.h 2005-01-17 17:45:29.000000000 +0100
+++ libtranslate-0.99-new/src/translate-service.h 2005-07-27 16:54:46.000000000 +0200
@@ -73,6 +73,14 @@
TranslateProgressFunc progress_func,
gpointer user_data,
GError **err);
+ char *(*timed_translate_text)(TranslateService *service,
+ const char *text,
+ const char *from,
+ const char *to,
+ GTimeVal *deadline,
+ TranslateProgressFunc progress_func,
+ gpointer user_data,
+ GError **err);
char *(*translate_web_page) (TranslateService *service,
const char *url,
const char *from,
diff -dPNur libtranslate-0.99/src/translate-service-private.h libtranslate-0.99-new/src/translate-service-private.h
--- libtranslate-0.99/src/translate-service-private.h 2005-01-17 17:45:17.000000000 +0100
+++ libtranslate-0.99-new/src/translate-service-private.h 2005-07-27 17:30:00.000000000 +0200
@@ -41,6 +41,14 @@
TranslateProgressFunc progress_func,
gpointer user_data,
GError **err);
+char *translate_service_timed_translate_text (TranslateService *service,
+ const char *text,
+ const char *from,
+ const char *to,
+ GTimeVal *deadline,
+ TranslateProgressFunc progress_func,
+ gpointer user_data,
+ GError **err);
char *translate_service_translate_web_page (TranslateService *service,
const char *url,
const char *from,
diff -dPNur libtranslate-0.99/src/translate-session.c libtranslate-0.99-new/src/translate-session.c
--- libtranslate-0.99/src/translate-session.c 2005-01-17 17:45:35.000000000 +0100
+++ libtranslate-0.99-new/src/translate-session.c 2005-07-27 16:52:46.000000000 +0200
@@ -62,6 +62,8 @@
{
GMutex *mutex;
GCond *progress_cond;
+
+ GTimeVal *deadline;
TranslateSession *session;
GSList *services;
@@ -487,6 +489,7 @@
* @text: a nul-terminated string.
* @from: a RFC 3066 language tag.
* @to: a RFC 3066 language tag.
+ * @timeout: timeout in microseconds.
* @progress_func: a function to call when progressing, or %NULL.
* @user_data: data to pass to @progress_func, or %NULL.
* @err: a location to report errors, or %NULL. Any of the errors in
@@ -505,10 +508,11 @@
* when no longer needed.
**/
char *
-translate_session_translate_text (TranslateSession *session,
+translate_session_timed_translate_text (TranslateSession *session,
const char *text,
const char *from,
const char *to,
+ gulong timeout,
TranslateProgressFunc progress_func,
gpointer user_data,
GError **err)
@@ -519,6 +523,7 @@
unsigned int max_threads;
GThreadPool *pool;
GSList *l;
+ GTimeVal deadline;
unsigned int max_chunk_len = 0;
char *translated = NULL;
@@ -527,6 +532,11 @@
g_return_val_if_fail(from != NULL, NULL);
g_return_val_if_fail(to != NULL, NULL);
+ if (timeout) {
+ g_get_current_time(&deadline);
+ g_time_val_add(&deadline, timeout);
+ }
+
LOCK(session);
info.services = translate_session_get_services_for_translation(session,
TRANSLATE_PAIR_TEXT,
@@ -560,7 +570,8 @@
chunks = translate_session_split(text, max_chunk_len);
info.mutex = g_mutex_new();
- info.progress_cond = progress_func ? g_cond_new() : NULL;
+ info.progress_cond = (progress_func||timeout) ? g_cond_new() : NULL;
+ info.deadline = timeout ? &deadline : NULL;
info.session = session;
info.chunks = NULL;
info.from = from;
@@ -614,6 +625,11 @@
GSList *l;
int n_chunks;
+ if (timeout) {
+ if (!g_cond_timed_wait(info.progress_cond, info.mutex, info.deadline))
+ info.err = g_error_new(TRANSLATE_ERROR,TRANSLATE_ERROR_CANCELLED,_("timeout"));
+ break;
+ } else
g_cond_wait(info.progress_cond, info.mutex);
if (info.err)
@@ -680,6 +696,18 @@
return translated;
}
+char *
+translate_session_translate_text (TranslateSession *session,
+ const char *text,
+ const char *from,
+ const char *to,
+ TranslateProgressFunc progress_func,
+ gpointer user_data,
+ GError **err)
+{
+ return translate_session_timed_translate_text(session, text, from, to, 0, progress_func, user_data, err);
+}
+
static void
translate_session_translate_thread (gpointer data, gpointer user_data)
{
@@ -709,10 +737,11 @@
if (ret)
return;
- chunk_info->translated = translate_service_translate_text(service,
+ chunk_info->translated = translate_service_timed_translate_text(service,
chunk_info->chunk,
info->from,
info->to,
+ info->deadline,
info->progress_cond ? translate_session_translate_progress_cb : NULL,
info->progress_cond ? chunk_info : NULL,
&tmp_err);
diff -dPNur libtranslate-0.99/src/translate-session.h libtranslate-0.99-new/src/translate-session.h
--- libtranslate-0.99/src/translate-session.h 2005-01-17 17:45:40.000000000 +0100
+++ libtranslate-0.99-new/src/translate-session.h 2005-07-27 14:41:05.000000000 +0200
@@ -93,6 +93,14 @@
unsigned int translate_session_get_max_threads (TranslateSession *session);
int translate_session_get_max_retries (TranslateSession *session);
+char *translate_session_timed_translate_text (TranslateSession *session,
+ const char *text,
+ const char *from,
+ const char *to,
+ gulong timeout,
+ TranslateProgressFunc progress_func,
+ gpointer user_data,
+ GError **err);
char *translate_session_translate_text (TranslateSession *session,
const char *text,
const char *from,