Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37741739
en ru br
Репозитории 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
www.altlinux.org/Changes

Группа :: Разработка/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,
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin