X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=bindings%2Fruby%2Fdefs.h;h=97aea25d8ba2bd4128ad6d8eab422df392d4bc14;hb=777b02a7d7b922bcae08af1c16e475051ec7d8f3;hp=fa7b9515c9a8347e895a596b9a3f6b136925114a;hpb=9574fb60991fa81799fbd1d26d41693ca2794e6b;p=notmuch diff --git a/bindings/ruby/defs.h b/bindings/ruby/defs.h index fa7b9515..97aea25d 100644 --- a/bindings/ruby/defs.h +++ b/bindings/ruby/defs.h @@ -23,6 +23,7 @@ #include #include +#include extern VALUE notmuch_rb_cDatabase; extern VALUE notmuch_rb_cDirectory; @@ -32,7 +33,6 @@ extern VALUE notmuch_rb_cThreads; extern VALUE notmuch_rb_cThread; extern VALUE notmuch_rb_cMessages; extern VALUE notmuch_rb_cMessage; -extern VALUE notmuch_rb_cTags; extern VALUE notmuch_rb_eBaseError; extern VALUE notmuch_rb_eDatabaseError; @@ -66,7 +66,7 @@ extern const rb_data_type_t notmuch_rb_messages_type; extern const rb_data_type_t notmuch_rb_message_type; extern const rb_data_type_t notmuch_rb_tags_type; -#define Data_Get_Notmuch_Object(obj, type, ptr) \ +#define Data_Get_Notmuch_Rb_Object(obj, type, ptr) \ do { \ (ptr) = rb_check_typeddata ((obj), (type)); \ if (RB_UNLIKELY (!(ptr))) { \ @@ -75,8 +75,15 @@ extern const rb_data_type_t notmuch_rb_tags_type; } \ } while (0) +#define Data_Get_Notmuch_Object(obj, type, ptr) \ + do { \ + notmuch_rb_object_t *rb_wrapper; \ + Data_Get_Notmuch_Rb_Object ((obj), (type), rb_wrapper); \ + (ptr) = rb_wrapper->nm_object; \ + } while (0) + #define Data_Wrap_Notmuch_Object(klass, type, ptr) \ - TypedData_Wrap_Struct ((klass), (type), (ptr)) + TypedData_Wrap_Struct ((klass), (type), notmuch_rb_object_create ((ptr), "notmuch_rb_object: " __location__)) #define Data_Get_Notmuch_Database(obj, ptr) \ Data_Get_Notmuch_Object ((obj), ¬much_rb_database_type, (ptr)) @@ -105,6 +112,42 @@ extern const rb_data_type_t notmuch_rb_tags_type; #define Data_Get_Notmuch_Tags(obj, ptr) \ Data_Get_Notmuch_Object ((obj), ¬much_rb_tags_type, (ptr)) +typedef struct { + void *nm_object; +} notmuch_rb_object_t; + +static inline void * +notmuch_rb_object_create (void *nm_object, const char *name) +{ + notmuch_rb_object_t *rb_wrapper = talloc_named_const (NULL, sizeof (*rb_wrapper), name); + + if (RB_UNLIKELY (!rb_wrapper)) + return NULL; + + rb_wrapper->nm_object = nm_object; + talloc_steal (rb_wrapper, nm_object); + return rb_wrapper; +} + +static inline void +notmuch_rb_object_free (void *rb_wrapper) +{ + talloc_free (rb_wrapper); +} + +static inline void +notmuch_rb_object_destroy (VALUE rb_object, const rb_data_type_t *type) +{ + notmuch_rb_object_t *rb_wrapper; + + Data_Get_Notmuch_Rb_Object (rb_object, type, rb_wrapper); + + /* Call the corresponding notmuch_*_destroy function */ + ((void (*)(void *)) type->data) (rb_wrapper->nm_object); + notmuch_rb_object_free (rb_wrapper); + DATA_PTR (rb_object) = NULL; +} + /* status.c */ void notmuch_rb_status_raise (notmuch_status_t status); @@ -113,6 +156,9 @@ notmuch_rb_status_raise (notmuch_status_t status); VALUE notmuch_rb_database_alloc (VALUE klass); +VALUE +notmuch_rb_database_destroy (VALUE self); + VALUE notmuch_rb_database_initialize (int argc, VALUE *argv, VALUE klass); @@ -159,7 +205,7 @@ VALUE notmuch_rb_database_get_all_tags (VALUE self); VALUE -notmuch_rb_database_query_create (VALUE self, VALUE qstrv); +notmuch_rb_database_query_create (int argc, VALUE *argv, VALUE self); /* directory.c */ VALUE @@ -178,6 +224,9 @@ VALUE notmuch_rb_directory_get_child_directories (VALUE self); /* filenames.c */ +VALUE +notmuch_rb_filenames_get (notmuch_filenames_t *fnames); + VALUE notmuch_rb_filenames_destroy (VALUE self); @@ -323,10 +372,7 @@ notmuch_rb_message_thaw (VALUE self); /* tags.c */ VALUE -notmuch_rb_tags_destroy (VALUE self); - -VALUE -notmuch_rb_tags_each (VALUE self); +notmuch_rb_tags_get (notmuch_tags_t *tags); /* init.c */ void