00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <config.h>
00020 #include <stdlib.h>
00021 #include "midgard/midgard_metadata.h"
00022 #include "midgard/midgard_timestamp.h"
00023 #include "midgard/query.h"
00024 #include "midgard/midgard_object.h"
00025 #include "midgard_core_object.h"
00026 #include "schema.h"
00027
00028 enum {
00029 MIDGARD_METADATA_CREATOR = 1,
00030 MIDGARD_METADATA_CREATED,
00031 MIDGARD_METADATA_REVISOR,
00032 MIDGARD_METADATA_REVISED,
00033 MIDGARD_METADATA_REVISION,
00034 MIDGARD_METADATA_LOCKER,
00035 MIDGARD_METADATA_LOCKED,
00036 MIDGARD_METADATA_APPROVER,
00037 MIDGARD_METADATA_APPROVED,
00038 MIDGARD_METADATA_AUTHORS,
00039 MIDGARD_METADATA_OWNER,
00040 MIDGARD_METADATA_SCHEDULE_START,
00041 MIDGARD_METADATA_SCHEDULE_END,
00042 MIDGARD_METADATA_HIDDEN,
00043 MIDGARD_METADATA_NAV_NOENTRY,
00044 MIDGARD_METADATA_SIZE,
00045 MIDGARD_METADATA_PUBLISHED,
00046 MIDGARD_METADATA_SCORE,
00047 MIDGARD_METADATA_IMPORTED,
00048 MIDGARD_METADATA_EXPORTED,
00049 MIDGARD_METADATA_DELETED
00050 };
00051
00052 static void
00053 _metadata_set_property (GObject *object, guint property_id,
00054 const GValue *value, GParamSpec *pspec)
00055 {
00056 MidgardMetadata *self = (MidgardMetadata *) object;
00057
00058 switch (property_id) {
00059
00060 case MIDGARD_METADATA_CREATOR:
00061 g_free (self->private->creator);
00062 self->private->creator = g_value_dup_string (value);
00063 break;
00064
00065 case MIDGARD_METADATA_CREATED:
00066 g_free (self->private->created);
00067 self->private->created = g_value_dup_string (value);
00068 break;
00069
00070 case MIDGARD_METADATA_REVISOR:
00071 g_free (self->private->revisor);
00072 self->private->revisor = g_value_dup_string (value);
00073 break;
00074
00075 case MIDGARD_METADATA_REVISED:
00076 g_free (self->private->revised);
00077 self->private->revised = g_value_dup_string (value);
00078 break;
00079
00080 case MIDGARD_METADATA_REVISION:
00081 self->private->revision = g_value_get_uint (value);
00082 break;
00083
00084 case MIDGARD_METADATA_LOCKER:
00085 g_free (self->private->locker);
00086 self->private->locker = g_value_dup_string (value);
00087 break;
00088
00089 case MIDGARD_METADATA_LOCKED:
00090 g_free (self->private->locked);
00091 self->private->locked = g_value_dup_string (value);
00092 break;
00093
00094 case MIDGARD_METADATA_APPROVER:
00095 g_free (self->private->approver);
00096 self->private->approver = g_value_dup_string (value);
00097 break;
00098
00099 case MIDGARD_METADATA_APPROVED:
00100 g_free (self->private->approved);
00101 self->private->approved = g_value_dup_string (value);
00102 break;
00103
00104 case MIDGARD_METADATA_AUTHORS:
00105 g_free (self->private->authors);
00106 self->private->authors = g_value_dup_string (value);
00107 break;
00108
00109 case MIDGARD_METADATA_OWNER:
00110 g_free (self->private->owner);
00111 self->private->owner = g_value_dup_string (value);
00112 break;
00113
00114 case MIDGARD_METADATA_SCHEDULE_START:
00115 g_free (self->private->schedule_start);
00116 self->private->schedule_start = g_value_dup_string (value);
00117 break;
00118
00119 case MIDGARD_METADATA_SCHEDULE_END:
00120 g_free (self->private->schedule_end);
00121 self->private->schedule_end = g_value_dup_string (value);
00122 break;
00123
00124 case MIDGARD_METADATA_HIDDEN:
00125 self->private->hidden = g_value_get_boolean (value);
00126 break;
00127
00128 case MIDGARD_METADATA_NAV_NOENTRY:
00129 self->private->nav_noentry = g_value_get_boolean (value);
00130 break;
00131
00132 case MIDGARD_METADATA_SIZE:
00133 self->private->size = g_value_get_uint (value);
00134 break;
00135
00136 case MIDGARD_METADATA_PUBLISHED:
00137 g_free (self->private->published);
00138 self->private->published = g_value_dup_string (value);
00139 break;
00140
00141 case MIDGARD_METADATA_SCORE:
00142 self->private->score = g_value_get_int (value);
00143 break;
00144
00145 case MIDGARD_METADATA_EXPORTED:
00146 g_free (self->private->exported);
00147 self->private->exported = g_value_dup_string (value);
00148 break;
00149
00150 case MIDGARD_METADATA_IMPORTED:
00151 g_free (self->private->imported);
00152 self->private->imported = g_value_dup_string (value);
00153 break;
00154
00155 case MIDGARD_METADATA_DELETED:
00156 self->private->deleted = g_value_get_boolean (value);
00157 break;
00158
00159 default:
00160 G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec);
00161 break;
00162 }
00163 }
00164
00165
00166 static void
00167 _metadata_get_property (GObject *object, guint property_id,
00168 GValue *value, GParamSpec *pspec)
00169 {
00170 MidgardMetadata *self = (MidgardMetadata *) object;
00171
00172 switch (property_id) {
00173
00174 case MIDGARD_METADATA_CREATOR:
00175 g_value_set_string (value, self->private->creator);
00176 break;
00177
00178 case MIDGARD_METADATA_CREATED:
00179 g_value_set_string (value, self->private->created);
00180 break;
00181
00182 case MIDGARD_METADATA_REVISOR:
00183 g_value_set_string (value, self->private->revisor);
00184 break;
00185
00186 case MIDGARD_METADATA_REVISED:
00187 g_value_set_string (value, self->private->revised);
00188 break;
00189
00190 case MIDGARD_METADATA_LOCKER:
00191 g_value_set_string (value, self->private->locker);
00192 break;
00193
00194 case MIDGARD_METADATA_LOCKED:
00195 g_value_set_string (value, self->private->locked);
00196 break;
00197
00198 case MIDGARD_METADATA_APPROVER:
00199 g_value_set_string (value, self->private->approver);
00200 break;
00201
00202 case MIDGARD_METADATA_APPROVED:
00203 g_value_set_string (value, self->private->approved);
00204 break;
00205
00206 case MIDGARD_METADATA_REVISION:
00207 g_value_set_uint (value, self->private->revision);
00208 break;
00209
00210 case MIDGARD_METADATA_AUTHORS:
00211 g_value_set_string (value, self->private->authors);
00212 break;
00213
00214 case MIDGARD_METADATA_OWNER:
00215 g_value_set_string (value, self->private->owner);
00216 break;
00217
00218 case MIDGARD_METADATA_SCHEDULE_START:
00219 g_value_set_string (value, self->private->schedule_start);
00220 break;
00221
00222 case MIDGARD_METADATA_SCHEDULE_END:
00223 g_value_set_string (value, self->private->schedule_end);
00224 break;
00225
00226 case MIDGARD_METADATA_HIDDEN:
00227 g_value_set_boolean (value, self->private->hidden);
00228 break;
00229
00230 case MIDGARD_METADATA_NAV_NOENTRY:
00231 g_value_set_boolean (value, self->private->nav_noentry);
00232 break;
00233
00234 case MIDGARD_METADATA_SIZE:
00235 g_value_set_uint(value, self->private->size);
00236 break;
00237
00238 case MIDGARD_METADATA_PUBLISHED:
00239 g_value_set_string (value, self->private->published);
00240 break;
00241
00242 case MIDGARD_METADATA_SCORE:
00243 g_value_set_int (value, self->private->score);
00244 break;
00245
00246 case MIDGARD_METADATA_EXPORTED:
00247 g_value_set_string (value, self->private->exported);
00248 break;
00249
00250 case MIDGARD_METADATA_IMPORTED:
00251 g_value_set_string (value, self->private->imported);
00252 break;
00253
00254 case MIDGARD_METADATA_DELETED:
00255 g_value_set_boolean (value, self->private->deleted);
00256 break;
00257
00258 default:
00259 G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec);
00260 break;
00261 }
00262 }
00263
00264 static void
00265 _metadata_instance_init(GTypeInstance *instance, gpointer g_class)
00266 {
00267 MidgardMetadata *self = (MidgardMetadata *)instance;
00268
00269
00270 self->private = g_new(MidgardMetadataPrivate, 1);
00271 self->private->creator = NULL;
00272 self->private->created = NULL;
00273 self->private->revised = NULL;
00274 self->private->revisor = NULL;
00275 self->private->locker = NULL;
00276 self->private->locked = NULL;
00277 self->private->approved = NULL;
00278 self->private->approver = NULL;
00279 self->private->authors = NULL;
00280 self->private->owner = NULL;
00281 self->private->revision = 0;
00282 self->private->schedule_start = NULL;
00283 self->private->schedule_end = NULL;
00284 self->private->hidden = FALSE;
00285 self->private->nav_noentry = FALSE;
00286 self->private->size = 0;
00287 self->private->published = NULL;
00288 self->private->score = 0;
00289 self->private->exported = NULL;
00290 self->private->imported = NULL;
00291 self->private->deleted = FALSE;
00292 }
00293
00294 static void
00295 _metadata_object_finalize(GObject *object)
00296 {
00297 g_assert(object);
00298
00299 MidgardMetadata *self = (MidgardMetadata *)object;
00300
00301
00302 g_free(self->private->creator);
00303 g_free(self->private->created);
00304 g_free(self->private->revised);
00305 g_free(self->private->revisor);
00306 g_free(self->private->locker);
00307 g_free(self->private->locked);
00308 g_free(self->private->approved);
00309 g_free(self->private->approver);
00310 g_free(self->private->authors);
00311 g_free(self->private->owner);
00312 g_free(self->private->schedule_start);
00313 g_free(self->private->schedule_end);
00314 g_free(self->private->published);
00315 g_free(self->private->exported);
00316 g_free(self->private->imported);
00317
00318 g_free(self->private);
00319 }
00320
00321
00322 void midgard_metadata_set_create(MgdObject *object)
00323 {
00324 MgdObject *person = (MgdObject *)object->mgd->person;
00325 gchar *person_guid;
00326 g_object_get(G_OBJECT(person), "guid", &person_guid, NULL);
00327
00328 GValue tval = {0, };
00329 g_value_init(&tval, midgard_timestamp_get_type());
00330 midgard_timestamp_set_time(&tval, time(NULL));
00331
00332 MidgardMetadata *metadata = (MidgardMetadata *) object->metadata;
00333 metadata->private->creator = person_guid;
00334 metadata->private->created = midgard_timestamp_dup_string(&tval);
00335 }
00336
00337
00338 void midgard_metadata_set_update(MgdObject *object){
00339
00340 MgdObject *person = (MgdObject *)object->mgd->person;
00341 gchar *person_guid;
00342 g_object_get(G_OBJECT(person), "guid", &person_guid, NULL);
00343
00344 GValue tval = {0, };
00345 g_value_init(&tval, midgard_timestamp_get_type());
00346 midgard_timestamp_set_time(&tval, time(NULL));
00347
00348 MidgardMetadata *metadata = (MidgardMetadata *) object->metadata;
00349 metadata->private->revisor = person_guid;
00350 metadata->private->revised = midgard_timestamp_dup_string(&tval);
00351 metadata->private->revision += 1;
00352 }
00353
00354
00355 static void
00356 _metadata_class_init (gpointer g_class,
00357 gpointer g_class_data){
00358
00359 GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
00360 MidgardMetadataClass *klass = MIDGARD_METADATA_CLASS (g_class);
00361 GParamSpec *pspec;
00362
00363 gobject_class->set_property = _metadata_set_property;
00364 gobject_class->get_property = _metadata_get_property;
00365 gobject_class->finalize = _metadata_object_finalize;
00366
00367
00368
00369 klass->set_created = midgard_metadata_set_create;
00370 klass->signal_set_created = g_signal_new("set_created",
00371 G_TYPE_FROM_CLASS(g_class),
00372 G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
00373 G_STRUCT_OFFSET (MidgardMetadataClass, set_created),
00374 NULL,
00375 NULL,
00376 NULL,
00377 G_TYPE_NONE,
00378 0);
00379
00380
00381 klass->set_updated = midgard_metadata_set_update;
00382 klass->signal_set_updated = g_signal_new("set_updated",
00383 G_TYPE_FROM_CLASS(g_class),
00384 G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
00385 G_STRUCT_OFFSET (MidgardMetadataClass, set_updated),
00386 NULL,
00387 NULL,
00388 NULL,
00389 G_TYPE_NONE,
00390 0);
00391
00392
00393 pspec = g_param_spec_string ("creator",
00394 "metadata_creator",
00395 "The person who created object's record",
00396 "" ,
00397 G_PARAM_READWRITE);
00398
00399 g_object_class_install_property (gobject_class,
00400 MIDGARD_METADATA_CREATOR,
00401 pspec);
00402
00403 pspec = g_param_spec_string ("created",
00404 "metadata_created",
00405 "The date when object's record was created",
00406 "0000-00-00 00:00",
00407 G_PARAM_READWRITE);
00408
00409 g_object_class_install_property (gobject_class,
00410 MIDGARD_METADATA_CREATED,
00411 pspec);
00412
00413 pspec = g_param_spec_string ("revisor",
00414 "metadata_revisor",
00415 "The person who revised object's record",
00416 "",
00417 G_PARAM_READWRITE);
00418
00419 g_object_class_install_property (gobject_class,
00420 MIDGARD_METADATA_REVISOR,
00421 pspec);
00422
00423 pspec = g_param_spec_string ("revised",
00424 "metadata_revised",
00425 "The date when object's record was revised",
00426 "0000-00-00 00:00",
00427 G_PARAM_READWRITE);
00428
00429 g_object_class_install_property (gobject_class,
00430 MIDGARD_METADATA_REVISED,
00431 pspec);
00432
00433 pspec = g_param_spec_uint ("revision",
00434 "metadata_revision",
00435 "Object's record revision number",
00436 0, G_MAXUINT32, 0, G_PARAM_READWRITE);
00437
00438 g_object_class_install_property (gobject_class,
00439 MIDGARD_METADATA_REVISION,
00440 pspec);
00441
00442 pspec = g_param_spec_string ("locker",
00443 "metadata_locker",
00444 "The person who (un)locked object's record",
00445 "",
00446 G_PARAM_READWRITE);
00447
00448 g_object_class_install_property (gobject_class,
00449 MIDGARD_METADATA_LOCKER,
00450 pspec);
00451
00452 pspec = g_param_spec_string ("locked",
00453 "metadata_locked",
00454 "The date when object's record was (un)locked",
00455 "" ,
00456 G_PARAM_READWRITE);
00457
00458 g_object_class_install_property (gobject_class,
00459 MIDGARD_METADATA_LOCKED,
00460 pspec);
00461
00462 pspec = g_param_spec_string ("approver",
00463 "metadata_approver",
00464 "The person who (un)approved object's record",
00465 "",
00466 G_PARAM_READWRITE);
00467
00468 g_object_class_install_property (gobject_class,
00469 MIDGARD_METADATA_APPROVER,
00470 pspec);
00471
00472 pspec = g_param_spec_string ("approved",
00473 "metadata_approved",
00474 "The date when object's record was (un)approved",
00475 "",
00476 G_PARAM_READWRITE);
00477
00478 g_object_class_install_property (gobject_class,
00479 MIDGARD_METADATA_APPROVED,
00480 pspec);
00481
00482 pspec = g_param_spec_string ("authors",
00483 "metadata_authors",
00484 "The person who is an author",
00485 "",
00486 G_PARAM_READWRITE);
00487
00488 g_object_class_install_property (gobject_class,
00489 MIDGARD_METADATA_AUTHORS,
00490 pspec);
00491
00492 pspec = g_param_spec_string ("owner",
00493 "metadata_owner",
00494 "Group's guid which is an owner of the object",
00495 "",
00496 G_PARAM_READWRITE);
00497
00498 g_object_class_install_property (gobject_class,
00499 MIDGARD_METADATA_OWNER,
00500 pspec);
00501
00502 pspec = g_param_spec_string ("schedulestart",
00503 "metadata_schedule_start",
00504 "",
00505 "",
00506 G_PARAM_READWRITE);
00507
00508 g_object_class_install_property (gobject_class,
00509 MIDGARD_METADATA_SCHEDULE_START,
00510 pspec);
00511
00512 pspec = g_param_spec_string ("scheduleend",
00513 "metadata_schedule_end",
00514 "",
00515 "",
00516 G_PARAM_READWRITE);
00517
00518 g_object_class_install_property (gobject_class,
00519 MIDGARD_METADATA_SCHEDULE_END,
00520 pspec);
00521
00522 pspec = g_param_spec_boolean ("hidden",
00523 "metadata_hidden",
00524 "",
00525 FALSE,
00526 G_PARAM_READWRITE);
00527
00528 g_object_class_install_property (gobject_class,
00529 MIDGARD_METADATA_HIDDEN,
00530 pspec);
00531
00532 pspec = g_param_spec_boolean ("navnoentry",
00533 "metadata_nav_noentry",
00534 "",
00535 FALSE,
00536 G_PARAM_READWRITE);
00537
00538 g_object_class_install_property (gobject_class,
00539 MIDGARD_METADATA_NAV_NOENTRY,
00540 pspec);
00541
00542 pspec = g_param_spec_uint ("size",
00543 "metadata_size",
00544 "Object's size in bytes",
00545 0, G_MAXUINT32, 0, G_PARAM_READWRITE);
00546
00547 g_object_class_install_property (gobject_class,
00548 MIDGARD_METADATA_SIZE,
00549 pspec);
00550
00551 pspec = g_param_spec_string ("published",
00552 "metadata_published",
00553 "",
00554 "",
00555 G_PARAM_READWRITE);
00556
00557 g_object_class_install_property (gobject_class,
00558 MIDGARD_METADATA_PUBLISHED,
00559 pspec);
00560
00561 pspec = g_param_spec_int ("score",
00562 "metadata_score",
00563 "Object's record score",
00564 0, G_MAXINT32, 0, G_PARAM_READWRITE);
00565
00566 g_object_class_install_property (gobject_class,
00567 MIDGARD_METADATA_SCORE,
00568 pspec);
00569
00570 pspec = g_param_spec_string ("exported",
00571 "metadata_exported",
00572 "",
00573 "",
00574 G_PARAM_READWRITE);
00575 g_object_class_install_property (gobject_class,
00576 MIDGARD_METADATA_EXPORTED,
00577 pspec);
00578
00579 pspec = g_param_spec_string ("imported",
00580 "metadata_imported",
00581 "",
00582 "",
00583 G_PARAM_READWRITE);
00584 g_object_class_install_property (gobject_class,
00585 MIDGARD_METADATA_IMPORTED,
00586 pspec);
00587
00588 pspec = g_param_spec_boolean ("deleted",
00589 "metadata_deleted",
00590 "",
00591 FALSE,
00592 G_PARAM_READWRITE);
00593 g_object_class_install_property (gobject_class,
00594 MIDGARD_METADATA_DELETED,
00595 pspec);
00596 }
00597
00598
00599 GType midgard_metadata_get_type (void)
00600 {
00601 static GType type = 0;
00602 if (type == 0) {
00603 static const GTypeInfo info = {
00604 sizeof (MidgardMetadataClass),
00605 NULL,
00606 NULL,
00607 _metadata_class_init,
00608 NULL,
00609 NULL,
00610 sizeof (MidgardMetadata),
00611 0,
00612 _metadata_instance_init
00613 };
00614 type = g_type_register_static (G_TYPE_OBJECT,
00615 "midgard_metadata",
00616 &info, 0);
00617 }
00618 return type;
00619 }
00620
00621
00622 MidgardMetadata *midgard_metadata_new(MgdObject *object)
00623 {
00624 g_assert(object->mgd);
00625
00626 MidgardMetadata *self =
00627 (MidgardMetadata *) g_object_new(MIDGARD_TYPE_METADATA, NULL);
00628 self->private->object = object;
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643 return self;
00644 }
00645
00646 MidgardMetadata *midgard_object_metadata_get(MgdObject *object){
00647
00648 MidgardMetadata *mm = midgard_metadata_new(object);
00649 if(mm)
00650 return mm;
00651
00652 return NULL;
00653 }
00654
00655
00656 gchar *midgard_metadata_get_sql(MidgardMetadata *object){
00657
00658 g_assert(object);
00659
00660 guint i = 0;
00661 const gchar *nick, *prop_str;
00662 GValue pval = {0, };
00663 GParamSpec *prop;
00664
00665 static gchar *props[] = { "locker", "locked", "approver", "approved",
00666 "authors", "owner", "schedulestart", "scheduleend", "hidden",
00667 "navnoentry", "published", "score", NULL};
00668
00669 GString *sql = g_string_new("");
00670
00671 while (props[i] != NULL) {
00672
00673 prop = g_object_class_find_property(
00674 G_OBJECT_GET_CLASS(G_OBJECT(object)),
00675 props[i]);
00676
00677 nick = g_param_spec_get_nick (prop);
00678 if((g_ascii_strcasecmp(nick, "") != 0)){
00679
00680 g_value_init(&pval,prop->value_type);
00681 g_object_get_property(G_OBJECT(object), props[i], &pval);
00682
00683 switch (prop->value_type) {
00684
00685 case G_TYPE_STRING:
00686 prop_str = g_value_get_string(&pval);
00687 if(prop_str == NULL) prop_str = "";
00688 g_string_append_printf(sql,
00689 ",%s='%s' ",
00690 nick, prop_str);
00691 break;
00692
00693 case G_TYPE_BOOLEAN:
00694 g_string_append_printf(sql,
00695 ",%s=%d ",
00696 nick, g_value_get_boolean(&pval));
00697 break;
00698
00699 case G_TYPE_UINT:
00700 g_string_append_printf(sql,
00701 ",%s=%d ",
00702 nick, g_value_get_uint(&pval));
00703 break;
00704 }
00705 g_value_unset(&pval);
00706 }
00707 i++;
00708 }
00709
00710 return g_string_free(sql, FALSE);
00711 }
00712
00713 #define _SET_VALUE_TYPE \
00714 case G_TYPE_STRING:\
00715 g_hash_table_insert(vtable, "type", "string"); \
00716 break;\
00717 case G_TYPE_UINT:\
00718 g_hash_table_insert(vtable, "type", "integer");\
00719 break;\
00720 case G_TYPE_BOOLEAN:\
00721 g_hash_table_insert(vtable, "type", "boolean");\
00722 break;\
00723 case G_TYPE_FLOAT:\
00724 g_hash_table_insert(vtable, "type", "float");\
00725 break;
00726
00727
00728 typedef enum
00729 {
00730 MGD_META_PROPERTY_PARENT = 0,
00731 MGD_META_PROPERTY_UP,
00732 MGD_META_PROPERTY_PRIMARY,
00733 MGD_META_TREE_PARENT,
00734 MGD_META_TREE_CHILDS
00735 } MidgardMetadataType;
00736
00737 static struct
00738 {
00739 const gchar *cname;
00740 MidgardMetadataType type;
00741 }
00742 _types[] = {
00743 {"MGD_META_PROPERTY_PARENT", MGD_META_PROPERTY_PARENT},
00744 {"MGD_META_PROPERTY_UP", MGD_META_PROPERTY_UP},
00745 {"MGD_META_PROPERTY_PRIMARY", MGD_META_PROPERTY_PRIMARY},
00746 {"MGD_META_TREE_PARENT", MGD_META_TREE_PARENT},
00747 {"MGD_META_TREE_CHILDS", MGD_META_TREE_CHILDS},
00748 {NULL, 0}
00749 };
00750
00751 GSList *midgard_class_metadata_types()
00752 {
00753 gint i;
00754 GSList *list = NULL;
00755
00756 for ( i = 0; _types[i].cname; i++) {
00757
00758 if (_types[i].cname != NULL)
00759 list = g_slist_append(list, (gchar *)_types[i].cname);
00760 }
00761
00762 return list;
00763 }
00764
00765
00766 static void _destroy_metadata_hash_keys(gpointer data){
00767
00768 g_free((gchar *) data);
00769 }
00770
00771 static void _destroy_metadata_hash_values(gpointer data){
00772
00773 g_hash_table_destroy( (GHashTable *) data);
00774 }
00775
00776
00777 static void _destroy_metadata_vtable_hash_values(gpointer data){
00778
00779 g_free((gchar *) data);
00780 }
00781
00782 GHashTable *_midgard_class_list_properties(const gchar *classname){
00783
00784 GParamSpec **props;
00785 guint propn, i;
00786 GHashTable *ptable, *vtable;
00787
00788
00789 if (( props = g_object_class_list_properties(
00790 g_type_class_peek(g_type_from_name(classname)), &propn)) == NULL) {
00791
00792 ptable = g_hash_table_new_full (g_str_hash, g_str_equal,
00793 _destroy_metadata_hash_keys,
00794 _destroy_metadata_hash_values);
00795
00796 for (i = 0; i < propn; i++) {
00797
00798 vtable = g_hash_table_new_full (g_str_hash, g_str_equal,
00799 _destroy_metadata_hash_keys,
00800 _destroy_metadata_vtable_hash_values);
00801
00802
00803 switch(props[i]->value_type) {
00804
00805 case G_TYPE_STRING:
00806
00807 g_hash_table_insert(vtable, "type", "string");
00808 break;
00809
00810 case G_TYPE_UINT:
00811
00812 g_hash_table_insert(vtable, "type", "integer");
00813 break;
00814
00815 case G_TYPE_BOOLEAN:
00816
00817 g_hash_table_insert(vtable, "type", "boolean");
00818 break;
00819
00820 case G_TYPE_FLOAT:
00821
00822 g_hash_table_insert(vtable, "type", "float");
00823 break;
00824
00825 }
00826
00827
00828 g_hash_table_insert(vtable, "description",
00829 g_strdup(g_param_spec_get_blurb(props[i])));
00830
00831
00832 g_hash_table_insert(ptable, g_strdup(props[i]->name), vtable);
00833
00834 }
00835
00836 g_free(props);
00837 return ptable;
00838 }
00839
00840 return NULL;
00841 }
00842
00843
00844 GHashTable *_midgard_class_find_property(const gchar *classname, gchar *propertyname){
00845
00846 GParamSpec *prop;
00847 GHashTable *vtable;
00848
00849 if (( prop = g_object_class_find_property(
00850 g_type_class_peek(g_type_from_name(classname)),
00851 propertyname)) == NULL) {
00852
00853 vtable = g_hash_table_new_full (g_str_hash, g_str_equal,
00854 _destroy_metadata_hash_keys,
00855 _destroy_metadata_vtable_hash_values);
00856
00857
00858
00859
00860
00861 g_hash_table_insert(vtable, "description",
00862 g_strdup(g_param_spec_get_blurb(prop)));
00863
00864 return vtable;
00865
00866 }
00867
00868 return NULL;
00869 }
00870
00871 GParamSpec **midgard_class_list_properties(MgdObject *object, guint *n)
00872 {
00873 GParamSpec **pspecs =
00874 g_object_class_list_properties((GObjectClass *)object->klass, n);
00875
00876 return pspecs;
00877 }
00878
00879
00880 GParamSpec *midgard_class_find_property(MgdObject *object, gchar *propertyname)
00881 {
00882 GParamSpec *pspec =
00883 g_object_class_find_property((GObjectClass *) object->klass,
00884 propertyname);
00885
00886 if (pspec != NULL)
00887 return pspec;
00888
00889 return NULL;
00890
00891 }
00892
00893
00894 void midgard_class_get_metadata(MgdObject *object, gint mmt, GValue *val)
00895 {
00896 mmt = (MidgardMetadataType) mmt;
00897
00898 switch (mmt) {
00899
00900 case MGD_META_PROPERTY_PARENT:
00901
00902 g_value_init(val, G_TYPE_STRING);
00903 g_value_set_string(val, object->data->property_parent);
00904 break;
00905
00906 case MGD_META_PROPERTY_UP:
00907
00908 g_value_init(val, G_TYPE_STRING);
00909 g_value_set_string(val, object->data->property_up);
00910 break;
00911
00912 case MGD_META_PROPERTY_PRIMARY:
00913
00914 g_value_init(val, G_TYPE_STRING);
00915 g_value_set_string(val, object->data->primary);
00916 break;
00917
00918 case MGD_META_TREE_PARENT:
00919
00920 g_value_init(val, G_TYPE_STRING);
00921 g_value_set_string(val, object->data->parent);
00922 break;
00923
00924 case MGD_META_TREE_CHILDS:
00925
00926 g_value_init(val, G_TYPE_POINTER);
00927 g_value_set_pointer(val,(gpointer )object->data->childs);
00928
00929 break;
00930
00931 default:
00932
00933 g_value_init(val, G_TYPE_INVALID);
00934 break;
00935
00936 }
00937
00938
00939 }
00940
00941 void midgard_class_list_data()
00942 {
00943
00944
00945 }