Beispiel #1
0
VOID ShowError(Object *application, Object *window, CONST_STRPTR message, BOOL useIOError)
{
    TEXT   buffer[128];
    STRPTR newline = "\n",
           period  = ".",
           extra   = buffer;
           
    /* Never use IO error if it is 0 */
    if (IoErr() == 0) useIOError = FALSE;
    
    if (useIOError)
    {
        Fault(IoErr(), NULL, buffer, sizeof(buffer));
        buffer[0] = toupper(buffer[0]);
    }
    else
    {
        newline = "";
        period  = "";
        extra   = "";
    }
            
    MUI_Request
    (
        application, window, 0, _(MSG_TITLE), _(MSG_ERROR_OK), 
        "%s:\n%s%s%s%s", _(MSG_ERROR_HEADER), message, newline, extra, period
    );
}
Beispiel #2
0
void DisplayErrorMessage(Object * obj, enum ErrorCode errorcode)
{
    CONST_STRPTR errormessage = NULL;
    CONST_STRPTR additionaldata = NULL;
    Object * app = NULL;
    Object * wnd = NULL;

    GET(obj, MUIA_ApplicationObject, &app);
    GET(obj, MUIA_Window_Window, &wnd);

    switch(errorcode)
    {
    case(UNKNOWN_ERROR):
        errormessage = _(MSG_ERR_UNKNOWN_ERROR);
        break;
    case(NOT_RESTARTED_STACK):
        errormessage = _(MSG_ERR_NOT_RESTARTED_STACK);
        break;
    case(NOT_SAVED_PREFS_ENV):
        errormessage = _(MSG_ERR_NOT_SAVED_PREFS);
        additionaldata = PREFS_PATH_ENV;
        break;
    case(NOT_SAVED_PREFS_ENVARC):
        errormessage = _(MSG_ERR_NOT_SAVED_PREFS);
        additionaldata = PREFS_PATH_ENVARC;
        break;
    case(NOT_COPIED_FILES_ENV):
        errormessage = _(MSG_ERR_NOT_COPIED_FILES);
        additionaldata = PREFS_PATH_ENV;
        break;
    case(NOT_COPIED_FILES_ENVARC):
        errormessage = _(MSG_ERR_NOT_COPIED_FILES);
        additionaldata = PREFS_PATH_ENVARC;
        break;
    case(ALL_OK):
        return;
    }

    MUI_Request(app, wnd, 0, _(MSG_ERROR_TITLE), _(MSG_BUTTON_OK), errormessage, additionaldata);
}
Beispiel #3
0
///
/// US_DelFunc
//  Removes a user from the user database
HOOKPROTONHNONP(US_DelFunc, void)
{
  Object *lv;
  int userIndex;
  int m;
  struct User *user;

  ENTER();

  lv = G->US->GUI.LV_USERS;
  userIndex = xget(lv, MUIA_NList_Active);
  DoMethod(lv, MUIM_NList_GetEntry, userIndex, &user);

  if(user->MailDir[0] != '\0')
  {
    m = MUI_Request(G->App, G->US->GUI.WI, MUIF_NONE,
                    tr(MSG_MA_ConfirmReq), tr(MSG_US_RemoveReqGads), tr(MSG_US_RemoveReq));

    if(m == 1)
      DeleteMailDir(user->MailDir, TRUE);
  }
  else
  {
    // just remove the user, as this doesn't have an own mail directory
    m = 2;
  }

  if(m != 0)
  {
    DoMethod(lv, MUIM_NList_Remove, userIndex);
    // reactivate the Add/Del buttons
    set(G->US->GUI.BT_ADD, MUIA_Disabled, FALSE);
    set(G->US->GUI.BT_DEL, MUIA_Disabled, xget(lv, MUIA_NList_Entries) == 0);
  }

  LEAVE();
}
Beispiel #4
0
IPTR NetPEditor__MUIM_PrefsEditor_Save
(
    Class *CLASS, Object *self, Msg message
)
{
    struct NetPEditor_DATA *data = INST_DATA(CLASS, self);
    enum ErrorCode errorcode = UNKNOWN_ERROR;

    Gadgets2NetworkPrefs(data);

    if ((errorcode = SaveNetworkPrefs()) == ALL_OK)
    {
        SET(self, MUIA_PrefsEditor_Changed, FALSE);
        SET(self, MUIA_PrefsEditor_Testing, FALSE);
        return TRUE;
    }

    DisplayErrorMessage(self, errorcode);

    /* Prefs saved to disk, but stack not restarted. Inform about restart will 'apply' changes */
    if (errorcode == NOT_RESTARTED_STACK)
    {
        Object * app = NULL;
        Object * wnd = NULL;

        GET(self, MUIA_ApplicationObject, &app);
        GET(self, MUIA_Window_Window, &wnd);

        MUI_Request(app, wnd, 0, _(MSG_INFO_TITLE), _(MSG_BUTTON_OK),
                    _(MSG_PREFS_SAVED_RESTART), PREFS_PATH_ENVARC);

        return TRUE;
    }

    return FALSE;
}
Beispiel #5
0
__saveds __asm ULONG GROM_Generate (a2 Object *Win, a1 SW_IDATA **idata)
{
   UBYTE fspec[FMSIZE];
   BPTR  fp = NULL;
   ULONG x, Cost1 = (ULONG)(idata[2]), Cost2 = (ULONG)(idata[3]);
   UBYTE DoneText[] = "\33c\33bDone:\33n Registration form saved to file %s\n\n"
                      "Email to " SRK_EMAIL " or send by postal mail to:\n\n"
                      "   %s Registration\n"
                      "   405 Pulsar St.\n"
                      "   Fort Collins, CO 80525 USA\n\n"
                      "See the above file for more information.\n\n"
                      "Thank you for registering %s!";
   UBYTE ErrText[]  = "\33c\33bError:\33n Unable to open registration file %s.";
   UBYTE *Prog = (UBYTE *)(idata[1]);

   AddPart(strcpy(fspec, "RAM:"), Prog, FMSIZE);
   strcat(fspec, ".Regform");

   for (x=0; RG_ParseTable[x].Keyword; x++) {
      UBYTE *Val;
      get((*idata)->Gads[x], MUIA_String_Contents, &Val);

      if (RG_ParseTable[x].Required && (!Val || !Val[0])) {
         MUI_Request(Win, (*idata)->RegWin, 0,NULL, "*_Ok",(char *)
                     "\33c\33bError:\33n No value suppled for required "
                     "field '%s'\n",
                     RG_ParseTable[x].Keyword, NULL);
         goto Done;
      }
   }


   if (!(fp = Open(fspec, MODE_NEWFILE))) {
      MUI_Request(Win, (*idata)->RegWin, 0,NULL, "*_Ok",(char *)ErrText,
                  fspec, NULL, NULL);
      goto Done;
   }

   FPrintf(fp, "E-mail this form to %s with the subject line:\n"
               "  CMD REGISTER %s\n\n"
               "Registration cost is US $%ld for E-Mail registration and\n"
               "US $%ld for postal mail registration.  E-Mail registration\n"
               "will receive a keyfile shortly.  Postal registration should\n"
               "allow 4 weeks and include a disk and self addressed stamped\n"
               "envelope.  Checks can be made payable to ShadowWorks Software.\n\n"
               "Registration request for %s\n\n",

           SRK_EMAIL, Prog, Cost1, Cost2, Prog);

   for (x=0; RG_ParseTable[x].Keyword; x++) {
      UBYTE *Val;
      
      get((*idata)->Gads[x], MUIA_String_Contents, &Val);

      if (Val && Val[0])
         FPrintf(fp, "%-10s = %s\n", RG_ParseTable[x].Keyword, Val);
   }

   Close(fp); fp = NULL;

   MUI_Request(Win, (*idata)->RegWin, 0,NULL, "*_Ok",(char *)DoneText,
               fspec, Prog, Prog);

   set(Win, MUIA_Window_Open, FALSE);

  Done:
   if (fp) Close(fp);

   return 0;
}
Beispiel #6
0
void EventLoop(void)
{
    while (1)
    {
        ULONG sigs = 0UL;

        switch(DoMethod(MUIApp, MUIM_Application_NewInput, &sigs))
        {

        case MUIV_Application_ReturnID_Quit:
            return;

        case ACTID_OPEN:
        {
            struct FileRequester *request;

            request = MUI_AllocAslRequestTags(ASL_FileRequest,
                                              ASLFR_Window, xget(MUIWindow, MUIA_Window_Window),
                                              ASLFR_TitleText, msgTextProgramName,
                                              ASLFR_RejectIcons, TRUE,
                                              ASLFR_InitialDrawer, "SYS:Prefs/Presets",
                                              TAG_DONE );
            if( request != NULL )
            {
                DoMethod(MUIApp, MUIA_Application_Sleep, TRUE);
                if (MUI_AslRequest(request, NULL))
                {
                    char *file;

                    DoMethod(MUIApp, MUIA_Application_Sleep, FALSE);

                    file = AllocVec(strlen(request->fr_Drawer)+128,0);

                    if( file != NULL )
                    {
                        CopyMem(request->fr_Drawer, file, strlen(request->fr_Drawer)+1);
                        AddPart(file, request->fr_File, 128);
                        NewSettings(file);
                        GUINewSettings();
                        FreeVec(file);
                    }
                }
                else
                {
                    DoMethod(MUIApp, MUIA_Application_Sleep, FALSE);
                }
                MUI_FreeAslRequest(request);
            }
            break;
        }

        case ACTID_SAVEAS:
        {
            struct FileRequester *request;

            request = MUI_AllocAslRequestTags(ASL_FileRequest,
                                              ASLFR_Window, xget(MUIWindow, MUIA_Window_Window),
                                              ASLFR_TitleText, msgTextProgramName,
                                              ASLFR_RejectIcons, TRUE,
                                              ASLFR_DoSaveMode, TRUE,
                                              ASLFR_InitialDrawer, "SYS:Prefs/Presets",
                                              TAG_DONE);

            if(request != NULL )
            {
                DoMethod(MUIApp, MUIA_Application_Sleep, TRUE);
                FillUnit();
                if (MUI_AslRequest(request, NULL))
                {
                    char *file;

                    DoMethod(MUIApp, MUIA_Application_Sleep, FALSE);

                    file = AllocVec(strlen(request->fr_Drawer)+128,0);

                    if( file != NULL )
                    {
                        CopyMem(request->fr_Drawer, file, strlen(request->fr_Drawer)+1);
                        AddPart(file, request->fr_File, 128);
                        SaveSettings(file, UnitList);
                        if(SaveIcons)
                        {
                            WriteIcon(file);
                        }
                        FreeVec(file);
                    }
                }
                else
                {
                    DoMethod(MUIApp, MUIA_Application_Sleep, FALSE);
                }
                MUI_FreeAslRequest(request);
            }
            break;
        }

        case ACTID_ABOUT:
            MUI_Request(MUIApp, MUIWindow, 0, (char *) msgTextProgramName,
                        (char*)msgButtonOK, (char*)msgTextCopyright, "\033c",
                        (char*)msgTextProgramName, "1996-1999 Stéphane Barbaray/Martin Blom");
            break;

        case ACTID_SAVE:
            FillUnit();
            SaveSettings(ENVFILE, UnitList);
            SaveSettings(ENVARCFILE, UnitList);
            return;

        case ACTID_USE:
            FillUnit();
            SaveSettings(ENVFILE, UnitList);
            return;

        case ACTID_QUIT:
            return;

        case ACTID_DEFAULT:
            NewSettings(NULL);
            GUINewSettings();
            break;

        case ACTID_LASTSAVED:
            NewSettings(ENVARCFILE);
            GUINewSettings();
            break;

        case ACTID_RESTORE:
            NewSettings(args.from);
            GUINewSettings();
            break;

        case ACTID_ICONS:
        {
            APTR item = (APTR)DoMethod(MUIMenu,MUIM_FindUData,ACTID_ICONS);

            if(item)
            {
                if(xget(item, MUIA_Menuitem_Checked))
                {
                    SaveIcons = TRUE;
                }
                else
                {
                    SaveIcons = FALSE;
                }
            }
            break;
        }

        case ACTID_HELP:
            DoMethod(MUIApp,MUIM_Application_ShowHelp,NULL,NULL,"AHI",0);
            break;

        case ACTID_GUIDE:
            DoMethod(MUIApp,MUIM_Application_ShowHelp,NULL,NULL,"MAIN",0);
            break;

        case ACTID_HELPINDEX:
            DoMethod(MUIApp,MUIM_Application_ShowHelp,NULL,NULL,"Concept Index",0);
            break;

        case ACTID_UNIT:
            FillUnit();
            NewUnit(xget(MUIUnit,MUIA_Cycle_Active));
            GUINewUnit();
            break;

        case ACTID_MODE:
            FillUnit();
            NewMode(xget(MUIList, MUIA_List_Active));
            GUINewMode();
            break;

        case ACTID_DEBUG:
        case ACTID_SURROUND:
        case ACTID_ECHO:
        case ACTID_CPULIMIT:
        case ACTID_CLIPMV:
        case ACTID_ACTIME:
        {
            ULONG debug = AHI_DEBUG_NONE, surround = FALSE, echo = 0, cpu = 90;
            ULONG clip = FALSE, actime = 0;

            get(MUIDebug, MUIA_Cycle_Active, &debug);
            get(MUISurround, MUIA_Cycle_Active, &surround);
            get(MUIEcho, MUIA_Cycle_Active, &echo);
            get(MUIClipvol, MUIA_Cycle_Active, &clip);
            get(MUICpu, MUIA_Numeric_Value, &cpu);
            get(MUIACTime, MUIA_Numeric_Value, &actime);

            globalprefs.ahigp_DebugLevel       = debug;
            globalprefs.ahigp_DisableSurround  = surround;
            globalprefs.ahigp_DisableEcho      = (echo == 2);
            globalprefs.ahigp_FastEcho         = (echo == 1);
            globalprefs.ahigp_MaxCPU           = ((cpu << 16) + 100) / 100;
            globalprefs.ahigp_ClipMasterVolume = clip;
            globalprefs.ahigp_AntiClickTime    = ((actime << 16) + 1000) / 1000;

            break;
        }

        default:
            if (sigs)
            {
                sigs = Wait(sigs | SIGBREAKF_CTRL_C);
                if (sigs & SIGBREAKF_CTRL_C)
                    return;
            }
            break;
        }
    }
}
Beispiel #7
0
static IPTR mGetPrefs(struct IClass *cl,Object *obj, struct MUIP_Win_GetPrefs *msg)
{
    struct data            *data = INST_DATA(cl,obj);
    struct URL_Prefs       *p;
    struct URL_BrowserNode *bn;
    struct URL_MailerNode  *mn;
    struct URL_FTPNode     *fn;
    ULONG                  mode, error = 0;

    /* get the openurl.library prefs */

    switch (msg->mode)
    {
        case MUIV_Win_GetPrefs_InUse:      mode = URL_GetPrefs_Mode_InUse;   break;
        case MUIV_Win_GetPrefs_LastSaveds: mode = URL_GetPrefs_Mode_Envarc;  break;
        case MUIV_Win_GetPrefs_Restore:    mode = URL_GetPrefs_Mode_Env;     break;
        case MUIV_Win_GetPrefs_Defaults:   mode = URL_GetPrefs_Mode_Default; break;
        default: return FALSE;
    }

    p = URL_GetPrefs(URL_GetPrefs_Mode,mode,TAG_DONE);
    if (!p) error = MSG_Err_NoPrefs;
    else if (p->up_Version!=PREFS_VERSION) error = MSG_Err_BadPrefs;

    if (error)
    {
        MUI_Request(_app(obj),NULL,0,getString(MSG_ErrReqTitle),
                                     getString(MSG_ErrReqGadget),
                                     getString(error),
                                     p ? p->up_Version : 0);

        if (p) URL_FreePrefsA(p,NULL);

        return FALSE;
    }

    /* Browsers */
    set(data->browserList,MUIA_List_Quiet,TRUE);
    DoMethod(data->browserList,MUIM_List_Clear);

    for (bn = (struct URL_BrowserNode *)p->up_BrowserList.mlh_Head;
         bn->ubn_Node.mln_Succ;
         bn = (struct URL_BrowserNode *)bn->ubn_Node.mln_Succ)
    {
        DoMethod(data->browserList,MUIM_List_InsertSingle,(IPTR)bn,MUIV_List_Insert_Bottom);
    }

    set(data->browserList,MUIA_List_Quiet,FALSE);

    /* Mailers */
    set(data->mailerList,MUIA_List_Quiet,TRUE);
    DoMethod(data->mailerList,MUIM_List_Clear);

    for (mn = (struct URL_MailerNode *)p->up_MailerList.mlh_Head;
         mn->umn_Node.mln_Succ;
         mn = (struct URL_MailerNode *)mn->umn_Node.mln_Succ)
    {
        DoMethod(data->mailerList,MUIM_List_InsertSingle,(IPTR)mn,MUIV_List_Insert_Bottom);
    }

    set(data->mailerList,MUIA_List_Quiet,FALSE);

    /* FTPs */
    set(data->FTPList,MUIA_List_Quiet,TRUE);
    DoMethod(data->FTPList,MUIM_List_Clear);

    for (fn = (struct URL_FTPNode *)p->up_FTPList.mlh_Head;
         fn->ufn_Node.mln_Succ;
         fn = (struct URL_FTPNode *)fn->ufn_Node.mln_Succ)
    {
        DoMethod(data->FTPList,MUIM_List_InsertSingle,(IPTR)fn,MUIV_List_Insert_Bottom);
    }

    set(data->FTPList,MUIA_List_Quiet,FALSE);

    /* Miscellaneous */
    set(data->prepend, MUIA_Selected, isFlagSet(p->up_Flags, UPF_PREPENDHTTP));
    set(data->mailto, MUIA_Selected, isFlagSet(p->up_Flags, UPF_DOMAILTO));
    set(data->useFTP, MUIA_Selected, isFlagSet(p->up_Flags, UPF_DOFTP));

    set(data->show, MUIA_Selected, p->up_DefShow);
    set(data->toFront, MUIA_Selected, p->up_DefBringToFront);
    set(data->newWin, MUIA_Selected, p->up_DefNewWindow);
    set(data->launch, MUIA_Selected, p->up_DefLaunch);

    /* Activate the first entry */
    DoSuperMethod(cl,obj,MUIM_MultiSet,MUIA_List_Active,MUIV_List_Active_Top,
        (IPTR)data->browserList,
        (IPTR)data->mailerList,
        (IPTR)data->FTPList,
        NULL);

    URL_FreePrefsA(p,NULL);

    return TRUE;
}
Beispiel #8
0
///
/// US_SaveUserList
//  Initializes configuration files for new users and saves the user database
static BOOL US_SaveUserList(void)
{
  BOOL result = TRUE;
  int i;

  ENTER();

  get(G->US->GUI.LV_USERS, MUIA_NList_Entries, &G->Users.Num);
  for(i = 0; i < G->Users.Num; i++)
  {
    struct User *user;
    BOOL validUser = FALSE;

    DoMethod(G->US->GUI.LV_USERS, MUIM_NList_GetEntry, i, &user);

    if(user != NULL)
    {
      memcpy(&G->Users.User[i], user, sizeof(G->Users.User[i]));

      if(user->Name[0] != '\0')
      {
        if(user->MailDir[0] != '\0')
        {
          enum FType type;

          if(ObtainFileInfo(user->MailDir, FI_TYPE, &type) == FALSE || type != FIT_DRAWER)
          {
            if(MUI_Request(G->App, G->US->GUI.WI, MUIF_NONE, tr(MSG_MA_MUsers), tr(MSG_YesNoReq), tr(MSG_US_DIRECTORY_DOESNT_EXIST), user->MailDir, user->Name))
            {
              if(CreateDirectory(user->MailDir) == TRUE)
                validUser = TRUE;
              else
                ER_NewError(tr(MSG_ER_CantCreateDir), user->MailDir);
            }
          }
          else
            validUser = TRUE;
        }
        else
          ER_NewError(tr(MSG_ER_MissingDirectory));
      }
      else
        ER_NewError(tr(MSG_ER_MissingName));
    }
    else
      break;

    if(validUser == TRUE)
    {
      if(user->IsNew == TRUE)
      {
        if(user->Clone == TRUE)
        {
          char dest[SIZE_PATHFILE];

          // clone some files for the new user
          AddPath(dest, user->MailDir, ".addressbook", sizeof(dest));
          CopyFile(dest, NULL, G->abookFilename, NULL);

          AddPath(dest, user->MailDir, ".glossary", sizeof(dest));
          CopyFile(dest, NULL, G->DI_Filename, NULL);

          AddPath(dest, user->MailDir, ".config", sizeof(dest));
          CopyFile(dest, NULL, G->CO_PrefsFile, NULL);
        }
        else
        {
          char dest[SIZE_PATHFILE];

          // create an empty .addressbook file
          AddPath(dest, user->MailDir, ".addressbook", sizeof(dest));
          CreateEmptyABookFile(dest);
        }
      }
    }
    else
    {
      set(G->US->GUI.LV_USERS, MUIA_NList_Active, i);
      result = FALSE;
      // break out of the loop
      break;
    }
  }

  if(result == TRUE)
    US_SaveUsers();

  RETURN(result);
  return result;
}
Beispiel #9
0
///
/// US_Login
//  User login: puts up user list and waits for a selection
BOOL US_Login(const char *username, const char *password, const char *maildir, const char *prefsfile)
{
  int userIndex = -1;
  BOOL loggedin = FALSE;

  ENTER();

  // Load the .users file first
  US_LoadUsers();

  // if a username was given check if we have this username in
  // our loaded user list
  if(username != NULL)
  {
    int i;

    for(i = 0; i < G->Users.Num; i++)
    {
      if(stricmp(G->Users.User[i].Name, username) == 0)
      {
        userIndex = i;
        break;
      }
    }
  }

  // if we didn't find the specified user in our .users file or
  // if no username was given lets query in the splash window
  // for it.
  if(userIndex < 0)
  {
    // erase a possibly given password
    password = NULL;

    if(username != NULL)
    {
      // a user name was given at startup, but we didn't find it in our list
      MUI_Request(G->App, G->SplashWinObject, MUIF_NONE, tr(MSG_ER_USER_UNKNOWN_TITLE),
                                              tr(MSG_ER_USER_UNKNOWN_BUTTON),
                                              tr(MSG_ER_USER_UNKNOWN_ERROR), username);
      userIndex = -1;
    }
    else if(G->Users.Num >= 2)
    {
      // more than one users are available, let the user at the screen choose from these
      userIndex = DoMethod(G->SplashWinObject, MUIM_SplashWindow_SelectUser);
    }
    else
    {
      // no specific name was given, log in the first available user
      userIndex = 0;
    }
  }

  if(userIndex >= 0)
  {
    struct User *user = &G->Users.User[userIndex];

    G->Users.CurrentID = user->ID;
    strlcpy(G->MA_MailDir, maildir ? maildir : user->MailDir, sizeof(G->MA_MailDir));
    D(DBF_STARTUP, "user mail dir '%s'", G->MA_MailDir);

    if(prefsfile != NULL)
      strlcpy(G->CO_PrefsFile, prefsfile, sizeof(G->CO_PrefsFile));
    else
      AddPath(G->CO_PrefsFile, G->MA_MailDir, ".config", sizeof(G->CO_PrefsFile));
    D(DBF_STARTUP, "user config file '%s'", G->CO_PrefsFile);

    AddPath(G->abookFilename, user->UseAddr ? G->ProgDir : G->MA_MailDir, ".addressbook", sizeof(G->abookFilename));
    AddPath(G->DI_Filename, user->UseDict ? G->ProgDir : G->MA_MailDir, ".glossary", sizeof(G->DI_Filename));

    if(IsStrEmpty(user->Password) == FALSE)
    {
      // prompt for a password, if the given one does not match or none was given by tooltypes/command line
      if(IsStrEmpty(password) == FALSE)
        loggedin = (strcmp(password, user->Password) == 0 || strcmp(password, "\01") == 0);

      if(loggedin == FALSE)
        loggedin = DoMethod(G->SplashWinObject, MUIM_SplashWindow_PasswordRequest, user);
    }
    else
    {
      // this user has no password, so we signal success
      loggedin = TRUE;
    }
  }

  RETURN(loggedin);
  return loggedin;
}
Beispiel #10
0
/* /// "ApplyDragAction()" */
BOOL ApplyDragAction(Object *obj, LONG targetentry)
{
    struct PrefsListEntry *targetplnode = NULL;
    struct PrefsListEntry *sourceplnode = NULL;
    ULONG sourceid, targetid;
    IPTR sourceentry = -1;
    LONG result;
    APTR pic, spic, tpic;
    APTR form;

    get(obj, MUIA_List_Active, &sourceentry);
    if((((LONG) sourceentry) < 0) || (targetentry < 0))
    {
        return(FALSE);
    }
    DoMethod(obj, MUIM_List_GetEntry, sourceentry, &sourceplnode);
    DoMethod(obj, MUIM_List_GetEntry, targetentry, &targetplnode);
    if((!(sourceplnode && targetplnode)) || (sourceplnode == targetplnode))
    {
        return(FALSE);
    }
    sourceid = sourceplnode->chunkid;
    targetid = targetplnode->chunkid;

    switch(sourceid)
    {
        case IFFFORM_DEVICECFG:
            if(targetid == IFFFORM_DEVICECFG)
            {
                result = MUI_Request(_app(obj), _win(obj), 0, NULL, "Replace|Merge|Cancel",
                                     "Do you want to \33breplace\33n or \33bmerge\33n the prefs of\n"
                                     "\33b%s\33n\n"
                                     "with the contents from\n"
                                     "\33b%s\33n?", targetplnode->id, sourceplnode->id);
                if(result < 1)
                {
                    return(FALSE);
                }
                tpic = NULL;
                spic = NULL;
                pic = psdFindCfgForm(NULL, IFFFORM_DEVICECFG);
                while(pic)
                {
                    if(psdMatchStringChunk(pic, IFFCHNK_DEVID, targetplnode->devid))
                    {
                        tpic = pic;
                    }
                    if(psdMatchStringChunk(pic, IFFCHNK_DEVID, sourceplnode->devid))
                    {
                        spic = pic;
                    }
                    pic = psdNextCfgForm(pic);
                }
                if(!(tpic && spic))
                {
                    return(FALSE);
                }
                // delete old contents
                if(result == 1)
                {
                    while((pic = psdFindCfgForm(tpic, IFFFORM_DEVCFGDATA)))
                    {
                        psdRemCfgForm(pic);
                    }
                    while((pic = psdFindCfgForm(tpic, IFFFORM_IFCFGDATA)))
                    {
                        psdRemCfgForm(pic);
                    }
                }

                // copy device cfg data
                pic = psdFindCfgForm(spic, IFFFORM_DEVCFGDATA);
                while(pic)
                {
                    form = psdWriteCfg(pic);
                    if(form)
                    {
                        psdAddCfgEntry(tpic, form);
                        psdFreeVec(form);
                    }
                    pic = psdNextCfgForm(pic);
                }
                // copy interface cfg data
                pic = psdFindCfgForm(spic, IFFFORM_IFCFGDATA);
                while(pic)
                {
                    form = psdWriteCfg(pic);
                    if(form)
                    {
                        psdAddCfgEntry(tpic, form);
                        psdFreeVec(form);
                    }
                    pic = psdNextCfgForm(pic);
                }
                return(TRUE);
            }
            break;

        case IFFFORM_IFCFGDATA:
        case IFFFORM_DEVCFGDATA:
            if((targetid == IFFFORM_DEVCFGDATA) || (targetid == IFFFORM_IFCFGDATA))
            {
                if(strcmp(sourceplnode->owner, targetplnode->owner))
                {
                    result = MUI_RequestA(_app(obj), _win(obj), 0, NULL, "Add to device|Cancel",
                                          "Sorry, but only prefs of the same owner can\n"
                                          "be replaced.\n\n"
                                          "Do you wish to add this prefs\n"
                                          "to the device instead?", NULL);
                    if(result < 1)
                    {
                        return(FALSE);
                    }
                    targetid = IFFFORM_DEVICECFG;
                } else {
                    result = MUI_Request(_app(obj), _win(obj), 0, NULL, "Replace|Cancel",
                                         "Do you want to \33breplace\33n the prefs of\n"
                                         "\33b%s\33n\n"
                                         "by those of\n"
                                         "\33b%s\33n?", targetplnode->id, sourceplnode->id);

                    if(result < 1)
                    {
                        return(FALSE);
                    }
                    pic = psdGetUsbDevCfg(sourceplnode->owner, sourceplnode->devid, sourceplnode->ifid);
                    if(pic)
                    {
                        form = psdWriteCfg(pic);
                        if(form)
                        {
                            psdSetUsbDevCfg(sourceplnode->owner, targetplnode->devid, targetplnode->ifid, form);
                            psdFreeVec(form);
                        }
                    }
                    return(TRUE);
                }
            }
            if(targetid == IFFFORM_DEVICECFG)
            {
                pic = psdGetUsbDevCfg(sourceplnode->owner, targetplnode->devid, sourceplnode->ifid);
                if(pic)
                {
                    result = MUI_Request(_app(obj), _win(obj), 0, NULL, "Replace|Cancel",
                                         "Do you want to \33breplace\33n the prefs of\n"
                                         "\33b%s\33n\n"
                                         "by the one in\n"
                                         "\33b%s\33n?", targetplnode->id, sourceplnode->id);
                } else {
                    result = MUI_Request(_app(obj), _win(obj), 0, NULL, "Add|Cancel",
                                         "Do you want to \33badd\33n the prefs of\n"
                                         "\33b%s\33n\n"
                                         "to the device\n"
                                         "\33b%s\33n?", sourceplnode->id, targetplnode->id);
                }
                if(result < 1)
                {
                    return(FALSE);
                }
                pic = psdGetUsbDevCfg(sourceplnode->owner, sourceplnode->devid, sourceplnode->ifid);
                if(pic)
                {
                    form = psdWriteCfg(pic);
                    if(form)
                    {
                        psdSetUsbDevCfg(sourceplnode->owner, targetplnode->devid, sourceplnode->ifid, form);
                        psdFreeVec(form);
                    }
                }
                return(TRUE);
            }
            break;

        case IFFCHNK_FORCEDBIND:
            if((targetid == IFFFORM_DEVICECFG) ||
               (targetid == IFFFORM_DEVCFGDATA) ||
               (targetid == IFFFORM_IFCFGDATA) ||
               (targetid == IFFCHNK_FORCEDBIND))
            {
                psdSetForcedBinding(sourceplnode->owner, targetplnode->devid, targetplnode->ifid);
                return(TRUE);
            }
            break;
    }
    return(FALSE);
}