Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
John McEleney
/
mailutils
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
Commit
42eb3a52
...
42eb3a529f37dd13918cf96f3fee0234a9315e8a
authored
2001-07-19 15:04:10 +0000
by
Sergey Poznyakoff
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
Mailbox primitives.
1 parent
76d65d64
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
253 additions
and
0 deletions
libmu_scm/mu_mailbox.c
libmu_scm/mu_mailbox.c
0 → 100644
View file @
42eb3a5
/* GNU mailutils - a suite of utilities for electronic mail
Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
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
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
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, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "mu_scm.h"
long
mailbox_tag
;
/* NOTE: Maybe will have to add some more members. That's why it is a
struct, not just a typedef mailbox_t */
struct
mu_mailbox
{
mailbox_t
mbox
;
/* Mailbox */
};
/* SMOB functions: */
static
SCM
mu_scm_mailbox_mark
(
SCM
mailbox_smob
)
{
return
SCM_BOOL_F
;
}
static
scm_sizet
mu_scm_mailbox_free
(
SCM
mailbox_smob
)
{
struct
mu_mailbox
*
mum
=
(
struct
mu_mailbox
*
)
SCM_CDR
(
mailbox_smob
);
mailbox_close
(
mum
->
mbox
);
mailbox_destroy
(
&
mum
->
mbox
);
free
(
mum
);
/* NOTE: Currently there is no way for this function to return the
amount of memory *actually freed* by mailbox_destroy */
return
sizeof
(
struct
mu_mailbox
);
}
static
int
mu_scm_mailbox_print
(
SCM
mailbox_smob
,
SCM
port
,
scm_print_state
*
pstate
)
{
struct
mu_mailbox
*
mum
=
(
struct
mu_mailbox
*
)
SCM_CDR
(
mailbox_smob
);
size_t
count
=
0
;
url_t
url
=
NULL
;
char
*
p
;
mailbox_messages_count
(
mum
->
mbox
,
&
count
);
mailbox_get_url
(
mum
->
mbox
,
&
url
);
scm_puts
(
"#<mailbox "
,
port
);
p
=
url_to_string
(
url
);
if
(
p
)
{
char
buf
[
64
];
scm_puts
(
p
,
port
);
snprintf
(
buf
,
sizeof
(
buf
),
" (%d)"
,
count
);
scm_puts
(
buf
,
port
);
}
else
scm_puts
(
"uninitialized"
,
port
);
scm_puts
(
">"
,
port
);
return
1
;
}
/* Internal functions */
SCM
mu_scm_mailbox_create
(
mailbox_t
mbox
)
{
struct
mu_mailbox
*
mum
;
mum
=
scm_must_malloc
(
sizeof
(
struct
mu_mailbox
),
"mailbox"
);
mum
->
mbox
=
mbox
;
SCM_RETURN_NEWSMOB
(
mailbox_tag
,
mum
);
}
int
mu_scm_is_mailbox
(
SCM
scm
)
{
return
SCM_NIMP
(
scm
)
&&
SCM_CAR
(
scm
)
==
mailbox_tag
;
}
/* ************************************************************************** */
/* Guile primitives */
SCM_DEFINE
(
mu_mailbox_open
,
"mu-mailbox-open"
,
2
,
0
,
0
,
(
SCM
URL
,
SCM
MODE
),
"Opens a mailbox specified by URL."
)
#define FUNC_NAME s_mu_mailbox_open
{
mailbox_t
mbox
=
NULL
;
char
*
mode_str
;
int
mode
=
0
;
SCM_ASSERT
(
SCM_NIMP
(
URL
)
&&
SCM_STRINGP
(
URL
),
URL
,
SCM_ARG1
,
FUNC_NAME
);
SCM_ASSERT
(
SCM_NIMP
(
MODE
)
&&
SCM_STRINGP
(
MODE
),
MODE
,
SCM_ARG2
,
FUNC_NAME
);
for
(
mode_str
=
SCM_CHARS
(
MODE
);
*
mode_str
;
mode_str
++
)
switch
(
*
mode_str
)
{
case
'r'
:
mode
|=
MU_STREAM_READ
;
break
;
case
'w'
:
mode
|=
MU_STREAM_WRITE
;
break
;
case
'a'
:
mode
|=
MU_STREAM_APPEND
;
break
;
case
'c'
:
mode
|=
MU_STREAM_CREAT
;
break
;
}
if
(
mode
&
MU_STREAM_READ
&&
mode
&
MU_STREAM_WRITE
)
mode
=
(
mode
&
~
(
MU_STREAM_READ
|
MU_STREAM_WRITE
))
|
MU_STREAM_RDWR
;
if
(
mailbox_create_default
(
&
mbox
,
SCM_CHARS
(
URL
))
!=
0
)
return
SCM_BOOL_F
;
if
(
mailbox_open
(
mbox
,
mode
)
!=
0
)
{
mailbox_destroy
(
&
mbox
);
return
SCM_BOOL_F
;
}
return
mu_scm_mailbox_create
(
mbox
);
}
#undef FUNC_NAME
SCM_DEFINE
(
mu_mailbox_close
,
"mu-mailbox-close"
,
1
,
0
,
0
,
(
SCM
MBOX
),
"Closes mailbox MBOX"
)
#define FUNC_NAME s_mu_mailbox_close
{
struct
mu_mailbox
*
mum
;
SCM_ASSERT
(
mu_scm_is_mailbox
(
MBOX
),
MBOX
,
SCM_ARG1
,
FUNC_NAME
);
mum
=
(
struct
mu_mailbox
*
)
SCM_CDR
(
MBOX
);
mailbox_close
(
mum
->
mbox
);
mailbox_destroy
(
&
mum
->
mbox
);
return
SCM_UNDEFINED
;
}
#undef FUNC_NAME
SCM_DEFINE
(
mu_mailbox_get_message
,
"mu-mailbox-get-message"
,
2
,
0
,
0
,
(
SCM
MBOX
,
SCM
MSGNO
),
"Retrieve from MBOX message # MSGNO."
)
#define FUNC_NAME s_mu_mailbox_get_message
{
size_t
msgno
;
struct
mu_mailbox
*
mum
;
message_t
msg
;
SCM_ASSERT
(
mu_scm_is_mailbox
(
MBOX
),
MBOX
,
SCM_ARG1
,
FUNC_NAME
);
SCM_ASSERT
((
SCM_IMP
(
MSGNO
)
&&
SCM_INUMP
(
MSGNO
)),
MSGNO
,
SCM_ARG2
,
FUNC_NAME
);
mum
=
(
struct
mu_mailbox
*
)
SCM_CDR
(
MBOX
);
msgno
=
SCM_INUM
(
MSGNO
);
if
(
mailbox_get_message
(
mum
->
mbox
,
msgno
,
&
msg
))
return
SCM_BOOL_F
;
return
mu_scm_message_create
(
MBOX
,
msg
);
}
#undef FUNC_NAME
SCM_DEFINE
(
mu_mailbox_messages_count
,
"mu-mailbox-messages-count"
,
1
,
0
,
0
,
(
SCM
MBOX
),
"Returns number of messages in the mailbox."
)
#define FUNC_NAME s_mu_mailbox_messages_count
{
struct
mu_mailbox
*
mum
;
size_t
nmesg
;
SCM_ASSERT
(
mu_scm_is_mailbox
(
MBOX
),
MBOX
,
SCM_ARG1
,
FUNC_NAME
);
mum
=
(
struct
mu_mailbox
*
)
SCM_CDR
(
MBOX
);
if
(
mailbox_messages_count
(
mum
->
mbox
,
&
nmesg
))
return
SCM_BOOL_F
;
return
scm_makenum
(
nmesg
);
}
#undef FUNC_NAME
SCM_DEFINE
(
mu_mailbox_expunge
,
"mu-mailbox-expunge"
,
1
,
0
,
0
,
(
SCM
MBOX
),
"Expunges deleted messages from the mailbox."
)
#define FUNC_NAME s_mu_mailbox_expunge
{
struct
mu_mailbox
*
mum
;
SCM_ASSERT
(
mu_scm_is_mailbox
(
MBOX
),
MBOX
,
SCM_ARG1
,
FUNC_NAME
);
mum
=
(
struct
mu_mailbox
*
)
SCM_CDR
(
MBOX
);
if
(
mailbox_expunge
(
mum
->
mbox
))
return
SCM_BOOL_F
;
return
SCM_BOOL_T
;
}
#undef FUNC_NAME
SCM_DEFINE
(
mu_mailbox_url
,
"mu-mailbox-url"
,
1
,
0
,
0
,
(
SCM
MBOX
),
"Returns the URL of the mailbox"
)
#define FUNC_NAME s_mu_mailbox_url
{
struct
mu_mailbox
*
mum
;
url_t
url
;
SCM_ASSERT
(
mu_scm_is_mailbox
(
MBOX
),
MBOX
,
SCM_ARG1
,
FUNC_NAME
);
mum
=
(
struct
mu_mailbox
*
)
SCM_CDR
(
MBOX
);
mailbox_get_url
(
mum
->
mbox
,
&
url
);
return
scm_makfrom0str
(
url_to_string
(
url
));
}
#undef FUNC_NAME
SCM_DEFINE
(
mu_mailbox_append_message
,
"mu-mailbox-append-message"
,
2
,
0
,
0
,
(
SCM
MBOX
,
SCM
MESG
),
"Appends the message to the mailbox"
)
#define FUNC_NAME s_mu_mailbox_append_message
{
struct
mu_mailbox
*
mum
;
message_t
msg
;
SCM_ASSERT
(
mu_scm_is_mailbox
(
MBOX
),
MBOX
,
SCM_ARG1
,
FUNC_NAME
);
SCM_ASSERT
(
mu_scm_is_message
(
MESG
),
MESG
,
SCM_ARG2
,
FUNC_NAME
);
mum
=
(
struct
mu_mailbox
*
)
SCM_CDR
(
MBOX
);
msg
=
mu_scm_message_get
(
MESG
);
if
(
mailbox_append_message
(
mum
->
mbox
,
msg
))
return
SCM_BOOL_F
;
return
SCM_BOOL_T
;
}
#undef FUNC_NAME
/* Initialize the module */
void
mu_scm_mailbox_init
()
{
mailbox_tag
=
scm_make_smob_type
(
"mailbox"
,
sizeof
(
struct
mu_mailbox
));
scm_set_smob_mark
(
mailbox_tag
,
mu_scm_mailbox_mark
);
scm_set_smob_free
(
mailbox_tag
,
mu_scm_mailbox_free
);
scm_set_smob_print
(
mailbox_tag
,
mu_scm_mailbox_print
);
#include "mu_mailbox.x"
}
Please
register
or
sign in
to post a comment