jens-maus/yam

View on GitHub
src/mui/TCPIPConfigPage.c

Summary

Maintainability
Test Coverage
/***************************************************************************

 YAM - Yet Another Mailer
 Copyright (C) 1995-2000 Marcel Beck
 Copyright (C) 2000-2022 YAM Open Source Team

 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

 YAM Official Support Site : http://www.yam.ch
 YAM OpenSource project     : http://sourceforge.net/projects/yamos/

 $Id$

 Superclass:  MUIC_ConfigPage
 Description: "TCP/IP" configuration page

***************************************************************************/

#include "TCPIPConfigPage_cl.h"

#include <proto/asl.h>
#include <proto/muimaster.h>
#if defined(__amigaos4__)
#include <proto/application.h>
#endif
#include <mui/BetterString_mcc.h>
#include <mui/NBalance_mcc.h>
#include <mui/NList_mcc.h>
#include <mui/NListview_mcc.h>

#include "YAM.h"

#include "mui/AccountList.h"
#include "mui/ConfigPage.h"
#include "mui/ConfigPageList.h"
#include "mui/FolderRequestPopup.h"

#include "Config.h"
#include "MailServers.h"
#include "Requesters.h"
#include "Threads.h"
#include "UIDL.h"
#include "UserIdentity.h"

#include "tcp/ssl.h"

#include "Debug.h"

/* CLASSDATA
struct Data
{
  Object *GR_POP3_VIRTROOT;
  Object *LV_POP3;
  Object *BT_PADD;
  Object *BT_PDEL;
  Object *BT_POPUP;
  Object *BT_POPDOWN;
  Object *CH_POPENABLED;
  Object *ST_POPDESC;
  Object *ST_POPHOST;
  Object *ST_POPPORT;
  Object *LB_POPPORT;
  Object *BT_POPTEST;
  Object *CY_POPSECURE;
  Object *CY_POPAUTH;
  Object *ST_POPUSERID;
  Object *ST_PASSWD;
  Object *CY_PRESELECTION;
  Object *CH_DOWNLOADONSTARTUP;
  Object *CH_INTERVAL;
  Object *NM_INTERVAL;
  Object *CH_DLLARGE;
  Object *ST_WARNSIZE;
  Object *CH_DELETE;
  Object *CH_APPLYREMOTEFILTERS;
  Object *CH_POP3_NOTIFY_REQ;
  Object *CH_POP3_NOTIFY_SOUND;
  Object *PO_POP3_NOTIFY_SOUND;
  Object *ST_POP3_NOTIFY_SOUND;
  Object *BT_POP3_NOTIFY_SOUND;
  Object *CH_POP3_NOTIFY_CMD;
  Object *PO_POP3_NOTIFY_CMD;
  Object *ST_POP3_NOTIFY_CMD;
  Object *GR_SMTP_VIRTROOT;
  Object *LV_SMTP;
  Object *BT_SADD;
  Object *BT_SDEL;
  Object *BT_SMTPUP;
  Object *BT_SMTPDOWN;
  Object *CH_SMTPENABLED;
  Object *ST_SMTPDESC;
  Object *ST_SMTPHOST;
  Object *ST_SMTPPORT;
  Object *LB_SMTPPORT;
  Object *BT_SMTPTEST;
  Object *CY_SMTPSECURE;
  Object *CY_SMTPAUTH;
  Object *ST_SMTPAUTHUSER;
  Object *ST_SMTPAUTHPASS;
  Object *CH_SMTP8BIT;
  Object *PO_SMTP_SENTFOLDER;
  Object *PO_POP_INCOMINGFOLDER;
  #if defined(__amigaos4__)
  Object *CH_POP3_NOTIFY_OS41SYSTEM;
  #endif
  Object *GR_POP3_SSLCERTWARNINGS;
  Object *GR_SMTP_SSLCERTWARNINGS;
};
*/

/* Overloaded Methods */
/// OVERLOAD(OM_NEW)
OVERLOAD(OM_NEW)
{
  static const char *secureSMTPMethods[4];
  static const char *securePOP3Methods[4];
  static const char *smtpAuthMethods[7];
  static const char *pop3AuthMethods[3];
  static const char *preselectionModes[5];
  static const char *rtitles[3];
  Object *GR_POP3_VIRTROOT;
  Object *LV_POP3;
  Object *BT_PADD;
  Object *BT_PDEL;
  Object *BT_POPUP;
  Object *BT_POPDOWN;
  Object *CH_POPENABLED;
  Object *ST_POPDESC;
  Object *ST_POPHOST;
  Object *ST_POPPORT;
  Object *LB_POPPORT;
  Object *BT_POPTEST;
  Object *CY_POPSECURE;
  Object *CY_POPAUTH;
  Object *ST_POPUSERID;
  Object *ST_PASSWD;
  Object *CY_PRESELECTION;
  Object *CH_DOWNLOADONSTARTUP;
  Object *CH_INTERVAL;
  Object *NM_INTERVAL;
  Object *CH_DLLARGE;
  Object *ST_WARNSIZE;
  Object *CH_DELETE;
  Object *CH_APPLYREMOTEFILTERS;
  Object *CH_POP3_NOTIFY_REQ;
  Object *CH_POP3_NOTIFY_SOUND;
  Object *PO_POP3_NOTIFY_SOUND;
  Object *ST_POP3_NOTIFY_SOUND;
  Object *BT_POP3_NOTIFY_SOUND;
  Object *CH_POP3_NOTIFY_CMD;
  Object *PO_POP3_NOTIFY_CMD;
  Object *ST_POP3_NOTIFY_CMD;
  Object *GR_SMTP_VIRTROOT;
  Object *LV_SMTP;
  Object *BT_SADD;
  Object *BT_SDEL;
  Object *BT_SMTPUP;
  Object *BT_SMTPDOWN;
  Object *CH_SMTPENABLED;
  Object *ST_SMTPDESC;
  Object *ST_SMTPHOST;
  Object *ST_SMTPPORT;
  Object *LB_SMTPPORT;
  Object *BT_SMTPTEST;
  Object *CY_SMTPSECURE;
  Object *CY_SMTPAUTH;
  Object *ST_SMTPAUTHUSER;
  Object *ST_SMTPAUTHPASS;
  Object *CH_SMTP8BIT;
  Object *PO_SMTP_SENTFOLDER;
  Object *PO_POP_INCOMINGFOLDER;
  #if defined(__amigaos4__)
  Object *CH_POP3_NOTIFY_OS41SYSTEM;
  #endif
  Object *GR_POP3_SSLCERTWARNINGS;
  Object *GR_SMTP_SSLCERTWARNINGS;

  ENTER();

  secureSMTPMethods[0] = tr(MSG_CO_SMTP_SECURITY_NONE);
  secureSMTPMethods[1] = tr(MSG_CO_SMTP_SECURITY_TLS);
  secureSMTPMethods[2] = tr(MSG_CO_SMTP_SECURITY_SSL);
  secureSMTPMethods[3] = NULL;

  securePOP3Methods[0] = tr(MSG_CO_POP_SECURITY_NONE);
  securePOP3Methods[1] = tr(MSG_CO_POP_SECURITY_TLS);
  securePOP3Methods[2] = tr(MSG_CO_POP_SECURITY_SSL);
  securePOP3Methods[3] = NULL;

  smtpAuthMethods[0] = tr(MSG_CO_SMTPAUTH_NONE);
  smtpAuthMethods[1] = tr(MSG_CO_SMTPAUTH_AUTO);
  smtpAuthMethods[2] = tr(MSG_CO_SMTPAUTH_DIGEST);
  smtpAuthMethods[3] = tr(MSG_CO_SMTPAUTH_CRAM);
  smtpAuthMethods[4] = tr(MSG_CO_SMTPAUTH_LOGIN);
  smtpAuthMethods[5] = tr(MSG_CO_SMTPAUTH_PLAIN);
  smtpAuthMethods[6] = NULL;

  pop3AuthMethods[0] = tr(MSG_CO_POP_AUTH_PLAIN);
  pop3AuthMethods[1] = tr(MSG_CO_POP_AUTH_APOP);
  pop3AuthMethods[2] = NULL;

  preselectionModes[PSM_NEVER]       = tr(MSG_CO_PSNever);
  preselectionModes[PSM_LARGE]       = tr(MSG_CO_PSLarge);
  preselectionModes[PSM_ALWAYS]      = tr(MSG_CO_PSAlways);
  preselectionModes[PSM_ALWAYSLARGE] = tr(MSG_CO_PSAlwaysFast);
  preselectionModes[4] = NULL;

  rtitles[0] = tr(MSG_CO_ReceiveMail);
  rtitles[1] = tr(MSG_CO_SendMail);
  rtitles[2] = NULL;

  if((obj = DoSuperNew(cl, obj,
    MUIA_HelpNode, "Configuration#TCPIP",
    MUIA_ConfigPage_Page, cp_TCPIP,
    MUIA_ConfigPage_UseScrollgroup, FALSE,
    MUIA_ConfigPage_AddSpacer, FALSE,
    MUIA_ConfigPage_Contents, RegisterGroup(rtitles),
      MUIA_CycleChain, TRUE,

      // Receive MailServer List (POP3/IMAP)
      Child, ScrollgroupObject,
        MUIA_Scrollgroup_FreeHoriz, FALSE,
        MUIA_Scrollgroup_AutoBars, TRUE,
        MUIA_Scrollgroup_Contents, GR_POP3_VIRTROOT = VGroupV,

          Child, HGroup,
            GroupSpacing(0),
            Child, VGroup,
              MUIA_HorizWeight, 30,

              Child, HBarT(tr(MSG_CO_POP_SERVERLIST)), End,

              Child, NListviewObject,
                MUIA_CycleChain, TRUE,
                MUIA_Weight,     60,
                MUIA_NListview_NList, LV_POP3 = AccountListObject,
                End,
              End,

              Child, HGroup,
                Child, ColGroup(2),
                  MUIA_Group_Spacing, 1,
                  MUIA_Group_SameWidth, TRUE,
                  MUIA_Weight, 1,
                  Child, BT_PADD = MakeButton(MUIX_B "+" MUIX_N),
                  Child, BT_PDEL = MakeButton(MUIX_B "-" MUIX_N),
                End,
                Child, HSpace(0),
                Child, ColGroup(2),
                  MUIA_Group_Spacing, 1,
                  MUIA_Group_SameWidth, TRUE,
                  Child, BT_POPUP = PopButton(MUII_ArrowUp),
                  Child, BT_POPDOWN = PopButton(MUII_ArrowDown),
                End,
              End,
            End,

            Child, NBalanceObject,
              MUIA_Balance_Quiet, TRUE,
            End,

            Child, VGroup,
              MUIA_HorizWeight, 70,

              Child, ColGroup(2), GroupFrameT(tr(MSG_CO_POP_SERVERSETTINGS)),

                Child, HSpace(1),
                Child, MakeCheckGroup(&CH_POPENABLED, tr(MSG_CO_POPActive)),

                Child, Label2(tr(MSG_CO_POP_DESC)),
                Child, ST_POPDESC = MakeString(SIZE_LARGE, tr(MSG_CO_POP_DESC)),

                Child, Label2(tr(MSG_CO_POP_SERVER)),
                Child, ST_POPHOST = MakeString(SIZE_HOST, tr(MSG_CO_POP_SERVER)),

                Child, Label2(tr(MSG_CO_POP_PORT)),
                Child, HGroup,
                  Child, ST_POPPORT = BetterStringObject,
                    StringFrame,
                    MUIA_CycleChain,          TRUE,
                    MUIA_FixWidthTxt,         "00000",
                    MUIA_String_MaxLen,       5+1,
                    MUIA_String_AdvanceOnCR,  TRUE,
                    MUIA_String_Integer,      0,
                    MUIA_String_Accept,       "0123456789",
                    MUIA_ControlChar,         ShortCut(tr(MSG_CO_POP_PORT)),
                  End,
                  Child, Label2(tr(MSG_CO_POP_PORT_STANDARD)),
                  Child, LB_POPPORT = LLabel2("000"),
                  Child, HSpace(0),
                End,

                Child, HSpace(1),
                Child, BT_POPTEST = MakeButton(tr(MSG_CO_POP3_TEST_CONNECTION_SETTINGS)),

                Child, HSpace(1),
                Child, HBarT(tr(MSG_CO_POP_SECURITYAUTH)), End,

                Child, Label2(tr(MSG_CO_POP_SECURITY)),
                Child, CY_POPSECURE = MakeCycle(securePOP3Methods, tr(MSG_CO_POP_SECURITY)),

                Child, Label2(tr(MSG_CO_POP_AUTH)),
                Child, CY_POPAUTH = MakeCycle(pop3AuthMethods, tr(MSG_CO_POP_AUTH)),

                Child, Label2(tr(MSG_CO_POPUserID)),
                Child, ST_POPUSERID = MakeString(SIZE_USERID, tr(MSG_CO_POPUserID)),

                Child, Label2(tr(MSG_CO_Password)),
                Child, ST_PASSWD = MakePassString(tr(MSG_CO_Password)),

                Child, HSpace(1),
                Child, HBarT(tr(MSG_CO_POP_MSGHANDLING)), End,

                Child, Label2(tr(MSG_CO_PreSelect)),
                Child, CY_PRESELECTION = MakeCycle(preselectionModes, tr(MSG_CO_PreSelect)),

                Child, HSpace(1),
                Child, MakeCheckGroup(&CH_DOWNLOADONSTARTUP, tr(MSG_CO_DOWNLOAD_ON_STARTUP)),

                Child, HSpace(1),
                Child, HGroup,
                  Child, CH_INTERVAL = MakeCheck(tr(MSG_CO_CheckMail)),
                  Child, Label2(tr(MSG_CO_CheckMail)),
                  Child, NM_INTERVAL = NumericbuttonObject,
                    MUIA_CycleChain,      TRUE,
                    MUIA_Numeric_Min,     1,
                    MUIA_Numeric_Max,     240,
                    MUIA_Numeric_Default, 5,
                  End,
                  Child, Label2(tr(MSG_CO_Minutes)),
                  Child, HSpace(0),
                End,

                Child, HSpace(1),
                Child, HGroup,
                  Child, MakeCheckGroup(&CH_DLLARGE, tr(MSG_CO_DOWNLOAD_LARGE_MAILS1)),
                  Child, ST_WARNSIZE = MakeInteger(5, tr(MSG_CO_DOWNLOAD_LARGE_MAILS1)),
                  Child, LLabel(tr(MSG_CO_DOWNLOAD_LARGE_MAILS2)),
                  Child, HSpace(0),
                End,

                Child, HSpace(1),
                Child, MakeCheckGroup(&CH_DELETE, tr(MSG_CO_DeleteServerMail)),

                Child, HSpace(1),
                Child, MakeCheckGroup(&CH_APPLYREMOTEFILTERS, tr(MSG_CO_APPLY_REMOTE_FILTERS)),

                Child, HSpace(1),
                Child, HBarT(tr(MSG_CO_POP_FOLDERS)), End,

                Child, Label2(tr(MSG_CO_POP_INCOMINGFOLDER)),
                Child, PO_POP_INCOMINGFOLDER = FolderRequestPopupObject, End,

                Child, HSpace(1),
                Child, HBarT(tr(MSG_CO_POP_NOTIFICATION)), End,

                Child, HSpace(1),
                Child, HGroup,
                  Child, CH_POP3_NOTIFY_REQ = MakeCheck(tr(MSG_CO_NotiReq)),
                  Child, LLabel(tr(MSG_CO_NotiReq)),
                  Child, HSpace(0),
                End,

                #if defined(__amigaos4__)
                Child, HSpace(1),
                Child, HGroup,
                  Child, CH_POP3_NOTIFY_OS41SYSTEM = MakeCheck(tr(MSG_CO_NOTIOS41SYSTEM)),
                  Child, LLabel(tr(MSG_CO_NOTIOS41SYSTEM)),
                  Child, HSpace(0),
                End,
                #endif // __amigaos4__

                Child, HSpace(1),
                Child, HGroup,
                  Child, CH_POP3_NOTIFY_SOUND = MakeCheck(tr(MSG_CO_NotiSound)),
                  Child, LLabel(tr(MSG_CO_NotiSound)),
                  Child, HGroup,
                    MUIA_Group_Spacing, 0,
                    Child, PO_POP3_NOTIFY_SOUND = PopaslObject,
                      MUIA_Popasl_Type, ASL_FileRequest,
                      MUIA_Popstring_String, ST_POP3_NOTIFY_SOUND = MakeString(SIZE_PATHFILE, ""),
                      MUIA_Popstring_Button, PopButton(MUII_PopFile),
                    End,
                    Child, BT_POP3_NOTIFY_SOUND = PopButton(MUII_TapePlay),
                  End,
                End,

                Child, HSpace(1),
                Child, HGroup,
                  Child, CH_POP3_NOTIFY_CMD = MakeCheck(tr(MSG_CO_NotiCommand)),
                  Child, LLabel(tr(MSG_CO_NotiCommand)),
                  Child, PO_POP3_NOTIFY_CMD = PopaslObject,
                    MUIA_Popasl_Type, ASL_FileRequest,
                    MUIA_Popstring_String, ST_POP3_NOTIFY_CMD = MakeString(SIZE_COMMAND, ""),
                    MUIA_Popstring_Button, PopButton(MUII_PopFile),
                  End,
                End,

                Child, HSpace(1),
                Child, GR_POP3_SSLCERTWARNINGS = VGroup,
                  Child, HSpace(0),
                End,

                Child, HVSpace,
                Child, HVSpace,

              End,
            End,
          End,
        End,
      End,

      // Send MailServer List (SMTP)
      Child, ScrollgroupObject,
        MUIA_Scrollgroup_FreeHoriz, FALSE,
        MUIA_Scrollgroup_AutoBars, TRUE,
        MUIA_Scrollgroup_Contents, GR_SMTP_VIRTROOT = VGroupV,

          Child, HGroup,
            GroupSpacing(0),
            Child, VGroup,
              MUIA_HorizWeight, 30,

              Child, HBarT(tr(MSG_CO_SMTP_SERVERLIST)), End,

              Child, NListviewObject,
                MUIA_CycleChain, TRUE,
                MUIA_Weight,     60,
                MUIA_NListview_NList, LV_SMTP = AccountListObject,
                End,
              End,

              Child, HGroup,
                Child, ColGroup(2),
                  MUIA_Group_Spacing, 1,
                  MUIA_Group_SameWidth, TRUE,
                  MUIA_Weight, 1,
                  Child, BT_SADD = MakeButton(MUIX_B "+" MUIX_N),
                  Child, BT_SDEL = MakeButton(MUIX_B "-" MUIX_N),
                End,
                Child, HSpace(0),
                Child, ColGroup(2),
                  MUIA_Group_Spacing, 1,
                  MUIA_Group_SameWidth, TRUE,
                  Child, BT_SMTPUP = PopButton(MUII_ArrowUp),
                  Child, BT_SMTPDOWN = PopButton(MUII_ArrowDown),
                End,
              End,
            End,

            Child, NBalanceObject,
              MUIA_Balance_Quiet, TRUE,
            End,

            Child, VGroup,
              MUIA_HorizWeight, 70,

              Child, ColGroup(2), GroupFrameT(tr(MSG_CO_SMTP_SERVERSETTINGS)),

                Child, HSpace(1),
                Child, MakeCheckGroup(&CH_SMTPENABLED, tr(MSG_CO_SMTP_ACTIVE)),

                Child, Label2(tr(MSG_CO_SMTP_DESC)),
                Child, ST_SMTPDESC = MakeString(SIZE_LARGE, tr(MSG_CO_SMTP_DESC)),

                Child, Label2(tr(MSG_CO_SMTP_SERVER)),
                Child, ST_SMTPHOST = MakeString(SIZE_HOST, tr(MSG_CO_SMTP_SERVER)),

                Child, Label2(tr(MSG_CO_SMTP_PORT)),
                Child, HGroup,
                  Child, ST_SMTPPORT = BetterStringObject,
                    StringFrame,
                    MUIA_CycleChain,          TRUE,
                    MUIA_FixWidthTxt,         "00000",
                    MUIA_String_MaxLen,       5+1,
                    MUIA_String_AdvanceOnCR,  TRUE,
                    MUIA_String_Integer,      0,
                    MUIA_String_Accept,       "0123456789",
                    MUIA_ControlChar,         ShortCut(tr(MSG_CO_SMTP_PORT)),
                  End,
                  Child, Label2(tr(MSG_CO_SMTP_PORT_STANDARD)),
                  Child, LB_SMTPPORT = LLabel2("000"),
                  Child, HSpace(0),
                End,

                Child, HSpace(1),
                Child, BT_SMTPTEST = MakeButton(tr(MSG_CO_SMTP_TEST_CONNECTION_SETTINGS)),

                Child, HSpace(1),
                Child, HBarT(tr(MSG_CO_SMTP_SECURITYAUTH)), End,

                Child, Label2(tr(MSG_CO_SMTP_SECURITY)),
                Child, CY_SMTPSECURE = MakeCycle(secureSMTPMethods, tr(MSG_CO_SMTP_SECURITY)),

                Child, Label2(tr(MSG_CO_SMTP_AUTH)),
                Child, CY_SMTPAUTH = MakeCycle(smtpAuthMethods, tr(MSG_CO_SMTP_AUTH)),

                Child, Label2(tr(MSG_CO_SMTPUser)),
                Child, ST_SMTPAUTHUSER = MakeString(SIZE_USERID, tr(MSG_CO_SMTPUser)),

                Child, Label2(tr(MSG_CO_SMTPPass)),
                Child, ST_SMTPAUTHPASS = MakePassString(tr(MSG_CO_SMTPPass)),

                Child, HSpace(1),
                Child, HBarT(tr(MSG_CO_SMTP_OPTIONS)), End,

                Child, HSpace(1),
                Child, HGroup,
                  Child, CH_SMTP8BIT = MakeCheck(tr(MSG_CO_Allow8bit)),
                  Child, LLabel1(tr(MSG_CO_Allow8bit)),
                  Child, HSpace(0),
                End,

                Child, HSpace(1),
                Child, HBarT(tr(MSG_CO_SMTP_FOLDERS)), End,

                Child, Label2(tr(MSG_CO_SMTP_SENTFOLDER)),
                Child, PO_SMTP_SENTFOLDER = FolderRequestPopupObject,
                End,

                Child, HSpace(1),
                Child, GR_SMTP_SSLCERTWARNINGS = VGroup,
                  Child, HSpace(0),
                End,

                Child, HVSpace,
                Child, HVSpace,

              End,
            End,
          End,
        End,
      End,

    End,
  TAG_MORE, inittags(msg))) != NULL)
  {
    GETDATA;

    data->GR_POP3_VIRTROOT =          GR_POP3_VIRTROOT;
    data->LV_POP3 =                   LV_POP3;
    data->BT_PADD =                   BT_PADD;
    data->BT_PDEL =                   BT_PDEL;
    data->BT_POPUP =                  BT_POPUP;
    data->BT_POPDOWN =                BT_POPDOWN;
    data->CH_POPENABLED =             CH_POPENABLED;
    data->ST_POPDESC =                ST_POPDESC;
    data->ST_POPHOST =                ST_POPHOST;
    data->ST_POPPORT =                ST_POPPORT;
    data->LB_POPPORT =                LB_POPPORT;
    data->BT_POPTEST =                BT_POPTEST;
    data->CY_POPSECURE =              CY_POPSECURE;
    data->CY_POPAUTH =                CY_POPAUTH;
    data->ST_POPUSERID =              ST_POPUSERID;
    data->ST_PASSWD =                 ST_PASSWD;
    data->CY_PRESELECTION =           CY_PRESELECTION;
    data->CH_DOWNLOADONSTARTUP =      CH_DOWNLOADONSTARTUP;
    data->CH_INTERVAL =               CH_INTERVAL;
    data->NM_INTERVAL =               NM_INTERVAL;
    data->CH_DLLARGE =                CH_DLLARGE;
    data->ST_WARNSIZE =               ST_WARNSIZE;
    data->CH_DELETE =                 CH_DELETE;
    data->CH_APPLYREMOTEFILTERS =     CH_APPLYREMOTEFILTERS;
    data->CH_POP3_NOTIFY_REQ =        CH_POP3_NOTIFY_REQ;
    data->CH_POP3_NOTIFY_SOUND =      CH_POP3_NOTIFY_SOUND;
    data->PO_POP3_NOTIFY_SOUND =      PO_POP3_NOTIFY_SOUND;
    data->ST_POP3_NOTIFY_SOUND =      ST_POP3_NOTIFY_SOUND;
    data->BT_POP3_NOTIFY_SOUND =      BT_POP3_NOTIFY_SOUND;
    data->CH_POP3_NOTIFY_CMD =        CH_POP3_NOTIFY_CMD;
    data->PO_POP3_NOTIFY_CMD =        PO_POP3_NOTIFY_CMD;
    data->ST_POP3_NOTIFY_CMD =        ST_POP3_NOTIFY_CMD;
    data->GR_SMTP_VIRTROOT =          GR_SMTP_VIRTROOT;
    data->LV_SMTP =                   LV_SMTP;
    data->BT_SADD =                   BT_SADD;
    data->BT_SDEL =                   BT_SDEL;
    data->BT_SMTPUP =                 BT_SMTPUP;
    data->BT_SMTPDOWN =               BT_SMTPDOWN;
    data->CH_SMTPENABLED =            CH_SMTPENABLED;
    data->ST_SMTPDESC =               ST_SMTPDESC;
    data->ST_SMTPHOST =               ST_SMTPHOST;
    data->ST_SMTPPORT =               ST_SMTPPORT;
    data->LB_SMTPPORT =               LB_SMTPPORT;
    data->BT_SMTPTEST =               BT_SMTPTEST;
    data->CY_SMTPSECURE =             CY_SMTPSECURE;
    data->CY_SMTPAUTH =               CY_SMTPAUTH;
    data->ST_SMTPAUTHUSER =           ST_SMTPAUTHUSER;
    data->ST_SMTPAUTHPASS =           ST_SMTPAUTHPASS;
    data->CH_SMTP8BIT =               CH_SMTP8BIT;
    data->PO_SMTP_SENTFOLDER =        PO_SMTP_SENTFOLDER;
    data->PO_POP_INCOMINGFOLDER =     PO_POP_INCOMINGFOLDER;
    #if defined(__amigaos4__)
    data->CH_POP3_NOTIFY_OS41SYSTEM = CH_POP3_NOTIFY_OS41SYSTEM;
    #endif // __amigaos4__
    data->GR_POP3_SSLCERTWARNINGS =   GR_POP3_SSLCERTWARNINGS;
    data->GR_SMTP_SSLCERTWARNINGS =   GR_SMTP_SSLCERTWARNINGS;

    SetHelp(ST_SMTPDESC,               MSG_HELP_CO_ST_SMTPDESC);
    SetHelp(ST_SMTPHOST,               MSG_HELP_CO_ST_SMTPHOST);
    SetHelp(ST_SMTPPORT,               MSG_HELP_CO_ST_SMTPPORT);
    SetHelp(BT_SMTPTEST,               MSG_HELP_CO_BT_SMTPTEST);
    SetHelp(CH_SMTP8BIT,               MSG_HELP_CO_CH_SMTP8BIT);
    SetHelp(ST_SMTPAUTHUSER,           MSG_HELP_CO_ST_SMTPAUTHUSER);
    SetHelp(ST_SMTPAUTHPASS,           MSG_HELP_CO_ST_SMTPAUTHPASS);
    SetHelp(CY_SMTPAUTH,               MSG_HELP_CO_CY_SMTPAUTHMETHOD);
    SetHelp(LV_POP3,                   MSG_HELP_CO_LV_POP3);
    SetHelp(BT_PADD,                   MSG_HELP_CO_BT_PADD);
    SetHelp(BT_PDEL,                   MSG_HELP_CO_BT_PDEL);
    SetHelp(ST_POPDESC,                MSG_HELP_CO_ST_POPDESC);
    SetHelp(ST_POPHOST,                MSG_HELP_CO_ST_POPHOST);
    SetHelp(ST_POPPORT,                MSG_HELP_CO_ST_POPPORT);
    SetHelp(BT_POPTEST,                MSG_HELP_CO_BT_POPTEST);
    SetHelp(ST_POPUSERID,              MSG_HELP_CO_ST_POPUSERID);
    SetHelp(ST_PASSWD,                 MSG_HELP_CO_ST_PASSWD);
    SetHelp(CH_DELETE,                 MSG_HELP_CO_CH_DELETE);
    SetHelp(CY_POPAUTH,                MSG_HELP_CO_CY_POPAUTH);
    SetHelp(CH_POPENABLED,             MSG_HELP_CO_CH_POPENABLED);
    SetHelp(CH_DOWNLOADONSTARTUP,      MSG_HELP_CO_CH_DOWNLOAD_ON_STARTUP );
    SetHelp(CH_INTERVAL,               MSG_HELP_CO_ST_INTERVAL);
    SetHelp(NM_INTERVAL,               MSG_HELP_CO_ST_INTERVAL);
    SetHelp(CH_DLLARGE,                MSG_HELP_CO_CH_DLLARGE);
    SetHelp(ST_WARNSIZE,               MSG_HELP_CO_ST_WARNSIZE);
    SetHelp(CH_APPLYREMOTEFILTERS,     MSG_HELP_CO_CH_APPLY_REMOTE_FILTERS );
    SetHelp(CY_SMTPSECURE,             MSG_HELP_CO_CY_SMTPSECURE);
    SetHelp(CY_POPSECURE,              MSG_HELP_CO_CY_POPSECURE);
    SetHelp(CY_PRESELECTION,           MSG_HELP_CO_CY_MSGSELECT);
    SetHelp(CH_POP3_NOTIFY_REQ,        MSG_HELP_CO_CH_NOTIREQ);
    SetHelp(CH_POP3_NOTIFY_SOUND,      MSG_HELP_CO_CH_NOTISOUND);
    SetHelp(CH_POP3_NOTIFY_CMD,        MSG_HELP_CO_CH_NOTICMD);
    SetHelp(ST_POP3_NOTIFY_CMD,        MSG_HELP_CO_ST_NOTICMD);
    SetHelp(ST_POP3_NOTIFY_SOUND,      MSG_HELP_CO_ST_NOTISOUND);
    SetHelp(PO_SMTP_SENTFOLDER,        MSG_HELP_CO_PO_SMTP_SENTFOLDER);
    SetHelp(PO_POP_INCOMINGFOLDER,     MSG_HELP_CO_PO_POP_INCOMINGFOLDER);
    #if defined(__amigaos4__)
    SetHelp(CH_POP3_NOTIFY_OS41SYSTEM, MSG_HELP_CO_CH_NOTIOS41SYSTEM);
    #endif // __amigaos4__

    DoMethod(LV_POP3,                   MUIM_Notify, MUIA_NList_Active,     MUIV_EveryTime, obj, 1, METHOD(POP3ToGUI));
    DoMethod(ST_POPDESC,                MUIM_Notify, MUIA_String_Contents,  MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(ST_POPHOST,                MUIM_Notify, MUIA_String_Contents,  MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(ST_POPPORT,                MUIM_Notify, MUIA_String_Contents,  MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(BT_POPTEST,                MUIM_Notify, MUIA_Pressed,          FALSE,          obj, 1, METHOD(TestPOP3Connection));
    DoMethod(ST_POPUSERID,              MUIM_Notify, MUIA_String_Contents,  MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(ST_PASSWD,                 MUIM_Notify, MUIA_String_Contents,  MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(CH_POPENABLED,             MUIM_Notify, MUIA_Selected,         MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(CY_POPAUTH,                MUIM_Notify, MUIA_Cycle_Active,     MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(CH_DELETE,                 MUIM_Notify, MUIA_Selected,         MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(CH_DOWNLOADONSTARTUP,      MUIM_Notify, MUIA_Selected,         MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(CH_INTERVAL,               MUIM_Notify, MUIA_Selected,         MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(NM_INTERVAL,               MUIM_Notify, MUIA_Numeric_Value,    MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(CH_DLLARGE,                MUIM_Notify, MUIA_Selected,         MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(ST_WARNSIZE,               MUIM_Notify, MUIA_String_Contents,  MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(CH_APPLYREMOTEFILTERS,     MUIM_Notify, MUIA_Selected,         MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(CY_PRESELECTION,           MUIM_Notify, MUIA_Cycle_Active,     MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(BT_PADD,                   MUIM_Notify, MUIA_Pressed,          FALSE,          obj, 1, METHOD(AddPOP3Entry));
    DoMethod(BT_PDEL,                   MUIM_Notify, MUIA_Pressed,          FALSE,          obj, 1, METHOD(DeletePOP3Entry));
    DoMethod(BT_POPUP,                  MUIM_Notify, MUIA_Pressed,          FALSE,          LV_POP3, 3, MUIM_NList_Move, MUIV_NList_Move_Selected, MUIV_NList_Move_Previous);
    DoMethod(BT_POPDOWN,                MUIM_Notify, MUIA_Pressed,          FALSE,          LV_POP3, 3, MUIM_NList_Move, MUIV_NList_Move_Selected, MUIV_NList_Move_Next);
    DoMethod(CY_POPSECURE,              MUIM_Notify, MUIA_Cycle_Active,     MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(CH_POP3_NOTIFY_REQ,        MUIM_Notify, MUIA_Selected,         MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    #if defined(__amigaos4__)
    DoMethod(CH_POP3_NOTIFY_OS41SYSTEM, MUIM_Notify, MUIA_Selected,         MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    #endif // __amigaos4__
    DoMethod(CH_POP3_NOTIFY_CMD,        MUIM_Notify, MUIA_Selected,         MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(ST_POP3_NOTIFY_CMD,        MUIM_Notify, MUIA_String_Contents,  MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(CH_POP3_NOTIFY_SOUND,      MUIM_Notify, MUIA_Selected,         MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(ST_POP3_NOTIFY_SOUND,      MUIM_Notify, MUIA_String_Contents,  MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));
    DoMethod(PO_POP_INCOMINGFOLDER,     MUIM_Notify, MUIA_FolderRequestPopup_FolderChanged, MUIV_EveryTime, obj, 1, METHOD(GUIToPOP3));

    // connect SMTP related stuff to the corresponding Hooks
    DoMethod(LV_SMTP,               MUIM_Notify, MUIA_NList_Active,     MUIV_EveryTime, obj, 1, METHOD(SMTPToGUI));
    DoMethod(ST_SMTPDESC,           MUIM_Notify, MUIA_String_Contents,  MUIV_EveryTime, obj, 1, METHOD(GUIToSMTP));
    DoMethod(ST_SMTPHOST,           MUIM_Notify, MUIA_String_Contents,  MUIV_EveryTime, obj, 1, METHOD(GUIToSMTP));
    DoMethod(ST_SMTPPORT,           MUIM_Notify, MUIA_String_Contents,  MUIV_EveryTime, obj, 1, METHOD(GUIToSMTP));
    DoMethod(BT_SMTPTEST,           MUIM_Notify, MUIA_Pressed,          FALSE,          obj, 1, METHOD(TestSMTPConnection));
    DoMethod(ST_SMTPAUTHUSER,       MUIM_Notify, MUIA_String_Contents,  MUIV_EveryTime, obj, 1, METHOD(GUIToSMTP));
    DoMethod(ST_SMTPAUTHPASS,       MUIM_Notify, MUIA_String_Contents,  MUIV_EveryTime, obj, 1, METHOD(GUIToSMTP));
    DoMethod(CH_SMTPENABLED,        MUIM_Notify, MUIA_Selected,         MUIV_EveryTime, obj, 1, METHOD(GUIToSMTP));
    DoMethod(CY_SMTPAUTH,           MUIM_Notify, MUIA_Cycle_Active,     MUIV_EveryTime, obj, 1, METHOD(GUIToSMTP));
    DoMethod(CH_SMTP8BIT,           MUIM_Notify, MUIA_Selected,         MUIV_EveryTime, obj, 1, METHOD(GUIToSMTP));
    DoMethod(BT_SADD,               MUIM_Notify, MUIA_Pressed,          FALSE,          obj, 1, METHOD(AddSMTPEntry));
    DoMethod(BT_SDEL,               MUIM_Notify, MUIA_Pressed,          FALSE,          obj, 1, METHOD(DeleteSMTPEntry));
    DoMethod(BT_SMTPUP,             MUIM_Notify, MUIA_Pressed,          FALSE,          LV_SMTP, 3, MUIM_NList_Move, MUIV_NList_Move_Selected, MUIV_NList_Move_Previous);
    DoMethod(BT_SMTPDOWN,           MUIM_Notify, MUIA_Pressed,          FALSE,          LV_SMTP, 3, MUIM_NList_Move, MUIV_NList_Move_Selected, MUIV_NList_Move_Next);
    DoMethod(CY_SMTPSECURE,         MUIM_Notify, MUIA_Cycle_Active,     MUIV_EveryTime, obj, 1, METHOD(GUIToSMTP));
    DoMethod(PO_SMTP_SENTFOLDER,    MUIM_Notify, MUIA_FolderRequestPopup_FolderChanged, MUIV_EveryTime, obj, 1, METHOD(GUIToSMTP));

    // set some additional cyclechain data
    set(BT_POPUP,    MUIA_CycleChain, TRUE);
    set(BT_POPDOWN,  MUIA_CycleChain, TRUE);
    set(BT_SMTPUP,   MUIA_CycleChain, TRUE);
    set(BT_SMTPDOWN, MUIA_CycleChain, TRUE);

    set(BT_POP3_NOTIFY_SOUND, MUIA_CycleChain, TRUE);
    DoMethod(BT_POP3_NOTIFY_SOUND, MUIM_Notify, MUIA_Pressed, FALSE, obj, 2, METHOD(PlaySound), ST_POP3_NOTIFY_SOUND);
  }

  RETURN((IPTR)obj);
  return (IPTR)obj;
}

///
/// OVERLOAD(MUIM_ConfigPage_ConfigToGUI)
OVERLOAD(MUIM_ConfigPage_ConfigToGUI)
{
  GETDATA;
  int numPOP = 0;
  int numSMTP = 0;
  struct MailServerNode *msn;

  ENTER();

  // clear the lists first
  set(data->LV_POP3, MUIA_NList_Quiet, TRUE);
  DoMethod(data->LV_POP3, MUIM_NList_Clear);
  set(data->LV_SMTP, MUIA_NList_Quiet, TRUE);
  DoMethod(data->LV_SMTP, MUIM_NList_Clear);

  // we iterate through our mail server list and make sure to populate
  // out NList object correctly.
  IterateList(&CE->pop3ServerList, struct MailServerNode *, msn)
  {
    DoMethod(data->LV_POP3, MUIM_NList_InsertSingle, msn, MUIV_NList_Insert_Bottom);
    numPOP++;
  }
  IterateList(&CE->smtpServerList, struct MailServerNode *, msn)
  {
    DoMethod(data->LV_SMTP, MUIM_NList_InsertSingle, msn, MUIV_NList_Insert_Bottom);
    numSMTP++;
  }

  // make sure the first entry is selected per default
  xset(data->LV_POP3, MUIA_NList_Quiet, FALSE,
                      MUIA_NList_Active, MUIV_NList_Active_Top);
  xset(data->LV_SMTP, MUIA_NList_Quiet, FALSE,
                      MUIA_NList_Active, MUIV_NList_Active_Top);

  // set the enabled stated of the del button according to the number of available accounts
  set(data->BT_PDEL, MUIA_Disabled, numPOP < 2);
  set(data->BT_SDEL, MUIA_Disabled, numSMTP < 2);

  RETURN(0);
  return 0;
}

///
/// OVERLOAD(MUIM_ConfigPage_GUIToConfig)
OVERLOAD(MUIM_ConfigPage_GUIToConfig)
{
  GETDATA;

  ENTER();

  // bring NList elements and Exec list elements into sync
  SortNListToExecList(data->LV_POP3, &CE->pop3ServerList);
  SortNListToExecList(data->LV_SMTP, &CE->smtpServerList);

  RETURN(0);
  return 0;
}

///
/// OVERLOAD(MUIM_ThreadFinished)
OVERLOAD(MUIM_ThreadFinished)
{
  GETDATA;
  struct MUIP_ThreadFinished *tf = (struct MUIP_ThreadFinished *)msg;

  ENTER();

  switch(tf->action)
  {
    case TA_ReceiveMails:
    {
      // get the server node from the taglist we supplied to the thread call
      struct MailServerNode *msn = (struct MailServerNode *)GetTagData(TT_ReceiveMails_MailServer, (IPTR)NULL, tf->actionTags);

      MUI_Request(_app(obj), _win(obj), MUIF_NONE, tr(MSG_CO_POP3_CONNECTION_TITLE), tr(MSG_OkayReq), (tf->result == TRUE) ? tr(MSG_CO_POP3_CONNECTION_SUCCESS) : tr(MSG_CO_POP3_CONNECTION_FAILURE), msn->hostname);

      set(data->BT_POPTEST, MUIA_Disabled, FALSE);
    }
    break;

    case TA_SendMails:
    {
      // get the server node from the taglist we supplied to the thread call
      struct UserIdentityNode *uin = (struct UserIdentityNode *)GetTagData(TT_SendMails_UserIdentity, (IPTR)NULL, tf->actionTags);
      struct MailServerNode *msn = uin->smtpServer;

      MUI_Request(_app(obj), _win(obj), MUIF_NONE, tr(MSG_CO_SMTP_CONNECTION_TITLE), tr(MSG_OkayReq), (tf->result == TRUE) ? tr(MSG_CO_SMTP_CONNECTION_SUCCESS) : tr(MSG_CO_SMTP_CONNECTION_FAILURE), msn->hostname);

      // delete the temporary fake identity again
      DeleteUserIdentity(uin);
      set(data->BT_SMTPTEST, MUIA_Disabled, FALSE);
    }
    break;
  }

  RETURN(0);
  return 0;
}

///
/// DECLARE(POP3ToGUI)
// fills form with data from selected list entry
DECLARE(POP3ToGUI)
{
  GETDATA;
  struct MailServerNode *msn = NULL;
  LONG pos = MUIV_NList_GetPos_Start;

  ENTER();

  // get the currently selected POP3 server
  DoMethod(data->LV_POP3, MUIM_NList_GetEntry, MUIV_NList_GetEntry_Active, &msn);

  // make sure to disable GUI elements
  if(msn == NULL || xget(data->LV_POP3, MUIA_NList_Entries) < 2)
    set(data->BT_PDEL, MUIA_Disabled, TRUE);
  else
    set(data->BT_PDEL, MUIA_Disabled, FALSE);

  if(msn != NULL)
    DoMethod(data->LV_POP3, MUIM_NList_GetPos, msn, &pos);
  else
    pos = 0;

  set(data->BT_POPUP, MUIA_Disabled, pos == 0);
  set(data->BT_POPDOWN, MUIA_Disabled, pos == (LONG)xget(data->LV_POP3, MUIA_NList_Entries) - 1);

  if(msn != NULL)
  {
    // all notifies here are nnset() notifies so that we don't trigger any additional
    // notify or otherwise we would run into problems.
    nnset(data->CH_POPENABLED,             MUIA_Selected,        isServerActive(msn));
    nnset(data->ST_POPDESC,                MUIA_String_Contents, msn->description);
    nnset(data->ST_POPHOST,                MUIA_String_Contents, msn->hostname);
    nnset(data->ST_POPPORT,                MUIA_String_Integer,  msn->port);
    nnset(data->ST_POPUSERID,              MUIA_String_Contents, msn->username);
    nnset(data->ST_PASSWD,                 MUIA_String_Contents, msn->password);
    nnset(data->CH_DOWNLOADONSTARTUP,      MUIA_Selected,        hasServerDownloadOnStartup(msn));
    nnset(data->CH_INTERVAL,               MUIA_Selected,        hasServerDownloadPeriodically(msn));
    nnset(data->NM_INTERVAL,               MUIA_Numeric_Value,   msn->downloadInterval);
    nnset(data->CH_DLLARGE,                MUIA_Selected,        hasServerDownloadLargeMails(msn));
    nnset(data->ST_WARNSIZE,               MUIA_String_Integer,  msn->largeMailSizeLimit);
    nnset(data->CH_APPLYREMOTEFILTERS,     MUIA_Selected,        hasServerApplyRemoteFilters(msn));
    nnset(data->CH_DELETE,                 MUIA_Selected,        hasServerPurge(msn));
    nnset(data->CY_PRESELECTION,           MUIA_Cycle_Active,    msn->preselection);
    nnset(data->CH_POP3_NOTIFY_REQ,        MUIA_Selected,        msn->notifyByRequester);
    #if defined(__amigaos4__)
    nnset(data->CH_POP3_NOTIFY_OS41SYSTEM, MUIA_Selected,        msn->notifyByOS41System);
    #endif // __amigaos4__
    nnset(data->CH_POP3_NOTIFY_SOUND,      MUIA_Selected,        msn->notifyBySound);
    nnset(data->CH_POP3_NOTIFY_CMD,        MUIA_Selected,        msn->notifyByCommand);
    nnset(data->ST_POP3_NOTIFY_SOUND,      MUIA_String_Contents, msn->notifySound);
    nnset(data->ST_POP3_NOTIFY_CMD,        MUIA_String_Contents, msn->notifyCommand);
    nnset(data->PO_POP_INCOMINGFOLDER,     MUIA_FolderRequestPopup_FolderID, msn->mailStoreFolderID);

    set(data->NM_INTERVAL, MUIA_Disabled, hasServerDownloadPeriodically(msn) == FALSE);
    set(data->ST_WARNSIZE, MUIA_Disabled, hasServerDownloadLargeMails(msn) == FALSE);

    #if defined(__amigaos4__)
    set(data->CH_POP3_NOTIFY_OS41SYSTEM, MUIA_Disabled, G->applicationID == 0 || LIB_VERSION_IS_AT_LEAST(ApplicationBase, 53, 2) == FALSE);
    #endif // __amigaos4__

    set(data->PO_POP3_NOTIFY_SOUND, MUIA_Disabled, msn->notifyBySound == FALSE);
    set(data->BT_POP3_NOTIFY_SOUND, MUIA_Disabled, msn->notifyBySound == FALSE);
    set(data->PO_POP3_NOTIFY_CMD, MUIA_Disabled, msn->notifyByCommand == FALSE);

    if(hasServerAPOP(msn))
      nnset(data->CY_POPAUTH, MUIA_Cycle_Active, 1);
    else
      nnset(data->CY_POPAUTH, MUIA_Cycle_Active, 0);

    if(hasServerTLS(msn))
      nnset(data->CY_POPSECURE, MUIA_Cycle_Active, 1);
    else if(hasServerSSL(msn))
      nnset(data->CY_POPSECURE, MUIA_Cycle_Active, 2);
    else
      nnset(data->CY_POPSECURE, MUIA_Cycle_Active, 0);

    // we have to enabled/disable the SSL support accordingly
    set(data->CY_POPSECURE, MUIA_Disabled, G->sslCtx == NULL);

    if(hasServerSSL(msn) == TRUE)
      nnset(data->LB_POPPORT, MUIA_Text_Contents, "995");
    else
      nnset(data->LB_POPPORT, MUIA_Text_Contents, "110");

    DoMethod(obj, METHOD(ShowSSLCertWarnings), data->GR_POP3_VIRTROOT, data->GR_POP3_SSLCERTWARNINGS, msn);
  }

  RETURN(0);
  return 0;
}

///
/// DECLARE(GUIToPOP3)
// fills form data into selected list entry
DECLARE(GUIToPOP3)
{
  GETDATA;
  int p;

  ENTER();

  p = xget(data->LV_POP3, MUIA_NList_Active);
  if(p != MUIV_NList_Active_Off)
  {
    struct MailServerNode *msn = NULL;

    DoMethod(data->LV_POP3, MUIM_NList_GetEntry, p, &msn);
    if(msn != NULL)
    {
      unsigned int oldSSLFlags;

      GetMUIString(msn->description,  data->ST_POPDESC,   sizeof(msn->description));
      GetMUIString(msn->hostname,     data->ST_POPHOST,   sizeof(msn->hostname));
      GetMUIString(msn->username,     data->ST_POPUSERID, sizeof(msn->username));
      GetMUIString(msn->password,     data->ST_PASSWD,    sizeof(msn->password));
      msn->preselection = GetMUICycle(data->CY_PRESELECTION);

      if(GetMUICheck(data->CH_POPENABLED) == TRUE)
        setFlag(msn->flags, MSF_ACTIVE);
      else
        clearFlag(msn->flags, MSF_ACTIVE);

      switch(GetMUICycle(data->CY_POPAUTH))
      {
        case 1:
          setFlag(msn->flags, MSF_APOP);
        break;

        default:
          clearFlag(msn->flags, MSF_APOP);
        break;
      }

      if(GetMUICheck(data->CH_DOWNLOADONSTARTUP) == TRUE)
        setFlag(msn->flags, MSF_DOWNLOAD_ON_STARTUP);
      else
        clearFlag(msn->flags, MSF_DOWNLOAD_ON_STARTUP);

      if(GetMUICheck(data->CH_INTERVAL) == TRUE)
        setFlag(msn->flags, MSF_DOWNLOAD_PERIODICALLY);
      else
        clearFlag(msn->flags, MSF_DOWNLOAD_PERIODICALLY);

      set(data->NM_INTERVAL, MUIA_Disabled, hasServerDownloadPeriodically(msn) == FALSE);

      msn->downloadInterval = GetMUINumer(data->NM_INTERVAL);

      if(GetMUICheck(data->CH_DLLARGE) == TRUE)
        setFlag(msn->flags, MSF_DOWNLOAD_LARGE_MAILS);
      else
        clearFlag(msn->flags, MSF_DOWNLOAD_LARGE_MAILS);

      set(data->ST_WARNSIZE, MUIA_Disabled, hasServerDownloadLargeMails(msn) == FALSE);

      msn->largeMailSizeLimit = GetMUIInteger(data->ST_WARNSIZE);

      if(GetMUICheck(data->CH_APPLYREMOTEFILTERS) == TRUE)
        setFlag(msn->flags, MSF_APPLY_REMOTE_FILTERS);
      else
        clearFlag(msn->flags, MSF_APPLY_REMOTE_FILTERS);

      if(GetMUICheck(data->CH_DELETE) == TRUE)
        setFlag(msn->flags, MSF_PURGEMESSGAES);
      else
        clearFlag(msn->flags, MSF_PURGEMESSGAES);

      // if the user hasn't yet entered an own account name or the default
      // account name is still present we go and set an automatic generated one
      if(IsStrEmpty(msn->description) || strcmp(msn->description, tr(MSG_NewEntry)) == 0)
        snprintf(msn->description, sizeof(msn->description), "%s@%s", msn->username, msn->hostname);

      msn->port = GetMUIInteger(data->ST_POPPORT);

      // remember the current flags of the server
      oldSSLFlags = msn->flags;

      switch(GetMUICycle(data->CY_POPSECURE))
      {
        // TLSv1 secure connection (STARTTLS)
        case 1:
        {
          setFlag(msn->flags, MSF_SEC_TLS);
          clearFlag(msn->flags, MSF_SEC_SSL);
        }
        break;

        // SSLv3 secure connection (SSL/TLS)
        case 2:
        {
          clearFlag(msn->flags, MSF_SEC_TLS);
          setFlag(msn->flags, MSF_SEC_SSL);
        }
        break;

        // no secure connection
        default:
        {
          clearFlag(msn->flags, MSF_SEC_TLS);
          clearFlag(msn->flags, MSF_SEC_SSL);
        }
        break;
      }

      // check if the user changed something on the SSL/TLS options and
      // update the port accordingly
      if(oldSSLFlags != msn->flags)
      {
        if(hasServerSSL(msn) == TRUE)
        {
          nnset(data->LB_POPPORT, MUIA_Text_Contents, "995");
          // adapt the port only if was the standard port for the previous security type before
          if(msn->port == 110)
          {
            nnset(data->ST_POPPORT, MUIA_String_Integer, 995);
            msn->port = 995;
          }
        }
        else
        {
          nnset(data->LB_POPPORT, MUIA_Text_Contents, "110");
          // adapt the port only if was the standard port for the previous security type before
          if(msn->port == 995)
          {
            nnset(data->ST_POPPORT, MUIA_String_Integer, 110);
            msn->port = 110;
          }
        }
      }

      msn->notifyByRequester = GetMUICheck(data->CH_POP3_NOTIFY_REQ);
      #if defined(__amigaos4__)
      msn->notifyByOS41System = GetMUICheck(data->CH_POP3_NOTIFY_OS41SYSTEM);
      #endif // __amigaos4__
      msn->notifyBySound = GetMUICheck(data->CH_POP3_NOTIFY_SOUND);
      msn->notifyByCommand = GetMUICheck(data->CH_POP3_NOTIFY_CMD);
      GetMUIString(msn->notifySound, data->ST_POP3_NOTIFY_SOUND, sizeof(msn->notifySound));
      GetMUIString(msn->notifyCommand, data->ST_POP3_NOTIFY_CMD, sizeof(msn->notifyCommand));

      msn->mailStoreFolderID = xget(data->PO_POP_INCOMINGFOLDER, MUIA_FolderRequestPopup_FolderID);
      strlcpy(msn->mailStoreFolderName, (char *)xget(data->PO_POP_INCOMINGFOLDER, MUIA_FolderRequestPopup_FolderName), sizeof(msn->mailStoreFolderName));

      #if defined(__amigaos4__)
      set(data->CH_POP3_NOTIFY_OS41SYSTEM, MUIA_Disabled, G->applicationID == 0 || LIB_VERSION_IS_AT_LEAST(ApplicationBase, 53, 2) == FALSE);
      #endif // __amigaos4__

      set(data->PO_POP3_NOTIFY_SOUND, MUIA_Disabled, msn == NULL || msn->notifyBySound == FALSE);
      set(data->BT_POP3_NOTIFY_SOUND, MUIA_Disabled, msn == NULL || msn->notifyBySound == FALSE);
      set(data->PO_POP3_NOTIFY_CMD, MUIA_Disabled, msn == NULL || msn->notifyByCommand == FALSE);

      DoMethod(data->LV_POP3, MUIM_NList_Redraw, p);
    }
  }

  RETURN(0);
  return 0;
}

///
/// DECLARE(TestPOP3Connection)
DECLARE(TestPOP3Connection)
{
  GETDATA;
  int p;

  ENTER();

  p = xget(data->LV_POP3, MUIA_NList_Active);
  if(p != MUIV_NList_Active_Off)
  {
    struct MailServerNode *msn = NULL;

    DoMethod(data->LV_POP3, MUIM_NList_GetEntry, p, &msn);
    if(msn != NULL)
    {
      // make sure we have an up-to-date server structure
      DoMethod(obj, METHOD(GUIToPOP3));

      // mark the server as "in use" and try to establish a connection
      LockMailServer(msn);
      msn->useCount++;

      set(data->BT_POPTEST, MUIA_Disabled, TRUE);

      if(DoAction(obj, TA_ReceiveMails,
        TT_ReceiveMails_MailServer, msn,
        TT_ReceiveMails_Flags, RECEIVEF_USER|RECEIVEF_TEST_CONNECTION,
        TAG_DONE) == FALSE)
      {
        // setting up the thread failed, revert all changes
        msn->useCount--;
        set(data->BT_POPTEST, MUIA_Disabled, FALSE);
      }

      // when the thread eventually terminates it will call the MUIM_ThreadFinished method

      UnlockMailServer(msn);
    }
  }

  RETURN(0);
  return 0;
}

///
/// DECLARE(AddPOP3Entry)
// adds a new entry to the POP3 account list
DECLARE(AddPOP3Entry)
{
  GETDATA;
  struct MailServerNode *msn;

  ENTER();

  if((msn = CreateNewMailServer(MST_POP3, CE, IsMinListEmpty(&CE->pop3ServerList))) != NULL)
  {
    if(IsMinListEmpty(&CE->pop3ServerList) == FALSE)
      strlcpy(msn->description, tr(MSG_NewEntry), sizeof(msn->description));

    DoMethod(data->LV_POP3, MUIM_NList_InsertSingle, msn, MUIV_NList_Insert_Bottom);

    // add the server to the list
    AddTail((struct List *)&CE->pop3ServerList, (struct Node *)msn);

    // set the new entry active and make sure that the host gadget will be
    // set as the new active object of the window as that gadget will be used
    // to automatically set the account name.
    set(data->LV_POP3, MUIA_NList_Active, MUIV_List_Active_Bottom);
    set(_win(obj), MUIA_Window_ActiveObject, data->ST_POPHOST);
  }

  RETURN(0);
  return 0;
}

///
/// DECLARE(DeletePOP3Entry)
// deletes an entry from the POP3 account list
DECLARE(DeletePOP3Entry)
{
  GETDATA;
  struct MailServerNode *msn = NULL;

  ENTER();

  DoMethod(data->LV_POP3, MUIM_NList_GetEntry, MUIV_NList_GetEntry_Active, &msn);

  if(msn != NULL &&
     xget(data->LV_POP3, MUIA_NList_Entries) > 1)
  {
    DoMethod(data->LV_POP3, MUIM_NList_Remove, MUIV_NList_Remove_Active);

    // remove it from the internal mail server list as well.
    Remove((struct Node *)msn);

    // delete a possibly existing UIDL database file
    DeleteUIDLfile(msn);

    FreeSysObject(ASOT_NODE, msn);
  }

  RETURN(0);
  return 0;
}

///
/// DECLARE(SMTPToGUI)
// fills form with data from selected list entry
DECLARE(SMTPToGUI)
{
  GETDATA;
  struct MailServerNode *msn = NULL;
  LONG pos = MUIV_NList_GetPos_Start;

  ENTER();

  // get the currently selected SMTP server
  DoMethod(data->LV_SMTP, MUIM_NList_GetEntry, MUIV_NList_GetEntry_Active, &msn);

  // make sure to disable GUI elements
  if(msn == NULL || xget(data->LV_SMTP, MUIA_NList_Entries) < 2)
    set(data->BT_SDEL, MUIA_Disabled, TRUE);
  else
    set(data->BT_SDEL, MUIA_Disabled, FALSE);

  if(msn != NULL)
    DoMethod(data->LV_SMTP, MUIM_NList_GetPos, msn, &pos);
  else
    pos = 0;

  set(data->BT_SMTPUP, MUIA_Disabled, pos == 0);
  set(data->BT_SMTPDOWN, MUIA_Disabled, pos == (LONG)xget(data->LV_SMTP, MUIA_NList_Entries) - 1);

  if(msn != NULL)
  {
    // all notifies here are nnset() notifies so that we don't trigger any additional
    // notify or otherwise we would run into problems.

    nnset(data->CH_SMTPENABLED,     MUIA_Selected,                    isServerActive(msn));
    nnset(data->ST_SMTPDESC,        MUIA_String_Contents,             msn->description);
    nnset(data->ST_SMTPHOST,        MUIA_String_Contents,             msn->hostname);
    nnset(data->ST_SMTPPORT,        MUIA_String_Integer,              msn->port);
    nnset(data->ST_SMTPAUTHUSER,    MUIA_String_Contents,             msn->username);
    nnset(data->ST_SMTPAUTHPASS,    MUIA_String_Contents,             msn->password);
    nnset(data->CH_SMTP8BIT,        MUIA_Selected,                    hasServer8bit(msn));
    nnset(data->PO_SMTP_SENTFOLDER, MUIA_FolderRequestPopup_FolderID, msn->mailStoreFolderID);

    xset(data->CY_SMTPSECURE, MUIA_NoNotify,     TRUE,
                              MUIA_Cycle_Active, MSF2SMTPSecMethod(msn),
                              MUIA_Disabled,     G->sslCtx == NULL);

    nnset(data->CY_SMTPAUTH, MUIA_Cycle_Active, hasServerAuth(msn) ? MSF2SMTPAuthMethod(msn)+1 : 0);

    set(data->ST_SMTPAUTHUSER, MUIA_Disabled, hasServerAuth(msn) == FALSE);
    set(data->ST_SMTPAUTHPASS, MUIA_Disabled, hasServerAuth(msn) == FALSE);

    if(hasServerSSL(msn) == TRUE)
      nnset(data->LB_SMTPPORT, MUIA_Text_Contents, "465");
    else if(hasServerTLS(msn) == TRUE)
      nnset(data->LB_SMTPPORT, MUIA_Text_Contents, "587");
    else
      nnset(data->LB_SMTPPORT, MUIA_Text_Contents, "25");

    DoMethod(obj, METHOD(ShowSSLCertWarnings), data->GR_SMTP_VIRTROOT, data->GR_SMTP_SSLCERTWARNINGS, msn);
  }

  RETURN(0);
  return 0;
}

///
/// DECLARE(GUIToSMTP)
// fills form data into selected list entry
DECLARE(GUIToSMTP)
{
  GETDATA;
  int p;

  ENTER();

  p = xget(data->LV_SMTP, MUIA_NList_Active);
  if(p != MUIV_NList_Active_Off)
  {
    struct MailServerNode *msn = NULL;

    DoMethod(data->LV_SMTP, MUIM_NList_GetEntry, p, &msn);
    if(msn != NULL)
    {
      unsigned int oldSSLFlags;

      GetMUIString(msn->description,  data->ST_SMTPDESC,     sizeof(msn->description));
      GetMUIString(msn->hostname,     data->ST_SMTPHOST,     sizeof(msn->hostname));
      GetMUIString(msn->username,     data->ST_SMTPAUTHUSER, sizeof(msn->username));
      GetMUIString(msn->password,     data->ST_SMTPAUTHPASS, sizeof(msn->password));

      if(GetMUICheck(data->CH_SMTPENABLED) == TRUE)
        setFlag(msn->flags, MSF_ACTIVE);
      else
        clearFlag(msn->flags, MSF_ACTIVE);

      // if the user hasn't yet entered an own account name or the default
      // account name is still present we go and set an automatic generated one
      if(IsStrEmpty(msn->description) || strcmp(msn->description, tr(MSG_NewEntry)) == 0)
        snprintf(msn->description, sizeof(msn->description), "%s@%s", msn->username, msn->hostname);

      if(GetMUICheck(data->CH_SMTP8BIT) == TRUE)
        setFlag(msn->flags, MSF_ALLOW_8BIT);
      else
        clearFlag(msn->flags, MSF_ALLOW_8BIT);

      // get the port number
      msn->port = GetMUIInteger(data->ST_SMTPPORT);

      // remember the current flags of the server
      oldSSLFlags = msn->flags;

      switch(GetMUICycle(data->CY_SMTPSECURE))
      {
        // TLSv1 secure connection (STARTTLS)
        case 1:
        {
          setFlag(msn->flags, MSF_SEC_TLS);
          clearFlag(msn->flags, MSF_SEC_SSL);
        }
        break;

        // SSLv3 secure connection (SSL/TLS)
        case 2:
        {
          clearFlag(msn->flags, MSF_SEC_TLS);
          setFlag(msn->flags, MSF_SEC_SSL);
        }
        break;

        // no secure connection
        default:
        {
          clearFlag(msn->flags, MSF_SEC_TLS);
          clearFlag(msn->flags, MSF_SEC_SSL);
        }
        break;
      }

      // check if the user changed something on the SSL/TLS options and
      // update the port accordingly
      if(oldSSLFlags != msn->flags)
      {
        if(hasServerSSL(msn) == TRUE)
        {
          nnset(data->LB_SMTPPORT, MUIA_Text_Contents, "465");
          // adapt the port only if was the standard port for the previous security type before
          if((isFlagSet(oldSSLFlags, MSF_SEC_TLS) && msn->port == 587) ||
             (isFlagClear(oldSSLFlags, MSF_SEC_TLS) && isFlagClear(oldSSLFlags, MSF_SEC_SSL) && msn->port == 25))
          {
            nnset(data->ST_SMTPPORT, MUIA_String_Integer, 465);
            msn->port = 465;
          }
        }
        else if(hasServerTLS(msn) == TRUE)
        {
          nnset(data->LB_SMTPPORT, MUIA_Text_Contents, "587");
          // adapt the port only if was the standard port for the previous security type before
          if((isFlagSet(oldSSLFlags, MSF_SEC_SSL) && msn->port == 465) ||
             (isFlagClear(oldSSLFlags, MSF_SEC_TLS) && isFlagClear(oldSSLFlags, MSF_SEC_SSL) && msn->port == 25))
          {
            nnset(data->ST_SMTPPORT, MUIA_String_Integer, 587);
            msn->port = 587;
          }
        }
        else
        {
          nnset(data->LB_SMTPPORT, MUIA_Text_Contents, "25");
          // adapt the port only if was the standard port for the previous security type before
          if((isFlagSet(oldSSLFlags, MSF_SEC_SSL) && msn->port == 465) ||
             (isFlagSet(oldSSLFlags, MSF_SEC_TLS) && msn->port == 587))
          {
            nnset(data->ST_SMTPPORT, MUIA_String_Integer, 25);
            msn->port = 25;
          }
        }
      }

      switch(GetMUICycle(data->CY_SMTPAUTH))
      {
        // No Authentication
        case 0:
        {
          clearFlag(msn->flags, MSF_AUTH);
          clearFlag(msn->flags, MSF_AUTH_AUTO);
          clearFlag(msn->flags, MSF_AUTH_DIGEST);
          clearFlag(msn->flags, MSF_AUTH_CRAM);
          clearFlag(msn->flags, MSF_AUTH_LOGIN);
          clearFlag(msn->flags, MSF_AUTH_PLAIN);
        }
        break;

        // Auto
        case 1:
        {
          setFlag(msn->flags, MSF_AUTH);
          setFlag(msn->flags, MSF_AUTH_AUTO);
          clearFlag(msn->flags, MSF_AUTH_DIGEST);
          clearFlag(msn->flags, MSF_AUTH_CRAM);
          clearFlag(msn->flags, MSF_AUTH_LOGIN);
          clearFlag(msn->flags, MSF_AUTH_PLAIN);
        }
        break;

        // DIGEST-MD5
        case 2:
        {
          setFlag(msn->flags, MSF_AUTH);
          clearFlag(msn->flags, MSF_AUTH_AUTO);
          setFlag(msn->flags, MSF_AUTH_DIGEST);
          clearFlag(msn->flags, MSF_AUTH_CRAM);
          clearFlag(msn->flags, MSF_AUTH_LOGIN);
          clearFlag(msn->flags, MSF_AUTH_PLAIN);
        }
        break;

        // CRAM-MD5
        case 3:
        {
          setFlag(msn->flags, MSF_AUTH);
          clearFlag(msn->flags, MSF_AUTH_AUTO);
          clearFlag(msn->flags, MSF_AUTH_DIGEST);
          setFlag(msn->flags, MSF_AUTH_CRAM);
          clearFlag(msn->flags, MSF_AUTH_LOGIN);
          clearFlag(msn->flags, MSF_AUTH_PLAIN);
        }
        break;

        // LOGIN
        case 4:
        {
          setFlag(msn->flags, MSF_AUTH);
          clearFlag(msn->flags, MSF_AUTH_AUTO);
          clearFlag(msn->flags, MSF_AUTH_DIGEST);
          clearFlag(msn->flags, MSF_AUTH_CRAM);
          setFlag(msn->flags, MSF_AUTH_LOGIN);
          clearFlag(msn->flags, MSF_AUTH_PLAIN);
        }
        break;

        // PLAIN
        case 5:
        {
          setFlag(msn->flags, MSF_AUTH);
          clearFlag(msn->flags, MSF_AUTH_AUTO);
          clearFlag(msn->flags, MSF_AUTH_DIGEST);
          clearFlag(msn->flags, MSF_AUTH_CRAM);
          clearFlag(msn->flags, MSF_AUTH_LOGIN);
          setFlag(msn->flags, MSF_AUTH_PLAIN);
        }
        break;
      }

      if(GetMUICycle(data->CY_SMTPAUTH) > 0)
      {
        set(data->ST_SMTPAUTHUSER, MUIA_Disabled, FALSE);
        set(data->ST_SMTPAUTHPASS, MUIA_Disabled, FALSE);
      }
      else
      {
        set(data->ST_SMTPAUTHUSER, MUIA_Disabled, TRUE);
        set(data->ST_SMTPAUTHPASS, MUIA_Disabled, TRUE);
      }

      // get the sent folder
      msn->mailStoreFolderID = xget(data->PO_SMTP_SENTFOLDER, MUIA_FolderRequestPopup_FolderID);
      strlcpy(msn->mailStoreFolderName, (char *)xget(data->PO_SMTP_SENTFOLDER, MUIA_FolderRequestPopup_FolderName), sizeof(msn->mailStoreFolderName));

      // we also have to update the SMTP Server Array
      // in case the user changes to the Identities
      // config page
      set(obj, MUIA_ConfigPage_ConfigUpdate, cp_TCPIP);

      // redraw the list
      DoMethod(data->LV_SMTP, MUIM_NList_Redraw, p);
    }
  }

  RETURN(0);
  return 0;
}

///
/// DECLARE(TestSMTPConnection)
DECLARE(TestSMTPConnection)
{
  GETDATA;
  int p;

  ENTER();

  p = xget(data->LV_SMTP, MUIA_NList_Active);
  if(p != MUIV_NList_Active_Off)
  {
    struct MailServerNode *msn = NULL;

    DoMethod(data->LV_SMTP, MUIM_NList_GetEntry, p, &msn);
    if(msn != NULL)
    {
      struct UserIdentityNode *uin;

      // make sure we have an up-to-date server structure
      DoMethod(obj, METHOD(GUIToSMTP));

      // we need a fake user identity to place the SMTP server into
      if((uin = CreateNewUserIdentity(CE)) != NULL)
      {
        uin->smtpServer = msn;

        // mark the server as "in use" and try to establish a connection
        LockMailServer(msn);
        msn->useCount++;

        set(data->BT_SMTPTEST, MUIA_Disabled, TRUE);

        if(DoAction(obj, TA_SendMails,
          TT_SendMails_UserIdentity, uin,
          TT_SendMails_Mode, SENDMAIL_ALL_USER,
          TT_SendMails_Flags, SENDF_TEST_CONNECTION,
          TAG_DONE) == FALSE)
        {
          // setting up the thread failed, revert all changes
          DeleteUserIdentity(uin);
          msn->useCount--;
          set(data->BT_SMTPTEST, MUIA_Disabled, FALSE);
        }

        // when the thread eventually terminates it will call the MUIM_ThreadFinished method

        UnlockMailServer(msn);
      }
    }
  }

  RETURN(0);
  return 0;
}

///
/// DECLARE(AddSMTPEntry)
// adds a new entry to the SMTP account list
DECLARE(AddSMTPEntry)
{
  GETDATA;
  struct MailServerNode *msn;

  ENTER();

  if((msn = CreateNewMailServer(MST_SMTP, CE, IsMinListEmpty(&CE->smtpServerList))) != NULL)
  {
    if(IsMinListEmpty(&CE->smtpServerList) == FALSE)
      strlcpy(msn->description, tr(MSG_NewEntry), sizeof(msn->description));

    DoMethod(data->LV_SMTP, MUIM_NList_InsertSingle, msn, MUIV_NList_Insert_Bottom);

    // add the server to the list
    AddTail((struct List *)&CE->smtpServerList, (struct Node *)msn);

    // set the new entry active and make sure that the host gadget will be
    // set as the new active object of the window as that gadget will be used
    // to automatically set the account name.
    set(data->LV_SMTP, MUIA_NList_Active, MUIV_List_Active_Bottom);
    set(_win(obj), MUIA_Window_ActiveObject, data->ST_SMTPHOST);
  }

  RETURN(0);
  return 0;
}

///
/// DECLARE(DeleteSMTPEntry)
// deletes an entry from the SMTP account list
DECLARE(DeleteSMTPEntry)
{
  GETDATA;
  struct MailServerNode *msn = NULL;

  ENTER();

  DoMethod(data->LV_SMTP, MUIM_NList_GetEntry, MUIV_NList_GetEntry_Active, &msn);

  if(msn != NULL &&
     xget(data->LV_SMTP, MUIA_NList_Entries) > 1)
  {
    DoMethod(data->LV_SMTP, MUIM_NList_Remove, MUIV_NList_Remove_Active);

    // remove it from the internal mail server list as well.
    Remove((struct Node *)msn);

    FreeSysObject(ASOT_NODE, msn);
  }

  RETURN(0);
  return 0;
}

///
/// DECLARE(PlaySound)
// plays sound file referred by the string gadget
DECLARE(PlaySound) // Object *strObj
{
  char *file;

  ENTER();

  file = (char *)xget(msg->strObj, MUIA_String_Contents);
  if(IsStrEmpty(file) == FALSE)
    PlaySound(file);

  RETURN(0);
  return 0;
}

///
/// DECLARE(ShowSSLCertWarnings)
DECLARE(ShowSSLCertWarnings) // Object *vroot, Object *group, struct MailServerNode *msn
{
  ENTER();

  // workaround for a bug in MUI 3.8
  // the surrounding virtual group must be put into change state as well, otherwise the
  // contents will not be refreshed correctly
  if(DoMethod(msg->vroot, MUIM_Group_InitChange))
  {
    if(DoMethod(msg->group, MUIM_Group_InitChange))
    {
      int failures = msg->msn->certFailures;
      struct List *childList = (struct List *)xget(msg->group, MUIA_Group_ChildList);
      Object *cstate = (Object *)childList->lh_Head;
      Object *child;

      // remove all children first in any case
      while((child = NextObject(&cstate)) != NULL)
      {
        DoMethod(msg->group, OM_REMMEMBER, child);
        MUI_DisposeObject(child);
      }

      if(failures != SSL_CERT_ERR_NONE)
      {
        Object *clear;

        DoMethod(msg->group, OM_ADDMEMBER, HBarT(tr(MSG_CO_ACCEPTED_SERVER_CERT_WARNINGS)), End);

        if(isFlagSet(failures, SSL_CERT_ERR_UNTRUSTED))
          DoMethod(msg->group, OM_ADDMEMBER, TextObject, MUIA_Text_Copy, FALSE, MUIA_Text_Contents, tr(MSG_SSL_CERT_WARNING_UNTRUSTED), End);

        if(isFlagSet(failures, SSL_CERT_ERR_IDMISMATCH))
          DoMethod(msg->group, OM_ADDMEMBER, TextObject, MUIA_Text_Copy, FALSE, MUIA_Text_Contents, tr(MSG_SSL_CERT_WARNING_IDMISMATCH), End);

        if(isFlagSet(failures, SSL_CERT_ERR_NOTYETVALID))
          DoMethod(msg->group, OM_ADDMEMBER, TextObject, MUIA_Text_Copy, FALSE, MUIA_Text_Contents, tr(MSG_SSL_CERT_WARNING_NOTYETVALID), End);

        if(isFlagSet(failures, SSL_CERT_ERR_EXPIRED))
          DoMethod(msg->group, OM_ADDMEMBER, TextObject, MUIA_Text_Copy, FALSE, MUIA_Text_Contents, tr(MSG_SSL_CERT_WARNING_EXPIRED), End);

        if(isFlagSet(failures, SSL_CERT_ERR_SIGINVALID))
          DoMethod(msg->group, OM_ADDMEMBER, TextObject, MUIA_Text_Copy, FALSE, MUIA_Text_Contents, tr(MSG_SSL_CERT_WARNING_SIGINVALID), End);

        if(isFlagSet(failures, SSL_CERT_ERR_OTHER))
          DoMethod(msg->group, OM_ADDMEMBER, TextObject, MUIA_Text_Copy, FALSE, MUIA_Text_Contents, tr(MSG_SSL_CERT_WARNING_OTHER), End);

        clear = MakeButton(tr(MSG_CO_CLEAR_SERVER_CERT_WARNINGS));
        DoMethod(clear, MUIM_Notify, MUIA_Pressed, FALSE, obj, 4, METHOD(ClearSSLCertWarnings), msg->vroot, msg->group, msg->msn);

        DoMethod(msg->group, OM_ADDMEMBER, HGroup,
          Child, HSpace(0),
          Child, clear,
          End);
      }
      else
      {
        // just (re)add a spacer if no warnings were ignored
        DoMethod(msg->group, OM_ADDMEMBER, HSpace(0));
      }

      DoMethod(msg->group, MUIM_Group_ExitChange);
    }
    DoMethod(msg->vroot, MUIM_Group_ExitChange);
  }

  RETURN(0);
  return 0;
}

///
/// DECLARE(ClearSSLCertWarnings)
DECLARE(ClearSSLCertWarnings) // Object *vroot, Object *group, struct MailServerNode *msn
{
  ENTER();

  // reset all errors and remove the previous list of errors
  msg->msn->certFailures = SSL_CERT_ERR_NONE;
  // we must push the method instead of calling it directly, because this method
  // is called from within an OM_SET method (MUIA_Pressed=FALSE) and the update
  // will dispose the button object. This must crash, because the OM_SET method
  // will continue after the MUI_DisposeObject() call.
  DoMethod(_app(obj), MUIM_Application_PushMethod, obj, 4, METHOD(ShowSSLCertWarnings), msg->vroot, msg->group, msg->msn);

  RETURN(0);
  return 0;
}

///