/vqdr/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/vqdr/trunk
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
1
/*
2
 * The contects of this file is in the Public Domain.
3
 *
4
 * Created by Gustav Hartivgsson.
5
 */
6
36 by Gustav Hartvigsson
Refactoring.
7
namespace Utils {
1 by Gustav Hartvigsson
* Initial code - far from done
8
  public int str_cmp (string a, string b) {
9
    return a.collate (b);
10
  }
11
  
12
  public void print_ln (string str, ...) {
13
    var va = va_list ();
43 by Gustav Hartvigsson
* Added err_print_ln.
14
    var tmp = str + "\n";
15
    stdout.vprintf (tmp, va);
16
  }
17
18
  public void err_print_ln (string str, ...) {
19
    var va = va_list ();
20
    var tmp = str + "\n";
21
    stderr.vprintf (tmp, va);
1 by Gustav Hartvigsson
* Initial code - far from done
22
  }
23
  
24
  public string object_to_string (GLib.Object obj) {
39 by Gustav Hartvigsson
Made objcet_to_string () recursive when dealing with GObjects.
25
     StringBuilder strbldr = new StringBuilder ();
26
     internal_object_to_string (obj, ref strbldr);
27
     return strbldr.str;
28
  }
29
43 by Gustav Hartvigsson
* Added err_print_ln.
30
  string collect_string (string[] segments) {
31
    if (segments.length == 0) {
32
      return "";
33
    }
34
    if (segments.length == 1) {
35
      return segments[0];
36
    }
37
    StringBuilder strbldr = new StringBuilder ();
38
    foreach (var segment in segments) {
39
      strbldr.append (segment);
40
    }
41
    return strbldr.str;
42
  }
43
39 by Gustav Hartvigsson
Made objcet_to_string () recursive when dealing with GObjects.
44
  private unowned StringBuilder internal_object_to_string (GLib.Object obj,
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
45
                                                  ref StringBuilder str_builder,
46
                                                  int nesting = 0) {
47
    GLib.ObjectClass obj_class = (GLib.ObjectClass) obj.get_type ().class_ref ();
48
    
49
    for (var i = 0; i < nesting; i++) {
50
     str_builder.append ("\t");
51
    }
52
    
53
    str_builder.append ("((")
1 by Gustav Hartvigsson
* Initial code - far from done
54
               .append (obj.get_type().name ())
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
55
               .append_printf (")->(%p):\n", obj);
1 by Gustav Hartvigsson
* Initial code - far from done
56
    
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
57
    foreach (GLib.ParamSpec ps in obj_class.list_properties ()) {
1 by Gustav Hartvigsson
* Initial code - far from done
58
      
59
      if (ps.value_type == 0 || ps.value_type == GLib.Type.INVALID) {
60
        continue;
61
      }
62
      
63
      var prop_name = ps.get_name ();
64
      
65
      Value prop_val = GLib.Value (ps.value_type);
66
      
67
      if (prop_val.type () == GLib.Type.INVALID || prop_val.type () == 0) {
68
        continue;
69
      }
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
70
1 by Gustav Hartvigsson
* Initial code - far from done
71
      obj.get_property (prop_name, ref prop_val);
72
      
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
73
      for (var i = 0; i < nesting; i++) {
74
        str_builder.append ("\t");
75
      }
76
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
77
      str_builder.append ("\t(")
1 by Gustav Hartvigsson
* Initial code - far from done
78
                 .append (prop_val.type_name ())
79
                 .append (") ")
80
                 .append (prop_name)
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
81
                 .append (":");
82
83
1 by Gustav Hartvigsson
* Initial code - far from done
84
      
85
      
86
      switch (prop_val.type ()) {
87
        case (GLib.Type.STRING):
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
88
          if (prop_val.dup_string () == null) {
89
            str_builder.append ("(null)");
8 by Gustav Hartvigsson
* Fixed string handling in gobject_to_string ().
90
          } else {
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
91
            str_builder.append (prop_val.dup_string ());
8 by Gustav Hartvigsson
* Fixed string handling in gobject_to_string ().
92
          }
1 by Gustav Hartvigsson
* Initial code - far from done
93
        break;
94
        case (GLib.Type.INT):
95
          str_builder.append (prop_val.get_int ().to_string ());
96
        break;
97
        case (GLib.Type.BOOLEAN):
98
          str_builder.append (prop_val.get_boolean ().to_string ());
99
        break;
100
        case (GLib.Type.CHAR):
101
          var v = prop_val.get_schar ();
102
          str_builder.append_c (v)
103
                     .append (" (")
104
                     .append_printf ("%hhx", v);
105
          str_builder.append (")");
106
        break;
107
        case (GLib.Type.DOUBLE):
108
          str_builder.append (prop_val.get_double ().to_string ());
109
        break;
110
        case (GLib.Type.ENUM):
111
          str_builder.append (prop_val.get_enum ().to_string ());
112
        break;
113
        case (GLib.Type.FLAGS):
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
114
          // TODO: Probobly needs better handling, but this will do.
1 by Gustav Hartvigsson
* Initial code - far from done
115
          str_builder.append (prop_val.get_flags ().to_string ());
116
        break;
117
        case (GLib.Type.FLOAT):
118
          str_builder.append (prop_val.get_float ().to_string ());
119
        break;
120
        case (GLib.Type.INT64):
121
          str_builder.append (prop_val.get_int64 ().to_string ());
122
        break;
123
        case (GLib.Type.LONG):
124
          str_builder.append (prop_val.get_long ().to_string ());
125
        break;
126
        case (GLib.Type.POINTER):
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
127
          str_builder.append ("(")
39 by Gustav Hartvigsson
Made objcet_to_string () recursive when dealing with GObjects.
128
                     .append_printf ("%p", prop_val.get_pointer ());
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
129
          str_builder.append (")");
130
        break;
131
        case (GLib.Type.BOXED):
132
          str_builder.append ("(")
39 by Gustav Hartvigsson
Made objcet_to_string () recursive when dealing with GObjects.
133
                     .append_printf ("%p", prop_val.get_boxed ());
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
134
          str_builder.append (")");
1 by Gustav Hartvigsson
* Initial code - far from done
135
        break;
136
        case (GLib.Type.UCHAR):
137
          var v = prop_val.get_uchar ();
138
          str_builder.append_c ((char) v)
139
                     .append (" (")
140
                     .append_printf ("%hhx", v);
141
          str_builder.append (")");
142
        break;
143
        case (GLib.Type.UINT):
144
          str_builder.append (prop_val.get_uint ().to_string ());
145
        break;
146
        case (GLib.Type.UINT64):
147
          str_builder.append (prop_val.get_uint64 ().to_string ());
148
        break;
149
        case (GLib.Type.ULONG):
150
          str_builder.append (prop_val.get_ulong ().to_string ());
151
        break;
152
        case (GLib.Type.VARIANT):
9 by Gustav Hartvigsson
* object_to_string () - Prittier prints,
153
          GLib.Variant v = prop_val.dup_variant ();
154
          GLib.Variant? tv = null;
155
          unowned string ts1 = v.get_type_string ();
156
          str_builder.append ("")
157
                     .append (ts1)
158
                     .append ("\n\t(\n");
159
          GLib.VariantIter iter = v.iterator ();
160
          tv = iter.next_value ();
161
          while (tv != null) {
162
            unowned string ts2 = tv.get_type_string ();
163
            string tp = tv.print (true);
164
            str_builder.append ("\t\t((")
165
                       .append (ts2)
166
                       .append ("): ")
167
                       .append (tp)
168
                       .append (")\n");
169
            tv = iter.next_value ();
170
          }
171
          
1 by Gustav Hartvigsson
* Initial code - far from done
172
        break;
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
173
174
      }
175
      if (prop_val.type ().is_a (typeof (GLib.Object))) {
176
        var new_nesting = nesting + 1;
177
        GLib.Object? dup_obj = prop_val.dup_object ();
178
        str_builder.append_printf ("->(%p):\n", dup_obj);
179
        internal_object_to_string (dup_obj, ref str_builder, new_nesting);
180
      }
181
1 by Gustav Hartvigsson
* Initial code - far from done
182
      str_builder.append ("\n");
183
    }
40 by Gustav Hartvigsson
Sort of fixed object_to_string ()...
184
    for (var i = 0; i < nesting; i++) {
185
      str_builder.append ("\t");
186
    }
187
    str_builder.append (")\n");
39 by Gustav Hartvigsson
Made objcet_to_string () recursive when dealing with GObjects.
188
    return str_builder;
1 by Gustav Hartvigsson
* Initial code - far from done
189
  }
190
  
191
}