/* mailboxes.c */
#include "ml.h"
Menu mailopen_file_menu[] = {
{ NULL, "create", NUL_TERM,
mailboxes_create, NULL, 0, NULL, NULL, BTN_ON },
{ NULL, "delete", NUL_TERM,
mailboxes_delete, NULL, 0, NULL, NULL, BTN_ON },
{ NULL, "rename", NUL_TERM,
mailboxes_rename, NULL, 0, NULL, NULL, BTN_MAILBOX_DONEWS },
{ NULL, "subscribe_only", NUL_TERM,
mailboxes_subscribe_only, NULL, 0, NULL, NULL, BTN_ON },
{ NULL, "unsubscribe_only", NUL_TERM,
mailboxes_unsubscribe_only, NULL, 0, NULL, NULL, BTN_ON },
{ NULL, "create_only", NUL_TERM,
mailboxes_create_only, NULL, 0, NULL, NULL, BTN_MAILBOX_DONEWS },
};
Menu mailopen_option_menu[] = {
{ NULL, "everything", NUL_TERM,
mailboxes_everything, NULL, 0, NULL, NULL, BTN_ON },
{ NULL, "subscribed", NUL_TERM,
mailboxes_subscribed, NULL, 0, NULL, NULL, BTN_ON },
};
Menu mailboxopen_menu[] = {
{ NULL, "subscribe_menu", NUL_TERM,
NULL, mailopen_file_menu, XtNumber(mailopen_file_menu),
NULL, NULL, BTN_ON },
{ NULL, "option_menu", NUL_TERM,
NULL, mailopen_option_menu, XtNumber(mailopen_option_menu),
NULL, NULL, BTN_ON },
{ NULL, "HELP", NUL_TERM,
mailboxes_help, NULL, 0, NULL, NULL, BTN_ON },
};
Button_Menu mailopen_buttons[] = {
{ "mbox_open_btn", mailboxes_open, NULL, BTN_ON, NULL },
{ "mbox_scan_btn", mailboxes_scan, NULL, BTN_NOSELECTION, NULL },
{ "mbox_fetch_btn", mailboxes_fetch, NULL, BTN_ON, NULL },
{ "mbox_dismiss_btn", mailboxes_dismiss, NULL, BTN_ON, NULL },
};
Button_Menu mailcopy_buttons[] = {
{ "mbox_copy_btn", mailboxes_copy, NULL, BTN_MAILBOX_DONEWS, NULL },
{ "mbox_move_btn", mailboxes_move, NULL, BTN_MAILBOX_DONEWS, NULL },
{ "mbox_fetch_btn", mailboxes_fetch, NULL, BTN_ON, NULL },
{ "mbox_cancel_btn", mailboxes_cancel, NULL, BTN_ON, NULL },
};
#ifdef __STDC__
Mailbox_List *new_mailbox_list(void)
#else
Mailbox_List *new_mailbox_list()
#endif
{
Mailbox_List *mailbox_list = (Mailbox_List *) fs_get(sizeof(Mailbox_List));
mailbox_list->name = NULL;
mailbox_list->delimiter = NUL_TERM;
mailbox_list->attribute = 0L;
mailbox_list->nmsgs = 0L;
mailbox_list->recent = 0L;
mailbox_list->unseen = 0L;
mailbox_list->validity = 0L;
mailbox_list->uidnext = 0L;
mailbox_list->next = NULL;
mailbox_list->prev = NULL;
return(mailbox_list);
}
#ifdef __STDC__
void free_mailbox_list(Mailbox_List *mailbox_list)
#else
void free_mailbox_list(mailbox_list)
Mailbox_List *mailbox_list;
#endif
{
if(mailbox_list == NULL)
return;
free_mailbox_list(mailbox_list->prev);
if(mailbox_list->name != NULL)
fs_give((void **) &mailbox_list->name);
fs_give((void **) &mailbox_list);
mailbox_list = NULL;
return;
}
#ifdef __STDC__
void mailboxes_check_buttons(Mailbox_Win *mailbox_win)
#else
void mailboxes_check_buttons(mailbox_win)
Mailbox_Win *mailbox_win;
#endif
{
if(mailbox_win && mailbox_win->is_realized)
update_buttons(mailbox_win->buttonlist,
mailbox_win->button_state);
return;
}
#ifdef __STDC__
char *get_mailbox_name(Widget w, char *current_server,
Boolean *changed, Boolean *move)
#else
char *get_mailbox_name(w, current_server, changed, move)
Widget w;
char *current_server;
Boolean *changed;
Boolean *move;
#endif
{
Server_Config *server;
Mailbox_Win *mailbox_win;
Boolean errors = FALSE;
char *ret = NULL;
char *patt;
mailbox_win = mailboxes(NULL, TRUE);
server = find_configuration(preferences.defaultConfig);
if(server) {
XmTextSetString(mailbox_win->server,server->name);
XmTextSetString(mailbox_win->mailbox, preferences.default_savebox);
if((set_config_current(mailbox_win,TRUE)) == SYSCALL_FAILURE)
errors = TRUE;
}
else
errors = TRUE;
if(errors == FALSE) {
patt = XmTextGetString(mailbox_win->pattern);
load_mailbox_list(mailbox_win, mailbox_win->current, patt,
(mailbox_win->everything == TRUE)
? LOAD_UNSUBSCRIBED : LOAD_SUBSCRIBED);
fs_give((void **) &patt);
stuff_mailbox_list(mailbox_win,FALSE);
modal_main_loop(&mailbox_win->done);
}
XtPopdown(mailbox_win->shell);
if(mailbox_win->move == TRUE)
*move = TRUE;
else
*move = FALSE;
if(errors == FALSE) {
if(mailbox_win->current != NULL) {
session->active = mailbox_win->current;
if((strcasecmp(current_server,
(mailbox_win->current->hostname != NULL)
? mailbox_win->current->hostname
: EMPTYSTR)) != STRMATCH) {
ret = get_mailbox_string_from_window(mailbox_win);
*changed = TRUE;
}
else {
ret = get_mailbox_simple_from_window(mailbox_win);
*changed = FALSE;
}
}
}
else
session->active = NULL;
XtDestroyWidget(mailbox_win->shell);
pop_cursor();
return(ret);
}
#ifdef __STDC__
Mailbox_Win *mailboxes(MainWindow *mwin, Boolean subwin)
#else
Mailbox_Win *mailboxes(mwin, subwin)
MainWindow *mwin;
Boolean subwin;
#endif
{
Arg args[ARGLISTSIZE];
int n = 0;
int i = 0;
Mailbox_Win *mailbox_win;
XtTranslations translations;
char *ret = NULL;
if(subwin == FALSE) {
if(session->mailboxwin != NULL) {
if(session->mailboxwin->is_realized == TRUE) {
de_iconify(session->mailboxwin->shell);
stuff_mailbox_list(session->mailboxwin, TRUE);
}
else {
XtPopup(session->mailboxwin->shell, XtGrabNone);
session->mailboxwin->is_realized = TRUE;
stuff_mailbox_list(session->mailboxwin, TRUE);
}
session->mailboxwin->mwin = mwin;
return(session->mailboxwin);
}
}
else
push_cursor(PIRATE_CURSOR);
mailbox_win = (Mailbox_Win *) fs_get(sizeof(Mailbox_Win));
mailbox_win->is_realized = FALSE;
if(subwin == TRUE)
session->mailcopywin = mailbox_win;
else
session->mailboxwin = mailbox_win;
mailbox_win->mwin = mwin;
mailbox_win->buttonlist = NULL;
mailbox_win->button_state = BTN_NOSELECTION;
mailbox_win->done = 0;
mailbox_win->everything = FALSE;
mailbox_win->is_realized = FALSE;
mailbox_win->item_no = 0;
mailbox_win->move = FALSE;
mailbox_win->top_level = (subwin == TRUE) ? FALSE : TRUE;
mailbox_win->current = find_configuration(preferences.defaultConfig);
if(mailbox_win->current) {
mailbox_win->type = ((mailbox_win->current->type == SERVICE_NEWS)
|| (mailbox_win->current->type == SERVICE_NNTP))
? MAILBOX_TYPE_NEWS : MAILBOX_TYPE_MAIL;
}
else
mailbox_win->type = MAILBOX_TYPE_MAIL;
/*
* POP servers are defined as "news" here for the purpose of setting
* buttons. One cannot copy to the POP3 service.
*/
if((mailbox_win->type == MAILBOX_TYPE_NEWS) ||
(mailbox_win->current->type == SERVICE_POP))
mailbox_win->button_state |= BTN_MAILBOX_DONEWS;
else
mailbox_win->button_state |= BTN_MAILBOX_DOMAIL;
push_cursor(WATCH_CURSOR);
if(preferences.autoPlace == TRUE) {
XtSetArg(args[n], XtNx, -1000); n ++;
XtSetArg(args[n], XtNy, -1000); n ++;
}
XtSetArg (args[n], XmNdeleteResponse, XmDO_NOTHING); n++;
mailbox_win->shell = XtCreatePopupShell("mailopen",
topLevelShellWidgetClass,
session->shell,
args, n);
n = 0;
AddDestroyCallback (mailbox_win->shell);
setup_editres(mailbox_win->shell);
if(mbox_icon != (Pixmap) None)
XtVaSetValues(mailbox_win->shell,
XmNiconPixmap,mbox_icon,
NULL);
mailbox_win->form = XmCreateForm(mailbox_win->shell,
"form", args, n );
n = 0;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n ++;
mailbox_win->menubar = XmCreateMenuBar(mailbox_win->form,
"menubar", args, n);
n = 0;
XtManageChild(mailbox_win->menubar);
make_buttons(&mailbox_win->buttonlist, NULL,
mailbox_win->menubar,
mailboxopen_menu,
XtNumber(mailboxopen_menu),
mailbox_win->button_state,
(XtPointer) mailbox_win, ROOTMENULEVEL);
XtSetArg(args[n], XmNadjustMargin, FALSE); n ++;
XtSetArg(args[n], XmNmarginWidth, 0); n ++;
XtSetArg(args[n], XmNborderWidth, 0); n ++;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++;
XtSetArg(args[n], XmNtopWidget, mailbox_win->menubar); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNorientation, XmHORIZONTAL); n ++;
XtSetArg(args[n], XmNpacking, XmPACK_COLUMN); n ++;
mailbox_win->rowcol = XmCreateRowColumn(mailbox_win->form,
"rowcol", args, n);
n = 0;
if(mailbox_win->top_level) {
make_secondbuttons(mailbox_win->buttonlist,
mailbox_win->rowcol,
mailopen_buttons, XtNumber(mailopen_buttons),
mailbox_win->button_state, (XtPointer) mailbox_win);
}
else {
make_secondbuttons(mailbox_win->buttonlist,
mailbox_win->rowcol,
mailcopy_buttons, XtNumber(mailcopy_buttons),
mailbox_win->button_state, (XtPointer) mailbox_win);
}
XtManageChild(mailbox_win->rowcol);
XtSetArg(args[n], XmNtraversalOn, FALSE); n ++;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++;
XtSetArg(args[n], XmNtopWidget, mailbox_win->rowcol); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNborderWidth, 0); n ++;
mailbox_win->conf_button = XmCreatePushButton(mailbox_win->form,
"conf_button",
args, n);
n = 0;
XtManageChild(mailbox_win->conf_button);
XtAddCallback(mailbox_win->conf_button, XmNactivateCallback,
(XtCallbackProc) mailboxes_configure, mailbox_win );
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++;
XtSetArg(args[n], XmNtopWidget, mailbox_win->rowcol); n ++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n ++;
XtSetArg(args[n], XmNleftWidget,mailbox_win->conf_button); n ++;
mailbox_win->server = XmCreateTextField(mailbox_win->form,
"server_textfld",
args, n);
n = 0;
XtManageChild(mailbox_win->server);
translations = XtParseTranslationTable(GLOBAL_text_field_translations);
XtOverrideTranslations(mailbox_win->server,translations);
translations =
XtParseTranslationTable(GLOBAL_terminal_text_field_translations);
XtOverrideTranslations(mailbox_win->server,translations);
XtAddCallback(mailbox_win->server, XmNmodifyVerifyCallback,
(XtCallbackProc) text_field_edit, NULL);
XtAddCallback(mailbox_win->server, XmNactivateCallback,
(XtCallbackProc) mailboxes_set_configure,
(XtPointer) mailbox_win);
XmTextSetString(mailbox_win->server,
((mailbox_win->current != NULL) &&
(mailbox_win->current->name != NULL))
? mailbox_win->current->name
: EMPTYSTR);
XtSetArg(args[n], XmNtraversalOn, FALSE); n ++;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++;
XtSetArg(args[n], XmNtopWidget, mailbox_win->server); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNborderWidth, 0); n ++;
mailbox_win->patt_button = XmCreatePushButton(mailbox_win->form,
"patt_button",
args, n);
n = 0;
XtManageChild(mailbox_win->patt_button);
XtAddCallback(mailbox_win->patt_button, XmNactivateCallback,
(XtCallbackProc) mailboxes_toggle_pattern, mailbox_win );
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++;
XtSetArg(args[n], XmNtopWidget, mailbox_win->server); n ++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n ++;
XtSetArg(args[n], XmNleftWidget,mailbox_win->patt_button); n ++;
mailbox_win->pattern = XmCreateTextField(mailbox_win->form,
"pattern_textfld",
args, n);
n = 0;
XtManageChild(mailbox_win->pattern);
translations = XtParseTranslationTable(GLOBAL_text_field_translations);
XtOverrideTranslations(mailbox_win->pattern,translations);
translations =
XtParseTranslationTable(GLOBAL_terminal_text_field_translations);
XtOverrideTranslations(mailbox_win->pattern,translations);
XtAddCallback(mailbox_win->pattern, XmNmodifyVerifyCallback,
(XtCallbackProc) text_field_edit, NULL);
XtAddCallback(mailbox_win->pattern, XmNactivateCallback,
(XtCallbackProc) mailboxes_pattern,
(XtPointer) mailbox_win);
XmTextSetString(mailbox_win->pattern, MAILBOXDEFAULTPATTERN);
XtSetArg(args[n], XmNtraversalOn, FALSE); n ++;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++;
XtSetArg(args[n], XmNtopWidget, mailbox_win->pattern); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNborderWidth, 0); n ++;
mailbox_win->name_button = XmCreatePushButton(mailbox_win->form,
"name_button",
args, n);
n = 0;
XtManageChild(mailbox_win->name_button);
XtAddCallback(mailbox_win->name_button, XmNactivateCallback,
(XtCallbackProc) mailboxes_toggle_mailbox, mailbox_win );
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++;
XtSetArg(args[n], XmNtopWidget, mailbox_win->pattern); n ++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n ++;
XtSetArg(args[n], XmNleftWidget, mailbox_win->name_button); n ++;
mailbox_win->mailbox = XmCreateTextField(mailbox_win->form,
"mailbox_textfld",
args, n);
n = 0;
XtManageChild(mailbox_win->mailbox);
translations = XtParseTranslationTable(GLOBAL_text_field_translations);
XtOverrideTranslations(mailbox_win->mailbox,translations);
translations =
XtParseTranslationTable(GLOBAL_terminal_text_field_translations);
XtOverrideTranslations(mailbox_win->mailbox,translations);
XtAddCallback(mailbox_win->mailbox, XmNmodifyVerifyCallback,
(XtCallbackProc) text_field_edit, NULL);
if(mailbox_win->top_level)
XtAddCallback(mailbox_win->mailbox, XmNactivateCallback,
(XtCallbackProc) mailboxes_open,
(XtPointer) mailbox_win);
else
XtAddCallback(mailbox_win->mailbox, XmNactivateCallback,
(XtCallbackProc) mailboxes_copy,
(XtPointer) mailbox_win);
XmTextSetString(mailbox_win->mailbox,
((mailbox_win->current != NULL)
&& (mailbox_win->current->mailbox != NULL))
? mailbox_win->current->mailbox
: EMPTYSTR);
XtSetArg(args[n], XmNscrollBarDisplayPolicy, XmSTATIC); n ++;
XtSetArg(args[n], XmNlistSizePolicy, XmCONSTANT); n ++;
XtSetArg(args[n], XmNselectionPolicy, XmSINGLE_SELECT); n ++;
mailbox_win->list = XmCreateScrolledList(mailbox_win->form,"list",args,n);
n = 0;
XtAddCallback(mailbox_win->list, XmNsingleSelectionCallback,
(XtCallbackProc) mailboxes_select, mailbox_win);
if(mailbox_win->top_level)
XtAddCallback(mailbox_win->list, XmNdefaultActionCallback,
(XtCallbackProc) mailboxes_open, mailbox_win);
else
XtAddCallback(mailbox_win->list, XmNdefaultActionCallback,
(XtCallbackProc) mailboxes_copy, mailbox_win);
XtAddCallback(mailbox_win->shell, XmNpopdownCallback,
(XtCallbackProc) mailboxes_popdown, mailbox_win);
XtAddCallback(mailbox_win->shell, XmNdestroyCallback,
(XtCallbackProc) mailboxes_destroy, mailbox_win);
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++;
XtSetArg(args[n], XmNtopWidget, mailbox_win->mailbox); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n ++;
XtSetValues(XtParent(mailbox_win->list), args, n);
n = 0;
if(mailbox_win->top_level)
translations = XtParseTranslationTable(GLOBAL_mailboxes_pop_translations);
else
translations = XtParseTranslationTable(GLOBAL_mailcopy_pop_translations);
XtOverrideTranslations(mailbox_win->list,translations);
XtManageChild(mailbox_win->list);
XtManageChild(mailbox_win->form);
stuff_mailbox_list(mailbox_win, FALSE);
mailboxes_set_title(mailbox_win);
XtManageChild(mailbox_win->shell);
XtPopup(mailbox_win->shell, XtGrabNone);
position_popup_widget(mailbox_win->shell, FALSE);
XmProcessTraversal(mailbox_win->mailbox, XmTRAVERSE_CURRENT);
pop_cursor();
mailbox_win->is_realized = TRUE;
return(mailbox_win);
}
#ifdef __STDC__
void mailboxes_set_title(Mailbox_Win *mailbox_win)
#else
void mailboxes_set_title(mailbox_win)
Mailbox_Win *mailbox_win;
#endif
{
char buffer[512];
sprintf(buffer,"%s %s", (mailbox_win->everything)
? MLGetLocalized(XtNstrUnSubscribed,StrUnSubscribed)
: MLGetLocalized(XtNstrSubscribed,StrSubscribed),
(mailbox_win->type == MAILBOX_TYPE_NEWS)
? MLGetLocalized(XtNstrNewsgroups, StrNewsgroups)
: MLGetLocalized(XtNstrMailboxes, StrMailboxes));
XtVaSetValues(mailbox_win->shell,XtNtitle, buffer, NULL);
return;
}
#ifdef __STDC__
int set_config_current(Mailbox_Win *mailbox_win, Boolean warn)
#else
int set_config_current(mailbox_win, warn)
Mailbox_Win *mailbox_win;
Boolean warn;
#endif
{
char *conf;
Server_Config *server;
char buff[FILEBUFFLEN];
conf = GetTextField(mailbox_win->server);
if((*conf == NUL_TERM) || ((server = find_configuration(conf)) == NULL)) {
if(warn) {
sprintf(buff,MLGetLocalized(XtNmsgUnknownConfig,MsgUnknownConfig),conf);
mm_log(buff,WARN);
}
create_host_window(session->shell, conf);
fs_give((void **) &conf);
return(SYSCALL_FAILURE);
}
fs_give((void **) &conf);
if(server == mailbox_win->current) /* No change neccessary */
return(SYSCALL_SUCCESS);
mailbox_win->current = server;
XmTextSetString(mailbox_win->server,
(server->name) ? server->name : EMPTYSTR);
mailbox_win->type = ((server->type == SERVICE_NEWS)
|| (server->type == SERVICE_NNTP))
? MAILBOX_TYPE_NEWS : MAILBOX_TYPE_MAIL ;
/* Disable copy|move for news and pop3 */
if((mailbox_win->type == MAILBOX_TYPE_NEWS) ||
(mailbox_win->current->type == SERVICE_POP)) {
mailbox_win->button_state |= BTN_MAILBOX_DONEWS;
mailbox_win->button_state &= ~(BTN_MAILBOX_DOMAIL);
}
else {
mailbox_win->button_state |= BTN_MAILBOX_DOMAIL;
mailbox_win->button_state &= ~(BTN_MAILBOX_DONEWS);
}
mailboxes_check_buttons(mailbox_win);
if(server->mailbox)
XmTextSetString(mailbox_win->mailbox,server->mailbox);
else
XmTextSetString(mailbox_win->mailbox,EMPTYSTR);
stuff_mailbox_list(mailbox_win,TRUE);
return(SYSCALL_SUCCESS);
}
#ifdef __STDC__
void mailboxes_set_configure(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_set_configure(w, mailbox_win, xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
set_config_current(mailbox_win,FALSE);
XmProcessTraversal(mailbox_win->pattern, XmTRAVERSE_CURRENT);
return;
}
#ifdef __STDC__
void mailboxes_configure(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_configure(w, mailbox_win, xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
Server_Config *server;
if((set_config_current(mailbox_win, FALSE)) == SYSCALL_FAILURE)
return;
server = mailbox_win->current;
if(server) {
if(server->next)
server = server->next;
else
server = session->servers;
}
if(server) {
XmTextSetString(mailbox_win->server,server->name);
set_config_current(mailbox_win,FALSE);
}
return;
}
#ifdef __STDC__
void mailboxes_fetch(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_fetch(w, mailbox_win, xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
char *patt;
if((set_config_current(mailbox_win,TRUE)) == SYSCALL_FAILURE)
return;
patt = XmTextGetString(mailbox_win->pattern);
load_mailbox_list(mailbox_win, mailbox_win->current, patt,
(mailbox_win->everything == TRUE)
? LOAD_UNSUBSCRIBED : LOAD_SUBSCRIBED);
fs_give((void **) &patt);
stuff_mailbox_list(mailbox_win,FALSE);
return;
}
#ifdef __STDC__
void mailboxes_toggle_pattern(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_toggle_pattern(w, mailbox_win, xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
if(mailbox_win->everything)
XmTextSetString(mailbox_win->pattern, MAILBOXALLPATTERN);
else
XmTextSetString(mailbox_win->pattern, MAILBOXDEFAULTPATTERN);
return;
}
#ifdef __STDC__
void mailboxes_toggle_mailbox(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_toggle_mailbox(w, mailbox_win, xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
int *sel;
int total;
int pos;
int cnt;
XtVaGetValues(mailbox_win->list, XmNitemCount, &total, NULL);
if(total == 0)
return;
if(XmListGetSelectedPos(mailbox_win->list, &sel, &cnt))
pos = sel[0] + 1;
else
pos = 1;
if(cnt)
XtFree((XtPointer) sel);
if(pos > total)
pos = 1;
XmListDeselectAllItems(mailbox_win->list);
XmListSelectPos(mailbox_win->list,pos, TRUE);
return;
}
#ifdef __STDC__
void mailboxes_everything(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_everything(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
XmTextSetString(mailbox_win->pattern, MAILBOXALLPATTERN);
mailbox_win->everything = TRUE;
mailboxes_set_title(mailbox_win);
return;
}
#ifdef __STDC__
void mailboxes_subscribed(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_subscribed(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
XmTextSetString(mailbox_win->pattern, MAILBOXDEFAULTPATTERN);
mailbox_win->everything = FALSE;
mailboxes_set_title(mailbox_win);
return;
}
#define MOP_SUBSCRIBE 1
#define MOP_UNSUBSCRIBE 2
#define MOP_DESTROY 3
#define MOP_CREATE 4
#define MOP_RENAME 5
#define MOP_CREATE_ONLY 6
#ifdef __STDC__
void mailboxes_manage(Mailbox_Win *mailbox_win, int operation)
#else
void mailboxes_manage(mailbox_win, operation)
Mailbox_Win *mailbox_win;
int operation;
#endif
{
char *conf;
long openflags = 0L;
Server_Config *server;
char *server_str = NULL;
char *mailbox_str = NULL;
char *newname = NULL;
char *tmp = NULL;
char *patt;
int error = 0;
MAILSTREAM *mailstream = NIL;
if((set_config_current(mailbox_win,TRUE)) == SYSCALL_FAILURE)
return;
if(preferences.developer_debug == TRUE)
openflags = OP_DEBUG;
mailbox_str = get_mailbox_string_from_window(mailbox_win);
if(mailbox_str == NULL)
return;
if(*mailbox_str == NUL_TERM) {
fs_give((void **) &mailbox_str);
return;
}
if(operation == MOP_RENAME) {
tmp = input_string(mailbox_win->shell,
MLGetLocalized(XtNmsgNewMailboxName,
MsgNewMailboxName),
NULL, RENAMEMAILBOXHELPFILE);
if(tmp == NULL)
return;
if(*tmp == NUL_TERM) {
fs_give((void **) &tmp);
fs_give((void **) &mailbox_str);
return;
}
newname = format_mailboxname_server(mailbox_win->current,
tmp, mailbox_win->type);
fs_give((void **) &tmp);
if((strcmp(newname, mailbox_str)) == STRMATCH) {
fs_give((void **) &newname);
fs_give((void **) &mailbox_str);
return;
}
close_invalid_mailbox(mailbox_str);
}
if(mailbox_win->top_level == TRUE)
push_cursor(WATCH_CURSOR);
else
XDefineCursor(display, XtWindow(mailbox_win->shell), clock_cursor);
if(mailbox_win->current->imap) {
mailstream = mail_open(NIL,mailbox_win->current->imap,
openflags|OP_HALFOPEN);
if(mailstream == NIL) {
fs_give((void **) &mailbox_str);
if(newname)
fs_give((void **) &newname);
if(mailbox_win->top_level == TRUE)
pop_cursor();
else
XUndefineCursor(display, XtWindow(mailbox_win->shell));
return;
}
}
session->active = mailbox_win->current;
switch(operation) {
case MOP_SUBSCRIBE:
if(! mail_subscribe(mailstream,mailbox_str))
error = MOP_SUBSCRIBE;
break;
case MOP_UNSUBSCRIBE:
if(! mail_unsubscribe(mailstream,mailbox_str))
error = MOP_UNSUBSCRIBE;
if(! error)
XmTextSetString(mailbox_win->mailbox,EMPTYSTR);
break;
case MOP_CREATE:
if(mailbox_win->type == MAILBOX_TYPE_MAIL)
if(! mail_create(mailstream,mailbox_str))
error = MOP_CREATE;
if(! mail_subscribe(mailstream,mailbox_str))
error = MOP_SUBSCRIBE;
break;
case MOP_CREATE_ONLY:
if(mailbox_win->type == MAILBOX_TYPE_MAIL)
if(! mail_create(mailstream,mailbox_str))
error = MOP_CREATE;
break;
case MOP_DESTROY:
if(! mail_unsubscribe(mailstream,mailbox_str))
error = MOP_UNSUBSCRIBE;
if(mailbox_win->type == MAILBOX_TYPE_MAIL)
if((ml_confirm(mailbox_win->shell,
MLGetLocalized(XtNmsgDestroyMailbox,
MsgDestroyMailbox),
CONFIRM_OK_CANCEL)) == TRUE) {
close_invalid_mailbox(mailbox_str);
if(! mail_delete(mailstream,mailbox_str))
error = MOP_DESTROY;
}
if(! error)
XmTextSetString(mailbox_win->mailbox, EMPTYSTR);
break;
case MOP_RENAME:
if(mailbox_win->type == MAILBOX_TYPE_MAIL) {
if(! mail_unsubscribe(mailstream,mailbox_str))
error = MOP_UNSUBSCRIBE;
if(! mail_rename(mailstream,mailbox_str,newname))
error = MOP_RENAME;
if(! mail_subscribe(mailstream,newname))
error = MOP_SUBSCRIBE;
}
if(!error)
XmTextSetString(mailbox_win->mailbox,EMPTYSTR);
break;
default:
break;
}
if(mailstream != NIL)
mail_close(mailstream);
if(error)
mm_log(MLGetLocalized(XtNmsgMailboxOpFailed,
MsgMailboxOpFailed), WARN);
else
mm_log(MLGetLocalized(XtNmsgMailboxOpSuccess,
MsgMailboxOpSuccess), NIL);
if((mailbox_win->everything == FALSE) ||
((operation == MOP_CREATE) || operation == MOP_DESTROY)
|| (operation == MOP_RENAME)) {
patt = XmTextGetString(mailbox_win->pattern);
load_mailbox_list(mailbox_win, mailbox_win->current, patt,
(mailbox_win->everything == TRUE)
? LOAD_UNSUBSCRIBED : LOAD_SUBSCRIBED);
fs_give((void **) &patt);
stuff_mailbox_list(mailbox_win,FALSE);
}
if(mailbox_win->top_level == TRUE)
pop_cursor();
else
XUndefineCursor(display, XtWindow(mailbox_win->shell));
return;
}
#ifdef __STDC__
void mailboxes_create(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_create(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
mailboxes_manage(mailbox_win, MOP_CREATE);
return;
}
#ifdef __STDC__
void mailboxes_create_only(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_create_only(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
mailboxes_manage(mailbox_win, MOP_CREATE_ONLY);
return;
}
#ifdef __STDC__
void mailboxes_subscribe_only(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_subscribe_only(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
mailboxes_manage(mailbox_win, MOP_SUBSCRIBE);
return;
}
#ifdef __STDC__
void mailboxes_delete(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_delete(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
mailboxes_manage(mailbox_win, MOP_DESTROY);
return;
}
#ifdef __STDC__
void mailboxes_unsubscribe_only(Widget w, Mailbox_Win *mailbox_win,
XtPointer xp)
#else
void mailboxes_unsubscribe_only(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
mailboxes_manage(mailbox_win, MOP_UNSUBSCRIBE);
return;
}
#ifdef __STDC__
void mailboxes_rename(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_rename(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
mailboxes_manage(mailbox_win, MOP_RENAME);
return;
}
#ifdef __STDC__
void mailboxes_pattern(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_pattern(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
}
#ifdef __STDC__
void mailboxes_select(Widget w, Mailbox_Win *mailbox_win,
XmListCallbackStruct *xp)
#else
void mailboxes_select(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XmListCallbackStruct *xp;
#endif
{
char *str;
XmStringGetLtoR(xp->item, XmSTRING_DEFAULT_CHARSET, &str);
XmTextSetString(mailbox_win->mailbox,str);
fs_give((void **) &str);
/* In case they turned it off, keep it enabled. */
XmListSelectPos(mailbox_win->list,xp->item_position,FALSE);
mailbox_win->item_no = (unsigned long) xp->item_position;
mailbox_win->button_state &= ~(BTN_NOSELECTION);
mailboxes_check_buttons(mailbox_win);
return;
}
#ifdef __STDC__
void mailboxes_open(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_open(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
Mailbox *mailbox;
char *mailboxname;
char *fixedname;
if((set_config_current(mailbox_win,TRUE)) == SYSCALL_FAILURE)
return;
push_cursor(WATCH_CURSOR);
mailbox = new_mailbox();
mailbox->has_new_mail = FALSE;
mailbox->auto_scan = FALSE;
mailbox->server = mailbox_win->current;
mailboxname = GetTextField(mailbox_win->mailbox);
fixedname = fix_mailboxpath(mailboxname);
mailbox->host = cpystr((mailbox_win->current->hostname)
? mailbox_win->current->hostname : EMPTYSTR);
mailbox->mailboxname = cpystr(fixedname);
mailbox->type = mailbox_win->type;
if(*fixedname != NUL_TERM)
mailbox->imapname = format_mailboxname_server(mailbox_win->current,
fixedname, mailbox_win->type);
fs_give((void **) &mailboxname);
fs_give((void **) &fixedname);
mailboxes_close_window(w,mailbox_win,xp);
session->active = mailbox_win->current;
if((mailbox->imapname != NULL) && (*mailbox->imapname != NUL_TERM))
open_mailbox(mailbox_win->mwin, mailbox, FALSE);
else {
mwin_cancel(mailbox_win->mwin);
free_mailbox(mailbox);
}
session->active = NULL;
pop_cursor();
return;
}
#ifdef __STDC__
void mailboxes_scan(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_scan(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
char *mailboxname;
char *fixedname;
int current_count;
Mailbox *mailbox;
if(mailbox_win->item_no == 0L) {
mm_log(MLGetLocalized(XtNmsgNoMailboxSelected,
MsgNoMailboxSelected), WARN);
return;
}
if((set_config_current(mailbox_win,TRUE)) == SYSCALL_FAILURE)
return;
push_cursor(WATCH_CURSOR);
mailbox = new_mailbox();
close_autoscan_mailbox();
mailbox->has_new_mail = FALSE;
mailbox->auto_scan = TRUE;
mailbox->server = mailbox_win->current;
mailboxname = GetTextField(mailbox_win->mailbox);
fixedname = fix_mailboxpath(mailboxname);
mailbox->host = cpystr((mailbox_win->current->hostname)
? (mailbox_win->current->hostname) : EMPTYSTR);
mailbox->mailboxname = cpystr(fixedname);
mailbox->type = mailbox_win->type;
if(*fixedname != NUL_TERM)
mailbox->imapname = format_mailboxname_server(mailbox_win->current,
fixedname, mailbox_win->type);
fs_give((void **) &mailboxname);
fs_give((void **) &fixedname);
session->active = mailbox_win->current;
if((mailbox->imapname != NULL) && (*mailbox->imapname != NUL_TERM)) {
if(mailbox_win->mwin->destroyed == TRUE)
mailbox_win->mwin = create_main_window(NULL);
open_mailbox(mailbox_win->mwin,mailbox, FALSE);
}
else {
free_mailbox(mailbox);
mwin_cancel(mailbox_win->mwin);
}
session->active = NULL;
XmListDeselectAllItems(mailbox_win->list);
XtVaGetValues(mailbox_win->list, XmNitemCount, ¤t_count, NULL);
if(mailbox_win->item_no < current_count)
XmListSelectPos(mailbox_win->list,mailbox_win->item_no + 1, TRUE);
else {
mailbox_win->item_no = 0L;
mailbox_win->button_state |= BTN_NOSELECTION;
mailboxes_check_buttons(mailbox_win);
}
pop_cursor();
return;
}
#ifdef __STDC__
void mailboxes_dismiss(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_dismiss(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
XUndefineCursor(display, XtWindow(mailbox_win->shell));
XtPopdown(mailbox_win->shell);
mailbox_win->is_realized = FALSE;
mwin_cancel(mailbox_win->mwin);
return;
}
#ifdef __STDC__
void mailboxes_cancel(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_cancel(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
XmTextSetString(mailbox_win->mailbox,EMPTYSTR);
mailbox_win->done = 1;
return;
}
#ifdef __STDC__
void mailboxes_close_window(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_close_window(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
XUndefineCursor(display, XtWindow(mailbox_win->shell));
XtPopdown(mailbox_win->shell);
mailbox_win->is_realized = FALSE;
return;
}
#ifdef __STDC__
void mailboxes_popdown(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_popdown(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
XUndefineCursor(display, XtWindow(mailbox_win->shell));
mailbox_win->is_realized = FALSE;
return;
}
#ifdef __STDC__
void mailboxes_destroy(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_destroy(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
Boolean toplevel;
if(mailbox_win) {
toplevel = mailbox_win->top_level;
free_buttonlist(mailbox_win->buttonlist);
fs_give((void **) &mailbox_win);
if(toplevel == TRUE)
session->mailboxwin = NULL;
else
session->mailcopywin = NULL;
}
return;
}
#ifdef __STDC__
void mailboxes_help(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_help(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
help(mailbox_win->shell,MAILBOXESHELPFILE);
return;
}
#ifdef __STDC__
void close_invalid_mailbox(char *str)
#else
void close_invalid_mailbox(str)
char *str;
#endif
{
Mailbox *mailbox;
for(mailbox = session->mailboxes; mailbox; mailbox = mailbox->next)
if(strcmp(str,mailbox->imapname) == STRMATCH) {
close_mailbox(mailbox);
break;
}
return;
}
#ifdef __STDC__
void close_autoscan_mailbox(void)
#else
void close_autoscan_mailbox()
#endif
{
Mailbox *mailbox;
Boolean found;
do {
found = FALSE;
for(mailbox = session->mailboxes; mailbox; mailbox = mailbox->next) {
if(mailbox->auto_scan == TRUE) {
found = TRUE;
close_mailbox(mailbox);
break;
}
}
} while(found == TRUE);
return;
}
#ifdef __STDC__
void mblist_help(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mblist_help(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
help(mailbox_win->shell,MAILBOXESHELPFILE);
return;
}
#ifdef __STDC__
void mblist_select(Widget w, Mailbox_Win *mailbox_win,
XmListCallbackStruct *xp)
#else
void mblist_select(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XmListCallbackStruct *xp;
#endif
{
char *str;
XmStringGetLtoR(xp->item, XmSTRING_DEFAULT_CHARSET, &str);
XmTextSetString(mailbox_win->mailbox,str);
fs_give((void **) &str);
return;
}
#ifdef __STDC__
void mailboxes_copy(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_copy(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
mailbox_win->move = FALSE;
mailbox_win->done = TRUE;
return;
}
#ifdef __STDC__
void mailboxes_move(Widget w, Mailbox_Win *mailbox_win, XtPointer xp)
#else
void mailboxes_move(w,mailbox_win,xp)
Widget w;
Mailbox_Win *mailbox_win;
XtPointer xp;
#endif
{
mailbox_win->move = TRUE;
mailbox_win->done = TRUE;
return;
}
#ifdef __STDC__
char *fix_netmailboxpath(char * str, Boolean *changed)
#else
char *fix_netmailboxpath(str, changed)
char *str;
Boolean *changed;
#endif
{
char *ptr;
char buff[FILEBUFFLEN];
Server_Config *config;
char *tmp = NULL;
*changed = FALSE;
if(str == NULL)
return(NULL);
if(*str == NUL_TERM)
return(cpystr(str));
strcpy(buff,str);
if((ptr = strchr(buff,COLONCHAR)) == NULL)
return(fix_mailboxpath(buff));
*ptr = NUL_TERM;
ptr ++;
config = find_configuration(buff);
if(config == NULL)
return(fix_mailboxpath(buff));
if((config == NULL) ||
((config->type != SERVICE_LOCAL) && (config->type != SERVICE_IMAP))) {
mm_log(MLGetLocalized(XtNmsgUnsupportedConfig,
MsgUnsupportedConfig), WARN);
return(NULL);
}
*changed = TRUE;
session->active = config;
tmp = fix_mailboxpath(ptr);
strcpy(buff,(config->imap) ? config->imap : EMPTYSTR);
strcat(buff,(tmp) ? tmp : EMPTYSTR);
if(tmp)
fs_give((void **) &tmp);
return(cpystr(buff));
}
#ifdef __STDC__
char *fix_mailboxpath(char *str)
#else
char *fix_mailboxpath(str)
char * str;
#endif
{
char *ret = NULL;
char *ptr = NULL;
if(str == NULL || *str == NUL_TERM)
return(cpystr(EMPTYSTR));
if((strcasecmp(str,INBOX)) == 0)
ucase(str);
if(*str == '{' && ((ptr = strchr(str,'}')) != NULL))
ptr ++;
else
ptr = str;
if(*ptr != PLUSCHAR)
return(cpystr(ptr));
ptr ++;
if(*ptr == PLUSCHAR)
return(cpystr(ptr));
if((preferences.folder_path == NULL)
|| (*preferences.folder_path == NUL_TERM))
return(cpystr(ptr));
ret = (char *) fs_get(strlen(ptr) + strlen(preferences.folder_path) + 2);
strcpy(ret,preferences.folder_path);
if(ret[strlen(ret) - 1] != PATH_SEPARATOR_CHAR)
strcat(ret,PATH_SEPARATOR_STR);
strcat(ret,ptr);
return(ret);
}
#ifdef __STDC__
char *unfix_mailboxpath(char *str)
#else
char *unfix_mailboxpath(str)
char *str;
#endif
{
char *buf = NULL;
char *ret = NULL;
char *ptr = NULL;
if((str == NULL) || (*str == NUL_TERM))
return(cpystr(EMPTYSTR));
if(*str == '{' && ((ptr = strchr(str,'}')) != NULL))
ptr ++;
else
ptr = str;
if((preferences.folder_path == NULL)
|| (*preferences.folder_path == NUL_TERM))
return(cpystr(ptr));
buf = (char *) fs_get(strlen(ptr) + strlen(preferences.folder_path) + 2);
ret = (char *) fs_get(strlen(ptr) + strlen(preferences.folder_path) + 2);
strcpy(buf,preferences.folder_path);
if(buf[strlen(buf) - 1] != PATH_SEPARATOR_CHAR)
strcat(buf,PATH_SEPARATOR_STR);
if(strncmp(ptr,buf,strlen(buf)) == STRMATCH) {
strcpy(ret,PLUSSTR);
strcat(ret,ptr + strlen(buf));
fs_give((void **) &buf);
}
else {
fs_give((void **) &buf);
strcpy(ret,ptr);
}
return(ret);
}
#ifdef __STDC__
void load_mailbox_list(Mailbox_Win *mailbox_win, Server_Config *server,
char *patt, int loadflags)
#else
void load_mailbox_list(mailbox_win, server,patt,loadflags)
Mailbox_Win *mailbox_win;
Server_Config *server;
char *patt;
int loadflags;
#endif
{
MAILSTREAM *mailstream = NULL;
long openflags = 0L;
char *tmp = NULL;
char newpatt[FILEBUFFLEN];
if(preferences.developer_debug == TRUE)
openflags = OP_DEBUG;
if((loadflags == LOAD_UNSUBSCRIBED)
&& (((strcmp(patt,MAILBOXNONOPATTERN)) == STRMATCH)
|| ((strcmp(patt,MAILBOXDEFAULTPATTERN)) == STRMATCH))
&& ((ml_confirm(session->shell,
MLGetLocalized(XtNmsgEntireUniverse,
MsgEntireUniverse),
CONFIRM_OK_CANCEL))== FALSE))
return;
if(mailbox_win && mailbox_win->top_level == FALSE)
XDefineCursor(display, XtWindow(mailbox_win->shell), clock_cursor);
else
push_cursor(WATCH_CURSOR);
tmp = fix_mailboxpath(patt);
session->active = server;
if(server->imap) {
mailstream = mail_open(NIL,server->imap,openflags|OP_HALFOPEN);
if(mailstream == NIL) {
pop_cursor();
session->active = NULL;
return;
}
}
sprintf(newpatt,"%s%s",(server->imap) ? server->imap : EMPTYSTR, tmp);
fs_give((void **) &tmp);
switch(loadflags) {
case LOAD_SUBSCRIBED:
free_mailbox_list(server->subscribed);
server->subscribed = NULL;
server->in_use = TRUE;
mail_lsub(mailstream,NIL,newpatt);
server->in_use = FALSE;
if(server->subscribed)
sort_mailbox_list(&server->subscribed);
break;
case LOAD_UNSUBSCRIBED:
free_mailbox_list(server->unsubscribed);
server->unsubscribed = NULL;
server->in_use = TRUE;
if(mailstream)
mail_parameters(mailstream,SET_IMAP2FINDALL,(void *) 1);
mail_list(mailstream,NIL,newpatt);
if(mailstream)
mail_parameters(mailstream,SET_IMAP2FINDALL,(void *) 0);
server->in_use = FALSE;
if(server->unsubscribed)
sort_mailbox_list(&server->unsubscribed);
break;
default:
break;
}
if(mailstream)
mail_close(mailstream);
session->active = NULL;
if(mailbox_win && mailbox_win->top_level == FALSE)
XUndefineCursor(display, XtWindow(mailbox_win->shell));
else
pop_cursor();
return;
}
#ifdef __STDC__
void stuff_mailbox_list(Mailbox_Win *mailbox_win, Boolean force)
#else
void stuff_mailbox_list(mailbox_win,force)
Mailbox_Win *mailbox_win;
Boolean force;
#endif
{
Mailbox_List *mailbox_list;
Mailbox_List *ptr;
char *fixedname;
XmString xstr;
XmListDeselectAllItems(mailbox_win->list);
mailbox_win->item_no = 0L;
mailbox_win->button_state |= BTN_NOSELECTION;
if(mailbox_win->is_realized == TRUE)
mailboxes_check_buttons(mailbox_win);
XmListDeleteAllItems(mailbox_win->list);
if(mailbox_win->current) {
if(mailbox_win->everything == TRUE)
mailbox_list = mailbox_win->current->unsubscribed;
else
mailbox_list = mailbox_win->current->subscribed;
}
for(ptr = mailbox_list; ptr; ptr = ptr->prev) {
fixedname = unfix_mailboxpath(ptr->name);
xstr = XmStringCreateSimple(fixedname);
fs_give((void **) &fixedname);
XmListAddItemUnselected(mailbox_win->list,xstr,0);
XmStringFree(xstr);
}
return;
}
#ifdef __STDC__
int mailbox_compare(const void *n1, const void *n2)
#else
int mailbox_compare(n1,n2)
const void *n1;
const void *n2;
#endif
{
Mailbox_List **name1 = (Mailbox_List **) n1;
Mailbox_List **name2 = (Mailbox_List **) n2;
char *fixedname1;
char *fixedname2;
int result;
fixedname1 = unfix_mailboxpath((*(name1))->name);
fixedname2 = unfix_mailboxpath((*(name2))->name);
result = strcmp(fixedname1, fixedname2);
/* ensure INBOX is first in the list */
if(strcasecmp(fixedname1,INBOX) == STRMATCH)
result = (-1);
if(strcasecmp(fixedname2,INBOX) == STRMATCH)
result = 1;
fs_give((void **) &fixedname1);
fs_give((void **) &fixedname2);
return(result);
}
#ifdef __STDC__
void sort_mailbox_list(Mailbox_List **list)
#else
void sort_mailbox_list(list)
Mailbox_List **list;
#endif
{
Mailbox_List **sort;
Mailbox_List *mailbox_list;
int n = 0;
int total = 0;
for(mailbox_list = *list ; mailbox_list; mailbox_list = mailbox_list->prev)
total ++;
if(total < 2)
return;
sort = (Mailbox_List **) fs_get(total * sizeof(Mailbox_List *));
for(mailbox_list = *list; mailbox_list; mailbox_list = mailbox_list->prev) {
sort[n] = mailbox_list;
n ++;
}
qsort((char *) sort, total, sizeof(Mailbox_List **), mailbox_compare);
for(n = 0; n < total; n ++) {
mailbox_list = sort[n];
if(n == 0)
*list = mailbox_list;
if(n < (total - 1))
mailbox_list->prev = sort[n + 1];
else
mailbox_list->prev = NULL;
}
fs_give((void **) &sort);
return;
}
#ifdef __STDC__
char *format_mailbox_name(char *server,char *mailbox,int type)
#else
char *format_mailbox_name(server,mailbox,type)
char *server;
char *mailbox;
int type;
#endif
{
Server_Config *server_config;
char buff[FILEBUFFLEN];
char *ret;
char *tmp;
*buff = NUL_TERM;
tmp = fix_mailboxpath(mailbox);
if(tmp) {
server_config = find_server_by_host(server);
if(server_config) {
strcpy(buff, (server_config->imap) ? server_config->imap : EMPTYSTR);
if(type == MAILBOX_TYPE_NEWS)
strcat(buff,NEWSNAMESTART);
strcat(buff,tmp);
}
fs_give((void **) &tmp);
}
ret = cpystr(buff);
return(ret);
}
#ifdef __STDC__
char *format_mailboxname_server(Server_Config *server,char *mailbox,int type)
#else
char *format_mailboxname_server(server,mailbox,type)
Server_Config *server;
char *mailbox;
int type;
#endif
{
char buff[FILEBUFFLEN];
char *ret;
char *tmp;
*buff = NUL_TERM;
tmp = fix_mailboxpath(mailbox);
if(tmp) {
if(server) {
strcpy(buff, (server->imap) ? server->imap : EMPTYSTR);
if(type == MAILBOX_TYPE_NEWS)
strcat(buff,NEWSNAMESTART);
strcat(buff,tmp);
}
fs_give((void **) &tmp);
}
ret = cpystr(buff);
return(ret);
}
#ifdef __STDC__
char *get_mailbox_string_from_window(Mailbox_Win *mailbox_win)
#else
char *get_mailbox_string_from_window(mailbox_win)
Mailbox_Win *mailbox_win;
#endif
{
char *mailbox;
char *ret = NULL;
if((set_config_current(mailbox_win,TRUE)) == SYSCALL_FAILURE)
return(NULL);
mailbox = GetTextField(mailbox_win->mailbox);
if(*mailbox != NUL_TERM) {
ret = format_mailboxname_server(mailbox_win->current, mailbox,
mailbox_win->type);
fs_give((void **) &mailbox);
}
else
fs_give((void **) &mailbox);
return(ret);
}
#ifdef __STDC__
char *get_mailbox_simple_from_window(Mailbox_Win *mailbox_win)
#else
char *get_mailbox_simple_from_window(mailbox_win)
Mailbox_Win *mailbox_win;
#endif
{
char *mailbox;
char *ret = NULL;
mailbox = GetTextField(mailbox_win->mailbox);
ret = fix_mailboxpath(mailbox);
fs_give((void **) &mailbox);
return(ret);
}
#ifdef __STDC__
void mailboxes_pop(Widget w, XtPointer xp)
#else
void mailboxes_pop(w,xp)
Widget w;
XtPointer xp;
#endif
{
if((session->mailboxwin != NULL)
&& (session->mailboxwin->is_realized == TRUE))
mailboxes_dismiss(w,session->mailboxwin,NULL);
return;
}
#ifdef __STDC__
void mailcopy_pop(Widget w, XtPointer xp)
#else
void mailcopy_pop(w,xp)
Widget w;
XtPointer xp;
#endif
{
if((session->mailcopywin != NULL)
&& (session->mailcopywin->is_realized == TRUE))
mailboxes_cancel(w,session->mailcopywin,NULL);
return;
}
syntax highlighted by Code2HTML, v. 0.9.1