~ubuntu-branches/ubuntu/quantal/maildir-utils/quantal

« back to all changes in this revision

Viewing changes to libmuguile/mu-guile-msg.c

  • Committer: Package Import Robot
  • Author(s): Norbert Preining
  • Date: 2012-03-15 08:45:56 UTC
  • mfrom: (1.2.5)
  • Revision ID: package-import@ubuntu.com-20120315084556-vqdvw8sgodo24aji
Tags: 0.9.8.2-1
* several new upstream versions
* b-d on libgmime-2.6-dev (Closes: #664001, #664006)
* bump standards version to 3.9.3, no changes necessary
* switch to source format 3.0 (quilt): debian/control, debian/rules
* maildir-utils depends on dpkg/install-info (lintian warning)
* fix man page lintian warnings

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
** Copyright (C) 2011 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
3
 
**
4
 
** This program is free software; you can redistribute it and/or modify it
5
 
** under the terms of the GNU General Public License as published by the
6
 
** Free Software Foundation; either version 3, or (at your option) any
7
 
** later version.
8
 
**
9
 
** This program is distributed in the hope that it will be useful,
10
 
** but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
** GNU General Public License for more details.
13
 
**
14
 
** You should have received a copy of the GNU General Public License
15
 
** along with this program; if not, write to the Free Software Foundation,
16
 
** Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
 
**
18
 
*/
19
 
 
20
 
#include <mu-msg.h>
21
 
#include <mu-query.h>
22
 
#include <mu-runtime.h>
23
 
 
24
 
#include "mu-guile-msg.h"
25
 
#include "mu-guile-common.h"
26
 
 
27
 
struct _MuMsgWrapper {
28
 
        MuMsg   *_msg;
29
 
        gboolean _unrefme;
30
 
};
31
 
typedef struct _MuMsgWrapper MuMsgWrapper;
32
 
 
33
 
static long MSG_TAG;
34
 
 
35
 
static int
36
 
mu_guile_scm_is_msg (SCM scm)
37
 
{
38
 
        return SCM_NIMP(scm) && (long) SCM_CAR (scm) == MSG_TAG;
39
 
}
40
 
 
41
 
 
42
 
SCM
43
 
mu_guile_msg_to_scm (MuMsg *msg)
44
 
{
45
 
        MuMsgWrapper *msgwrap;
46
 
 
47
 
        g_return_val_if_fail (msg, SCM_UNDEFINED);
48
 
        
49
 
        msgwrap = scm_gc_malloc (sizeof (MuMsgWrapper), "msg");
50
 
        msgwrap->_msg = msg;
51
 
        msgwrap->_unrefme = FALSE;
52
 
        
53
 
        SCM_RETURN_NEWSMOB (MSG_TAG, msgwrap);
54
 
}
55
 
 
56
 
SCM_DEFINE (msg_make_from_file, "mu:msg:make-from-file", 1, 0, 0,
57
 
            (SCM PATH),
58
 
            "Create a message object based on the message in PATH.\n")
59
 
#define FUNC_NAME s_msg_make_from_file
60
 
{
61
 
        MuMsg *msg;
62
 
        GError *err;
63
 
 
64
 
        SCM_ASSERT (scm_is_string (PATH), PATH, SCM_ARG1, FUNC_NAME);
65
 
        
66
 
        err = NULL;
67
 
        msg = mu_msg_new_from_file (scm_to_utf8_string (PATH), NULL, &err);
68
 
        
69
 
        if (err) {
70
 
                mu_guile_g_error (FUNC_NAME, err);
71
 
                g_error_free (err);
72
 
        }
73
 
        
74
 
        return msg ? mu_guile_msg_to_scm (msg) : SCM_UNDEFINED;
75
 
}
76
 
#undef FUNC_NAME
77
 
 
78
 
 
79
 
SCM_DEFINE (msg_move, "mu:msg:move-to-maildir", 2, 0, 0,
80
 
            (SCM MSG, SCM TARGETMDIR),
81
 
            "Move message to another maildir TARGETMDIR. Note that this the "
82
 
            "base-level Maildir, ie. /home/user/Maildir/archive, and must"
83
 
            " _not_ include the 'cur' or 'new' part. mu_msg_move_to_maildir "
84
 
            "will make sure that the copy is from new/ to new/ and cur/ to "
85
 
            "cur/. Also note that the target maildir must be on the same "
86
 
            "filesystem. Returns #t if it worked, #f otherwise.\n")
87
 
#define FUNC_NAME s_msg_move
88
 
{
89
 
        GError *err;
90
 
        MuMsgWrapper *msgwrap;
91
 
        gboolean rv;
92
 
        
93
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);        
94
 
        SCM_ASSERT (scm_is_string (TARGETMDIR), TARGETMDIR, SCM_ARG2, FUNC_NAME);
95
 
 
96
 
        msgwrap = (MuMsgWrapper*) SCM_CDR(MSG);
97
 
 
98
 
        err = NULL;
99
 
        rv = mu_msg_move_to_maildir (msgwrap->_msg,
100
 
                                     scm_to_utf8_string (TARGETMDIR), &err);
101
 
        if (!rv && err) {
102
 
                mu_guile_g_error (FUNC_NAME, err);
103
 
                g_error_free (err);
104
 
        }
105
 
 
106
 
        return rv ? SCM_BOOL_T : SCM_BOOL_F;
107
 
}
108
 
#undef FUNC_NAME
109
 
 
110
 
 
111
 
 
112
 
 
113
 
 
114
 
static SCM
115
 
scm_from_string_or_null (const char *str)
116
 
{
117
 
        return str ? scm_from_utf8_string (str) : SCM_UNSPECIFIED;
118
 
}
119
 
                
120
 
 
121
 
static SCM
122
 
msg_str_field (SCM msg_smob, MuMsgFieldId mfid)
123
 
{
124
 
        MuMsgWrapper *msgwrap;
125
 
        msgwrap = (MuMsgWrapper*) SCM_CDR(msg_smob);
126
 
 
127
 
        return scm_from_string_or_null (
128
 
                mu_msg_get_field_string(msgwrap->_msg, mfid));
129
 
}
130
 
 
131
 
static gint64
132
 
msg_num_field (SCM msg_smob, MuMsgFieldId mfid)
133
 
{
134
 
        MuMsgWrapper *msgwrap;
135
 
        msgwrap = (MuMsgWrapper*) SCM_CDR(msg_smob);
136
 
 
137
 
        return mu_msg_get_field_numeric(msgwrap->_msg, mfid);
138
 
}
139
 
 
140
 
 
141
 
SCM_DEFINE (msg_date, "mu:msg:date", 1, 0, 0,
142
 
            (SCM MSG),
143
 
            "Get the date (time in seconds since epoch) for MSG.\n")
144
 
#define FUNC_NAME s_msg_date
145
 
{
146
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
147
 
        
148
 
        return scm_from_unsigned_integer
149
 
                (msg_num_field (MSG, MU_MSG_FIELD_ID_DATE));    
150
 
}
151
 
#undef FUNC_NAME
152
 
 
153
 
 
154
 
 
155
 
SCM_DEFINE (msg_size, "mu:msg:size", 1, 0, 0,
156
 
            (SCM MSG),
157
 
            "Get the size in bytes for MSG.\n")
158
 
#define FUNC_NAME s_msg_size
159
 
{
160
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
161
 
        
162
 
        return scm_from_unsigned_integer
163
 
                (msg_num_field (MSG, MU_MSG_FIELD_ID_SIZE));    
164
 
}
165
 
#undef FUNC_NAME
166
 
 
167
 
 
168
 
 
169
 
SCM_DEFINE (msg_prio, "mu:msg:priority", 1, 0, 0,
170
 
            (SCM MSG),
171
 
            "Get the priority of MSG (low, normal or high).\n")
172
 
#define FUNC_NAME s_msg_prio
173
 
{
174
 
        MuMsgPrio prio;
175
 
        MuMsgWrapper *msgwrap;
176
 
 
177
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
178
 
 
179
 
        msgwrap = (MuMsgWrapper*) SCM_CDR(MSG);
180
 
        
181
 
        prio = mu_msg_get_prio (msgwrap->_msg);
182
 
 
183
 
        switch (prio) {
184
 
        case MU_MSG_PRIO_LOW:    return scm_from_locale_symbol("mu:low");
185
 
        case MU_MSG_PRIO_NORMAL: return scm_from_locale_symbol("mu:normal");
186
 
        case MU_MSG_PRIO_HIGH:   return scm_from_locale_symbol("mu:high");
187
 
        default:
188
 
                g_return_val_if_reached (SCM_UNDEFINED);
189
 
        }       
190
 
}
191
 
#undef FUNC_NAME
192
 
 
193
 
struct _FlagData {
194
 
        MuMsgFlags flags;
195
 
        SCM lst;
196
 
};
197
 
typedef struct _FlagData FlagData;
198
 
 
199
 
 
200
 
static void
201
 
check_flag (MuMsgFlags flag, FlagData *fdata)
202
 
{
203
 
        if (fdata->flags & flag) {
204
 
                SCM item;
205
 
                char *flagsym;
206
 
 
207
 
                flagsym = g_strconcat ("mu:", mu_msg_flag_name(flag), NULL);
208
 
                item = scm_list_1 (scm_from_locale_symbol(flagsym));
209
 
                g_free (flagsym);
210
 
                
211
 
                fdata->lst = scm_append_x (scm_list_2(fdata->lst, item));
212
 
        }       
213
 
}
214
 
 
215
 
 
216
 
SCM_DEFINE (msg_flags, "mu:msg:flags", 1, 0, 0,
217
 
            (SCM MSG),
218
 
            "Get the flags for MSG (one or or more of new, passed, replied, "
219
 
            "seen, trashed, draft, flagged, unread, signed, encrypted, "
220
 
            "has-attach).\n")
221
 
#define FUNC_NAME s_msg_flags
222
 
{
223
 
        MuMsgWrapper *msgwrap;
224
 
        FlagData fdata;
225
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
226
 
        
227
 
        msgwrap = (MuMsgWrapper*) SCM_CDR(MSG);
228
 
        
229
 
        fdata.flags = mu_msg_get_flags (msgwrap->_msg);
230
 
        fdata.lst = SCM_EOL;
231
 
        mu_msg_flags_foreach ((MuMsgFlagsForeachFunc)check_flag,
232
 
                              &fdata);
233
 
 
234
 
        return fdata.lst;
235
 
}
236
 
#undef FUNC_NAME
237
 
 
238
 
 
239
 
SCM_DEFINE (msg_subject, "mu:msg:subject", 1, 0, 0,
240
 
            (SCM MSG), "Get the subject of MSG.\n")
241
 
#define FUNC_NAME s_msg_subject
242
 
{
243
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
244
 
 
245
 
        return msg_str_field (MSG, MU_MSG_FIELD_ID_SUBJECT);
246
 
}
247
 
#undef FUNC_NAME
248
 
 
249
 
 
250
 
SCM_DEFINE (msg_from, "mu:msg:from", 1, 0, 0,
251
 
            (SCM MSG), "Get the sender of MSG.\n")
252
 
#define FUNC_NAME s_msg_from
253
 
{
254
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
255
 
        
256
 
        return msg_str_field (MSG, MU_MSG_FIELD_ID_FROM);
257
 
}
258
 
#undef FUNC_NAME
259
 
 
260
 
struct _EachContactData {
261
 
        SCM lst;
262
 
        MuMsgContactType ctype;
263
 
};
264
 
typedef struct _EachContactData EachContactData;
265
 
 
266
 
static void
267
 
contacts_to_list (MuMsgContact *contact, EachContactData *ecdata)
268
 
{
269
 
        if (mu_msg_contact_type (contact) == ecdata->ctype) {
270
 
                SCM item;
271
 
                const char *addr, *name;
272
 
 
273
 
                addr = mu_msg_contact_address(contact);
274
 
                name = mu_msg_contact_name(contact);
275
 
                
276
 
                item = scm_list_1
277
 
                        (scm_list_2 (
278
 
                                scm_from_string_or_null(name),
279
 
                                scm_from_string_or_null(addr)));
280
 
                ecdata->lst = scm_append_x (scm_list_2(ecdata->lst, item));     
281
 
        }
282
 
}
283
 
        
284
 
 
285
 
static SCM
286
 
contact_list_field (SCM msg_smob, MuMsgFieldId mfid)
287
 
{
288
 
        MuMsgWrapper *msgwrap;
289
 
        EachContactData ecdata;
290
 
 
291
 
        ecdata.lst = SCM_EOL;
292
 
        
293
 
        switch (mfid) {
294
 
        case MU_MSG_FIELD_ID_TO: ecdata.ctype = MU_MSG_CONTACT_TYPE_TO; break;
295
 
        case MU_MSG_FIELD_ID_CC: ecdata.ctype = MU_MSG_CONTACT_TYPE_CC; break;
296
 
        case MU_MSG_FIELD_ID_BCC: ecdata.ctype = MU_MSG_CONTACT_TYPE_BCC; break;
297
 
        default: g_return_val_if_reached (SCM_UNDEFINED);
298
 
        }
299
 
        
300
 
        msgwrap = (MuMsgWrapper*) SCM_CDR(msg_smob);
301
 
        
302
 
        mu_msg_contact_foreach (msgwrap->_msg,
303
 
                                (MuMsgContactForeachFunc)contacts_to_list,
304
 
                                &ecdata);
305
 
        return ecdata.lst;
306
 
}
307
 
 
308
 
 
309
 
SCM_DEFINE (msg_to, "mu:msg:to", 1, 0, 0,
310
 
            (SCM MSG), "Get the list of To:-recipients of MSG.\n")
311
 
#define FUNC_NAME s_msg_to
312
 
{
313
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
314
 
        
315
 
        return contact_list_field (MSG, MU_MSG_FIELD_ID_TO);
316
 
}
317
 
#undef FUNC_NAME
318
 
 
319
 
            
320
 
 
321
 
SCM_DEFINE (msg_cc, "mu:msg:cc", 1, 0, 0,
322
 
            (SCM MSG), "Get the list of Cc:-recipients of MSG.\n")
323
 
#define FUNC_NAME s_msg_cc
324
 
{
325
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
326
 
 
327
 
        return contact_list_field (MSG, MU_MSG_FIELD_ID_CC);
328
 
}
329
 
#undef FUNC_NAME
330
 
 
331
 
 
332
 
SCM_DEFINE (msg_bcc, "mu:msg:bcc", 1, 0, 0,
333
 
            (SCM MSG), "Get the list of Bcc:-recipients of MSG.\n")
334
 
#define FUNC_NAME s_msg_bcc
335
 
{
336
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
337
 
        
338
 
        return contact_list_field (MSG, MU_MSG_FIELD_ID_BCC);
339
 
}
340
 
#undef FUNC_NAME
341
 
 
342
 
 
343
 
SCM_DEFINE (msg_path, "mu:msg:path", 1, 0, 0,
344
 
            (SCM MSG), "Get the filesystem path for MSG.\n")
345
 
#define FUNC_NAME s_msg_path
346
 
{
347
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
348
 
        
349
 
        return msg_str_field (MSG, MU_MSG_FIELD_ID_PATH);
350
 
}
351
 
#undef FUNC_NAME
352
 
 
353
 
 
354
 
SCM_DEFINE (msg_maildir, "mu:msg:maildir", 1, 0, 0,
355
 
            (SCM MSG), "Get the maildir where MSG lives.\n")
356
 
#define FUNC_NAME s_msg_maildir
357
 
{
358
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
359
 
 
360
 
        return msg_str_field (MSG, MU_MSG_FIELD_ID_MAILDIR);
361
 
}
362
 
#undef FUNC_NAME
363
 
 
364
 
 
365
 
 
366
 
SCM_DEFINE (msg_msgid, "mu:msg:message-id", 1, 0, 0,
367
 
            (SCM MSG), "Get the MSG's message-id.\n")
368
 
#define FUNC_NAME s_msg_msgid
369
 
{
370
 
        return msg_str_field (MSG, MU_MSG_FIELD_ID_MSGID);
371
 
}
372
 
#undef FUNC_NAME
373
 
 
374
 
 
375
 
SCM_DEFINE (msg_body, "mu:msg:body", 1, 1, 0,
376
 
                    (SCM MSG, SCM HTML), "Get the MSG's body. If HTML is #t, "
377
 
                    "prefer the html-version, otherwise prefer plain text.\n")
378
 
#define FUNC_NAME s_msg_body
379
 
{
380
 
        MuMsgWrapper *msgwrap;
381
 
        gboolean html;
382
 
        const char *val;
383
 
 
384
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
385
 
        
386
 
        msgwrap = (MuMsgWrapper*) SCM_CDR(MSG);
387
 
        html = SCM_UNBNDP(HTML) ? FALSE : HTML == SCM_BOOL_T;
388
 
        
389
 
        if (html)
390
 
                val = mu_msg_get_body_html(msgwrap->_msg);
391
 
        else
392
 
                val = mu_msg_get_body_text(msgwrap->_msg);
393
 
                
394
 
        return scm_from_string_or_null (val);
395
 
}
396
 
#undef FUNC_NAME
397
 
 
398
 
 
399
 
SCM_DEFINE (msg_header, "mu:msg:header", 1, 1, 0,
400
 
                    (SCM MSG, SCM HEADER), "Get an arbitary HEADER from MSG.\n")
401
 
#define FUNC_NAME s_msg_header
402
 
{
403
 
        MuMsgWrapper *msgwrap;
404
 
        const char *header;
405
 
        const char *val;
406
 
 
407
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
408
 
        SCM_ASSERT (scm_is_string (HEADER), HEADER, SCM_ARG2, FUNC_NAME);
409
 
        
410
 
        msgwrap = (MuMsgWrapper*) SCM_CDR(MSG);
411
 
        header  =  scm_to_utf8_string (HEADER);
412
 
        val     =  mu_msg_get_header(msgwrap->_msg, header);
413
 
        
414
 
        return val ? scm_from_string_or_null(val) : SCM_UNDEFINED;
415
 
}
416
 
#undef FUNC_NAME
417
 
 
418
 
static SCM
419
 
msg_string_list_field (SCM msg_smob, MuMsgFieldId mfid)
420
 
{
421
 
        MuMsgWrapper *msgwrap;
422
 
        SCM scmlst;
423
 
        const GSList *lst;
424
 
        
425
 
        msgwrap = (MuMsgWrapper*) SCM_CDR(msg_smob);
426
 
        lst = mu_msg_get_field_string_list (msgwrap->_msg, mfid);
427
 
        
428
 
        for (scmlst = SCM_EOL; lst;
429
 
             lst = g_slist_next(lst)) { 
430
 
                SCM item;
431
 
                item = scm_list_1
432
 
                        (scm_from_string_or_null((const char*)lst->data));
433
 
                scmlst = scm_append_x (scm_list_2(scmlst, item));
434
 
        }
435
 
 
436
 
        return scmlst;
437
 
}
438
 
 
439
 
 
440
 
SCM_DEFINE (msg_tags, "mu:msg:tags", 1, 1, 0,
441
 
                    (SCM MSG), "Get the list of tags (contents of the "
442
 
                    "X-Label:-header) for MSG.\n")
443
 
#define FUNC_NAME s_msg_tags
444
 
{
445
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
446
 
        
447
 
        return msg_string_list_field (MSG, MU_MSG_FIELD_ID_TAGS);
448
 
}
449
 
#undef FUNC_NAME
450
 
 
451
 
 
452
 
 
453
 
SCM_DEFINE (msg_refs, "mu:msg:references", 1, 1, 0,
454
 
            (SCM MSG), "Get the list of referenced message-ids "
455
 
            "(contents of the References: and Reply-To: headers).\n")
456
 
#define FUNC_NAME s_msg_refs
457
 
{
458
 
        SCM_ASSERT (mu_guile_scm_is_msg(MSG), MSG, SCM_ARG1, FUNC_NAME);
459
 
        
460
 
        return msg_string_list_field (MSG, MU_MSG_FIELD_ID_REFS);
461
 
}
462
 
#undef FUNC_NAME
463
 
 
464
 
            
465
 
static SCM
466
 
msg_mark (SCM msg_smob)
467
 
{
468
 
        MuMsgWrapper *msgwrap;
469
 
        msgwrap = (MuMsgWrapper*) SCM_CDR(msg_smob);
470
 
 
471
 
        msgwrap->_unrefme = TRUE;
472
 
 
473
 
        return SCM_UNSPECIFIED;
474
 
}
475
 
 
476
 
static scm_sizet
477
 
msg_free (SCM msg_smob)
478
 
{
479
 
        MuMsgWrapper *msgwrap;  
480
 
        msgwrap = (MuMsgWrapper*) SCM_CDR(msg_smob);
481
 
        
482
 
        if (msgwrap->_unrefme)
483
 
                mu_msg_unref (msgwrap->_msg);
484
 
 
485
 
        return sizeof (MuMsgWrapper);
486
 
}
487
 
 
488
 
static int
489
 
msg_print (SCM msg_smob, SCM port, scm_print_state * pstate)
490
 
{
491
 
        MuMsgWrapper *msgwrap;  
492
 
        msgwrap = (MuMsgWrapper*) SCM_CDR(msg_smob);
493
 
 
494
 
        scm_puts ("#<msg ", port);
495
 
 
496
 
        if (msg_smob == SCM_BOOL_F)
497
 
                scm_puts ("#f", port);
498
 
        else 
499
 
                scm_puts (mu_msg_get_path(msgwrap->_msg),
500
 
                          port);
501
 
 
502
 
        scm_puts (">", port);
503
 
 
504
 
        return 1;
505
 
}
506
 
 
507
 
 
508
 
static void
509
 
define_symbols (void)
510
 
{
511
 
        /* message priority */
512
 
        scm_c_define ("mu:high",        scm_from_int(MU_MSG_PRIO_HIGH));
513
 
        scm_c_define ("mu:low",         scm_from_int(MU_MSG_PRIO_LOW));
514
 
        scm_c_define ("mu:normal",      scm_from_int(MU_MSG_PRIO_NORMAL));
515
 
 
516
 
        /* message flags */
517
 
        scm_c_define ("mu:new",         scm_from_int(MU_MSG_FLAG_NEW));
518
 
        scm_c_define ("mu:passed",      scm_from_int(MU_MSG_FLAG_PASSED));
519
 
        scm_c_define ("mu:replied",     scm_from_int(MU_MSG_FLAG_REPLIED));
520
 
        scm_c_define ("mu:seen",        scm_from_int(MU_MSG_FLAG_SEEN));
521
 
        scm_c_define ("mu:trashed",     scm_from_int(MU_MSG_FLAG_TRASHED));
522
 
        scm_c_define ("mu:draft",       scm_from_int(MU_MSG_FLAG_DRAFT));
523
 
        scm_c_define ("mu:flagged",     scm_from_int(MU_MSG_FLAG_FLAGGED));
524
 
        scm_c_define ("mu:unread",      scm_from_int(MU_MSG_FLAG_UNREAD));
525
 
        scm_c_define ("mu:signed",      scm_from_int(MU_MSG_FLAG_SIGNED));
526
 
        scm_c_define ("mu:encrypted",   scm_from_int(MU_MSG_FLAG_ENCRYPTED));
527
 
        scm_c_define ("mu:has-attach",  scm_from_int(MU_MSG_FLAG_HAS_ATTACH));
528
 
}
529
 
 
530
 
 
531
 
gboolean
532
 
mu_guile_msg_load_current (const char *path)
533
 
{
534
 
        MuMsg *msg;
535
 
        GError *err;
536
 
        SCM msgsmob;
537
 
        
538
 
        err = NULL;
539
 
        msg = mu_msg_new_from_file (path, NULL, &err);
540
 
 
541
 
        if (!msg) {
542
 
                g_printerr ("error creating message for '%s'", path);
543
 
                if (err) {
544
 
                        g_printerr (": %s", err->message);
545
 
                        g_error_free (err);
546
 
                }
547
 
                g_printerr ("\n");
548
 
                return FALSE;
549
 
        }
550
 
        
551
 
        msgsmob = mu_guile_msg_to_scm (msg);
552
 
        scm_c_define ("mu:current-msg", msgsmob); 
553
 
 
554
 
        return TRUE;
555
 
}
556
 
 
557
 
 
558
 
void*
559
 
mu_guile_msg_init (void *data)
560
 
{
561
 
        
562
 
        MSG_TAG = scm_make_smob_type ("msg", sizeof(MuMsgWrapper));
563
 
        
564
 
        scm_set_smob_mark  (MSG_TAG, msg_mark);
565
 
        scm_set_smob_free  (MSG_TAG, msg_free);
566
 
        scm_set_smob_print (MSG_TAG, msg_print);        
567
 
 
568
 
        define_symbols ();
569
 
        
570
 
#include "mu-guile-msg.x"
571
 
 
572
 
        return NULL;
573
 
}
574
 
 
575