/*ProfiPacket - packet radio terminal program
  Copyright (C) 1999  Alexander Feigl

  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

  Author:

  Alexander Feigl
  Burachstraße 51

  D-88250 Weingarten

  Mail : Alexander.Feigl@gmx.de
*/

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "Preferences.h"
#include "global.h"
#include "GUIProtos.h"
#include "Audio.h"


#define ID_PREF 0x50524546
#define ID_PRPA 0x50525041

#define PREF_MaxSpy              100
#define PREF_NumLock             101
#define PREF_InsertMode          102
#define PREF_MessageWindowSecs   103
#define PREF_DataCollectorTime   104
#define PREF_BufferSave          105
#define PREF_MonitorMode         106
#define PREF_SaveDir             107
#define PREF_RemoteDir           108
#define PREF_EnableHuffman       109
#define PREF_HuffmanMonitor      110
/*#define PREF_ConnectMsg          111    not used - compound 1000 */
#define PREF_ConnectMsgAutoTime  112
#define PREF_ConnectMsgAutoNr    113
#define PREF_SpyAutoCompress     114
#define PREF_SpyAutoCompressFol  115
#define PREF_MailLifetime        116
#define PREF_MaxMails            117
#define PREF_SysopCallPeriod     118
#define PREF_RedirectMycalls     119
#define PREF_ShowMaillist        120
#define PREF_LockSysopMails      121
#define PREF_PMailOnce           147
#define PREF_FullBBS             148
#define PREF_BoxIdent            122
#define PREF_BoxQTH              140
#define PREF_BoxHRoute           141
#define PREF_SysopANSIPen        123
#define PREF_SysopANSIStyle      124
#define PREF_UserANSIPen         125
#define PREF_UserANSIStyle       126
#define PREF_LinkANSIPen         127
#define PREF_LinkANSIStyle       128
#define PREF_SpecialANSIPen      129
#define PREF_SpecialANSIStyle    130
#define PREF_EditBuffersize      131
#define PREF_QSOBuffersize       132
#define PREF_MonitorBuffersize   133
#define PREF_EditWeight          134
#define PREF_MonitorWeight       135
#define PREF_MonEditWeight       136
#define PREF_MonMonitorWeight    137
#define PREF_Devices             138
#define PREF_Callsets            139
#define PREF_BeaconMinutes       142
#define PREF_BeaconOnlyMail      143
#define PREF_BeaconNoMessage     144
#define PREF_BeaconLine          145
#define PREF_BeaconMailLine      146


/*maximum : 148*/


/* Compound 1000 - connectmsgs */
#define PREF_ConnectMsg          1000

/* Compound 2000 - audio effect target */
#define PREF_EffectTarget        2000

/* Compound 3000 - audio effect type */
#define PREF_EffectType          3000

/* Compound 4000 - audio effect fname */
#define PREF_EffectPath          4000

/* Compound 5000 - audio effect level */
#define PREF_EffectLevel         5000

/* Compound 6000 - audio effect start */
#define PREF_EffectStart         6000

/* Compound 7000 - audio effect stop */
#define PREF_EffectStop          7000


/* Compound 10000 - devices */
#define PREF_DevExecDevice       10000
#define PREF_DevExecUnit         10100
#define PREF_DevExecFlags        10200
#define PREF_DevExecBaud         10300
#define PREF_DevPrefix           10400
#define PREF_DevDescription      10500
#define PREF_DevGlobalMycall     10600
#define PREF_DevChannels         10700
#define PREF_DevSendBeacon       10800
#define PREF_DevBeaconPath       10900

#define PREF_DevCallsetChannels  15000    /* double compound !!!*/

/* Compound 20000 - callset */
#define PREF_CallMyCall          20000
#define PREF_CallServerName      20100


#ifdef AmigaOS



#include <exec/memory.h>
#include <dos/exall.h>

#include <clib/iffparse_protos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/muimaster_protos.h>
#include <clib/alib_protos.h>

#ifdef __GNUC__


extern void *DOSBase;
extern void *SysBase;
extern void *IntuitionBase;
extern void *UtilityBase;
extern void *IFFParseBase;

#include <inline/muimaster.h>
#include <inline/dos.h>
#include <inline/exec.h>
#include <inline/iffparse.h>
#include <inline/utility.h>

#endif

#include <libraries/mui.h>

#else /* AmigaOS */

#include "amigaemu.h"

#endif /*AmigaOS*/

void MAIN_SetDefaultPrefs(void)
 {
  struct PPPreferences *pref;

  unsigned long i,j;


  pref=&Preferences;

  for (i=0;i<8;++i)   /* TNC device init */
   {
    struct TNCDevice *dev;
    dev=&pref->Devices[i];

    dev->ExecDevice[0]='\0';
    dev->ExecUnit=0;
    dev->ExecFlags=0;
    dev->ExecBaud=9600;
    dev->Prefix[0]='\0';
    dev->Description[0]='T';
    dev->Description[1]='N';
    dev->Description[2]='C';
    dev->Description[3]=' ';
    dev->Description[4]='1'+i;
    dev->Description[5]='\0';
    dev->GlobalMycall[0]='\0';
    dev->Channels=10;
    dev->CallsetChannels[0]=10;
    dev->SendBeacon=SENDBEACON_NEVER;
    CopyString(dev->BeaconPath,"ALL");

    for (j=1;j<8;++j)
     {
      dev->CallsetChannels[i]=0;
     }
   }

  for (i=0;i<8;++i)          /* Callset init */
   {
    struct Callset *call;
    call=&pref->Callsets[i];
    call->MyCall[0]='\0';
    call->ServerName[0]='C';
    call->ServerName[1]='H';
    call->ServerName[2]='A';
    call->ServerName[3]='T';
    call->ServerName[4]='\0';
   }

  pref->MaxSpy=0;
  pref->NumLock=FALSE;
  pref->InsertMode=TRUE;
  pref->MessageWindowSecs=6;
  pref->DataCollectorTime=300;
  pref->BufferSave=FALSE;
  pref->MonitorMode=TRUE;


  pref->SaveDir[0]='S';
  pref->SaveDir[1]='a';
  pref->SaveDir[2]='v';
  pref->SaveDir[3]='e';
  pref->SaveDir[4]='\0';

  pref->RemoteDir[0]='U';
  pref->RemoteDir[1]='s';
  pref->RemoteDir[2]='e';
  pref->RemoteDir[3]='r';
  pref->RemoteDir[4]='\0';

  pref->EnableHuffman=TRUE;
  pref->HuffmanMonitor=TRUE;

  for (i=0;i<16;++i)
   {
    pref->ConnectMsg[i][0]='\0';
   }

  pref->ConnectMsgAutoTime=0;
  pref->ConnectMsgAutoNr=0;


  pref->BeaconMinutes=60;
  pref->BeaconOnlyMail=FALSE;
  pref->BeaconNoMessage=FALSE;
  pref->BeaconLine[0]='\0';
  CopyString(pref->BeaconMailLine,"Mail:%#");

  pref->SpyAutoCompress=TRUE;
  pref->SpyAutoCompressFol=2;

#ifndef DISABLE_BBS
  pref->MailLifetime=21;
  pref->MaxMails=0;
  pref->SysopCallPeriod=3;
  pref->RedirectMycalls=TRUE;
  pref->ShowMaillist=TRUE;
  pref->LockSysopMails=TRUE;
  pref->PMailOnce=TRUE;
  pref->FullBBS=FALSE;
  pref->BoxIdent[0]='\0';
  CopyString(pref->BoxQTH,"Anywhere");
  CopyString(pref->BoxHRoute,"#???.???.???.???");
#endif

  pref->SysopANSIPen=2;
  pref->SysopANSIStyle=0;
  pref->UserANSIPen=1;
  pref->UserANSIStyle=0;
  pref->LinkANSIPen=2;
  pref->LinkANSIStyle=4;
  pref->SpecialANSIPen=3;
  pref->SpecialANSIStyle=4;
  pref->EditBuffersize=4;
  pref->QSOBuffersize=10;
  pref->MonitorBuffersize=20;
  pref->EditWeight=50;
  pref->MonitorWeight=50;
  pref->MonEditWeight=25;
  pref->MonMonitorWeight=75;

  for (i=0;i<MAX_EFFECT;++i)
   {
    pref->AudioEffects[i].EffectTarget=0;
    pref->AudioEffects[i].EffectType=AUDIOTYPE_BUILTIN;
    pref->AudioEffects[i].EffectPath[0]='\0';
    pref->AudioEffects[i].EffectLevel=AUDIOLEVL_EVER;
    pref->AudioEffects[i].EffectStart=0;
    pref->AudioEffects[i].EffectStop=23;
   }

 }

static void PREF_SetLongData(unsigned long id,unsigned long value)
{
 DoMethod(PrefDataspace,MUIM_Dataspace_Add,&value,sizeof (value),id);
}

static void PREF_SetStringData(unsigned long id,unsigned char *string)
{
 unsigned char *sptr=string;
 unsigned long ssize=0;
 do {++ssize;} while ( *(sptr++)!='\0');
 DoMethod(PrefDataspace,MUIM_Dataspace_Add,string,ssize,id);
}


static void PREF_GetLongData(unsigned long id,unsigned long *value)
{
 unsigned long *vptr;
        if (
            (vptr = (void *) (DoMethod(PrefDataspace,
                          MUIM_Dataspace_Find, id)))
            ==NULL)
           return;
 *value=*vptr;
}

static void PREF_GetStringData(unsigned long id,unsigned char *string,
              unsigned long size)
{
 unsigned char *sptr;
 unsigned long ssize=0;
 unsigned char *vptr;
        if (
            (vptr = (void *) (DoMethod(PrefDataspace,
                          MUIM_Dataspace_Find, id)))
            ==NULL)
           return;
 sptr=vptr;

 while ( (*sptr!='\0') && ((ssize+1)<size) )
  {
   *(string++)=*(sptr++);
   ssize++;
  }
 *(string++)='\0';

}























static void PREF_PrepareDataspace(void)
{
 unsigned long i;
 PREF_SetLongData(PREF_MaxSpy,Preferences.MaxSpy);
 PREF_SetLongData(PREF_NumLock,Preferences.NumLock);
 PREF_SetLongData(PREF_InsertMode,Preferences.InsertMode);
 PREF_SetLongData(PREF_MessageWindowSecs,Preferences.MessageWindowSecs);
 PREF_SetLongData(PREF_DataCollectorTime,Preferences.DataCollectorTime);
 PREF_SetLongData(PREF_BufferSave,Preferences.BufferSave);
 PREF_SetLongData(PREF_MonitorMode,Preferences.MonitorMode);
 PREF_SetLongData(PREF_EnableHuffman,Preferences.EnableHuffman);
 PREF_SetLongData(PREF_HuffmanMonitor,Preferences.HuffmanMonitor);
 PREF_SetLongData(PREF_ConnectMsgAutoTime,Preferences.ConnectMsgAutoTime);
 PREF_SetLongData(PREF_ConnectMsgAutoNr,Preferences.ConnectMsgAutoNr);
 PREF_SetLongData(PREF_SpyAutoCompress,Preferences.SpyAutoCompress);
 PREF_SetLongData(PREF_SpyAutoCompressFol,Preferences.SpyAutoCompressFol);
 PREF_SetLongData(PREF_SysopANSIPen,Preferences.SysopANSIPen);
 PREF_SetLongData(PREF_SysopANSIStyle,Preferences.SysopANSIStyle);
 PREF_SetLongData(PREF_UserANSIPen,Preferences.UserANSIPen);
 PREF_SetLongData(PREF_UserANSIStyle,Preferences.UserANSIStyle);
 PREF_SetLongData(PREF_LinkANSIPen,Preferences.LinkANSIPen);
 PREF_SetLongData(PREF_LinkANSIStyle,Preferences.LinkANSIStyle);
 PREF_SetLongData(PREF_SpecialANSIPen,Preferences.SpecialANSIPen);
 PREF_SetLongData(PREF_SpecialANSIStyle,Preferences.SpecialANSIStyle);
 PREF_SetLongData(PREF_EditBuffersize,Preferences.EditBuffersize);
 PREF_SetLongData(PREF_QSOBuffersize,Preferences.QSOBuffersize);
 PREF_SetLongData(PREF_MonitorBuffersize,Preferences.MonitorBuffersize);
 PREF_SetLongData(PREF_EditWeight,Preferences.EditWeight);
 PREF_SetLongData(PREF_MonitorWeight,Preferences.MonitorWeight);
 PREF_SetLongData(PREF_MonEditWeight,Preferences.MonEditWeight);
 PREF_SetLongData(PREF_MonMonitorWeight,Preferences.MonMonitorWeight);
 PREF_SetLongData(PREF_BeaconMinutes,Preferences.BeaconMinutes);
 PREF_SetLongData(PREF_BeaconOnlyMail,Preferences.BeaconOnlyMail);
 PREF_SetLongData(PREF_BeaconNoMessage,Preferences.BeaconNoMessage);

 PREF_SetStringData(PREF_SaveDir,Preferences.SaveDir);
 PREF_SetStringData(PREF_RemoteDir,Preferences.RemoteDir);
 PREF_SetStringData(PREF_BeaconLine,Preferences.BeaconLine);
 PREF_SetStringData(PREF_BeaconMailLine,Preferences.BeaconMailLine);



 for (i=0;i<16;++i)
  {
   PREF_SetStringData(PREF_ConnectMsg+i,Preferences.ConnectMsg[i]);
  }

 for (i=0;i<8;++i)
  {
   struct TNCDevice *tncd;
   signed long k;
   tncd=&Preferences.Devices[i];
   PREF_SetStringData(PREF_DevExecDevice+i,tncd->ExecDevice);
   PREF_SetLongData(PREF_DevExecUnit+i,tncd->ExecUnit);
   PREF_SetLongData(PREF_DevExecFlags+i,tncd->ExecFlags);
   PREF_SetLongData(PREF_DevExecBaud+i,tncd->ExecBaud);
   PREF_SetStringData(PREF_DevPrefix+i,tncd->Prefix);
   PREF_SetStringData(PREF_DevDescription+i,tncd->Description);
   PREF_SetStringData(PREF_DevGlobalMycall+i,tncd->GlobalMycall);
   PREF_SetLongData(PREF_DevChannels+i,tncd->Channels);
   PREF_SetLongData(PREF_DevSendBeacon+i,tncd->SendBeacon);
   PREF_SetStringData(PREF_DevBeaconPath+i,tncd->BeaconPath);
   for (k=0;k<8;++k)
    {
     PREF_SetLongData(PREF_DevCallsetChannels+k*100+i,tncd->CallsetChannels[k]);
    }
  }
 for (i=0;i<8;++i)
  {
   struct Callset *call;
   call=&Preferences.Callsets[i];
   PREF_SetStringData(PREF_CallMyCall+i,call->MyCall);
   PREF_SetStringData(PREF_CallServerName+i,call->ServerName);
  }

 for (i=0;i<16;++i)
  {
   struct AudioEffect *effect;
   effect=&Preferences.AudioEffects[i];
   PREF_SetLongData(PREF_EffectTarget+i,effect->EffectTarget);
   PREF_SetLongData(PREF_EffectType+i,effect->EffectType);
   PREF_SetStringData(PREF_EffectPath+i,effect->EffectPath);
   PREF_SetLongData(PREF_EffectLevel+i,effect->EffectLevel);
   PREF_SetLongData(PREF_EffectStart+i,effect->EffectStart);
   PREF_SetLongData(PREF_EffectStop+i,effect->EffectStop);
  }

#ifndef DISABLE_BBS

 PREF_SetLongData(PREF_MailLifetime,Preferences.MailLifetime);
 PREF_SetLongData(PREF_MaxMails,Preferences.MaxMails);
 PREF_SetLongData(PREF_SysopCallPeriod,Preferences.SysopCallPeriod);
 PREF_SetLongData(PREF_RedirectMycalls,Preferences.RedirectMycalls);
 PREF_SetLongData(PREF_ShowMaillist,Preferences.ShowMaillist);
 PREF_SetLongData(PREF_LockSysopMails,Preferences.LockSysopMails);
 PREF_SetLongData(PREF_PMailOnce,Preferences.PMailOnce);
 PREF_SetLongData(PREF_FullBBS,Preferences.FullBBS);
 PREF_SetStringData(PREF_BoxIdent,Preferences.BoxIdent);
 PREF_SetStringData(PREF_BoxQTH,Preferences.BoxQTH);
 PREF_SetStringData(PREF_BoxHRoute,Preferences.BoxHRoute);

#endif

}




static void PREF_ParseDataspace(void)
{
 unsigned long i;
 PREF_GetLongData(PREF_MaxSpy,&Preferences.MaxSpy);
 PREF_GetLongData(PREF_NumLock,&Preferences.NumLock);
 PREF_GetLongData(PREF_InsertMode,&Preferences.InsertMode);
 PREF_GetLongData(PREF_MessageWindowSecs,&Preferences.MessageWindowSecs);
 PREF_GetLongData(PREF_DataCollectorTime,&Preferences.DataCollectorTime);
 PREF_GetLongData(PREF_BufferSave,&Preferences.BufferSave);
 PREF_GetLongData(PREF_MonitorMode,&Preferences.MonitorMode);
 PREF_GetLongData(PREF_EnableHuffman,&Preferences.EnableHuffman);
 PREF_GetLongData(PREF_HuffmanMonitor,&Preferences.HuffmanMonitor);
 PREF_GetLongData(PREF_ConnectMsgAutoTime,&Preferences.ConnectMsgAutoTime);
 PREF_GetLongData(PREF_ConnectMsgAutoNr,&Preferences.ConnectMsgAutoNr);
 PREF_GetLongData(PREF_SpyAutoCompress,&Preferences.SpyAutoCompress);
 PREF_GetLongData(PREF_SpyAutoCompressFol,&Preferences.SpyAutoCompressFol);
 PREF_GetLongData(PREF_SysopANSIPen,&Preferences.SysopANSIPen);
 PREF_GetLongData(PREF_SysopANSIStyle,&Preferences.SysopANSIStyle);
 PREF_GetLongData(PREF_UserANSIPen,&Preferences.UserANSIPen);
 PREF_GetLongData(PREF_UserANSIStyle,&Preferences.UserANSIStyle);
 PREF_GetLongData(PREF_LinkANSIPen,&Preferences.LinkANSIPen);
 PREF_GetLongData(PREF_LinkANSIStyle,&Preferences.LinkANSIStyle);
 PREF_GetLongData(PREF_SpecialANSIPen,&Preferences.SpecialANSIPen);
 PREF_GetLongData(PREF_SpecialANSIStyle,&Preferences.SpecialANSIStyle);
 PREF_GetLongData(PREF_EditBuffersize,&Preferences.EditBuffersize);
 PREF_GetLongData(PREF_QSOBuffersize,&Preferences.QSOBuffersize);
 PREF_GetLongData(PREF_MonitorBuffersize,&Preferences.MonitorBuffersize);
 PREF_GetLongData(PREF_EditWeight,&Preferences.EditWeight);
 PREF_GetLongData(PREF_MonitorWeight,&Preferences.MonitorWeight);
 PREF_GetLongData(PREF_MonEditWeight,&Preferences.MonEditWeight);
 PREF_GetLongData(PREF_MonMonitorWeight,&Preferences.MonMonitorWeight);
 PREF_GetLongData(PREF_BeaconMinutes,&Preferences.BeaconMinutes);
 PREF_GetLongData(PREF_BeaconOnlyMail,&Preferences.BeaconOnlyMail);
 PREF_GetLongData(PREF_BeaconNoMessage,&Preferences.BeaconNoMessage);


 PREF_GetStringData(PREF_SaveDir,Preferences.SaveDir,196);
 PREF_GetStringData(PREF_RemoteDir,Preferences.RemoteDir,196);
 PREF_GetStringData(PREF_BeaconLine,Preferences.BeaconLine,160);
 PREF_GetStringData(PREF_BeaconMailLine,Preferences.BeaconMailLine,80);


 for (i=0;i<16;++i)
  {
   PREF_GetStringData(PREF_ConnectMsg+i,Preferences.ConnectMsg[i],80);
  }

 for (i=0;i<8;++i)
  {
   struct TNCDevice *tncd;
   signed long k;
   tncd=&Preferences.Devices[i];
   PREF_GetStringData(PREF_DevExecDevice+i,tncd->ExecDevice,32);
   PREF_GetLongData(PREF_DevExecUnit+i,&tncd->ExecUnit);
   PREF_GetLongData(PREF_DevExecFlags+i,&tncd->ExecFlags);
   PREF_GetLongData(PREF_DevExecBaud+i,&tncd->ExecBaud);
   PREF_GetStringData(PREF_DevPrefix+i,tncd->Prefix,8);
   PREF_GetStringData(PREF_DevDescription+i,tncd->Description,12);
   PREF_GetStringData(PREF_DevGlobalMycall+i,tncd->GlobalMycall,10);
   PREF_GetLongData(PREF_DevChannels+i,&tncd->Channels);
   PREF_GetLongData(PREF_DevSendBeacon+i,&tncd->SendBeacon);
   PREF_GetStringData(PREF_DevBeaconPath+i,tncd->BeaconPath,80);
   for (k=0;k<8;++k)
    {
     PREF_GetLongData(PREF_DevCallsetChannels+k*100+i,&tncd->CallsetChannels[k]);
    }
  }

 for (i=0;i<8;++i)
  {
   struct Callset *call;
   call=&Preferences.Callsets[i];
   PREF_GetStringData(PREF_CallMyCall+i,call->MyCall,10);
   PREF_GetStringData(PREF_CallServerName+i,call->ServerName,32);
  }

 for (i=0;i<16;++i)
  {
   struct AudioEffect *effect;
   effect=&Preferences.AudioEffects[i];
   PREF_GetLongData(PREF_EffectTarget+i,&effect->EffectTarget);
   PREF_GetLongData(PREF_EffectType+i,&effect->EffectType);
   PREF_GetStringData(PREF_EffectPath+i,effect->EffectPath,196);
   PREF_GetLongData(PREF_EffectLevel+i,&effect->EffectLevel);
   PREF_GetLongData(PREF_EffectStart+i,&effect->EffectStart);
   PREF_GetLongData(PREF_EffectStop+i,&effect->EffectStop);
  }

#ifndef DISABLE_BBS
 PREF_GetLongData(PREF_PMailOnce,&Preferences.PMailOnce);
 PREF_GetLongData(PREF_FullBBS,&Preferences.FullBBS);
 PREF_GetLongData(PREF_MailLifetime,&Preferences.MailLifetime);
 PREF_GetLongData(PREF_MaxMails,&Preferences.MaxMails);
 PREF_GetLongData(PREF_SysopCallPeriod,&Preferences.SysopCallPeriod);
 PREF_GetLongData(PREF_RedirectMycalls,&Preferences.RedirectMycalls);
 PREF_GetLongData(PREF_ShowMaillist,&Preferences.ShowMaillist);
 PREF_GetLongData(PREF_LockSysopMails,&Preferences.LockSysopMails);
 PREF_GetStringData(PREF_BoxIdent,Preferences.BoxIdent,8);
 PREF_GetStringData(PREF_BoxQTH,Preferences.BoxQTH,16);
 PREF_GetStringData(PREF_BoxHRoute,Preferences.BoxHRoute,64);
#endif

}














int PREF_SavePreferences(void)
{
 struct IFFHandle *iffh;
 BPTR filh;

 PREF_PrepareDataspace();
 if ((iffh=AllocIFF())==NULL)
  {
   return(FALSE);
  }
 InitIFFasDOS(iffh);
 if ( (filh=Open("data/ProfiPacket.prefs",MODE_NEWFILE))==NULL)
  {
   FreeIFF(iffh);
   return(FALSE);
  }
 iffh->iff_Stream=filh;
 if ( OpenIFF(iffh,IFFF_WRITE)!=0)
  {
   Close(filh);
   FreeIFF(iffh);
   return(FALSE);
  }

 if ( PushChunk(iffh,ID_PREF,ID_FORM,IFFSIZE_UNKNOWN)!=0)
  {
   CloseIFF(iffh);
   Close(filh);
   FreeIFF(iffh);
   return(FALSE);
  }

 if ( DoMethod(PrefDataspace,MUIM_Dataspace_WriteIFF,iffh,0,ID_PRPA)!=0)
  {
   CloseIFF(iffh);
   Close(filh);
   FreeIFF(iffh);
   return(FALSE);
  }
 if ( PopChunk(iffh) )
  {
   CloseIFF(iffh);
   Close(filh);
   FreeIFF(iffh);
   return(FALSE);
  }

 CloseIFF(iffh);
 Close(filh);

 FreeIFF(iffh);
 return(TRUE);

}

int PREF_LoadPreferences(void)
{
 struct IFFHandle *iffh;
 BPTR filh;
 signed long error;

 if ((iffh=AllocIFF())==NULL)
  {
   return(FALSE);
  }
 InitIFFasDOS(iffh);
 if ( (filh=Open("data/ProfiPacket.prefs",MODE_OLDFILE))==NULL)
  {
   FreeIFF(iffh);
   return(FALSE);
  }
 iffh->iff_Stream=filh;
 if ( OpenIFF(iffh,IFFF_READ)!=0)
  {
   Close(filh);
   FreeIFF(iffh);
   return(FALSE);
  }

 StopChunk(iffh,ID_PREF,ID_PRPA);

 while ((error=ParseIFF(iffh,IFFPARSE_SCAN))==0)
  {
   struct ContextNode *cnod;
   cnod=CurrentChunk(iffh);
   if (cnod==NULL) continue;
   if (cnod->cn_Type!=ID_PREF) continue;
   if (cnod->cn_ID==ID_PRPA)
    {
     error=DoMethod(PrefDataspace,MUIM_Dataspace_ReadIFF,iffh);
     if (error!=NULL)
      {
       CloseIFF(iffh);
       Close(filh);
       FreeIFF(iffh);
       return(FALSE);
      }
    }
  }

 if (error!=IFFERR_EOF)
  {
   CloseIFF(iffh);
   Close(filh);
   FreeIFF(iffh);
   return(FALSE);
  }

 CloseIFF(iffh);
 Close(filh);
 FreeIFF(iffh);
 PREF_ParseDataspace();
 return(TRUE);

}



