On Fri, Oct 19, 2012 at 12:02 PM, Enlightenment SVN
<[email protected]> wrote:
> Log:
> PROTO/elocation: Fixup AddressToPosition.
>
> Took me some time to figure out how to construct the a{ss} here. Array
> and then dict entries for each. Working now with the geonames provider
> so all is good.
>
> Author: stefan
> Date: 2012-10-19 08:02:55 -0700 (Fri, 19 Oct 2012)
> New Revision: 78256
> Trac: http://trac.enlightenment.org/e/changeset/78256
>
> Modified:
> trunk/PROTO/elocation/src/lib/elocation.c
>
> Modified: trunk/PROTO/elocation/src/lib/elocation.c
> ===================================================================
> --- trunk/PROTO/elocation/src/lib/elocation.c 2012-10-19 15:02:50 UTC (rev
> 78255)
> +++ trunk/PROTO/elocation/src/lib/elocation.c 2012-10-19 15:02:55 UTC (rev
> 78256)
> @@ -771,23 +771,57 @@
> elocation_address_to_position(Elocation_Address *address_shadow,
> Elocation_Position *position_shadow)
> {
> EDBus_Message *msg;
> - EDBus_Message_Iter *iter, *dict, *entry;
> + EDBus_Message_Iter *iter, *entry, *array;
>
> msg = edbus_proxy_method_call_new(meta_geocode, "AddressToPosition");
> iter = edbus_message_iter_get(msg);
> - edbus_message_iter_arguments_set(iter, "a{ss}", &dict);
>
> - entry = edbus_message_iter_container_new(dict, 'e', "ss");
> + array = edbus_message_iter_container_new(iter, 'a', "{ss}");
>
> - edbus_message_iter_arguments_set(entry, "ss", "country",
> address_shadow->country);
humn... I'm checking with José if it would be possible to do something
as you had before.
> - edbus_message_iter_arguments_set(entry, "ss", "countrycode",
> address_shadow->countrycode);
> - edbus_message_iter_arguments_set(entry, "ss", "locality",
> address_shadow->locality);
> - edbus_message_iter_arguments_set(entry, "ss", "postalcode",
> address_shadow->postalcode);
> - edbus_message_iter_arguments_set(entry, "ss", "region",
> address_shadow->region);
> - edbus_message_iter_arguments_set(entry, "ss", "timezone",
> address_shadow->timezone);
> + if (address_shadow->country)
> + {
> + entry = edbus_message_iter_container_new(array, 'e', NULL);
> + edbus_message_iter_arguments_set(entry, "ss", "country",
> address_shadow->country);
> + edbus_message_iter_container_close(array, entry);
> + }
>
> - edbus_message_iter_container_close(dict, entry);
> - edbus_message_iter_container_close(iter, dict);
> + if (address_shadow->countrycode)
> + {
> + entry = edbus_message_iter_container_new(array, 'e', NULL);
> + edbus_message_iter_arguments_set(entry, "ss", "countrycode",
> address_shadow->countrycode);
> + edbus_message_iter_container_close(array, entry);
> + }
> +
> + if (address_shadow->locality)
> + {
> + entry = edbus_message_iter_container_new(array, 'e', NULL);
> + edbus_message_iter_arguments_set(entry, "ss", "locality",
> address_shadow->locality);
> + edbus_message_iter_container_close(array, entry);
> + }
> +
> + if (address_shadow->postalcode)
> + {
> + entry = edbus_message_iter_container_new(array, 'e', NULL);
> + edbus_message_iter_arguments_set(entry, "ss", "postalcode",
> address_shadow->postalcode);
> + edbus_message_iter_container_close(array, entry);
> + }
> +
> + if (address_shadow->region)
> + {
> + entry = edbus_message_iter_container_new(array, 'e', NULL);
> + edbus_message_iter_arguments_set(entry, "ss", "region",
> address_shadow->region);
> + edbus_message_iter_container_close(array, entry);
> + }
> +
> + if (address_shadow->timezone)
> + {
> + entry = edbus_message_iter_container_new(array, 'e', NULL);
> + edbus_message_iter_arguments_set(entry, "ss", "timezone",
> address_shadow->timezone);
> + edbus_message_iter_container_close(array, entry);
> + }
> +
> + edbus_message_iter_container_close(iter, array);
> +
Meanwhile, you might want to do something like below (untested):
#define ENTRY(key) { #key, address_shadow->##key }
struct keyval {
const char *key;
const char *val;
} keyval[] = {
ENTRY(country),
ENTRY(countrycode),
ENTRY(locality),
ENTRY(postalcode),
ENTRY(region),
{ }
};
#undef ENTRY
for (k = keyval; k && k->key; k++)
{
EDBus_Message_Iter *entry;
if (!k->val)
continue;
entry = edbus_message_iter_container_new(array, 'e', NULL);
edbus_message_iter_arguments_set(entry, "ss", k->key, k->val);
edbus_message_iter_container_close(array, entry);
}
edbus_message_iter_container_close(iter, array);
---
I've just commited an example about this: check r78263.
Lucas De Marchi
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel