From 89fa3bb99adbfa3e43787b645ab66259fddffbe5 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 10 Nov 2014 18:17:08 -0500 Subject: [PATCH 01/11] embedding: begin cef string_multimap api cef_string_multimap_alloc() --- ports/cef/lib.rs | 1 + ports/cef/string_multimap.rs | 22 ++++++++++++++++++++++ ports/cef/types.rs | 9 +++++---- 3 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 ports/cef/string_multimap.rs diff --git a/ports/cef/lib.rs b/ports/cef/lib.rs index ca96b5283e2..ae689e33ee1 100644 --- a/ports/cef/lib.rs +++ b/ports/cef/lib.rs @@ -52,6 +52,7 @@ pub mod request; pub mod string; pub mod string_list; pub mod string_map; +pub mod string_multimap; pub mod task; pub mod types; pub mod urlrequest; diff --git a/ports/cef/string_multimap.rs b/ports/cef/string_multimap.rs new file mode 100644 index 00000000000..35c848750e9 --- /dev/null +++ b/ports/cef/string_multimap.rs @@ -0,0 +1,22 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use eutil::slice_to_str; +use libc::{c_int}; +use std::collections::TreeMap; +use std::mem; +use std::string::String; +use string::{cef_string_userfree_utf8_alloc,cef_string_userfree_utf8_free,cef_string_utf8_set}; +use types::{cef_string_multimap_t,cef_string_t}; + + +//cef_string_multimap + +#[no_mangle] +pub extern "C" fn cef_string_multimap_alloc() -> *mut cef_string_multimap_t { + unsafe { + let smm: Box>> = box TreeMap::new(); + mem::transmute(smm) + } +} diff --git a/ports/cef/types.rs b/ports/cef/types.rs index 4484ffe7787..e1815f3f89d 100644 --- a/ports/cef/types.rs +++ b/ports/cef/types.rs @@ -5,10 +5,11 @@ use libc::{c_uint, c_ushort, c_int, c_double, size_t, c_void, c_longlong}; use libc::types::os::arch::c95::wchar_t; -pub enum cef_string_map_t {} -pub enum cef_string_list_t {} -pub enum cef_text_input_context_t {} -pub enum cef_event_handle_t {} +pub type cef_string_map_t = c_void; +pub type cef_string_multimap_t = c_void; +pub type cef_string_list_t = c_void; +pub type cef_text_input_context_t = c_void; +pub type cef_event_handle_t = c_void; //these all need to be done... pub enum cef_binary_value_val {} From cc55f88496406fad084cc0c311b1691c8fe39825 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 10 Nov 2014 18:17:55 -0500 Subject: [PATCH 02/11] embedding: cef_string_multimap_size() --- ports/cef/string_multimap.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ports/cef/string_multimap.rs b/ports/cef/string_multimap.rs index 35c848750e9..6e4dcda1691 100644 --- a/ports/cef/string_multimap.rs +++ b/ports/cef/string_multimap.rs @@ -10,6 +10,9 @@ use std::string::String; use string::{cef_string_userfree_utf8_alloc,cef_string_userfree_utf8_free,cef_string_utf8_set}; use types::{cef_string_multimap_t,cef_string_t}; +fn string_multimap_to_treemap(smm: *mut cef_string_multimap_t) -> *mut TreeMap> { + smm as *mut TreeMap> +} //cef_string_multimap @@ -20,3 +23,16 @@ pub extern "C" fn cef_string_multimap_alloc() -> *mut cef_string_multimap_t { mem::transmute(smm) } } + +#[no_mangle] +pub extern "C" fn cef_string_multimap_size(smm: *mut cef_string_multimap_t) -> c_int { + unsafe { + if smm.is_null() { return 0; } + let mut c: c_int = 0; + let v = string_multimap_to_treemap(smm); + for (_, val) in (*v).iter() { + c = c + (*val).len() as c_int; + } + c + } +} From f1f8c65de7ad08a8208a00e5909cdbe907570ed7 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 10 Nov 2014 18:18:12 -0500 Subject: [PATCH 03/11] embedding: cef_string_multimap_find_count() --- ports/cef/string_multimap.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ports/cef/string_multimap.rs b/ports/cef/string_multimap.rs index 6e4dcda1691..9bf02a54bcc 100644 --- a/ports/cef/string_multimap.rs +++ b/ports/cef/string_multimap.rs @@ -36,3 +36,19 @@ pub extern "C" fn cef_string_multimap_size(smm: *mut cef_string_multimap_t) -> c c } } + +#[no_mangle] +pub extern "C" fn cef_string_multimap_find_count(smm: *mut cef_string_multimap_t, key: *const cef_string_t) -> c_int { + unsafe { + if smm.is_null() { return 0; } + let v = string_multimap_to_treemap(smm); + slice_to_str((*key).str as *const u8, (*key).length as uint, |result| { + match (*v).find(&String::from_str(result)) { + Some(s) => { + s.len() as c_int + } + None => 0 + } + }) + } +} From 7758a4427db47c995b314efb782384885728a2db Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 10 Nov 2014 18:18:30 -0500 Subject: [PATCH 04/11] embedding: cef_string_multimap_append() --- ports/cef/string_multimap.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ports/cef/string_multimap.rs b/ports/cef/string_multimap.rs index 9bf02a54bcc..d653bd8e79c 100644 --- a/ports/cef/string_multimap.rs +++ b/ports/cef/string_multimap.rs @@ -52,3 +52,27 @@ pub extern "C" fn cef_string_multimap_find_count(smm: *mut cef_string_multimap_t }) } } + +#[no_mangle] +pub extern "C" fn cef_string_multimap_append(smm: *mut cef_string_multimap_t, key: *const cef_string_t, value: *const cef_string_t) -> c_int { + unsafe { + if smm.is_null() { return 0; } + let v = string_multimap_to_treemap(smm); + slice_to_str((*key).str as *const u8, (*key).length as uint, |result| { + let s = String::from_str(result); + let csv = cef_string_userfree_utf8_alloc(); + cef_string_utf8_set((*value).str as *const u8, (*value).length, csv, 1); + match (*v).find_mut(&s) { + Some(vc) => { + (*vc).push(csv); + 1 + } + None => { + let vc = vec!(csv); + (*v).insert(s, vc); + 1 + } + } + }) + } +} From 85a099719eb6365052d50cbdd374c20684f3494f Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 10 Nov 2014 18:18:45 -0500 Subject: [PATCH 05/11] embedding: cef_string_multimap_enumerate() --- ports/cef/string_multimap.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/ports/cef/string_multimap.rs b/ports/cef/string_multimap.rs index d653bd8e79c..8b75045e888 100644 --- a/ports/cef/string_multimap.rs +++ b/ports/cef/string_multimap.rs @@ -76,3 +76,23 @@ pub extern "C" fn cef_string_multimap_append(smm: *mut cef_string_multimap_t, ke }) } } + +#[no_mangle] +pub extern "C" fn cef_string_multimap_enumerate(smm: *mut cef_string_multimap_t, key: *const cef_string_t, index: c_int, value: *mut cef_string_t) -> c_int { + unsafe { + if smm.is_null() { return 0; } + let v = string_multimap_to_treemap(smm); + slice_to_str((*key).str as *const u8, (*key).length as uint, |result| { + match (*v).find(&String::from_str(result)) { + Some(s) => { + if (*s).len() <= index as uint { + return 0; + } + let cs = (*s)[index as uint]; + cef_string_utf8_set((*cs).str as *const u8, (*cs).length, value, 1) + } + None => 0 + } + }) + } +} From ce3e9fb511f0e112a7550eedb1f5576801c71f30 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 10 Nov 2014 18:19:00 -0500 Subject: [PATCH 06/11] embedding: cef_string_multimap_key() --- ports/cef/string_multimap.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/ports/cef/string_multimap.rs b/ports/cef/string_multimap.rs index 8b75045e888..6791d69a2e7 100644 --- a/ports/cef/string_multimap.rs +++ b/ports/cef/string_multimap.rs @@ -96,3 +96,21 @@ pub extern "C" fn cef_string_multimap_enumerate(smm: *mut cef_string_multimap_t, }) } } + +#[no_mangle] +pub extern "C" fn cef_string_multimap_key(smm: *mut cef_string_multimap_t, index: c_int, value: *mut cef_string_t) -> c_int { + unsafe { + if index < 0 || smm.is_null() { return 0; } + let v = string_multimap_to_treemap(smm); + let mut rem = index as uint; + + for (key, val) in (*v).iter() { + if rem < (*val).len() { + return cef_string_utf8_set((*key).as_bytes().as_ptr(), (*key).len() as u64, value, 1); + } else { + rem = rem - (*val).len(); + } + } + } + 0 +} From ef288f1195eda6a3af396f9a5ca8aa85e56cc240 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 10 Nov 2014 18:19:14 -0500 Subject: [PATCH 07/11] embedding: cef_string_multimap_value() --- ports/cef/string_multimap.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/ports/cef/string_multimap.rs b/ports/cef/string_multimap.rs index 6791d69a2e7..7f4af997da9 100644 --- a/ports/cef/string_multimap.rs +++ b/ports/cef/string_multimap.rs @@ -114,3 +114,22 @@ pub extern "C" fn cef_string_multimap_key(smm: *mut cef_string_multimap_t, index } 0 } + +#[no_mangle] +pub extern "C" fn cef_string_multimap_value(smm: *mut cef_string_multimap_t, index: c_int, value: *mut cef_string_t) -> c_int { + unsafe { + if index < 0 || smm.is_null() { return 0; } + let v = string_multimap_to_treemap(smm); + let mut rem = index as uint; + + for (_, val) in (*v).values().enumerate() { + if rem < (*val).len() { + let cs = (*val)[rem as uint]; + return cef_string_utf8_set((*cs).str as *const u8, (*cs).length, value, 1); + } else { + rem = rem - (*val).len(); + } + } + } + 0 +} From 32d6cff440bc88efbf2fd73b065a19fe01e4d80f Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 10 Nov 2014 18:20:03 -0500 Subject: [PATCH 08/11] embedding: cef_string_multimap_clear() --- ports/cef/string_multimap.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ports/cef/string_multimap.rs b/ports/cef/string_multimap.rs index 7f4af997da9..fac3c52821b 100644 --- a/ports/cef/string_multimap.rs +++ b/ports/cef/string_multimap.rs @@ -133,3 +133,19 @@ pub extern "C" fn cef_string_multimap_value(smm: *mut cef_string_multimap_t, ind } 0 } + +#[no_mangle] +pub extern "C" fn cef_string_multimap_clear(smm: *mut cef_string_multimap_t) { + unsafe { + if smm.is_null() { return; } + let v = string_multimap_to_treemap(smm); + if (*v).len() == 0 { return; } + for (_, val) in (*v).iter_mut() { + while (*val).len() != 0 { + let cs = (*val).pop(); + cef_string_userfree_utf8_free(cs.unwrap()); + } + } + (*v).clear(); + } +} From 8b231a26e4b9fe8956964d93cf1f6cf159b9d1c5 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 10 Nov 2014 18:20:14 -0500 Subject: [PATCH 09/11] embedding: cef_string_multimap_free() --- ports/cef/string_multimap.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ports/cef/string_multimap.rs b/ports/cef/string_multimap.rs index fac3c52821b..8aa544ca002 100644 --- a/ports/cef/string_multimap.rs +++ b/ports/cef/string_multimap.rs @@ -149,3 +149,13 @@ pub extern "C" fn cef_string_multimap_clear(smm: *mut cef_string_multimap_t) { (*v).clear(); } } + +#[no_mangle] +pub extern "C" fn cef_string_multimap_free(smm: *mut cef_string_multimap_t) { + unsafe { + if smm.is_null() { return; } + let v: Box>> = mem::transmute(smm); + cef_string_multimap_clear(smm); + drop(v); + } +} From 8a4d2949e8215df264779050f063556d945da63c Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 13 Nov 2014 15:35:55 -0500 Subject: [PATCH 10/11] embedding: replace usage of deprecated find*() with get*() --- ports/cef/string_map.rs | 2 +- ports/cef/string_multimap.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ports/cef/string_map.rs b/ports/cef/string_map.rs index 2ca2e4e0f9c..91434c556f3 100644 --- a/ports/cef/string_map.rs +++ b/ports/cef/string_map.rs @@ -54,7 +54,7 @@ pub extern "C" fn cef_string_map_find(sm: *mut cef_string_map_t, key: *const cef if sm.is_null() { return 0; } let v = string_map_to_treemap(sm); slice_to_str((*key).str as *const u8, (*key).length as uint, |result| { - match (*v).find(&String::from_str(result)) { + match (*v).get(&String::from_str(result)) { Some(s) => { cef_string_utf8_set((**s).str as *const u8, (**s).length, value, 1); 1 diff --git a/ports/cef/string_multimap.rs b/ports/cef/string_multimap.rs index 8aa544ca002..803ff73c660 100644 --- a/ports/cef/string_multimap.rs +++ b/ports/cef/string_multimap.rs @@ -43,7 +43,7 @@ pub extern "C" fn cef_string_multimap_find_count(smm: *mut cef_string_multimap_t if smm.is_null() { return 0; } let v = string_multimap_to_treemap(smm); slice_to_str((*key).str as *const u8, (*key).length as uint, |result| { - match (*v).find(&String::from_str(result)) { + match (*v).get(&String::from_str(result)) { Some(s) => { s.len() as c_int } @@ -62,7 +62,7 @@ pub extern "C" fn cef_string_multimap_append(smm: *mut cef_string_multimap_t, ke let s = String::from_str(result); let csv = cef_string_userfree_utf8_alloc(); cef_string_utf8_set((*value).str as *const u8, (*value).length, csv, 1); - match (*v).find_mut(&s) { + match (*v).get_mut(&s) { Some(vc) => { (*vc).push(csv); 1 @@ -83,7 +83,7 @@ pub extern "C" fn cef_string_multimap_enumerate(smm: *mut cef_string_multimap_t, if smm.is_null() { return 0; } let v = string_multimap_to_treemap(smm); slice_to_str((*key).str as *const u8, (*key).length as uint, |result| { - match (*v).find(&String::from_str(result)) { + match (*v).get(&String::from_str(result)) { Some(s) => { if (*s).len() <= index as uint { return 0; From 4ae5c88acc2087406b7c340e56a483321c831aa8 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 18 Nov 2014 14:43:00 -0500 Subject: [PATCH 11/11] address review comments --- ports/cef/string_multimap.rs | 29 +++++++++-------------------- ports/cef/types.rs | 10 +++++----- 2 files changed, 14 insertions(+), 25 deletions(-) diff --git a/ports/cef/string_multimap.rs b/ports/cef/string_multimap.rs index 803ff73c660..b8edfa041a7 100644 --- a/ports/cef/string_multimap.rs +++ b/ports/cef/string_multimap.rs @@ -5,6 +5,7 @@ use eutil::slice_to_str; use libc::{c_int}; use std::collections::TreeMap; +use std::iter::AdditiveIterator; use std::mem; use std::string::String; use string::{cef_string_userfree_utf8_alloc,cef_string_userfree_utf8_free,cef_string_utf8_set}; @@ -28,12 +29,8 @@ pub extern "C" fn cef_string_multimap_alloc() -> *mut cef_string_multimap_t { pub extern "C" fn cef_string_multimap_size(smm: *mut cef_string_multimap_t) -> c_int { unsafe { if smm.is_null() { return 0; } - let mut c: c_int = 0; let v = string_multimap_to_treemap(smm); - for (_, val) in (*v).iter() { - c = c + (*val).len() as c_int; - } - c + (*v).values().map(|val| (*val).len()).sum() as c_int } } @@ -44,9 +41,7 @@ pub extern "C" fn cef_string_multimap_find_count(smm: *mut cef_string_multimap_t let v = string_multimap_to_treemap(smm); slice_to_str((*key).str as *const u8, (*key).length as uint, |result| { match (*v).get(&String::from_str(result)) { - Some(s) => { - s.len() as c_int - } + Some(s) => s.len() as c_int, None => 0 } }) @@ -63,16 +58,10 @@ pub extern "C" fn cef_string_multimap_append(smm: *mut cef_string_multimap_t, ke let csv = cef_string_userfree_utf8_alloc(); cef_string_utf8_set((*value).str as *const u8, (*value).length, csv, 1); match (*v).get_mut(&s) { - Some(vc) => { - (*vc).push(csv); - 1 - } - None => { - let vc = vec!(csv); - (*v).insert(s, vc); - 1 - } + Some(vc) => (*vc).push(csv), + None => { (*v).insert(s, vec!(csv)); } } + 1 }) } } @@ -108,7 +97,7 @@ pub extern "C" fn cef_string_multimap_key(smm: *mut cef_string_multimap_t, index if rem < (*val).len() { return cef_string_utf8_set((*key).as_bytes().as_ptr(), (*key).len() as u64, value, 1); } else { - rem = rem - (*val).len(); + rem -= (*val).len(); } } } @@ -122,12 +111,12 @@ pub extern "C" fn cef_string_multimap_value(smm: *mut cef_string_multimap_t, ind let v = string_multimap_to_treemap(smm); let mut rem = index as uint; - for (_, val) in (*v).values().enumerate() { + for val in (*v).values() { if rem < (*val).len() { let cs = (*val)[rem as uint]; return cef_string_utf8_set((*cs).str as *const u8, (*cs).length, value, 1); } else { - rem = rem - (*val).len(); + rem -= (*val).len(); } } } diff --git a/ports/cef/types.rs b/ports/cef/types.rs index e1815f3f89d..b6abf2e7d38 100644 --- a/ports/cef/types.rs +++ b/ports/cef/types.rs @@ -5,11 +5,11 @@ use libc::{c_uint, c_ushort, c_int, c_double, size_t, c_void, c_longlong}; use libc::types::os::arch::c95::wchar_t; -pub type cef_string_map_t = c_void; -pub type cef_string_multimap_t = c_void; -pub type cef_string_list_t = c_void; -pub type cef_text_input_context_t = c_void; -pub type cef_event_handle_t = c_void; +pub enum cef_string_map_t {} +pub enum cef_string_multimap_t {} +pub enum cef_string_list_t {} +pub enum cef_text_input_context_t {} +pub enum cef_event_handle_t {} //these all need to be done... pub enum cef_binary_value_val {}