array_internal.c

Go to the documentation of this file.
00001 /*
00002  EasyDbus: DBus Binding Library
00003  Copyright (C) 2007  Daniele Rondina aka ge@@ru, geaaru@gmail.com 
00004  
00005  This program is free software; you can redistribute it and/or
00006  modify it under the terms of the GNU General Public License
00007  as published by the Free Software Foundation; either version 2
00008  of the License, or (at your option) any later version.
00009 
00010  This program is distributed in the hope that it will be useful,
00011  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  GNU General Public License for more details.
00014 
00015  You should have received a copy of the GNU General Public License
00016  along with this program; if not, write to the Free Software
00017  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00018 
00019  Filename:  array_internal.c
00020  
00021  Description:  
00022  
00023  Version:  1.0
00024  Created:  09/08/07 18:34:32 CEST
00025  Revision:  none
00026  
00027  Author:   Daniele Rondina aka Ge@@ru (geaaru@gmail.com) 
00028  License:  GPL 2.0
00029 */
00030 
00043 #include <string.h>
00044 #include <stdlib.h>
00045 //easydbus includes
00046 #include "easydbus-core.h"
00047 #include "debug.h"
00048 #include "utils.h"
00049 #include "dict_entry_internal.h"
00050 #include "variant_internal.h"
00051 #include "array_internal.h"
00052 #include "struct_internal.h"
00053 
00054 
00055 
00068 int
00069 add_array_to_msg (DBusMessage * msg, struct EasyDbus_elem *el)
00070 {
00071    struct EasyDbus_container *container = el->payload.p_container;
00072    int ret_val = -1;
00073    unsigned int i = 0;
00074    DBusMessageIter iter;
00075    DBusMessageIter iter2;
00076    short *p_i16 = NULL;
00077    int *p_i32 = NULL;
00078    long long *p_i64 = NULL;
00079    double *p_double = NULL;
00080    char *p_byte = NULL;
00081    char **p_string = NULL;
00082    struct EasyDbus_elem *internal_el = NULL;
00083    char *signature = NULL;
00084 
00085    dbus_message_iter_init_append (msg, &iter);
00086 
00087    /*
00088     * When an array is empty is always needed to
00089     * have a correct signature, else you can
00090     * receive an error because there isn't a different
00091     * between message sent and message handled from
00092     * server.
00093     */
00094    if (!container->nel) {
00095       if (!container->signature)
00096          EasyDbusDebug ("Error an empty array must have a"
00097                         " signature");
00098          return ret_val;
00099       if (dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY,
00100                                             container->signature,
00101                                             &iter2))
00102          ret_val = 0;
00103       else
00104          EasyDbusDebug ("Error on open container container\n");
00105       goto end;
00106    }
00107    /* container has at least one element */
00108    /* build signature */
00109    signature = prepare_signature (el, EASYDBUS_SIGNATURE_NORMAL);
00110    EasyDbusDebug ("Signature prepared for array = %s", signature);
00111    /* this is needed beacause first char of signature
00112     * relative to first container container must be ignored.
00113     * Try to speak of this with dbus protocols developers 
00114     * because i think that isn't correct. */
00115    signature++;
00116    if (dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, 
00117                                          signature, &iter2))
00118       ret_val = 0;
00119    else
00120       EasyDbusDebug ("Error on open container container\n");
00121    switch (container->elem_type) {
00122       case EASYDBUS_ELTYPE_INT16:
00123          p_i16 = (short *) container->p_data;
00124          for (i = 0; i < container->nel; i++) {
00125             dbus_message_iter_append_basic (&iter2, 
00126                                             DBUS_TYPE_INT16, p_i16);
00127             p_i16++;
00128          }
00129          break;
00130       case EASYDBUS_ELTYPE_UINT16:
00131          p_i16 = (short *) container->p_data;
00132          for (i = 0; i < container->nel; i++) {
00133             dbus_message_iter_append_basic (&iter2,
00134                                             DBUS_TYPE_UINT16, p_i16);
00135             p_i16++;
00136          }
00137          break;
00138       case EASYDBUS_ELTYPE_INT32:
00139          p_i32 = (int *) container->p_data;
00140          for (i = 0; i < container->nel; i++) {
00141             dbus_message_iter_append_basic (&iter2,
00142                                             DBUS_TYPE_INT32, p_i32);
00143             p_i32++;
00144          }
00145          break;
00146       case EASYDBUS_ELTYPE_UINT32:
00147          p_i32 = (int *) container->p_data;
00148          for (i = 0; i < container->nel; i++) {
00149             dbus_message_iter_append_basic (&iter2,
00150                                             DBUS_TYPE_UINT32, p_i32);
00151             p_i32++;
00152          }
00153          break;
00154       case EASYDBUS_ELTYPE_INT64:
00155          p_i64 = (long long *) container->p_data;
00156          for (i = 0; i < container->nel; i++) {
00157             dbus_message_iter_append_basic (&iter2,
00158                                             DBUS_TYPE_UINT32, p_i64);
00159             p_i64++;
00160          }
00161          break;
00162       case EASYDBUS_ELTYPE_UINT64:
00163          p_i64 = (long long *) container->p_data;
00164          for (i = 0; i < container->nel; i++) {
00165             dbus_message_iter_append_basic (&iter2,
00166                                             DBUS_TYPE_UINT64, p_i64);
00167             p_i64++;
00168          }
00169          break;
00170       case EASYDBUS_ELTYPE_BYTE:
00171          p_byte = (char *) container->p_data;
00172          for (i = 0; i < container->nel; i++) {
00173             dbus_message_iter_append_basic (&iter2,
00174                                             DBUS_TYPE_BYTE, p_byte);
00175             p_byte++;
00176          }
00177          break;
00178       case EASYDBUS_ELTYPE_DOUBLE:
00179          p_double = (double *) container->p_data;
00180          for (i = 0; i < container->nel; i++) {
00181             dbus_message_iter_append_basic (&iter2,
00182                                             DBUS_TYPE_DOUBLE,
00183                                             p_double);
00184             p_double++;
00185          }
00186          break;
00187       case EASYDBUS_ELTYPE_BOOLEAN:
00188          p_byte = (char *) container->p_data;
00189          for (i = 0; i < container->nel; i++) {
00190             dbus_message_iter_append_basic (&iter2,
00191                                             DBUS_TYPE_BOOLEAN,
00192                                             p_byte);
00193             p_byte++;
00194          }
00195          break;
00196       case EASYDBUS_ELTYPE_SIGNATURE:
00197          p_string = (char **) container->p_data;
00198          for (i = 0; i < container->nel; i++) {
00199             // char *temp = p_string[i];
00200             // printf ("%s \n", temp);
00201             dbus_message_iter_append_basic (&iter2,
00202                                             DBUS_TYPE_SIGNATURE,
00203                                             &p_string[i]);
00204          }
00205          break;
00206       case EASYDBUS_ELTYPE_STRING:
00207          p_string = (char **) container->p_data;
00208          for (i = 0; i < container->nel; i++) {
00209             // char *temp = p_string[i];
00210             // printf ("%s \n", temp);
00211             dbus_message_iter_append_basic (&iter2,
00212                                             DBUS_TYPE_STRING,
00213                                             &p_string[i]);
00214          }
00215          break;
00216       case EASYDBUS_ELTYPE_OBJECT_PATH:
00217          p_string = (char **) container->p_data;
00218          for (i = 0; i < container->nel; i++)
00219             dbus_message_iter_append_basic (&iter2,
00220                                             DBUS_TYPE_OBJECT_PATH,
00221                                             &p_string[i]);
00222          break;
00223       case EASYDBUS_ELTYPE_ARRAY:
00224          internal_el = (struct EasyDbus_elem *)
00225             container->p_data;
00226          for (i = 0; i < container->nel; i++) {
00227             easydbus_add_array_on_container_tomsg
00228                (msg, &iter2, internal_el);
00229             internal_el = internal_el->next;
00230          }
00231          break;
00232       case EASYDBUS_ELTYPE_DICT_ENTRY:
00233          internal_el = (struct EasyDbus_elem *)
00234             container->p_data;
00235          for (i = 0; i < container->nel; i++) {
00236             easydbus_add_dict_entry_tomsg (msg, &iter2, internal_el);
00237             internal_el = internal_el->next;
00238          }
00239          break;
00240       case EASYDBUS_ELTYPE_VARIANT:
00241          internal_el = (struct EasyDbus_elem *)
00242             container->p_data;
00243          for (i = 0; i < container->nel; i++) {
00244             //TODO:
00245             //rename function for manage variant on
00246             //container.
00247             add_variant_to_container_on_msg (msg, internal_el,
00248                                              &iter2);
00249             internal_el = internal_el->next;
00250          }
00251          break;
00252       case EASYDBUS_ELTYPE_STRUCT:
00253          internal_el = (struct EasyDbus_elem *)
00254             container->p_data;
00255          while (internal_el != NULL) {
00256             easydbus_add_struct_on_container_msg
00257                (msg, &iter2, internal_el);
00258             internal_el = internal_el->next;
00259          }
00260          break;
00261       case EASYDBUS_ELTYPE_INVALID:
00262          EasyDbusDebug ("ERROR This type must not be used!\n");
00263          break;
00264    }                            // end of switch
00265 
00266    /* move signature pointer to original 
00267     * position with container char before call free */
00268    free (--signature);
00269 
00270  end:
00271 
00272    dbus_message_iter_close_container (&iter, &iter2);
00273 
00274    return ret_val;
00275 }
00276 
00287 struct EasyDbus_container *
00288 easydbus_get_marshal_data_from_array (enum event_type type,
00289                                       void *container,
00290                                       enum el_type type_marshal_data,
00291                                       DBusMessageIter * iter)
00292 {
00293    int i32 = 0;
00294    unsigned int ui32 = 0;
00295    short i16 = 0;
00296    char byte = 0;
00297    char *string = NULL;
00298    unsigned short ui16 = 0;
00299    long long i64 = 0;
00300    double d = 0;
00301    unsigned long long ui64 = 0;
00302    DBusMessageIter subiter;
00303    unsigned int len = 1;
00304    char *bytes = NULL;
00305    char **strings = NULL;
00306    int *int32_array = NULL;
00307    unsigned int *uint32_array = NULL;
00308    unsigned short *uint16_array = NULL;
00309    short *int16_array = NULL;
00310    long long *int64_array = NULL;
00311    unsigned long long *uint64_array = NULL;
00312    double *double_array = NULL;
00313    unsigned int i = 0;
00314    struct EasyDbus_container *array = NULL;
00315    struct EasyDbus_container *cont_marshal_data = NULL;
00316 
00317 #ifdef EASYDBUS_DEBUG
00318    char *signature = NULL;
00319 #endif
00320 
00321    dbus_message_iter_recurse (iter, &subiter);
00322 
00323    if (type_marshal_data == DBUS_TYPE_INVALID) {
00324       EasyDbusDebug ("No element on array or error");
00325       return NULL;
00326    }
00327 
00328    if (type_marshal_data != DBUS_TYPE_DICT_ENTRY) {
00329       // count elems
00330       while (dbus_message_iter_has_next (&subiter)) {
00331          len++;
00332          dbus_message_iter_next (&subiter);
00333       }
00334       // reinit iterator
00335       dbus_message_iter_recurse (iter, &subiter);
00336       EasyDbusDebug ("Number of element on array = %d", len);
00337    }
00338 
00339    array = easydbus_container_create_skeleton (EASYDBUS_ELTYPE_ARRAY);
00340    if (!array) {
00341       EasyDbusDebug ("Error on create container skeleton");
00342       return NULL;
00343    }
00344 
00345    // this is neeeded for manage correctly empty array
00346    switch (type_marshal_data) {
00347       case DBUS_TYPE_STRING:
00348       case DBUS_TYPE_OBJECT_PATH:
00349       case DBUS_TYPE_SIGNATURE:
00350          strings = (char **) malloc (sizeof (char *) * len);
00351          if (!strings)
00352             goto error;
00353          memset (strings, 0, len * sizeof (char *));
00354          break;
00355       case DBUS_TYPE_INT32:
00356          int32_array = (int *) malloc (sizeof (int) * len);
00357          if (!int32_array)
00358             goto error;
00359          memset (int32_array, 0, sizeof (int) * len);
00360          break;
00361       case DBUS_TYPE_UINT32:
00362          uint32_array = (unsigned int *) malloc (sizeof (int) * len);
00363          if (!uint32_array)
00364             goto error;
00365          memset (uint32_array, 0, sizeof (int) * len);
00366          break;
00367       case DBUS_TYPE_INT64:
00368          int64_array =
00369             (long long *) malloc (sizeof (long long) * len);
00370          if (!int64_array)
00371             goto error;
00372          memset (int64_array, 0, sizeof (long long) * len);
00373          break;
00374       case DBUS_TYPE_UINT64:
00375          uint64_array = (unsigned long long *) malloc
00376             (sizeof (unsigned long long) * len);
00377          if (!uint64_array)
00378             goto error;
00379          memset (uint64_array, 0, sizeof (unsigned long long) * len);
00380          break;
00381       case DBUS_TYPE_INT16:
00382          int16_array = (short *) malloc (sizeof (short) * len);
00383          if (!int16_array)
00384             goto error;
00385          memset (int16_array, 0, sizeof (short) * len);
00386          break;
00387       case DBUS_TYPE_UINT16:
00388          uint16_array = (unsigned short *) malloc
00389             (sizeof (unsigned short) * len);
00390          if (!uint16_array)
00391             goto error;
00392          memset (uint16_array, 0, sizeof (unsigned short) * len);
00393          break;
00394       case DBUS_TYPE_BYTE:
00395       case DBUS_TYPE_BOOLEAN:
00396          bytes = (char *) malloc (len);
00397          if (!bytes)
00398             goto error;
00399          memset (bytes, 0, len);
00400       case DBUS_TYPE_DOUBLE:
00401          double_array = (double *) malloc (sizeof (double) * len);
00402          if (!double_array)
00403             goto error;
00404          memset (double_array, 0, sizeof (double) * len);
00405          break;
00406       case DBUS_TYPE_VARIANT:
00407       case DBUS_TYPE_DICT_ENTRY:
00408       case DBUS_TYPE_ARRAY:
00409       case DBUS_TYPE_STRUCT:
00410          // do nothings, dict entry and variant elements are
00411          // insert dinamically when it is read a element.
00412          break;
00413       default:
00414          goto error;
00415          break;
00416    }
00417 
00418    while (1) {
00419 #ifdef EASYDBUS_DEBUG
00420       signature = dbus_message_iter_get_signature (iter);
00421       EasyDbusDebug ("Current Signature = %s", signature);
00422       dbus_free (signature);
00423 #endif
00424       switch (dbus_message_iter_get_arg_type (&subiter)) {
00425          case DBUS_TYPE_STRING:
00426             dbus_message_iter_get_basic (&subiter, &string);
00427             EasyDbusDebug ("founded string = %s\n", string);
00428             strings[i] = (char *) malloc (strlen (string) + 1);
00429             EASYDBUS_MEMCOPY (strings[i], string,
00430                               strlen (string) + 1);
00431             //memset (strings[i], 0, strlen (string) + 1);
00432             //memcpy (strings[i], string, strlen (string) + 1);
00433             //EasyDbusDebug ("founded string = %s\n", strings[i]);
00434             i++;
00435             break;
00436          case DBUS_TYPE_INT32:
00437             dbus_message_iter_get_basic (&subiter, &i32);
00438             EasyDbusDebug ("founded int32 = %d", i32);
00439             int32_array[i] = i32;
00440             i++;
00441             break;
00442          case DBUS_TYPE_UINT32:
00443             dbus_message_iter_get_basic (&subiter, &ui32);
00444             EasyDbusDebug ("founded uint32 = %d", ui32);
00445             uint32_array[i] = ui32;
00446             i++;
00447             break;
00448          case DBUS_TYPE_INT16:
00449             dbus_message_iter_get_basic (&subiter, &i16);
00450             EasyDbusDebug ("founded int16 = %d", i16);
00451             int16_array[i] = i16;
00452             i++;
00453             break;
00454          case DBUS_TYPE_UINT16:
00455             dbus_message_iter_get_basic (&subiter, &ui16);
00456             EasyDbusDebug ("founded uint16 = %d", ui16);
00457             uint16_array[i] = ui16;
00458             i++;
00459             break;
00460          case DBUS_TYPE_INT64:
00461             dbus_message_iter_get_basic (&subiter, &i64);
00462             EasyDbusDebug ("founded int64 = %lld", i64);
00463             int64_array[i] = i64;
00464             i++;
00465             break;
00466          case DBUS_TYPE_UINT64:
00467             dbus_message_iter_get_basic (&subiter, &ui64);
00468             EasyDbusDebug ("founded uint64 = %lld", ui64);
00469             uint64_array[i] = ui64;
00470             i++;
00471             break;
00472          case DBUS_TYPE_BYTE:
00473             dbus_message_iter_get_basic (&subiter, &byte);
00474             EasyDbusDebug ("founded byte = %d", byte);
00475             bytes[i] = byte;
00476             i++;
00477             break;
00478          case DBUS_TYPE_BOOLEAN:
00479             dbus_message_iter_get_basic (&subiter, &byte);
00480             EasyDbusDebug ("founded boolean = %d", byte);
00481             bytes[i] = byte;
00482             i++;
00483             break;
00484          case DBUS_TYPE_DOUBLE:
00485             dbus_message_iter_get_basic (&subiter, &d);
00486             EasyDbusDebug ("founded double = %f", d);
00487             double_array[i] = d;
00488             i++;
00489             break;
00490          case DBUS_TYPE_OBJECT_PATH:
00491             dbus_message_iter_get_basic (&subiter, &string);
00492             EasyDbusDebug ("founded obj_path = %s\n", string);
00493             strings[i] = (char *) malloc (strlen (string) + 1);
00494             EASYDBUS_MEMCOPY (strings[i], string, strlen (string) + 1);
00495             //memset (strings[i], 0, strlen (string) + 1);
00496             //memcpy (strings[i], string, strlen (string));
00497             i++;
00498             break;
00499          case DBUS_TYPE_SIGNATURE:
00500             dbus_message_iter_get_basic (&subiter, &string);
00501             EasyDbusDebug ("founded signature = %s\n", string);
00502             strings[i] = (char *) malloc (strlen (string) + 1);
00503             EASYDBUS_MEMCOPY (strings[i], string, strlen (string) + 1);
00504             //memset (strings[i], 0, strlen (string) + 1);
00505             //memcpy (strings[i], string, strlen (string));
00506             i++;
00507             break;
00508          case DBUS_TYPE_ARRAY:
00509             cont_marshal_data =
00510                easydbus_get_marshal_data_from_array (type,
00511                                                      container,
00512                                                      dbus_message_iter_get_element_type
00513                                                      (&subiter),
00514                                                      &subiter);
00515             if (cont_marshal_data != NULL) {
00516                easydbus_array_add_array (cont_marshal_data, array);
00517                EasyDbusDebug ("Added array to container");
00518             }
00519             else
00520                EasyDbusDebug ("Error on manage array");
00521             break;
00522          case DBUS_TYPE_STRUCT:
00523             cont_marshal_data = easydbus_struct_build_elem
00524                (type, (void *) container, &subiter);
00525             if (cont_marshal_data != NULL) {
00526                easydbus_array_add_struct (cont_marshal_data, array);
00527                EasyDbusDebug ("Added struct to container");
00528             }
00529             else
00530                EasyDbusDebug ("Error on add struct to container");
00531             break;
00532          case DBUS_TYPE_VARIANT:
00533             cont_marshal_data = easydbus_variant_build_elem
00534                (type, (void *) container, &subiter);
00535             if (cont_marshal_data != NULL) {
00536                easydbus_array_add_variant (cont_marshal_data, array);
00537                EasyDbusDebug ("Added variant to container");
00538             }
00539             else
00540                EasyDbusDebug ("Error on add variant to container");
00541             i++;
00542             break;
00543          case DBUS_TYPE_DICT_ENTRY:
00544             cont_marshal_data = easydbus_dict_entry_build_container
00545                (type, container, &subiter);
00546             if (cont_marshal_data != NULL) {
00547                easydbus_array_add_dict_entry
00548                   (cont_marshal_data, array);
00549                EasyDbusDebug ("Added dict entry to array");
00550             }
00551             else
00552                EasyDbusDebug ("Error on add dict entry to array");
00553             i++;
00554             break;
00555          case DBUS_TYPE_INVALID:
00556             EasyDbusDebug ("Empty array or field wrong");
00557             break;
00558          default:
00559             EasyDbusDebug ("Not managed or error");
00560             break;
00561       }
00562       if (!dbus_message_iter_has_next (&subiter))
00563          goto exit;
00564       else
00565          dbus_message_iter_next (&subiter);
00566    }
00567 
00568  exit:
00569    /* no element on array */
00570    if (i == 0) {
00571       EasyDbusDebug ("Add signature %d (easydbus %d) to empty array",
00572                      type_marshal_data,
00573                      get_easydbus_type_from_dbus_type
00574                      (type_marshal_data));
00576       easydbus_container_add_signature_to_empty_container (array,
00577                                                            get_easydbus_type_from_dbus_type
00578                                                            (type_marshal_data),
00579                                                            EASYDBUS_ELTYPE_INVALID);
00580    }
00581    switch (type_marshal_data) {
00582       case DBUS_TYPE_STRING:
00583          if (i)                 /* if array isn't empty */
00584             easydbus_array_add_string_array (array, len, strings);
00585          for (i = 0; i < len; i++)
00586             free (strings[i]);
00587          free (strings);
00588          break;
00589       case DBUS_TYPE_INT32:
00590          if (i)
00591             easydbus_array_add_i32_array (array, len, int32_array);
00592          free (int32_array);
00593          break;
00594       case DBUS_TYPE_UINT32:
00595          if (i)
00596             easydbus_array_add_ui32_array (array, len, uint32_array);
00597          free (uint32_array);
00598       case DBUS_TYPE_BYTE:
00599          if (i)
00600             easydbus_array_add_byte_array (array, len, bytes);
00601          free (bytes);
00602          break;
00603       case DBUS_TYPE_INT64:
00604          if (i)
00605             easydbus_array_add_i64_array (array, len, int64_array);
00606          free (int64_array);
00607          break;
00608       case DBUS_TYPE_UINT64:
00609          if (i)
00610             easydbus_array_add_ui64_array (array, len, uint64_array);
00611          free (uint64_array);
00612          break;
00613       case DBUS_TYPE_INT16:
00614          if (i)
00615             easydbus_array_add_i16_array (array, len, int16_array);
00616          free (int16_array);
00617          break;
00618       case DBUS_TYPE_UINT16:
00619          if (i)
00620             easydbus_array_add_ui16_array (array, len, uint16_array);
00621          free (uint16_array);
00622          break;
00623       case DBUS_TYPE_BOOLEAN:
00624          if (i)
00625             easydbus_array_add_boolean_array (array, len, bytes);
00626          free (bytes);
00627          break;
00628       case DBUS_TYPE_DOUBLE:
00629          if (i)
00630             easydbus_array_add_double_array (array, len,
00631                                              double_array);
00632          free (double_array);
00633          break;
00634       case DBUS_TYPE_OBJECT_PATH:
00635          if (i)
00636             easydbus_array_add_obj_path_array (array, len, strings);
00637          for (i = 0; i < len; i++)
00638             free (strings[i]);
00639          free (strings);
00640          break;
00641       case DBUS_TYPE_SIGNATURE:
00642          if (i)
00643             easydbus_array_add_signature_array (array, len, strings);
00644          for (i = 0; i < len; i++)
00645             free (strings[i]);
00646          free (strings);
00647          break;
00648       case DBUS_TYPE_DICT_ENTRY:
00649       case DBUS_TYPE_VARIANT:
00650       case DBUS_TYPE_ARRAY:
00651       case DBUS_TYPE_STRUCT:
00652          EasyDbusDebug ("Data already inserted on array");
00653          break;
00654       default:
00655          break;
00656    }
00657 
00658    EasyDbusDebug ("End of get recurse marshal data");
00659    return array;
00660 
00661  error:
00662    if (array != NULL)
00663       easydbus_container_free (array);
00664    return NULL;
00665 }
00666 
00677 int 
00678 easydbus_add_array_on_container_tomsg (DBusMessage * msg, 
00679                                        DBusMessageIter * iter,
00680                                        struct EasyDbus_elem *el) 
00681 {
00682    DBusMessageIter iter2;
00683    short *p_i16 = NULL;
00684    int *p_i32 = NULL;
00685    long long *p_i64 = NULL;
00686    double *p_double = NULL;
00687    char *p_byte = NULL;
00688    char **p_string = NULL;
00689    struct EasyDbus_elem *internal_el = NULL;
00690    struct EasyDbus_container *container = el->payload.p_container;
00691    int ret_val = -1;
00692    unsigned int i;
00693    char *signature = NULL;
00694 
00695    if (!container->nel) {
00696       if (!container->signature) {
00697          EasyDbusDebug ("Error an empty array must have a"
00698                         " signature");
00699          return ret_val;
00700       }
00701       /* see if there is a solution more efficient */
00702       if (dbus_message_iter_open_container (iter, DBUS_TYPE_ARRAY,
00703                                              container->signature,
00704                                              &iter2))
00705          ret_val = 0;
00706       else
00707          EasyDbusDebug ("Error on open array container");
00708       goto end;
00709    }
00710 
00711    /* container has at least one element */
00712    /* build signature */
00713    signature = prepare_signature (el, EASYDBUS_SIGNATURE_NORMAL);
00714    EasyDbusDebug ("Signature prepared for container on array "
00715                   "= %s\n", signature);
00716    /* this is needed beacaurse first char of signature
00717     * relative to first container container must be ignored.
00718     * Try to speak of this with dbus protocols developers 
00719     * because i think that isn't correct. */
00720    signature++;
00721    if (dbus_message_iter_open_container (iter, DBUS_TYPE_ARRAY,
00722                                           signature, &iter2))
00723       ret_val = 0;
00724    else
00725       EasyDbusDebug ("Error on open array container\n");
00726    switch (container->elem_type) {
00727       case EASYDBUS_ELTYPE_INT16:
00728          p_i16 = (short *) container->p_data;
00729          for (i = 0; i < container->nel; i++) {
00730             dbus_message_iter_append_basic (&iter2,
00731                                             DBUS_TYPE_INT16, p_i16);
00732             p_i16++;
00733          }
00734          break;
00735       case EASYDBUS_ELTYPE_UINT16:
00736          p_i16 = (short *) container->p_data;
00737          for (i = 0; i < container->nel; i++) {
00738             dbus_message_iter_append_basic (&iter2,
00739                                             DBUS_TYPE_UINT16, p_i16);
00740             p_i16++;
00741          }
00742          break;
00743       case EASYDBUS_ELTYPE_INT32:
00744          p_i32 = (int *) container->p_data;
00745          for (i = 0; i < container->nel; i++) {
00746             dbus_message_iter_append_basic (&iter2,
00747                                             DBUS_TYPE_INT32, p_i32);
00748             p_i32++;
00749          }
00750          break;
00751       case EASYDBUS_ELTYPE_UINT32:
00752          p_i32 = (int *) container->p_data;
00753          for (i = 0; i < container->nel; i++) {
00754             dbus_message_iter_append_basic (&iter2,
00755                                             DBUS_TYPE_UINT32, p_i32);
00756             p_i32++;
00757          }
00758          break;
00759       case EASYDBUS_ELTYPE_INT64:
00760          p_i64 = (long long *) container->p_data;
00761          for (i = 0; i < container->nel; i++) {
00762             dbus_message_iter_append_basic (&iter2,
00763                                             DBUS_TYPE_UINT32, p_i64);
00764             p_i64++;
00765          }
00766          break;
00767       case EASYDBUS_ELTYPE_UINT64:
00768          p_i64 = (long long *) container->p_data;
00769          for (i = 0; i < container->nel; i++) {
00770             dbus_message_iter_append_basic (&iter2,
00771                                             DBUS_TYPE_UINT64, p_i64);
00772             p_i64++;
00773          }
00774          break;
00775       case EASYDBUS_ELTYPE_BYTE:
00776          p_byte = (char *) container->p_data;
00777          for (i = 0; i < container->nel; i++) {
00778             dbus_message_iter_append_basic (&iter2,
00779                                             DBUS_TYPE_BYTE, p_byte);
00780             p_byte++;
00781          }
00782          break;
00783       case EASYDBUS_ELTYPE_DOUBLE:
00784          p_double = (double *) container->p_data;
00785          for (i = 0; i < container->nel; i++) {
00786             dbus_message_iter_append_basic (&iter2,
00787                                             DBUS_TYPE_DOUBLE,
00788                                             p_double);
00789             p_double++;
00790          }
00791          break;
00792       case EASYDBUS_ELTYPE_BOOLEAN:
00793          p_byte = (char *) container->p_data;
00794          for (i = 0; i < container->nel; i++) {
00795             dbus_message_iter_append_basic (&iter2,
00796                                             DBUS_TYPE_BOOLEAN,
00797                                             p_byte);
00798             p_byte++;
00799          }
00800          break;
00801       case EASYDBUS_ELTYPE_STRING:
00802          p_string = (char **) container->p_data;
00803          for (i = 0; i < container->nel; i++) {
00804             // char *temp = p_string[i];
00805             // printf ("%s \n", temp);
00806             dbus_message_iter_append_basic (&iter2,
00807                                             DBUS_TYPE_STRING,
00808                                             &p_string[i]);
00809          }
00810          break;
00811       case EASYDBUS_ELTYPE_OBJECT_PATH:
00812          p_string = (char **) container->p_data;
00813          for (i = 0; i < container->nel; i++)
00814             dbus_message_iter_append_basic (&iter2,
00815                                             DBUS_TYPE_OBJECT_PATH,
00816                                             &p_string[i]);
00817          break;
00818       case EASYDBUS_ELTYPE_SIGNATURE:
00819          p_string = (char **) container->p_data;
00820          for (i = 0; i < container->nel; i++)
00821             dbus_message_iter_append_basic (&iter2,
00822                                             DBUS_TYPE_SIGNATURE,
00823                                             &p_string[i]);
00824          break;
00825       case EASYDBUS_ELTYPE_ARRAY:
00826          internal_el = (struct EasyDbus_elem *) container->p_data;
00827          for (i = 0; i < container->nel; i++) {
00828             easydbus_add_array_on_container_tomsg
00829                (msg, &iter2, internal_el);
00830             internal_el = internal_el->next;
00831          }
00832          break;
00833       case EASYDBUS_ELTYPE_VARIANT:
00834          internal_el = (struct EasyDbus_elem *)
00835             container->p_data;
00836          for (i = 0; i < container->nel; i++) {
00837             add_variant_to_container_on_msg (msg, internal_el,
00838                                              &iter2);
00839             internal_el = internal_el->next;
00840          }
00841          break;
00842       case EASYDBUS_ELTYPE_DICT_ENTRY:
00843          internal_el = (struct EasyDbus_elem *)
00844             container->p_data;
00845          for (i = 0; i < container->nel; i++) {
00846             easydbus_add_dict_entry_tomsg (msg, &iter2, internal_el);
00847             internal_el = internal_el->next;
00848          }
00849          break;
00850       case EASYDBUS_ELTYPE_STRUCT:
00851          internal_el = (struct EasyDbus_elem *)
00852             container->p_data;
00853          while (internal_el != NULL) {
00854             easydbus_add_struct_on_container_msg
00855                (msg, &iter2, internal_el);
00856             internal_el = internal_el->next;
00857          }
00858          break;
00859       case EASYDBUS_ELTYPE_INVALID:
00860          EasyDbusDebug ("ERROR This type must not be used!");
00861          break;
00862    } // end of switch
00863 
00864    /* move signature pointer to original 
00865     * position with array char before call free */
00866    free (--signature);
00867 
00868  end:
00869    dbus_message_iter_close_container (iter, &iter2);
00870 
00871    return ret_val;
00872 }
00873 
00874 
00875 
00878 //-------------------------------------------------//
00879 // struct easydbus_signature_elem_stack functions  //
00880 //-------------------------------------------------//
00881 
00898 struct easydbus_signature_elem_stack *
00899 easydbus_add_elem_to_stack (enum el_type el,
00900                             struct easydbus_signature_elem_stack
00901                             *stack)
00902 {
00903    struct easydbus_signature_elem_stack *new_el = NULL;
00904    struct easydbus_signature_elem_stack *tmp_el = NULL;
00905 
00906    new_el = (struct easydbus_signature_elem_stack *)
00907       malloc (sizeof (struct easydbus_signature_elem_stack));
00908 
00909    if (!new_el)
00910       return NULL;
00911 
00912    memset (new_el, 0, sizeof (struct easydbus_signature_elem_stack));
00913    new_el->next = new_el->prev = NULL;
00914    new_el->type = el;
00915 
00916    if (!stack)
00917       return new_el;
00918 
00919    tmp_el = stack;
00920    while (tmp_el->next)
00921       tmp_el = tmp_el->next;
00922 
00923    tmp_el->next = new_el;
00924    new_el->prev = tmp_el;
00925    return stack;
00926 }
00927 
00932 void
00933 easydbus_free_elem_from_stack 
00934   (struct easydbus_signature_elem_stack *el)
00935 {
00936    if (!el)
00937       return;
00938 
00939    if (el->next)
00940       el->next->prev = el->prev;
00941    if (el->prev)
00942       el->prev->next = el->next;
00943    free (el);
00944 }
00945 
00950 inline void
00951 easydbus_free_elem_from_stack_list 
00952   (struct easydbus_signature_elem_stack *list)
00953 {
00954    struct easydbus_signature_elem_stack *tmp_elem = NULL;
00955 
00956    while (list) {
00957       tmp_elem = list;
00958       list = list->next;
00959       easydbus_free_elem_from_stack (tmp_elem);
00960    }
00961 }
00962 
00964 // vim: ts=3 shiftwidth=3 expandtab

Generated on Thu Apr 10 10:00:17 2008 for EasyDbus-0.2 by  doxygen 1.5.4