]> git.notmuchmail.org Git - notmuch/blobdiff - bindings/ruby/message.c
emacs: Add new option notmuch-search-hide-excluded
[notmuch] / bindings / ruby / message.c
index 2babfd047e64cf0db9c6ebd4778d4c0ba59439aa..13c182f6549481b0866fb1789e25e8d874ac8b69 100644 (file)
@@ -1,6 +1,6 @@
 /* The Ruby interface to the notmuch mail library
  *
- * Copyright © 2010 Ali Polatel
+ * Copyright © 2010, 2011 Ali Polatel
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see http://www.gnu.org/licenses/ .
+ * along with this program.  If not, see https://www.gnu.org/licenses/ .
  *
  * Author: Ali Polatel <alip@exherbo.org>
  */
 #include "defs.h"
 
 /*
- * call-seq: MESSAGE.destroy => nil
+ * call-seq: MESSAGE.destroy! => nil
  *
  * Destroys the message, freeing all resources allocated for it.
  */
 VALUE
-notmuch_rb_message_destroy(VALUE self)
+notmuch_rb_message_destroy (VALUE self)
 {
-    notmuch_message_t *message;
-
-    Data_Get_Struct(self, notmuch_message_t, message);
-
-    notmuch_message_destroy(message);
+    notmuch_rb_object_destroy (self, &notmuch_rb_message_type);
 
     return Qnil;
 }
@@ -43,16 +39,16 @@ notmuch_rb_message_destroy(VALUE self)
  * Get the message ID of 'message'.
  */
 VALUE
-notmuch_rb_message_get_message_id(VALUE self)
+notmuch_rb_message_get_message_id (VALUE self)
 {
     const char *msgid;
     notmuch_message_t *message;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
+    Data_Get_Notmuch_Message (self, message);
 
-    msgid = notmuch_message_get_message_id(message);
+    msgid = notmuch_message_get_message_id (message);
 
-    return rb_str_new2(msgid);
+    return rb_str_new2 (msgid);
 }
 
 /*
@@ -61,16 +57,16 @@ notmuch_rb_message_get_message_id(VALUE self)
  * Get the thread ID of 'message'.
  */
 VALUE
-notmuch_rb_message_get_thread_id(VALUE self)
+notmuch_rb_message_get_thread_id (VALUE self)
 {
     const char *tid;
     notmuch_message_t *message;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
+    Data_Get_Notmuch_Message (self, message);
 
-    tid = notmuch_message_get_thread_id(message);
+    tid = notmuch_message_get_thread_id (message);
 
-    return rb_str_new2(tid);
+    return rb_str_new2 (tid);
 }
 
 /*
@@ -79,16 +75,16 @@ notmuch_rb_message_get_thread_id(VALUE self)
  * Get a Notmuch::Messages enumerable for all of the replies to 'message'.
  */
 VALUE
-notmuch_rb_message_get_replies(VALUE self)
+notmuch_rb_message_get_replies (VALUE self)
 {
     notmuch_messages_t *messages;
     notmuch_message_t *message;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
+    Data_Get_Notmuch_Message (self, message);
 
-    messages = notmuch_message_get_replies(message);
+    messages = notmuch_message_get_replies (message);
 
-    return Data_Wrap_Struct(notmuch_rb_cMessages, NULL, NULL, messages);
+    return Data_Wrap_Notmuch_Object (notmuch_rb_cMessages, &notmuch_rb_messages_type, messages);
 }
 
 /*
@@ -97,52 +93,75 @@ notmuch_rb_message_get_replies(VALUE self)
  * Get a filename for the email corresponding to 'message'
  */
 VALUE
-notmuch_rb_message_get_filename(VALUE self)
+notmuch_rb_message_get_filename (VALUE self)
 {
     const char *fname;
     notmuch_message_t *message;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
+    Data_Get_Notmuch_Message (self, message);
+
+    fname = notmuch_message_get_filename (message);
+
+    return rb_str_new2 (fname);
+}
+
+/*
+ * call-seq: MESSAGE.filenames => FILENAMES
+ *
+ * Get all filenames for the email corresponding to MESSAGE.
+ */
+VALUE
+notmuch_rb_message_get_filenames (VALUE self)
+{
+    notmuch_filenames_t *fnames;
+    notmuch_message_t *message;
+
+    Data_Get_Notmuch_Message (self, message);
 
-    fname = notmuch_message_get_filename(message);
+    fnames = notmuch_message_get_filenames (message);
 
-    return rb_str_new2(fname);
+    return notmuch_rb_filenames_get (fnames);
 }
 
 /*
- * call-seq: MESSAGE.get_flag(flag) => true or false
+ * call-seq: MESSAGE.get_flag (flag) => true or false
  *
  * Get a value of a flag for the email corresponding to 'message'
  */
 VALUE
-notmuch_rb_message_get_flag(VALUE self, VALUE flagv)
+notmuch_rb_message_get_flag (VALUE self, VALUE flagv)
 {
     notmuch_message_t *message;
+    notmuch_bool_t is_set;
+    notmuch_status_t status;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
+    Data_Get_Notmuch_Message (self, message);
 
-    if (!FIXNUM_P(flagv))
-        rb_raise(rb_eTypeError, "Flag not a Fixnum");
+    if (!FIXNUM_P (flagv))
+       rb_raise (rb_eTypeError, "Flag not a Fixnum");
 
-    return notmuch_message_get_flag(message, FIX2INT(flagv)) ? Qtrue : Qfalse;
+    status = notmuch_message_get_flag_st (message, FIX2INT (flagv), &is_set);
+    notmuch_rb_status_raise (status);
+
+    return is_set ? Qtrue : Qfalse;
 }
 
 /*
- * call-seq: MESSAGE.set_flag(flag, value) => nil
+ * call-seq: MESSAGE.set_flag (flag, value) => nil
  *
  * Set a value of a flag for the email corresponding to 'message'
  */
 VALUE
-notmuch_rb_message_set_flag(VALUE self, VALUE flagv, VALUE valuev)
+notmuch_rb_message_set_flag (VALUE self, VALUE flagv, VALUE valuev)
 {
     notmuch_message_t *message;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
+    Data_Get_Notmuch_Message (self, message);
 
-    if (!FIXNUM_P(flagv))
-        rb_raise(rb_eTypeError, "Flag not a Fixnum");
+    if (!FIXNUM_P (flagv))
+       rb_raise (rb_eTypeError, "Flag not a Fixnum");
 
-    notmuch_message_set_flag(message, FIX2INT(flagv), RTEST(valuev));
+    notmuch_message_set_flag (message, FIX2INT (flagv), RTEST (valuev));
 
     return Qnil;
 }
@@ -153,40 +172,36 @@ notmuch_rb_message_set_flag(VALUE self, VALUE flagv, VALUE valuev)
  * Get the date of 'message'
  */
 VALUE
-notmuch_rb_message_get_date(VALUE self)
+notmuch_rb_message_get_date (VALUE self)
 {
     notmuch_message_t *message;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
+    Data_Get_Notmuch_Message (self, message);
 
-    return UINT2NUM(notmuch_message_get_date(message));
+    return UINT2NUM (notmuch_message_get_date (message));
 }
 
 /*
- * call-seq: MESSAGE.header(name) => String
+ * call-seq: MESSAGE.header (name) => String
  *
  * Get the value of the specified header from 'message'
  */
 VALUE
-notmuch_rb_message_get_header(VALUE self, VALUE headerv)
+notmuch_rb_message_get_header (VALUE self, VALUE headerv)
 {
     const char *header, *value;
     notmuch_message_t *message;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
-
-#if !defined(RSTRING_PTR)
-#define RSTRING_PTR(v) (RSTRING((v))->ptr)
-#endif /* !defined(RSTRING_PTR) */
+    Data_Get_Notmuch_Message (self, message);
 
-    SafeStringValue(headerv);
-    header = RSTRING_PTR(headerv);
+    SafeStringValue (headerv);
+    header = RSTRING_PTR (headerv);
 
-    value = notmuch_message_get_header(message, header);
+    value = notmuch_message_get_header (message, header);
     if (!value)
-        rb_raise(notmuch_rb_eMemoryError, "Out of memory");
+       rb_raise (notmuch_rb_eMemoryError, "Out of memory");
 
-    return rb_str_new2(value);
+    return rb_str_new2 (value);
 }
 
 /*
@@ -195,70 +210,62 @@ notmuch_rb_message_get_header(VALUE self, VALUE headerv)
  * Get a Notmuch::Tags enumerable for all of the tags of 'message'.
  */
 VALUE
-notmuch_rb_message_get_tags(VALUE self)
+notmuch_rb_message_get_tags (VALUE self)
 {
     notmuch_message_t *message;
     notmuch_tags_t *tags;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
+    Data_Get_Notmuch_Message (self, message);
 
-    tags = notmuch_message_get_tags(message);
+    tags = notmuch_message_get_tags (message);
     if (!tags)
-        rb_raise(notmuch_rb_eMemoryError, "Out of memory");
+       rb_raise (notmuch_rb_eMemoryError, "Out of memory");
 
-    return Data_Wrap_Struct(notmuch_rb_cTags, NULL, NULL, tags);
+    return notmuch_rb_tags_get (tags);
 }
 
 /*
- * call-seq: MESSAGE.add_tag(tag) => true
+ * call-seq: MESSAGE.add_tag (tag) => true
  *
  * Add a tag to the 'message'
  */
 VALUE
-notmuch_rb_message_add_tag(VALUE self, VALUE tagv)
+notmuch_rb_message_add_tag (VALUE self, VALUE tagv)
 {
     const char *tag;
     notmuch_status_t ret;
     notmuch_message_t *message;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
-
-#if !defined(RSTRING_PTR)
-#define RSTRING_PTR(v) (RSTRING((v))->ptr)
-#endif /* !defined(RSTRING_PTR) */
+    Data_Get_Notmuch_Message (self, message);
 
-    SafeStringValue(tagv);
-    tag = RSTRING_PTR(tagv);
+    SafeStringValue (tagv);
+    tag = RSTRING_PTR (tagv);
 
-    ret = notmuch_message_add_tag(message, tag);
-    notmuch_rb_status_raise(ret);
+    ret = notmuch_message_add_tag (message, tag);
+    notmuch_rb_status_raise (ret);
 
     return Qtrue;
 }
 
 /*
- * call-seq: MESSAGE.remove_tag(tag) => true
+ * call-seq: MESSAGE.remove_tag (tag) => true
  *
  * Remove a tag from the 'message'
  */
 VALUE
-notmuch_rb_message_remove_tag(VALUE self, VALUE tagv)
+notmuch_rb_message_remove_tag (VALUE self, VALUE tagv)
 {
     const char *tag;
     notmuch_status_t ret;
     notmuch_message_t *message;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
+    Data_Get_Notmuch_Message (self, message);
 
-#if !defined(RSTRING_PTR)
-#define RSTRING_PTR(v) (RSTRING((v))->ptr)
-#endif /* !defined(RSTRING_PTR) */
+    SafeStringValue (tagv);
+    tag = RSTRING_PTR (tagv);
 
-    SafeStringValue(tagv);
-    tag = RSTRING_PTR(tagv);
-
-    ret = notmuch_message_remove_tag(message, tag);
-    notmuch_rb_status_raise(ret);
+    ret = notmuch_message_remove_tag (message, tag);
+    notmuch_rb_status_raise (ret);
 
     return Qtrue;
 }
@@ -269,15 +276,53 @@ notmuch_rb_message_remove_tag(VALUE self, VALUE tagv)
  * Remove all tags of the 'message'
  */
 VALUE
-notmuch_rb_message_remove_all_tags(VALUE self)
+notmuch_rb_message_remove_all_tags (VALUE self)
+{
+    notmuch_status_t ret;
+    notmuch_message_t *message;
+
+    Data_Get_Notmuch_Message (self, message);
+
+    ret = notmuch_message_remove_all_tags (message);
+    notmuch_rb_status_raise (ret);
+
+    return Qtrue;
+}
+
+/*
+ * call-seq: MESSAGE.maildir_flags_to_tags => true
+ *
+ * Add/remove tags according to maildir flags in the message filename (s)
+ */
+VALUE
+notmuch_rb_message_maildir_flags_to_tags (VALUE self)
+{
+    notmuch_status_t ret;
+    notmuch_message_t *message;
+
+    Data_Get_Notmuch_Message (self, message);
+
+    ret = notmuch_message_maildir_flags_to_tags (message);
+    notmuch_rb_status_raise (ret);
+
+    return Qtrue;
+}
+
+/*
+ * call-seq: MESSAGE.tags_to_maildir_flags => true
+ *
+ * Rename message filename (s) to encode tags as maildir flags
+ */
+VALUE
+notmuch_rb_message_tags_to_maildir_flags (VALUE self)
 {
     notmuch_status_t ret;
     notmuch_message_t *message;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
+    Data_Get_Notmuch_Message (self, message);
 
-    ret = notmuch_message_remove_all_tags(message);
-    notmuch_rb_status_raise(ret);
+    ret = notmuch_message_tags_to_maildir_flags (message);
+    notmuch_rb_status_raise (ret);
 
     return Qtrue;
 }
@@ -288,15 +333,15 @@ notmuch_rb_message_remove_all_tags(VALUE self)
  * Freeze the 'message'
  */
 VALUE
-notmuch_rb_message_freeze(VALUE self)
+notmuch_rb_message_freeze (VALUE self)
 {
     notmuch_status_t ret;
     notmuch_message_t *message;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
+    Data_Get_Notmuch_Message (self, message);
 
-    ret = notmuch_message_freeze(message);
-    notmuch_rb_status_raise(ret);
+    ret = notmuch_message_freeze (message);
+    notmuch_rb_status_raise (ret);
 
     return Qtrue;
 }
@@ -307,15 +352,15 @@ notmuch_rb_message_freeze(VALUE self)
  * Thaw a 'message'
  */
 VALUE
-notmuch_rb_message_thaw(VALUE self)
+notmuch_rb_message_thaw (VALUE self)
 {
     notmuch_status_t ret;
     notmuch_message_t *message;
 
-    Data_Get_Struct(self, notmuch_message_t, message);
+    Data_Get_Notmuch_Message (self, message);
 
-    ret = notmuch_message_thaw(message);
-    notmuch_rb_status_raise(ret);
+    ret = notmuch_message_thaw (message);
+    notmuch_rb_status_raise (ret);
 
     return Qtrue;
 }