1 /* The Ruby interface to the notmuch mail library
3 * Copyright © 2010 Ali Polatel
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see http://www.gnu.org/licenses/ .
18 * Author: Ali Polatel <alip@exherbo.org>
24 * call-seq: MESSAGE.destroy! => nil
26 * Destroys the message, freeing all resources allocated for it.
29 notmuch_rb_message_destroy(VALUE self)
31 notmuch_message_t *message;
33 Data_Get_Notmuch_Message(self, message);
35 notmuch_message_destroy(message);
36 DATA_PTR(self) = NULL;
42 * call-seq: MESSAGE.message_id => String
44 * Get the message ID of 'message'.
47 notmuch_rb_message_get_message_id(VALUE self)
50 notmuch_message_t *message;
52 Data_Get_Notmuch_Message(self, message);
54 msgid = notmuch_message_get_message_id(message);
56 return rb_str_new2(msgid);
60 * call-seq: MESSAGE.thread_id => String
62 * Get the thread ID of 'message'.
65 notmuch_rb_message_get_thread_id(VALUE self)
68 notmuch_message_t *message;
70 Data_Get_Notmuch_Message(self, message);
72 tid = notmuch_message_get_thread_id(message);
74 return rb_str_new2(tid);
78 * call-seq: MESSAGE.replies => MESSAGES
80 * Get a Notmuch::Messages enumerable for all of the replies to 'message'.
83 notmuch_rb_message_get_replies(VALUE self)
85 notmuch_messages_t *messages;
86 notmuch_message_t *message;
88 Data_Get_Notmuch_Message(self, message);
90 messages = notmuch_message_get_replies(message);
92 return Data_Wrap_Struct(notmuch_rb_cMessages, NULL, NULL, messages);
96 * call-seq: MESSAGE.filename => String
98 * Get a filename for the email corresponding to 'message'
101 notmuch_rb_message_get_filename(VALUE self)
104 notmuch_message_t *message;
106 Data_Get_Notmuch_Message(self, message);
108 fname = notmuch_message_get_filename(message);
110 return rb_str_new2(fname);
114 * call-seq: MESSAGE.filanames => FILENAMES
116 * Get all filenames for the email corresponding to MESSAGE.
119 notmuch_rb_message_get_filenames(VALUE self)
121 notmuch_filenames_t *fnames;
122 notmuch_message_t *message;
124 Data_Get_Notmuch_Message(self, message);
126 fnames = notmuch_message_get_filenames(message);
128 return Data_Wrap_Struct(notmuch_rb_cFileNames, NULL, NULL, fnames);
132 * call-seq: MESSAGE.get_flag(flag) => true or false
134 * Get a value of a flag for the email corresponding to 'message'
137 notmuch_rb_message_get_flag(VALUE self, VALUE flagv)
139 notmuch_message_t *message;
141 Data_Get_Notmuch_Message(self, message);
143 if (!FIXNUM_P(flagv))
144 rb_raise(rb_eTypeError, "Flag not a Fixnum");
146 return notmuch_message_get_flag(message, FIX2INT(flagv)) ? Qtrue : Qfalse;
150 * call-seq: MESSAGE.set_flag(flag, value) => nil
152 * Set a value of a flag for the email corresponding to 'message'
155 notmuch_rb_message_set_flag(VALUE self, VALUE flagv, VALUE valuev)
157 notmuch_message_t *message;
159 Data_Get_Notmuch_Message(self, message);
161 if (!FIXNUM_P(flagv))
162 rb_raise(rb_eTypeError, "Flag not a Fixnum");
164 notmuch_message_set_flag(message, FIX2INT(flagv), RTEST(valuev));
170 * call-seq: MESSAGE.date => Fixnum
172 * Get the date of 'message'
175 notmuch_rb_message_get_date(VALUE self)
177 notmuch_message_t *message;
179 Data_Get_Notmuch_Message(self, message);
181 return UINT2NUM(notmuch_message_get_date(message));
185 * call-seq: MESSAGE.header(name) => String
187 * Get the value of the specified header from 'message'
190 notmuch_rb_message_get_header(VALUE self, VALUE headerv)
192 const char *header, *value;
193 notmuch_message_t *message;
195 Data_Get_Notmuch_Message(self, message);
197 #if !defined(RSTRING_PTR)
198 #define RSTRING_PTR(v) (RSTRING((v))->ptr)
199 #endif /* !defined(RSTRING_PTR) */
201 SafeStringValue(headerv);
202 header = RSTRING_PTR(headerv);
204 value = notmuch_message_get_header(message, header);
206 rb_raise(notmuch_rb_eMemoryError, "Out of memory");
208 return rb_str_new2(value);
212 * call-seq: MESSAGE.tags => TAGS
214 * Get a Notmuch::Tags enumerable for all of the tags of 'message'.
217 notmuch_rb_message_get_tags(VALUE self)
219 notmuch_message_t *message;
220 notmuch_tags_t *tags;
222 Data_Get_Notmuch_Message(self, message);
224 tags = notmuch_message_get_tags(message);
226 rb_raise(notmuch_rb_eMemoryError, "Out of memory");
228 return Data_Wrap_Struct(notmuch_rb_cTags, NULL, NULL, tags);
232 * call-seq: MESSAGE.add_tag(tag) => true
234 * Add a tag to the 'message'
237 notmuch_rb_message_add_tag(VALUE self, VALUE tagv)
240 notmuch_status_t ret;
241 notmuch_message_t *message;
243 Data_Get_Notmuch_Message(self, message);
245 #if !defined(RSTRING_PTR)
246 #define RSTRING_PTR(v) (RSTRING((v))->ptr)
247 #endif /* !defined(RSTRING_PTR) */
249 SafeStringValue(tagv);
250 tag = RSTRING_PTR(tagv);
252 ret = notmuch_message_add_tag(message, tag);
253 notmuch_rb_status_raise(ret);
259 * call-seq: MESSAGE.remove_tag(tag) => true
261 * Remove a tag from the 'message'
264 notmuch_rb_message_remove_tag(VALUE self, VALUE tagv)
267 notmuch_status_t ret;
268 notmuch_message_t *message;
270 Data_Get_Notmuch_Message(self, message);
272 #if !defined(RSTRING_PTR)
273 #define RSTRING_PTR(v) (RSTRING((v))->ptr)
274 #endif /* !defined(RSTRING_PTR) */
276 SafeStringValue(tagv);
277 tag = RSTRING_PTR(tagv);
279 ret = notmuch_message_remove_tag(message, tag);
280 notmuch_rb_status_raise(ret);
286 * call-seq: MESSAGE.remove_all_tags => true
288 * Remove all tags of the 'message'
291 notmuch_rb_message_remove_all_tags(VALUE self)
293 notmuch_status_t ret;
294 notmuch_message_t *message;
296 Data_Get_Notmuch_Message(self, message);
298 ret = notmuch_message_remove_all_tags(message);
299 notmuch_rb_status_raise(ret);
305 * call-seq: MESSAGE.maildir_flags_to_tags => true
307 * Add/remove tags according to maildir flags in the message filename(s)
310 notmuch_rb_message_maildir_flags_to_tags(VALUE self)
312 notmuch_status_t ret;
313 notmuch_message_t *message;
315 Data_Get_Notmuch_Message(self, message);
317 ret = notmuch_message_maildir_flags_to_tags(message);
318 notmuch_rb_status_raise(ret);
324 * call-seq: MESSAGE.tags_to_maildir_flags => true
326 * Rename message filename(s) to encode tags as maildir flags
329 notmuch_rb_message_tags_to_maildir_flags(VALUE self)
331 notmuch_status_t ret;
332 notmuch_message_t *message;
334 Data_Get_Notmuch_Message(self, message);
336 ret = notmuch_message_tags_to_maildir_flags(message);
337 notmuch_rb_status_raise(ret);
343 * call-seq: MESSAGE.freeze => true
345 * Freeze the 'message'
348 notmuch_rb_message_freeze(VALUE self)
350 notmuch_status_t ret;
351 notmuch_message_t *message;
353 Data_Get_Notmuch_Message(self, message);
355 ret = notmuch_message_freeze(message);
356 notmuch_rb_status_raise(ret);
362 * call-seq: MESSAGE.thaw => true
367 notmuch_rb_message_thaw(VALUE self)
369 notmuch_status_t ret;
370 notmuch_message_t *message;
372 Data_Get_Notmuch_Message(self, message);
374 ret = notmuch_message_thaw(message);
375 notmuch_rb_status_raise(ret);