1 /* 2 * Copyright (C) 2009 Canonical, Ltd. 3 * 4 * This library is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU Lesser General Public License 6 * version 3.0 as published by the Free Software Foundation. 7 * 8 * This library is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU Lesser General Public License version 3.0 for more details. 12 * 13 * You should have received a copy of the GNU Lesser General Public 14 * License along with this library. If not, see 15 * <http://www.gnu.org/licenses/>. 16 * 17 * Authored by Mikkel Kamstrup Erlandsen <mikkel.kamstrup@canonical.com> 18 */ 19 20 #if !defined (_DEE_H_INSIDE) && !defined (DEE_COMPILATION) 21 #error "Only <dee.h> can be included directly." 22 #endif 23 24 #ifndef _HAVE_DEE_MODEL_H 25 #define _HAVE_DEE_MODEL_H 26 27 #include <glib.h> 28 #include <gio/gio.h> 29 #include <glib-object.h> 30 31 G_BEGIN_DECLS 32 33 #define DEE_TYPE_MODEL_ITER (dee_model_iter_get_type ()) 34 35 #define DEE_TYPE_MODEL (dee_model_get_type ()) 36 37 #define DEE_MODEL(obj) \ 38 (G_TYPE_CHECK_INSTANCE_CAST ((obj), DEE_TYPE_MODEL, DeeModel)) 39 40 #define DEE_IS_MODEL(obj) \ 41 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DEE_TYPE_MODEL)) 42 43 #define DEE_MODEL_GET_IFACE(obj) \ 44 (G_TYPE_INSTANCE_GET_INTERFACE(obj, dee_model_get_type (), DeeModelIface)) 45 46 typedef struct _DeeModelIface DeeModelIface; 47 typedef struct _DeeModel DeeModel; 48 49 /** 50 * DeeModelIter: 51 * 52 * The DeeModelIter structure is private and should only be used with the 53 * provided #DeeModel API. It is owned by DeeModel and should not be freed. 54 **/ 55 typedef struct _DeeModelIter DeeModelIter; 56 57 /** 58 * DeeModelTag: 59 * 60 * The DeeModelTag structure is private and should only be used with the 61 * provided #DeeModel API. It is owned by DeeModel and should not be freed. 62 **/ 63 typedef struct _DeeModelTag DeeModelTag; 64 65 /** 66 * DeeCompareRowFunc: 67 * @row1: (array): The model being indexed 68 * @row2: (array): The row to extract terms for 69 * @user_data: (closure): User data to pass to comparison function 70 * 71 * Compares @row1 and @row2. Mainly used with dee_model_insert_sorted() and 72 * dee_model_find_sorted(). 73 * 74 * Returns: -1, 0, or 1 if @row1 is respectively less than, equal, or greater 75 * than @row2. 76 */ 77 typedef gint (*DeeCompareRowFunc) (GVariant** row1, 78 GVariant** row2, 79 gpointer user_data); 80 81 /** 82 * DeeCompareRowSizedFunc: 83 * @row1: (array length=row1_length): Row data 84 * @row1_length: The number of elements in row1 array 85 * @row2: (array length=row2_length): Row data to compare with 86 * @row2_length: The number of elements in row2 array 87 * @user_data: (closure): User data passed to comparison function 88 * 89 * Compares @row1 and @row2. Mainly used with 90 * dee_model_insert_row_sorted_with_sizes() and 91 * dee_model_find_row_sorted_with_sizes(). 92 * 93 * Returns: -1, 0, or 1 if @row1 is respectively less than, equal, or greater 94 * than @row2. 95 */ 96 typedef gint (*DeeCompareRowSizedFunc) (GVariant** row1, 97 guint row1_length, 98 GVariant** row2, 99 guint row2_length, 100 gpointer user_data); 101 102 struct _DeeModelIface 103 { 104 GTypeInterface g_iface; 105 106 /* Signals */ 107 void (*row_added) (DeeModel *self, 108 DeeModelIter *iter); 109 110 void (*row_removed) (DeeModel *self, 111 DeeModelIter *iter); 112 113 void (*row_changed) (DeeModel *self, 114 DeeModelIter *iter); 115 116 /*< public >*/ 117 void (*set_schema_full) (DeeModel *self, 118 const char* const *column_schemas, 119 guint num_columns); 120 121 const gchar* const* (*get_schema) (DeeModel *self, 122 guint *num_columns); 123 124 const gchar* (*get_column_schema) (DeeModel *self, 125 guint column); 126 127 const gchar* (*get_field_schema) (DeeModel *self, 128 const gchar *field_name, 129 guint *out_column); 130 131 gint (*get_column_index) (DeeModel *self, 132 const gchar *column_name); 133 134 void (*set_column_names_full) (DeeModel *self, 135 const gchar **column_names, 136 guint num_columns); 137 138 const gchar** (*get_column_names) (DeeModel *self, 139 guint *num_columns); 140 141 void (*register_vardict_schema) (DeeModel *self, 142 guint num_column, 143 GHashTable *schemas); 144 145 GHashTable* (*get_vardict_schema) (DeeModel *self, 146 guint num_column); 147 148 guint (*get_n_columns) (DeeModel *self); 149 150 guint (*get_n_rows) (DeeModel *self); 151 152 DeeModelIter* (*append_row) (DeeModel *self, 153 GVariant **row_members); 154 155 DeeModelIter* (*prepend_row) (DeeModel *self, 156 GVariant **row_members); 157 158 DeeModelIter* (*insert_row) (DeeModel *self, 159 guint pos, 160 GVariant **row_members); 161 162 DeeModelIter* (*insert_row_before) (DeeModel *self, 163 DeeModelIter *iter, 164 GVariant **row_members); 165 166 DeeModelIter* (*insert_row_sorted) (DeeModel *self, 167 GVariant **row_members, 168 DeeCompareRowFunc cmp_func, 169 gpointer user_data); 170 171 DeeModelIter* (*find_row_sorted) (DeeModel *self, 172 GVariant **row_spec, 173 DeeCompareRowFunc cmp_func, 174 gpointer user_data, 175 gboolean *out_was_found); 176 177 void (*remove) (DeeModel *self, 178 DeeModelIter *iter); 179 180 void (*clear) (DeeModel *self); 181 182 void (*set_value) (DeeModel *self, 183 DeeModelIter *iter, 184 guint column, 185 GVariant *value); 186 187 void (*set_row) (DeeModel *self, 188 DeeModelIter *iter, 189 GVariant **row_members); 190 191 GVariant* (*get_value) (DeeModel *self, 192 DeeModelIter *iter, 193 guint column); 194 195 GVariant* (*get_value_by_name) (DeeModel *self, 196 DeeModelIter *iter, 197 const gchar *column_name); 198 199 DeeModelIter* (*get_first_iter) (DeeModel *self); 200 201 DeeModelIter* (*get_last_iter) (DeeModel *self); 202 203 DeeModelIter* (*get_iter_at_row) (DeeModel *self, 204 guint row); 205 206 gboolean (*get_bool) (DeeModel *self, 207 DeeModelIter *iter, 208 guint column); 209 210 guchar (*get_uchar) (DeeModel *self, 211 DeeModelIter *iter, 212 guint column); 213 214 gint32 (*get_int32) (DeeModel *self, 215 DeeModelIter *iter, 216 guint column); 217 218 guint32 (*get_uint32) (DeeModel *self, 219 DeeModelIter *iter, 220 guint column); 221 222 gint64 (*get_int64) (DeeModel *self, 223 DeeModelIter *iter, 224 guint column); 225 226 guint64 (*get_uint64) (DeeModel *self, 227 DeeModelIter *iter, 228 guint column); 229 230 gdouble (*get_double) (DeeModel *self, 231 DeeModelIter *iter, 232 guint column); 233 234 const gchar* (*get_string) (DeeModel *self, 235 DeeModelIter *iter, 236 guint column); 237 238 DeeModelIter* (*next) (DeeModel *self, 239 DeeModelIter *iter); 240 241 DeeModelIter* (*prev) (DeeModel *self, 242 DeeModelIter *iter); 243 244 gboolean (*is_first) (DeeModel *self, 245 DeeModelIter *iter); 246 247 gboolean (*is_last) (DeeModel *self, 248 DeeModelIter *iter); 249 250 guint (*get_position) (DeeModel *self, 251 DeeModelIter *iter); 252 253 DeeModelTag* (*register_tag) (DeeModel *self, 254 GDestroyNotify tag_destroy); 255 256 gpointer (*get_tag) (DeeModel *self, 257 DeeModelIter *iter, 258 DeeModelTag *tag); 259 260 void (*set_tag) (DeeModel *self, 261 DeeModelIter *iter, 262 DeeModelTag *tag, 263 gpointer value); 264 265 GVariant** (*get_row) (DeeModel *self, 266 DeeModelIter *iter, 267 GVariant **out_row_members); 268 269 void (*begin_changeset) (DeeModel *self); 270 271 void (*end_changeset) (DeeModel *self); 272 273 void (*changeset_started) (DeeModel *self); 274 275 void (*changeset_finished) (DeeModel *self); 276 277 /*< private >*/ 278 void (*_dee_model_1) (void); 279 void (*_dee_model_2) (void); 280 void (*_dee_model_3) (void); 281 }; 282 283 GType dee_model_iter_get_type (void); 284 285 /** 286 * dee_model_get_type: 287 * 288 * The GType of #DeeModel 289 * 290 * Return value: the #GType of #DeeModel 291 **/ 292 GType dee_model_get_type (void); 293 294 void dee_model_set_schema (DeeModel *self, 295 ...) G_GNUC_NULL_TERMINATED; 296 297 void dee_model_set_schema_full (DeeModel *self, 298 const gchar* const *column_schemas, 299 guint num_columns); 300 301 const gchar* const* dee_model_get_schema (DeeModel *self, 302 guint *num_columns); 303 304 const gchar* dee_model_get_column_schema (DeeModel *self, 305 guint column); 306 307 const gchar* dee_model_get_field_schema (DeeModel *self, 308 const gchar *field_name, 309 guint *out_column); 310 311 gint dee_model_get_column_index (DeeModel *self, 312 const gchar *column_name); 313 314 void dee_model_set_column_names (DeeModel *self, 315 const gchar *first_column_name, 316 ...) G_GNUC_NULL_TERMINATED; 317 318 void dee_model_set_column_names_full (DeeModel *self, 319 const gchar **column_names, 320 guint num_columns); 321 322 const gchar** dee_model_get_column_names (DeeModel *self, 323 guint *num_columns); 324 325 void dee_model_register_vardict_schema (DeeModel *self, 326 guint column, 327 GHashTable *schemas); 328 329 GHashTable* dee_model_get_vardict_schema (DeeModel *self, 330 guint column); 331 332 guint dee_model_get_n_columns (DeeModel *self); 333 334 guint dee_model_get_n_rows (DeeModel *self); 335 336 DeeModelIter* dee_model_append (DeeModel *self, 337 ...); 338 339 DeeModelIter* dee_model_append_row (DeeModel *self, 340 GVariant **row_members); 341 342 DeeModelIter* dee_model_prepend (DeeModel *self, 343 ...); 344 345 DeeModelIter* dee_model_prepend_row (DeeModel *self, 346 GVariant **row_members); 347 348 DeeModelIter* dee_model_insert (DeeModel *self, 349 guint pos, 350 ...); 351 352 DeeModelIter* dee_model_insert_row (DeeModel *self, 353 guint pos, 354 GVariant **row_members); 355 356 DeeModelIter* dee_model_insert_before (DeeModel *self, 357 DeeModelIter *iter, 358 ...); 359 360 DeeModelIter* dee_model_insert_row_before (DeeModel *self, 361 DeeModelIter *iter, 362 GVariant **row_members); 363 364 DeeModelIter* dee_model_insert_row_sorted (DeeModel *self, 365 GVariant **row_members, 366 DeeCompareRowFunc cmp_func, 367 gpointer user_data); 368 369 DeeModelIter* dee_model_insert_row_sorted_with_sizes (DeeModel *self, 370 GVariant **row_members, 371 DeeCompareRowSizedFunc cmp_func, 372 gpointer user_data); 373 374 DeeModelIter* dee_model_insert_sorted (DeeModel *self, 375 DeeCompareRowFunc cmp_func, 376 gpointer user_data, 377 ...); 378 379 DeeModelIter* dee_model_find_row_sorted (DeeModel *self, 380 GVariant **row_spec, 381 DeeCompareRowFunc cmp_func, 382 gpointer user_data, 383 gboolean *out_was_found); 384 385 DeeModelIter* dee_model_find_row_sorted_with_sizes (DeeModel *self, 386 GVariant **row_spec, 387 DeeCompareRowSizedFunc cmp_func, 388 gpointer user_data, 389 gboolean *out_was_found); 390 391 DeeModelIter* dee_model_find_sorted (DeeModel *self, 392 DeeCompareRowFunc cmp_func, 393 gpointer user_data, 394 gboolean *out_was_found, 395 ...); 396 397 void dee_model_remove (DeeModel *self, 398 DeeModelIter *iter); 399 400 void dee_model_clear (DeeModel *self); 401 402 void dee_model_set (DeeModel *self, 403 DeeModelIter *iter, 404 ...); 405 406 void dee_model_set_value (DeeModel *self, 407 DeeModelIter *iter, 408 guint column, 409 GVariant *value); 410 411 void dee_model_set_row (DeeModel *self, 412 DeeModelIter *iter, 413 GVariant **row_members); 414 415 void dee_model_get (DeeModel *self, 416 DeeModelIter *iter, 417 ...); 418 419 GVariant** dee_model_get_row (DeeModel *self, 420 DeeModelIter *iter, 421 GVariant **out_row_members); 422 423 GVariant* dee_model_get_value (DeeModel *self, 424 DeeModelIter *iter, 425 guint column); 426 427 GVariant* dee_model_get_value_by_name (DeeModel *self, 428 DeeModelIter *iter, 429 const gchar *column_name); 430 431 DeeModelIter* dee_model_get_first_iter (DeeModel *self); 432 433 DeeModelIter* dee_model_get_last_iter (DeeModel *self); 434 435 DeeModelIter* dee_model_get_iter_at_row (DeeModel *self, 436 guint row); 437 438 gboolean dee_model_get_bool (DeeModel *self, 439 DeeModelIter *iter, 440 guint column); 441 442 guchar dee_model_get_uchar (DeeModel *self, 443 DeeModelIter *iter, 444 guint column); 445 446 gint32 dee_model_get_int32 (DeeModel *self, 447 DeeModelIter *iter, 448 guint column); 449 450 guint32 dee_model_get_uint32 (DeeModel *self, 451 DeeModelIter *iter, 452 guint column); 453 454 gint64 dee_model_get_int64 (DeeModel *self, 455 DeeModelIter *iter, 456 guint column); 457 458 guint64 dee_model_get_uint64 (DeeModel *self, 459 DeeModelIter *iter, 460 guint column); 461 462 gdouble dee_model_get_double (DeeModel *self, 463 DeeModelIter *iter, 464 guint column); 465 466 const gchar * dee_model_get_string (DeeModel *self, 467 DeeModelIter *iter, 468 guint column); 469 470 DeeModelIter * dee_model_next (DeeModel *self, 471 DeeModelIter *iter); 472 473 DeeModelIter * dee_model_prev (DeeModel *self, 474 DeeModelIter *iter); 475 476 gboolean dee_model_is_first (DeeModel *self, 477 DeeModelIter *iter); 478 479 gboolean dee_model_is_last (DeeModel *self, 480 DeeModelIter *iter); 481 482 guint dee_model_get_position (DeeModel *self, 483 DeeModelIter *iter); 484 485 DeeModelTag* dee_model_register_tag (DeeModel *self, 486 GDestroyNotify tag_destroy); 487 488 gpointer dee_model_get_tag (DeeModel *self, 489 DeeModelIter *iter, 490 DeeModelTag *tag); 491 492 void dee_model_set_tag (DeeModel *self, 493 DeeModelIter *iter, 494 DeeModelTag *tag, 495 gpointer value); 496 497 void dee_model_clear_tag (DeeModel *self, 498 DeeModelIter *iter, 499 DeeModelTag *tag); 500 501 void dee_model_begin_changeset (DeeModel *self); 502 503 void dee_model_end_changeset (DeeModel *self); 504 505 GVariant** dee_model_build_row (DeeModel *self, 506 GVariant **out_row_members, 507 ...); 508 509 GVariant** dee_model_build_named_row (DeeModel *self, 510 GVariant **out_row_members, 511 const gchar *first_column_name, 512 ...) G_GNUC_NULL_TERMINATED; 513 514 GVariant** dee_model_build_named_row_valist (DeeModel *self, 515 GVariant **out_row_members, 516 const gchar *first_column_name, 517 va_list *args); 518 519 GVariant** dee_model_build_named_row_sunk (DeeModel *self, 520 GVariant **out_row_members, 521 guint *out_array_length, 522 const gchar *first_column_name, 523 ...) G_GNUC_NULL_TERMINATED; 524 525 G_END_DECLS 526 527 #endif /* _HAVE_DEE_MODEL_H */ 528