00001
00002
00003
00004
00005
00006
00007
00008 #include <libtorrent/session.hpp>
00009 #include <boost/python.hpp>
00010
00011 using namespace boost::python;
00012 using namespace libtorrent;
00013
00014 struct entry_to_python
00015 {
00016 static object convert(entry::list_type const& l)
00017 {
00018 list result;
00019
00020 for (entry::list_type::const_iterator i(l.begin()), e(l.end()); i != e; ++i)
00021 {
00022 result.append(*i);
00023 }
00024
00025 return result;
00026 }
00027
00028 static object convert(entry::dictionary_type const& d)
00029 {
00030 dict result;
00031
00032 for (entry::dictionary_type::const_iterator i(d.begin()), e(d.end()); i != e; ++i)
00033 result[i->first] = i->second;
00034
00035 return result;
00036 }
00037
00038 static object convert0(entry const& e)
00039 {
00040 switch (e.type())
00041 {
00042 case entry::int_t:
00043 return object(e.integer());
00044 case entry::string_t:
00045 return object(e.string());
00046 case entry::list_t:
00047 return convert(e.list());
00048 case entry::dictionary_t:
00049 return convert(e.dict());
00050 default:
00051 return object();
00052 }
00053 }
00054
00055 static PyObject* convert(entry const& e)
00056 {
00057 return incref(convert0(e).ptr());
00058 }
00059 };
00060
00061 struct entry_from_python
00062 {
00063 entry_from_python()
00064 {
00065 converter::registry::push_back(
00066 &convertible, &construct, type_id<entry>()
00067 );
00068 }
00069
00070 static void* convertible(PyObject* e)
00071 {
00072 return e;
00073 }
00074
00075 static entry construct0(object e)
00076 {
00077 if (extract<dict>(e).check())
00078 {
00079 dict d = extract<dict>(e);
00080 list items(d.items());
00081 std::size_t length = extract<std::size_t>(items.attr("__len__")());
00082 entry result(entry::dictionary_t);
00083
00084 for (std::size_t i = 0; i < length; ++i)
00085 {
00086 result.dict().insert(
00087 std::make_pair(
00088 extract<char const*>(items[i][0])()
00089 , construct0(items[i][1])
00090 )
00091 );
00092 }
00093
00094 return result;
00095 }
00096 else if (extract<list>(e).check())
00097 {
00098 list l = extract<list>(e);
00099
00100 std::size_t length = extract<std::size_t>(l.attr("__len__")());
00101 entry result(entry::list_t);
00102
00103 for (std::size_t i = 0; i < length; ++i)
00104 {
00105 result.list().push_back(construct0(l[i]));
00106 }
00107
00108 return result;
00109 }
00110 else if (extract<str>(e).check())
00111 {
00112 return entry(extract<std::string>(e)());
00113 }
00114 else if (extract<entry::integer_type>(e).check())
00115 {
00116 return entry(extract<entry::integer_type>(e)());
00117 }
00118
00119 return entry();
00120 }
00121
00122 static void construct(PyObject* e, converter::rvalue_from_python_stage1_data* data)
00123 {
00124 void* storage = ((converter::rvalue_from_python_storage<entry>*)data)->storage.bytes;
00125 new (storage) entry(construct0(object(borrowed(e))));
00126 data->convertible = storage;
00127 }
00128 };
00129
00130 void bind_entry()
00131 {
00132 to_python_converter<entry, entry_to_python>();
00133 entry_from_python();
00134 }
00135