2004-12-19 Havoc Pennington <hp@redhat.com>
[platform/upstream/dbus.git] / dbus / dbus-marshal-recursive.h
1 /* -*- mode: C; c-file-style: "gnu" -*- */
2 /* dbus-marshal-recursive.h  Marshalling routines for recursive types
3  *
4  * Copyright (C) 2004 Red Hat, Inc.
5  *
6  * Licensed under the Academic Free License version 2.1
7  * 
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  * 
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  *
22  */
23
24 #ifndef DBUS_MARSHAL_RECURSIVE_H
25 #define DBUS_MARSHAL_RECURSIVE_H
26
27 #include <config.h>
28 #include <dbus/dbus-marshal-basic.h>
29
30 #ifndef PACKAGE
31 #error "config.h not included here"
32 #endif
33
34 /* Notes on my plan to implement this:
35  * - also have DBusTypeWriter (heh)
36  * - TypeReader has accessors for:
37  *    . basic type
38  *    . array of basic type (efficiency hack)
39  *    . another type reader
40  * - a dict will appear to be a list of string, whatever, string, whatever
41  * - a variant will contain another TypeReader
42  * - a struct will be a list of whatever, whatever, whatever
43  *
44  * So the basic API usage is to go next, next, next; if the
45  * item is a basic type or basic array then read the item;
46  * if it's another type reader then process it; if it's
47  * a container type (struct, array, variant, dict) then
48  * recurse.
49  * 
50  */
51
52 struct DBusTypeReader
53 {
54   int byte_order;
55   const DBusString *type_str;
56   int type_pos;
57   const DBusString *value_str;
58   int value_pos;
59 };
60
61 typedef struct DBusTypeReader DBusTypeReader;
62
63 struct DBusTypeWriter
64 {
65   int byte_order;
66   DBusString *type_str;
67   int type_pos;
68   DBusString *value_str;
69   int value_pos;
70   int container_type;
71 };
72
73 typedef struct DBusTypeWriter DBusTypeWriter;
74
75 void        _dbus_type_reader_init                (DBusTypeReader    *reader,
76                                                    int                byte_order,
77                                                    const DBusString  *type_str,
78                                                    int                type_pos,
79                                                    const DBusString  *value_str,
80                                                    int                value_pos);
81 int         _dbus_type_reader_get_current_type    (DBusTypeReader    *reader);
82 int         _dbus_type_reader_get_array_type      (DBusTypeReader    *reader);
83 void        _dbus_type_reader_read_basic          (DBusTypeReader    *reader,
84                                                    void              *value);
85 dbus_bool_t _dbus_type_reader_read_array_of_basic (DBusTypeReader    *reader,
86                                                    int                type,
87                                                    void             **array,
88                                                    int               *array_len);
89 void        _dbus_type_reader_recurse             (DBusTypeReader    *reader,
90                                                    DBusTypeReader    *subreader);
91 dbus_bool_t _dbus_type_reader_next                (DBusTypeReader    *reader);
92
93 void        _dbus_type_writer_init        (DBusTypeWriter *writer,
94                                            int             byte_order,
95                                            DBusString     *type_str,
96                                            int             type_pos,
97                                            DBusString     *value_str,
98                                            int             value_pos);
99 dbus_bool_t _dbus_type_writer_write_basic (DBusTypeWriter *writer,
100                                            int             type,
101                                            const void     *value);
102 dbus_bool_t _dbus_type_writer_write_array (DBusTypeWriter *writer,
103                                            int             type,
104                                            const void     *array,
105                                            int             array_len);
106 dbus_bool_t _dbus_type_writer_recurse     (DBusTypeWriter *writer,
107                                            int             container_type,
108                                            DBusTypeWriter *sub);
109 dbus_bool_t _dbus_type_writer_unrecurse   (DBusTypeWriter *writer,
110                                            DBusTypeWriter *sub);
111
112 #endif /* DBUS_MARSHAL_RECURSIVE_H */