- remove DICT type
[platform/upstream/dbus.git] / dbus / dbus-marshal-recursive.h
index 19960ec..679dad3 100644 (file)
 #error "config.h not included here"
 #endif
 
-/* Notes on my plan to implement this:
- * - also have DBusTypeWriter (heh)
- * - TypeReader has accessors for:
- *    . basic type
- *    . array of basic type (efficiency hack)
- *    . another type reader
- * - a dict will appear to be a list of string, whatever, string, whatever
- * - a variant will contain another TypeReader
- * - a struct will be a list of whatever, whatever, whatever
- *
- * So the basic API usage is to go next, next, next; if the
- * item is a basic type or basic array then read the item;
- * if it's another type reader then process it; if it's
- * a container type (struct, array, variant, dict) then
- * recurse.
- * 
- */
+typedef struct DBusTypeReader      DBusTypeReader;
+typedef struct DBusTypeWriter      DBusTypeWriter;
+typedef struct DBusTypeReaderClass DBusTypeReaderClass;
 
 struct DBusTypeReader
 {
@@ -56,9 +42,21 @@ struct DBusTypeReader
   int type_pos;
   const DBusString *value_str;
   int value_pos;
-};
 
-typedef struct DBusTypeReader DBusTypeReader;
+  const DBusTypeReaderClass *klass;
+  union
+  {
+    struct {
+      int start_pos;
+      dbus_uint32_t len;
+      int element_type;
+    } array;
+
+    struct {
+      dbus_uint32_t finished : 1;
+    } strct;
+  } u;
+};
 
 struct DBusTypeWriter
 {
@@ -67,46 +65,63 @@ struct DBusTypeWriter
   int type_pos;
   DBusString *value_str;
   int value_pos;
+
+  dbus_uint32_t type_pos_is_expectation : 1; /* type_pos is an insertion point or an expected next type */
+
+  int container_type;
+  union
+  {
+    struct {
+      int start_pos; /* first element */
+      int len_pos;
+      int element_type_pos; /* position in type_str of array element type */
+      int element_type_len;
+    } array;
+  } u;
 };
 
-typedef struct DBusTypeWriter DBusTypeWriter;
+void        _dbus_type_reader_init                (DBusTypeReader    *reader,
+                                                   int                byte_order,
+                                                   const DBusString  *type_str,
+                                                   int                type_pos,
+                                                   const DBusString  *value_str,
+                                                   int                value_pos);
+int         _dbus_type_reader_get_current_type    (DBusTypeReader    *reader);
+dbus_bool_t _dbus_type_reader_array_is_empty      (DBusTypeReader    *reader);
+void        _dbus_type_reader_read_basic          (DBusTypeReader    *reader,
+                                                   void              *value);
+dbus_bool_t _dbus_type_reader_read_array_of_basic (DBusTypeReader    *reader,
+                                                   int                type,
+                                                   void             **array,
+                                                   int               *array_len);
+void        _dbus_type_reader_recurse             (DBusTypeReader    *reader,
+                                                   DBusTypeReader    *subreader);
+dbus_bool_t _dbus_type_reader_next                (DBusTypeReader    *reader);
 
-void        _dbus_type_reader_init             (DBusTypeReader    *reader,
-                                                int                byte_order,
-                                                const DBusString  *type_str,
-                                                int                type_pos,
-                                                const DBusString  *value_str,
-                                                int                value_pos);
-int         _dbus_type_reader_get_value_end    (DBusTypeReader    *reader);
-int         _dbus_type_reader_get_type_end     (DBusTypeReader    *reader);
-int         _dbus_type_reader_get_current_type (DBusTypeReader    *reader);
-int         _dbus_type_reader_get_array_type   (DBusTypeReader    *reader);
-void        _dbus_type_reader_read_basic       (DBusTypeReader    *reader,
-                                                void              *value);
-dbus_bool_t _dbus_type_reader_read_array       (DBusTypeReader    *reader,
-                                                int                type,
-                                                void             **array,
-                                                int               *array_len);
-void        _dbus_type_reader_recurse          (DBusTypeReader    *reader);
-void        _dbus_type_reader_unrecurse        (DBusTypeReader    *reader);
-dbus_bool_t _dbus_type_reader_next             (DBusTypeReader    *reader);
+void        _dbus_type_writer_init            (DBusTypeWriter *writer,
+                                               int             byte_order,
+                                               DBusString     *type_str,
+                                               int             type_pos,
+                                               DBusString     *value_str,
+                                               int             value_pos);
+dbus_bool_t _dbus_type_writer_write_basic     (DBusTypeWriter *writer,
+                                               int             type,
+                                               const void     *value);
+dbus_bool_t _dbus_type_writer_write_array     (DBusTypeWriter *writer,
+                                               int             type,
+                                               const void     *array,
+                                               int             array_len);
+dbus_bool_t _dbus_type_writer_recurse_struct  (DBusTypeWriter *writer,
+                                               DBusTypeWriter *sub);
+dbus_bool_t _dbus_type_writer_recurse_array   (DBusTypeWriter *writer,
+                                               const char     *element_type,
+                                               DBusTypeWriter *sub);
+dbus_bool_t _dbus_type_writer_recurse_variant (DBusTypeWriter *writer,
+                                               const char     *contained_type,
+                                               DBusTypeWriter *sub);
+dbus_bool_t _dbus_type_writer_unrecurse       (DBusTypeWriter *writer,
+                                               DBusTypeWriter *sub);
 
 
-void        _dbus_type_writer_init        (DBusTypeWriter *writer,
-                                           int             byte_order,
-                                           DBusString     *type_str,
-                                           int             type_pos,
-                                           DBusString     *value_str,
-                                           int             value_pos);
-dbus_bool_t _dbus_type_writer_write_basic (DBusTypeWriter *writer,
-                                           int             type,
-                                           const void     *value);
-dbus_bool_t _dbus_type_writer_write_array (DBusTypeWriter *writer,
-                                           int             type,
-                                           const void     *array,
-                                           int             array_len);
-dbus_bool_t _dbus_type_writer_recurse     (DBusTypeWriter *writer,
-                                           int             container_type);
-dbus_bool_t _dbus_type_writer_unrecurse   (DBusTypeWriter *writer);
 
 #endif /* DBUS_MARSHAL_RECURSIVE_H */