mldonkey-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Mldonkey-commits] mldonkey distrib/ChangeLog src/networks/bittorr...


From: mldonkey-commits
Subject: [Mldonkey-commits] mldonkey distrib/ChangeLog src/networks/bittorr...
Date: Sat, 01 Sep 2007 13:51:23 +0000

CVSROOT:        /sources/mldonkey
Module name:    mldonkey
Changes by:     spiralvoice <spiralvoice>       07/09/01 13:51:23

Modified files:
        distrib        : ChangeLog 
        src/networks/bittorrent: bTTorrent.ml 

Log message:
        patch #6174

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/mldonkey/distrib/ChangeLog?cvsroot=mldonkey&r1=1.1315&r2=1.1316
http://cvs.savannah.gnu.org/viewcvs/mldonkey/src/networks/bittorrent/bTTorrent.ml?cvsroot=mldonkey&r1=1.14&r2=1.15

Patches:
Index: distrib/ChangeLog
===================================================================
RCS file: /sources/mldonkey/mldonkey/distrib/ChangeLog,v
retrieving revision 1.1315
retrieving revision 1.1316
diff -u -b -r1.1315 -r1.1316
--- distrib/ChangeLog   31 Aug 2007 19:48:09 -0000      1.1315
+++ distrib/ChangeLog   1 Sep 2007 13:51:23 -0000       1.1316
@@ -14,6 +14,10 @@
 ChangeLog
 =========
 
+2007/09/01
+6174: BT: Encode non-UTF8 filenames using "encoding" or "codepage" data
+      from .torrent if present
+
 2007/08/31
 6175: Yet another patch for share_scan_interval
 - new default 30 minutes for newly created ini files

Index: src/networks/bittorrent/bTTorrent.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/bittorrent/bTTorrent.ml,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- src/networks/bittorrent/bTTorrent.ml        25 Jul 2007 19:25:48 -0000      
1.14
+++ src/networks/bittorrent/bTTorrent.ml        1 Sep 2007 13:51:23 -0000       
1.15
@@ -78,12 +78,14 @@
   let file_creation_date = ref zero in
   let file_modified_by = ref "" in
   let file_encoding = ref "" in
+  let file_codepage = ref zero in
   let file_ed2k_hash = ref "" in
   let file_is_private = ref zero in
   let file_aps = ref (List []) in
   let file_dht_backup_enable = ref zero in
   let length = ref zero in
   let file_files = ref [] in
+  let file_files_utf8 = ref [] in
 
   let parse_files files =
     let current_pos = ref zero in
@@ -91,6 +93,7 @@
         match v with
           Dictionary list ->
             let current_file = ref "" in
+            let current_file_utf8 = ref "" in
             let current_length = ref zero in
             let length_set = ref false in
 
@@ -108,13 +111,11 @@
             List.iter (fun (key, value) ->
                 match key, value with
                   String "path", List path ->
-                    if !current_file = "" then begin
                       current_file := path_list_to_string path;
                       if !verbose_msg_servers then
                         lprintf_nl "[BT] Parsed a new path: [%s]" !current_file
-                    end   
                 | String "path.utf-8", List path_utf8 -> 
-                    current_file := path_list_to_string path_utf8;
+                    current_file_utf8 := path_list_to_string path_utf8;
                     if !verbose_msg_servers then
                       lprintf_nl "[BT] Parsed path.utf-8: [%s]" !current_file
                 | String "length", Int n ->
@@ -129,8 +130,10 @@
             ) list;
 
             assert (!length_set);
-            assert (!current_file <> "");
+            assert (!current_file <> "" || !current_file_utf8 <> "");
             file_files := (!current_file, !current_length) :: !file_files;
+            if !current_file_utf8 <> "" then
+              file_files_utf8 := (!current_file_utf8, !current_length) :: 
!file_files_utf8;
             current_pos := !current_pos ++ !current_length
 
         | _ -> assert false
@@ -239,6 +242,8 @@
               file_modified_by := modified_by
             | String "encoding", String encoding ->
               file_encoding := encoding
+            | String "codepage", Int codepage ->
+              file_codepage := codepage
             | String "torrent filename", String torrent_filename ->
               file_torrent_filename := torrent_filename
             | String "nodes", nodes -> ()
@@ -271,6 +276,10 @@
     | _ -> assert false
   end;
 
+(* Convert codepage number to Charset name, for example: 936 -> CP936 *)
+  if !file_codepage <> 0L && !file_encoding = "" then
+    file_encoding := "CP" ^ (Int64.to_string !file_codepage);
+
   let real_file_name =
     match !file_name_utf8 with
     | None -> Charset.safe_convert !file_encoding !file_name
@@ -289,6 +298,21 @@
         Sha1.direct_of_string s
     ) in
 
+(* Only at this point we know if the torrent contains an "encoding" field
+   If UTF8 filenames were found, use them. If not and we have a charset
+   value used for encoding, convert non-UTF8 filenames to UTF8 ones. *)
+  if !file_files_utf8 <> [] then
+    file_files := !file_files_utf8
+  else
+    if !file_encoding <> "" then
+      begin
+        let file_files_encoded = ref [] in
+        List.iter (fun (name, length) ->
+          file_files_encoded := [(Charset.safe_convert !file_encoding name), 
length] @ !file_files_encoded
+        ) !file_files;
+        file_files := !file_files_encoded
+      end;
+
   (match List.length !file_files with
   | 0 -> ()
   | 1 -> file_name := (fst (List.hd !file_files));




reply via email to

[Prev in Thread] Current Thread [Next in Thread]