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

Reply via email to