@@ -223,6 +223,76 @@ class KeyValuesExt
223223
224224 return result;
225225 }
226+
227+ static boost::shared_ptr<KeyValues> from_dict (const char * name, dict source)
228+ {
229+ KeyValues* root = new KeyValues (name);
230+ AddDict (root, source);
231+ return boost::shared_ptr<KeyValues>(root, &__del__);
232+ }
233+
234+ static void AddDict (KeyValues* key, dict source)
235+ {
236+ list keys = source.keys ();
237+ for (int i=0 ; i < len (keys); ++i) {
238+ const char * key_name = extract<const char *>(keys[i]);
239+ object value = source[key_name];
240+
241+ if (PyLong_Check (value.ptr ())) {
242+ int overflow;
243+ long long_result = PyLong_AsLongAndOverflow (value.ptr (), &overflow);
244+ if (overflow == 0 ) {
245+ key->SetInt (key_name, long_result);
246+ continue ;
247+ }
248+
249+ PY_LONG_LONG long_long_result = PyLong_AsLongLong (value.ptr ());
250+ if (long_long_result < 0 ) {
251+ // KeyValues can't handle negative long long values.
252+ BOOST_RAISE_EXCEPTION (PyExc_OverflowError, " %lli is too big." , long_long_result)
253+ }
254+
255+ key->SetUint64 (key_name, long_long_result);
256+ continue ;
257+ }
258+
259+ extract<float > get_float (value);
260+ if (get_float.check ()) {
261+ key->SetFloat (key_name, get_float ());
262+ continue ;
263+ }
264+
265+ extract<const char *> get_string (value);
266+ if (get_string.check ()) {
267+ key->SetString (key_name, get_string ());
268+ continue ;
269+ }
270+
271+ extract<Color> get_color (value);
272+ if (get_color.check ()) {
273+ key->SetColor (key_name, get_color ());
274+ continue ;
275+ }
276+
277+ extract<CPointer*> get_ptr (value);
278+ if (get_ptr.check ()) {
279+ key->SetPtr (key_name, (void *) get_ptr ()->m_ulAddr );
280+ continue ;
281+ }
282+
283+ extract<dict> get_dict (value);
284+ if (get_dict.check ()) {
285+ AddDict (key->FindKey (key_name, true ), get_dict ());
286+ continue ;
287+ }
288+
289+ object type_name = value.attr (" __class__" ).attr (" __name__" );
290+ object py_value_str = str (value);
291+ const char * type_name_str = extract<const char *>(type_name);
292+ const char * value_str = extract<const char *>(py_value_str);
293+ BOOST_RAISE_EXCEPTION (PyExc_ValueError, " Invalid type (%s) of value '%s'" , type_name_str, value_str)
294+ }
295+ }
226296};
227297
228298
0 commit comments