/* * Turn a list of address structures into a formatted string * * Args: adrlist -- An adrlist * f -- Function to use to print one address in list. If NULL, * use rfc822_write_address_decode to print whole list. * do_quote -- Quote quotes and dots (only used if f == NULL). * Result: comma separated list of addresses which is * malloced here and returned * (the list is rfc1522 decoded unless f is *not* NULL) */ char * addr_list_string(struct mail_address *adrlist, char *(*f)(struct mail_address *, char *, size_t), int do_quote) { size_t len; char *list, *s, string[MAX_ADDR_EXPN+1]; register ADDRESS *a; if(!adrlist) return(cpystr("")); if(f){ len = 0; for(a = adrlist; a; a = a->next) len += (strlen((*f)(a, string, sizeof(string))) + 2); list = (char *) fs_get((len+1) * sizeof(char)); s = list; s[0] = '\0'; for(a = adrlist; a; a = a->next){ sstrncpy(&s, (*f)(a, string, sizeof(string)), len-(s-list)); if(a->next && len-(s-list) > 2){ *s++ = ','; *s++ = SPACE; } } } else{ len = est_size(adrlist); list = (char *) fs_get((len+1) * sizeof(char)); list[0] = '\0'; rfc822_write_address_decode(list, len+1, adrlist, do_quote); removing_leading_and_trailing_white_space(list); } list[len] = '\0'; return(list); }
/* * format_new_mail_msg - actual work of generating intro, * from, subject and expanded subject */ void format_new_mail_msg(char *folder, long int number, ENVELOPE *e, char *intro, char *from, char *subj, char *subjex, size_t buflen) /* min length of each of the 4 above if they're non-null */ { char *p, tmp[MAILTMPLEN+1], subj_leadin[MAILTMPLEN]; static char *carray[] = { "regarding", "concerning", "about", "as to", "as regards", "as respects", "in re", "re", "respecting", "in point of", "with regard to", "subject:" }; if(buflen > 0){ if(intro) intro[0] = '\0'; if(from) from[0] = '\0'; if(subj) subj[0] = '\0'; if(subjex) subjex[0] = '\0'; } if(from && e && e->from){ if(e->from->personal && e->from->personal[0]){ /* * The reason we use so many characters for tmp is because we * may have multiple MIME3 chunks and we don't want to truncate * in the middle of one of them before decoding. */ snprintf(tmp, sizeof(tmp), "%s", e->from->personal); p = (char *) rfc1522_decode_to_utf8((unsigned char *) tmp_20k_buf, SIZEOF_20KBUF, tmp); removing_leading_and_trailing_white_space(p); if(*p) snprintf(from, buflen, "%.200s", p); } if(!from[0]){ snprintf(tmp, sizeof(tmp), "%s%s%s", e->from->mailbox, e->from->host ? "@" : "", e->from->host ? e->from->host : ""); snprintf(from, buflen, "%.200s", tmp); } } if(number <= 1L){ if(e && e->subject && e->subject[0]){ snprintf(tmp, sizeof(tmp), "%s", e->subject); p = (char *) rfc1522_decode_to_utf8((unsigned char *)tmp_20k_buf, SIZEOF_20KBUF, tmp); if(subj) snprintf(subj, buflen, "%.200s", p); } snprintf(subj_leadin, sizeof(subj_leadin), " %s ", carray[(unsigned)random()%12]); if(!(from && from[0])) subj_leadin[1] = toupper((unsigned char)subj_leadin[1]); } if(subj && subjex){ if(subj[0]){ snprintf(subjex, buflen, "%s%.200s%s", (number <= 1L) ? (subj[0] ? subj_leadin : "") : "", (number <= 1L) ? (subj[0] ? subj : from ? " w" : " W") : "", (number <= 1L) ? (subj[0] ? "" : "ith no subject") : ""); } else subj[0] = subjex[0] = '\0'; } if(intro){ if(!folder){ if(number > 1) /* TRANSLATORS: The argument is the number of new messages */ snprintf(intro, buflen, _("%ld new messages!"), number); else /* TRANSLATORS: The argument is either " to you" or nothing */ snprintf(intro, buflen, _("New mail%s!"), (e && address_is_us(e->to, ps_global)) ? _(" to you") : ""); } else { long fl, tot, newfl; char *fname = folder ? (char *) folder_name_decoded((unsigned char *) folder) : ""; if(number > 1) snprintf(intro, buflen, _("%ld messages saved to folder \"%.80s\""), number, fname); else snprintf(intro, buflen, _("Mail saved to folder \"%.80s\""), fname); if((fl=utf8_width(fname)) > 10 && (tot=utf8_width(intro) + utf8_width(from ? from : "") + utf8_width(subj ? subj : "")) > ps_global->ttyo->screen_cols - 2){ char *f = fs_get((strlen(fname) + 1)*sizeof(char)); newfl = MAX(10, fl-(tot-(ps_global->ttyo->screen_cols - 2))); utf8_to_width_rhs(f, fname, strlen(fname) + 1, newfl-3); if(number > 1) snprintf(intro, buflen, _("%ld messages saved to folder \"...%.80s\""), number, f); else snprintf(intro, buflen, _("Mail saved to folder \"...%.80s\""), f); if(f) fs_give((void **)&f); } if (fname && *fname) fs_give((void **)&fname); } } }
/* * format_view_margin - return sane value for vertical margins */ int * format_view_margin(void) { static int margin[2]; char tmp[100], e[200], *err, lastchar = 0; int left = 0, right = 0, leftm = 0, rightm = 0; size_t l; memset(margin, 0, sizeof(margin)); /* * We initially tried to make sure that the user didn't shoot themselves * in the foot by setting this too small. People seem to want to do some * strange stuff, so we're going to relax the wild shot detection and * let people set what they want, until we get to the point of totally * absurd. We've also added the possibility of appending the letter c * onto the width. That means treat the value as an absolute column * instead of a width. That is, a right margin of 76c means wrap at * column 76, whereas right margin of 4 means to wrap at column * screen width - 4. */ if(ps_global->VAR_VIEW_MARGIN_LEFT){ strncpy(tmp, ps_global->VAR_VIEW_MARGIN_LEFT, sizeof(tmp)-1); tmp[sizeof(tmp)-1] = '\0'; removing_leading_and_trailing_white_space(tmp); if(tmp[0]){ l = strlen(tmp); if(l > 0) lastchar = tmp[l-1]; if(lastchar == 'c') tmp[l-1] = '\0'; if((err = strtoval(tmp, &left, 0, 0, 0, e, sizeof(e), "Viewer-margin-left")) != NULL){ leftm = 0; dprint((2, "%s\n", err)); } else{ if(lastchar == 'c') leftm = left-1; else leftm = left; leftm = MIN(MAX(0, leftm), ps_global->ttyo->screen_cols); } } } if(ps_global->VAR_VIEW_MARGIN_RIGHT){ strncpy(tmp, ps_global->VAR_VIEW_MARGIN_RIGHT, sizeof(tmp)-1); tmp[sizeof(tmp)-1] = '\0'; removing_leading_and_trailing_white_space(tmp); if(tmp[0]){ l = strlen(tmp); if(l > 0) lastchar = tmp[l-1]; if(lastchar == 'c') tmp[l-1] = '\0'; if((err = strtoval(tmp, &right, 0, 0, 0, e, sizeof(e), "Viewer-margin-right")) != NULL){ rightm = 0; dprint((2, "%s\n", err)); } else{ if(lastchar == 'c') rightm = ps_global->ttyo->screen_cols - right; else rightm = right; rightm = MIN(MAX(0, rightm), ps_global->ttyo->screen_cols); } } } if((rightm > 0 || leftm > 0) && rightm >= 0 && leftm >= 0 && ps_global->ttyo->screen_cols - rightm - leftm >= 8){ margin[0] = leftm; margin[1] = rightm; } return(margin); }
int to_charsets_text_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags) { int rv = 0; char **newval = NULL; void (*prev_screen)(struct pine *) = ps->prev_screen, (*redraw)(void) = ps->redrawer; OPT_SCREEN_S *saved_screen = NULL; char **apval; char *charset = NULL; switch(cmd){ case MC_CHOICE: if(fixed_var((*cl)->var, NULL, NULL)) break; apval = APVAL((*cl)->var, ew); if(apval){ int cac_flags = CAC_ALL; ps->redrawer = NULL; ps->next_screen = SCREEN_FUN_NULL; saved_screen = opt_screen; if((*cl)->var == &ps->vars[V_POST_CHAR_SET]) cac_flags = CAC_POSTING; #ifndef _WINDOWS else if((*cl)->var == &ps->vars[V_CHAR_SET] || (*cl)->var == &ps->vars[V_KEY_CHAR_SET]) cac_flags = CAC_DISPLAY; #endif /* !_WINDOWS */ charset = choose_a_charset(cac_flags); removing_leading_and_trailing_white_space(charset); if(charset && *charset){ rv = 1; if(apval && *apval) fs_give((void **) apval); *apval = charset; charset = NULL; newval = &(*cl)->value; /* this stuff is from bottom of text_toolit() */ /* * At this point, if changes occurred, var->user_val.X is set. * So, fix the current_val, and handle special cases... * * NOTE: we don't worry about the "fixed variable" case here, because * editing such vars should have been prevented above... */ /* * Now go and set the current_val based on user_val changes * above. Turn off command line settings... */ set_current_val((*cl)->var, TRUE, FALSE); fix_side_effects(ps, (*cl)->var, 0); if(newval){ if(*newval) fs_give((void **) newval); *newval = pretty_value(ps, *cl); } exception_override_warning((*cl)->var); } else{ ps->next_screen = prev_screen; ps->redrawer = redraw; rv = 0; } if(charset) fs_give((void **) &charset); opt_screen = saved_screen; ps->mangled_screen = 1; } break; default: rv = text_tool(ps, cmd, cl, flags); break; } return(rv); }
int stayopen_list_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags) { int rv = 0; char **newval = NULL; char **ltmp = NULL; char *folder = NULL; void (*prev_screen)(struct pine *) = ps->prev_screen, (*redraw)(void) = ps->redrawer; OPT_SCREEN_S *saved_screen = NULL; switch(cmd){ case MC_CHOICE: if(fixed_var((*cl)->var, NULL, NULL)) break; ps->redrawer = NULL; ps->next_screen = SCREEN_FUN_NULL; saved_screen = opt_screen; folder = folder_for_config(FOR_OPTIONSCREEN); removing_leading_and_trailing_white_space(folder); if(folder && *folder){ ltmp = (char **) fs_get(2 * sizeof(char *)); ltmp[0] = cpystr(folder); ltmp[1] = NULL; config_add_list(ps, cl, ltmp, &newval, 0); if(ltmp) fs_give((void **) <mp); rv = 1; /* this stuff is from bottom of text_toolit() */ /* * At this point, if changes occurred, var->user_val.X is set. * So, fix the current_val, and handle special cases... * * NOTE: we don't worry about the "fixed variable" case here, because * editing such vars should have been prevented above... */ /* * Now go and set the current_val based on user_val changes * above. Turn off command line settings... */ set_current_val((*cl)->var, TRUE, FALSE); fix_side_effects(ps, (*cl)->var, 0); /* * Delay setting the displayed value until "var.current_val" is set * in case current val get's changed due to a special case above. */ if(newval){ if(*newval) fs_give((void **) newval); *newval = pretty_value(ps, *cl); } exception_override_warning((*cl)->var); if(folder) fs_give((void **) &folder); } else{ ps->next_screen = prev_screen; ps->redrawer = redraw; rv = 0; } opt_screen = saved_screen; ps->mangled_screen = 1; break; default: rv = text_tool(ps, cmd, cl, flags); break; } return(rv); }
/* * Dialog proc to handle login * * Configures the dialog box on init and retrieves the settings on exit. */ BOOL CALLBACK __export config_dialog_proc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { DLG_CONFIGDATA *dlgcfg; BOOL ret = FALSE; int checked, def_rem_fldr = 1, def_diff_fldr = 0; switch (uMsg) { case WM_INITDIALOG: dlgcfg = (DLG_CONFIGDATA *)lParam; SetWindowLong (hDlg, WINDOW_USER_DATA, (LONG) dlgcfg); if(ps_global->install_flag) SetDlgItemText(hDlg, IDC_CONFTEXT, TEXT("Please specify where Alpine should create (or look for) your personal configuration file.")); SetDlgItemText(hDlg, IDC_CONFEFLDRNAME, TEXT("remote_pinerc")); if(*dlgcfg->confpath){ if(dlgcfg->confpath[0] == '{'){ LPTSTR tfldr, p, tfldr2, p2, user; tfldr = utf8_to_lptstr((LPSTR)(dlgcfg->confpath+1)); if(p = _tcschr(tfldr, '}')){ *p++ = '\0'; if(_tcscmp(TEXT("remote_pinerc"), p)){ SetDlgItemText(hDlg, IDC_CONFEFLDRNAME, p); def_diff_fldr = 1; } tfldr2 = _tcsdup(tfldr); for(p = tfldr, p2 = tfldr2; *p; p++) if(*p == '/' && !_tcsnicmp(p, TEXT("/user="******"remote_pinerc")); break; case IDC_CONFRRADIO: case IDC_CONFLRADIO: CheckRadioButton (hDlg, IDC_CONFRRADIO, IDC_CONFLRADIO, wParam); EnableWindow(GetDlgItem(hDlg, IDC_CONFFNTXT), wParam == IDC_CONFRRADIO ? 0 : 1); EnableWindow(GetDlgItem(hDlg, IDC_CONFEFN), wParam == IDC_CONFRRADIO ? 0 : 1); EnableWindow(GetDlgItem(hDlg, IDC_CONFBROWSE), wParam == IDC_CONFRRADIO ? 0 : 1); EnableWindow(GetDlgItem(hDlg, IDC_CONFSRVRTXT), wParam == IDC_CONFRRADIO ? 1 : 0); EnableWindow(GetDlgItem(hDlg, IDC_CONFESERVER), wParam == IDC_CONFRRADIO ? 1 : 0); EnableWindow(GetDlgItem(hDlg, IDC_CONFUNTXT), wParam == IDC_CONFRRADIO ? 1 : 0); EnableWindow(GetDlgItem(hDlg, IDC_CONFEUSERNAME), wParam == IDC_CONFRRADIO ? 1 : 0); EnableWindow(GetDlgItem(hDlg, IDC_CONFDFLTFLDR), wParam == IDC_CONFRRADIO ? 1 : 0); if(wParam == IDC_CONFRRADIO && IsDlgButtonChecked(hDlg, IDC_CONFDFLTFLDR) == BST_UNCHECKED){ EnableWindow(GetDlgItem(hDlg, IDC_CONFFLDRTXT), 1); EnableWindow(GetDlgItem(hDlg, IDC_CONFEFLDRNAME), 1); } else if(wParam == IDC_CONFLRADIO){ EnableWindow(GetDlgItem(hDlg, IDC_CONFFLDRTXT), 0); EnableWindow(GetDlgItem(hDlg, IDC_CONFEFLDRNAME), 0); } break; case IDC_CONFBROWSE: if(1){ TCHAR fn[MAXPATH+1]; OPENFILENAME ofn; fn[0] = '\0'; /* Set up the BIG STRUCTURE. see mswin.c */ memset (&ofn, 0, sizeof(ofn)); ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; ofn.hwndOwner = hDlg; ofn.lpstrFilter = NULL; ofn.lpstrCustomFilter = NULL; ofn.nFilterIndex = 0; ofn.lpstrFile = fn; ofn.nMaxFile = MAXPATH; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = TEXT("Select File"); ofn.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; ofn.lpstrDefExt = NULL; if (GetOpenFileName (&ofn)) { SetDlgItemText(hDlg, IDC_CONFEFN, fn); } } break; case IDOK: /* Retrieve the new username/passwd. */ if(IsDlgButtonChecked(hDlg, IDC_CONFDFLTSET) == BST_CHECKED) dlgcfg->setreg = 1; else dlgcfg->setreg = 0; if(IsDlgButtonChecked(hDlg, IDC_CONFRRADIO) == BST_CHECKED){ TCHAR lptstr_buf[MAXPATH+1]; char *utf8_srvr, *utf8_username, *utf8_fldrname; GetDlgItemText(hDlg, IDC_CONFESERVER, lptstr_buf, MAXPATH); lptstr_buf[MAXPATH] = '\0'; utf8_srvr = lptstr_to_utf8(lptstr_buf); removing_leading_and_trailing_white_space(utf8_srvr); if(!*utf8_srvr){ MessageBox(hDlg, TEXT("IMAP Server field empty"), TEXT("Alpine"), MB_ICONWARNING | MB_OK); if(utf8_srvr) fs_give((void **) &utf8_srvr); return(TRUE); } GetDlgItemText(hDlg, IDC_CONFEUSERNAME, lptstr_buf, MAXPATH); lptstr_buf[MAXPATH] = '\0'; utf8_username = lptstr_to_utf8(lptstr_buf); removing_leading_and_trailing_white_space(utf8_username); if(IsDlgButtonChecked(hDlg, IDC_CONFDFLTFLDR) == BST_CHECKED){ utf8_fldrname = cpystr("remote_pinerc"); } else{ GetDlgItemText(hDlg, IDC_CONFEFLDRNAME, lptstr_buf, MAXPATH); lptstr_buf[MAXPATH] = '\0'; utf8_fldrname = lptstr_to_utf8(lptstr_buf); removing_leading_and_trailing_white_space(utf8_fldrname); if(!*utf8_fldrname){ MessageBox(hDlg, TEXT("Configuration Folder Name field empty"), TEXT("Alpine"), MB_ICONWARNING | MB_OK); if(utf8_srvr) fs_give((void **) &utf8_srvr); if(utf8_username) fs_give((void **) &utf8_username); if(utf8_fldrname) fs_give((void **) &utf8_fldrname); return(TRUE); } } if((strlen(utf8_srvr) + strlen(utf8_username) + strlen(utf8_fldrname) + 11) > dlgcfg->confpathlen){ MessageBox(hDlg, TEXT("Config path too long"), TEXT("Alpine"), MB_ICONWARNING | MB_OK); if(utf8_srvr) fs_give((void **) &utf8_srvr); if(utf8_username) fs_give((void **) &utf8_username); if(utf8_fldrname) fs_give((void **) &utf8_fldrname); return(TRUE); } snprintf(dlgcfg->confpath, dlgcfg->confpathlen, "{%s%s%s}%s", utf8_srvr, *utf8_username ? "/user="******"", utf8_username, utf8_fldrname); if(utf8_srvr) fs_give((void **) &utf8_srvr); if(utf8_username) fs_give((void **) &utf8_username); if(utf8_fldrname) fs_give((void **) &utf8_fldrname); } else{ TCHAR lptstr_fn[MAXPATH+1]; char *utf8_fn; GetDlgItemText(hDlg, IDC_CONFEFN, lptstr_fn, MAXPATH); lptstr_fn[MAXPATH] = '\0'; utf8_fn = lptstr_to_utf8(lptstr_fn); removing_leading_and_trailing_white_space(utf8_fn); if(!*utf8_fn){ MessageBox(hDlg, TEXT("Configuration File Name field empty"), TEXT("Alpine"), MB_ICONWARNING | MB_OK); if(utf8_fn) fs_give((void **) &utf8_fn); return(TRUE); } if(strlen(utf8_fn) >= dlgcfg->confpathlen){ MessageBox(hDlg, TEXT("Config path too long"), TEXT("Alpine"), MB_ICONWARNING | MB_OK); if(utf8_fn) fs_give((void **) &utf8_fn); return(TRUE); } strncpy(dlgcfg->confpath, utf8_fn, dlgcfg->confpathlen); dlgcfg->confpath[dlgcfg->confpathlen-1] = '\0'; if(utf8_fn) fs_give((void **) &utf8_fn); } EndDialog (hDlg, LOWORD(wParam)); dlgcfg->rv = 0; ret = TRUE; break; case IDCANCEL: dlgcfg->rv = 1; ret = TRUE; EndDialog (hDlg, LOWORD(wParam)); break; } break; } return (ret); }
/* * Dialog proc to handle login * * Configures the dialog box on init and retrieves the settings on exit. */ BOOL CALLBACK __export config_vars_dialog_proc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { DLG_CONFIGVARSDATA *dlgcv; BOOL ret = FALSE; int usepop = 0; char buf[2*MAXPATH+1], *p; int buflen = 2*MAXPATH; #define TCBUFLEN (2*MAXPATH) TCHAR tcbuf[TCBUFLEN+1]; LPTSTR tmp_lptstr; char *u; switch (uMsg) { case WM_INITDIALOG: dlgcv = (DLG_CONFIGVARSDATA *)lParam; SetWindowLong (hDlg, WINDOW_USER_DATA, (LONG) dlgcv); if(dlgcv->ivars->pname){ tmp_lptstr = utf8_to_lptstr(dlgcv->ivars->pname); if(tmp_lptstr){ SetDlgItemText(hDlg, IDC_CFV_PNAME, tmp_lptstr); fs_give((void **) &tmp_lptstr); } } if(dlgcv->ivars->userid && dlgcv->ivars->domain){ snprintf(buf, sizeof(buf), "%.*s@%.*s", MAXPATH, dlgcv->ivars->userid, MAXPATH, dlgcv->ivars->domain); buf[buflen-1] = '\0'; tmp_lptstr = utf8_to_lptstr(buf); if(tmp_lptstr){ SetDlgItemText(hDlg, IDC_CFV_EMAILADR, tmp_lptstr); fs_give((void **) &tmp_lptstr); } } if(dlgcv->ivars->inboxpath){ char *mbx; mbx = dlgcv->ivars->inboxpath; if(*mbx == '{' && (p = strindex(mbx, '}')) && ((*(p+1) == '\0') || !strucmp(p+1, "inbox"))){ char srvbuf[MAXPATH+1], tuser[MAXPATH+1]; int i, j, k; srvbuf[0] = '\0'; tuser[0] = '\0'; strncpy(buf, mbx+1, min(buflen, (int)(p - (mbx+1)))); buf[min(buflen-1, (int)(p - (mbx+1)))] = '\0'; for(i = 0, j = 0; buf[i] && j < MAXPATH; i++){ if(buf[i] == '/'){ if(!struncmp("/user="******"/pop3", buf+i, 5) && (!*(buf+5) || (*(buf+5) == '/'))){ usepop = 1; i += 4; } else srvbuf[j++] = buf[i]; } else srvbuf[j++] = buf[i]; } srvbuf[j] = '\0'; if(*srvbuf){ tmp_lptstr = utf8_to_lptstr(srvbuf); if(tmp_lptstr){ SetDlgItemText(hDlg, IDC_CFV_MSERVER, tmp_lptstr); fs_give((void **) &tmp_lptstr); } } if(*tuser){ tmp_lptstr = utf8_to_lptstr(tuser); if(tmp_lptstr){ SetDlgItemText(hDlg, IDC_CFV_LOGIN, tmp_lptstr); fs_give((void **) &tmp_lptstr); } } } else { tmp_lptstr = utf8_to_lptstr(mbx); if(tmp_lptstr){ SetDlgItemText(hDlg, IDC_CFV_MSERVER, tmp_lptstr); fs_give((void **) &tmp_lptstr); } if(*mbx != '{' && *mbx != '#') EnableWindow(GetDlgItem(hDlg, IDC_CFV_MSERVER), 0); } } CheckRadioButton (hDlg, IDC_CFV_IMAP, IDC_CFV_POP3, usepop ? IDC_CFV_POP3 : IDC_CFV_IMAP); if(dlgcv->ivars->smtpserver){ tmp_lptstr = utf8_to_lptstr(dlgcv->ivars->smtpserver); if(tmp_lptstr){ SetDlgItemText(hDlg, IDC_CFV_SMTPSERVER, tmp_lptstr); fs_give((void **) &tmp_lptstr); } } if(dlgcv->ivars->defmailclient) CheckDlgButton(hDlg, IDC_CFV_DEFMAILER, BST_CHECKED); if(dlgcv->ivars->defnewsclient) CheckDlgButton(hDlg, IDC_CFV_DEFNEWSRDR, BST_CHECKED); return (1); break; case WM_COMMAND: dlgcv = (DLG_CONFIGVARSDATA *) GetWindowLong (hDlg, WINDOW_USER_DATA); switch (wParam) { case IDOK: /* personal name */ GetDlgItemText(hDlg, IDC_CFV_PNAME, tcbuf, TCBUFLEN); tcbuf[TCBUFLEN] = '\0'; u = lptstr_to_utf8(tcbuf); if(u){ removing_leading_and_trailing_white_space(u); if(dlgcv->ivars->pname) fs_give((void **)&dlgcv->ivars->pname); if(*u){ dlgcv->ivars->pname = u; u = NULL; } if(u) fs_give((void **) &u); } /* user-id and domain */ GetDlgItemText(hDlg, IDC_CFV_EMAILADR, tcbuf, TCBUFLEN); tcbuf[TCBUFLEN] = '\0'; u = lptstr_to_utf8(tcbuf); if(u){ removing_leading_and_trailing_white_space(u); if(p = strindex(u, '@')){ *(p++) = '\0'; if(dlgcv->ivars->userid) fs_give((void **)&dlgcv->ivars->userid); if(dlgcv->ivars->domain) fs_give((void **)&dlgcv->ivars->domain); if(*u){ dlgcv->ivars->userid = u; u = NULL; } if(*p) dlgcv->ivars->domain = cpystr(p); } else{ MessageBox(hDlg, TEXT("Invalid email address. Should be username@domain"), TEXT("Alpine"), MB_ICONWARNING | MB_OK); return(TRUE); } if(u) fs_give((void **) &u); } /* inbox-path */ GetDlgItemText(hDlg, IDC_CFV_MSERVER, tcbuf, TCBUFLEN); tcbuf[TCBUFLEN] = '\0'; u = lptstr_to_utf8(tcbuf); if(u){ removing_leading_and_trailing_white_space(u); if(*u == '{' || *u == '#' || !IsWindowEnabled(GetDlgItem(hDlg, IDC_CFV_MSERVER))){ if(dlgcv->ivars->inboxpath) fs_give((void **)&dlgcv->ivars->inboxpath); dlgcv->ivars->inboxpath = u; u = NULL; } else if(*u){ char tsrvr[4*MAXPATH+1]; int tsrvrlen = 4*MAXPATH; if(dlgcv->ivars->inboxpath) fs_give((void **)&dlgcv->ivars->inboxpath); snprintf(tsrvr, sizeof(tsrvr), "{%s%s", u, IsDlgButtonChecked(hDlg, IDC_CFV_POP3) == BST_CHECKED ? "/pop3" : ""); if(u) fs_give((void **) &u); GetDlgItemText(hDlg, IDC_CFV_LOGIN, tcbuf, TCBUFLEN); tcbuf[TCBUFLEN] = '\0'; u = lptstr_to_utf8(tcbuf); if(u){ removing_leading_and_trailing_white_space(u); if(*u){ strncat(tsrvr, "/user="******"}inbox", sizeof(tsrvr)-strlen(tsrvr)-1); tsrvr[sizeof(tsrvr)-1] = '\0'; dlgcv->ivars->inboxpath = cpystr(tsrvr); } } if(u) fs_give((void **) &u); } /* smtp-server */ GetDlgItemText(hDlg, IDC_CFV_SMTPSERVER, tcbuf, TCBUFLEN); tcbuf[TCBUFLEN] = '\0'; u = lptstr_to_utf8(tcbuf); if(u){ removing_leading_and_trailing_white_space(u); if(dlgcv->ivars->smtpserver) fs_give((void **)&dlgcv->ivars->smtpserver); if(*u){ dlgcv->ivars->smtpserver = u; u = NULL; } if(u) fs_give((void **) &u); } dlgcv->ivars->defmailclient = (IsDlgButtonChecked(hDlg, IDC_CFV_DEFMAILER) == BST_CHECKED); dlgcv->ivars->defnewsclient = (IsDlgButtonChecked(hDlg, IDC_CFV_DEFNEWSRDR) == BST_CHECKED); EndDialog (hDlg, LOWORD(wParam)); dlgcv->rv = 0; ret = TRUE; break; case IDCANCEL: dlgcv->rv = 1; ret = TRUE; EndDialog (hDlg, LOWORD(wParam)); break; } break; } return (ret); }
/*---------------------------------------------------------------------- Function to control flag set/clearing Basically, turn the flags into a fake list of features... Returns 0 unless user has added a keyword, then 1. ----*/ int flag_maintenance_screen(struct pine *ps, struct flag_screen *flags) { int i, lv, lc, maxwidth, offset, need, rv = 0; char tmp[1200], **p, *spacer; CONF_S *ctmpa, *first_line; struct flag_table *fp; OPT_SCREEN_S screen; try_again: maxwidth = MAX(MIN((ps->ttyo ? ps->ttyo->screen_cols : 80), 150), 30); first_line = NULL; ctmpa = NULL; for(p = flags->explanation; p && *p; p++) { new_confline(&ctmpa); ctmpa->keymenu = &flag_keymenu; ctmpa->help = NO_HELP; ctmpa->tool = flag_checkbox_tool; ctmpa->flags |= CF_NOSELECT; ctmpa->valoffset = 0; ctmpa->value = cpystr(_(*p)); } /* Now wire flags checkboxes together */ for(lv = 0, lc = 0, fp = (flags->flag_table ? *flags->flag_table : NULL); fp && fp->name; fp++) { /* longest name */ if(fp->flag != F_COMMENT) { if(lv < (i = utf8_width(_(fp->name)))) lv = i; if(fp->comment && lc < (i = utf8_width(fp->comment))) lc = i; } } lv = MIN(lv,100); lc = MIN(lc,100); if(lc > 0) spacer = " "; else spacer = ""; offset = 6; if((need = offset + 5 + lv + strlen(spacer) + lc) > maxwidth) { offset -= (need - maxwidth); offset = MAX(0,offset); if((need = offset + 5 + lv + strlen(spacer) + lc) > maxwidth) { spacer = " "; if((need = offset + 5 + lv + strlen(spacer) + lc) > maxwidth) { lc -= (need - maxwidth); lc = MAX(0,lc); if(lc == 0) spacer = ""; } } } new_confline(&ctmpa); ctmpa->keymenu = &flag_keymenu; ctmpa->help = NO_HELP; ctmpa->tool = flag_checkbox_tool; ctmpa->flags |= CF_NOSELECT; ctmpa->valoffset = 0; ctmpa->value = cpystr(""); new_confline(&ctmpa); ctmpa->keymenu = &flag_keymenu; ctmpa->help = NO_HELP; ctmpa->tool = flag_checkbox_tool; ctmpa->flags |= CF_NOSELECT; ctmpa->valoffset = 0; utf8_snprintf(tmp, sizeof(tmp), "%*.*w %s", offset+3, offset+3, _("Set"), _("Flag/Keyword Name")); tmp[sizeof(tmp)-1] = '\0'; ctmpa->value = cpystr(tmp); new_confline(&ctmpa); ctmpa->keymenu = &flag_keymenu; ctmpa->help = NO_HELP; ctmpa->tool = flag_checkbox_tool; ctmpa->flags |= CF_NOSELECT; ctmpa->valoffset = 0; snprintf(tmp, sizeof(tmp), "%*.*s--- %.*s", offset, offset, "", lv+lc+strlen(spacer), repeat_char(lv+lc+strlen(spacer), '-')); tmp[sizeof(tmp)-1] = '\0'; ctmpa->value = cpystr(tmp); for(fp = (flags->flag_table ? *flags->flag_table : NULL); fp && fp->name; fp++) { /* build the list */ new_confline(&ctmpa); if(!first_line && (fp->flag != F_COMMENT)) first_line = ctmpa; ctmpa->keymenu = &flag_keymenu; ctmpa->tool = flag_checkbox_tool; ctmpa->valoffset = offset; if(fp->flag == F_COMMENT) { ctmpa->help = NO_HELP; ctmpa->flags |= CF_NOSELECT; ctmpa->value = cpystr(fp->name); } else { ctmpa->help = fp->help; ctmpa->d.f.ftbl = flags->flag_table; ctmpa->d.f.fp = fp; utf8_snprintf(tmp, sizeof(tmp), "[%c] %-*.*w%s%-*.*w", (fp->set == 0) ? ' ' : (fp->set == 1) ? 'X' : '?', lv, lv, _(fp->name), spacer, lc, lc, fp->comment ? fp->comment : ""); ctmpa->value = cpystr(tmp); } } memset(&screen, 0, sizeof(screen)); /* * TRANSLATORS: FLAG MAINTENANCE is a screen title. * Print something1 using something2. configuration is something1 */ if(conf_scroll_screen(ps, &screen, first_line, _("FLAG MAINTENANCE"), _("configuration"), 0) == FLAG_ADD_RETURN) { int flags, r; char keyword[500]; char nickname[500]; char prompt[500]; char *error = NULL; KEYWORD_S *kw; HelpType help; /* * User is asking to add a new keyword. We will add it to the * mailbox if necessary and add it to the keywords list from * Setup/Config. Then we will modify the flag_table and present * the flag modification screen again. */ ps->mangled_screen = 1; keyword[0] = '\0'; flags = OE_APPEND_CURRENT; help = NO_HELP; do { if(error) { q_status_message(SM_ORDER, 3, 4, error); fs_give((void **) &error); } strncpy(prompt, _("Keyword to be added : "), sizeof(prompt)-1); prompt[sizeof(prompt)-1] = '\0'; r = optionally_enter(keyword, -FOOTER_ROWS(ps_global), 0, sizeof(keyword), prompt, NULL, help, &flags); if(r == 3) help = help == NO_HELP ? h_type_keyword : NO_HELP; else if(r == 1) { cmd_cancelled("Add Keyword"); goto try_again; } removing_leading_and_trailing_white_space(keyword); } while(r == 3 || keyword_check(keyword, &error)); for(kw = ps->keywords; kw; kw = kw->next) { if(kw->kw && !strucmp(kw->kw, keyword)) { q_status_message(SM_ORDER, 3, 4, _("Keyword already configured, changing nickname")); break; } } snprintf(prompt, sizeof(prompt), _("Optional nickname for \"%s\" : "), keyword); nickname[0] = '\0'; help = NO_HELP; do { r = optionally_enter(nickname, -FOOTER_ROWS(ps_global), 0, sizeof(nickname), prompt, NULL, help, &flags); if(r == 3) help = help == NO_HELP ? h_type_keyword_nickname : NO_HELP; else if(r == 1) { cmd_cancelled("Add Keyword"); goto try_again; } removing_leading_and_trailing_white_space(nickname); } while(r == 3); if(keyword[0]) { char ***alval; int offset = -1; struct variable *var; var = &ps_global->vars[V_KEYWORDS]; alval = ALVAL(var, Main); for(kw = ps->keywords; kw; kw = kw->next) { offset++; if(kw->kw && !strucmp(kw->kw, keyword)) { /* looks like it should already exist at offset */ break; } } if(!kw) offset = -1; if(offset >= 0 && (*alval) && (*alval)[offset]) { fs_give((void **) &(*alval)[offset]); (*alval)[offset] = put_pair(nickname, keyword); } else if(!*alval) { offset = 0; *alval = (char **) fs_get(2*sizeof(char *)); (*alval)[offset] = put_pair(nickname, keyword); (*alval)[offset+1] = NULL; } else { for(offset=0; (*alval)[offset]; offset++); ; fs_resize((void **) alval, (offset + 2) * sizeof(char *)); (*alval)[offset] = put_pair(nickname, keyword); (*alval)[offset+1] = NULL; } set_current_val(var, TRUE, FALSE); if(ps_global->prc) ps_global->prc->outstanding_pinerc_changes = 1; if(ps_global->keywords) free_keyword_list(&ps_global->keywords); if(var->current_val.l && var->current_val.l[0]) ps_global->keywords = init_keyword_list(var->current_val.l); clear_index_cache(ps_global->mail_stream, 0); rv = 1; } } ps->mangled_screen = 1; return(rv); }