/* this file is used by both the compilation for Node and Control */

void ClearNodeData(struct NodeSettingsData *NS) // different to InitNodeData() in Control_Main.c
{
  // small subroutine to set all the default values
  // never call if you've allocated mem for strings!
  NS->SysopAccount=NULL;
  NS->NodeName=NULL;
  NS->NodePhone=NULL;
  NS->NodeConnectScript=NULL;

  NS->AskUserPW=FALSE;

  NS->UseSysPW=FALSE;
  NS->SysPW=NULL;
  NS->SysPWScript=NULL;
  NS->SysPWPrompt=NULL;

  NS->UseNodePW=FALSE;
  NS->NodePW=NULL;
  NS->NodePWScript=NULL;
  NS->NodePWPrompt=NULL;

  NS->UserNamePrompt=NULL;
  NS->UserPWPrompt=NULL;

  NS->NodeLogFile=NULL;
  NS->ModemLogFile=NULL;
  NS->CallersLogFile=NULL;
  NS->UploadLog=FALSE;
  NS->DownloadLog=FALSE;
  NS->DoorLogFile=NULL;
  NS->DoorLog=FALSE;

  NS->ChatFlag=FALSE;
  NS->Iconified=TRUE; // this is set to TRUE so that we can check if the window is OPEN or not.
  NS->UseOwnScreen=FALSE;
  NS->OpenWatch=FALSE;
  NS->AccessRequired=0;
  NS->ScrModeID=0;
  NS->ScrWidth=0;
  NS->ScrHeight=0;
  NS->ScrDepth=0;
  NS->UseDevice=FALSE;
  NS->AllowNewUsers=FALSE;

  NS->NodePlayPen=NULL;
  NS->MaxDIZLines=0;

  NS->InactivityDisconnectOverride=FALSE;
  NS->InactivitySeconds=0;
  NS->CheckNodeScreens=TRUE;
}

void SetNodeSettingsDefaults(struct NodeSettingsData *NS) // different to InitNodeData() in Control_Main.c
{
  // small subroutine to set all the default values

  FreeAndSet(&NS->SysPW,"PASSWORD");
  FreeAndSet(&NS->SysPWPrompt,"System PW:");
  FreeAndSet(&NS->NodePW,"PASSWORD");
  FreeAndSet(&NS->NodePWPrompt,"Node PW:");
//  FreeAndSet(&NS->UserNamePrompt,"Username:");
//  FreeAndSet(&NS->UserPWPrompt,"Password:");
  NS->AskUserPW=TRUE;
  NS->UploadLog=TRUE;
  NS->DownloadLog=TRUE;
  NS->ChatFlag=TRUE;
  NS->UseOwnScreen=TRUE;
  NS->AccessRequired=0;
  NS->UseDevice=FALSE;
  NS->ScrModeID=BBSGlobal->ScreenInfo->ScrModeID;
  NS->ScrWidth= BBSGlobal->ScreenInfo->ScrWidth;
  NS->ScrHeight=BBSGlobal->ScreenInfo->ScrHeight;
  NS->ScrDepth=BBSGlobal->ScreenInfo->ScrDepth;
  NS->AllowNewUsers=TRUE;
  NS->MaxDIZLines=12;
  NS->InactivitySeconds=120; // 2 mins.
  NS->CheckNodeScreens=TRUE;
}


void CopyNodeSettings(struct NodeSettingsData *dest,struct NodeSettingsData *source)
{
  FreeAndSet(&dest->SysopAccount      ,source->SysopAccount);
  FreeAndSet(&dest->NodeName          ,source->NodeName);
  FreeAndSet(&dest->NodePhone         ,source->NodePhone);
  FreeAndSet(&dest->NodeConnectScript ,source->NodeConnectScript);

              dest->AskUserPW         =source->AskUserPW;

              dest->UseSysPW          =source->UseSysPW;
  FreeAndSet(&dest->SysPW             ,source->SysPW);
  FreeAndSet(&dest->SysPWScript       ,source->SysPWScript);
  FreeAndSet(&dest->SysPWPrompt       ,source->SysPWPrompt);

              dest->UseNodePW         =source->UseNodePW;
  FreeAndSet(&dest->NodePW            ,source->NodePW);
  FreeAndSet(&dest->NodePWScript      ,source->NodePWScript);
  FreeAndSet(&dest->NodePWPrompt      ,source->NodePWPrompt);

  FreeAndSet(&dest->UserNamePrompt    ,source->UserNamePrompt);
  FreeAndSet(&dest->UserPWPrompt      ,source->UserPWPrompt);

  FreeAndSet(&dest->NodeLogFile       ,source->NodeLogFile);
  FreeAndSet(&dest->ModemLogFile      ,source->ModemLogFile);
  FreeAndSet(&dest->CallersLogFile    ,source->CallersLogFile);
  FreeAndSet(&dest->DoorLogFile       ,source->DoorLogFile);
              dest->DoorLog           =source->DoorLog;
              dest->UploadLog         =source->UploadLog;
              dest->DownloadLog       =source->DownloadLog;

              dest->ChatFlag          =source->ChatFlag;
              dest->Iconified         =source->Iconified;
              dest->UseOwnScreen      =source->UseOwnScreen;
              dest->OpenWatch       =source->OpenWatch;
              dest->AccessRequired    =source->AccessRequired;

              dest->ScrModeID         =source->ScrModeID;
              dest->ScrWidth          =source->ScrWidth;
              dest->ScrHeight         =source->ScrHeight;
              dest->ScrDepth          =source->ScrDepth;

              dest->UseDevice         =source->UseDevice;
              dest->AllowNewUsers     =source->AllowNewUsers;
  FreeAndSet(&dest->NodePlayPen       ,source->NodePlayPen);
              dest->MaxDIZLines       =source->MaxDIZLines;
              dest->InactivitySeconds =source->InactivitySeconds;
              dest->InactivityDisconnectOverride =source->InactivityDisconnectOverride;

              dest->CheckNodeScreens  =source->CheckNodeScreens;

}

void FreeNodeSettingsData(struct NodeSettingsData *NS) // different to InitNodeData() in Control_Main.c
{
  FreeStr(NS->SysopAccount);
  FreeStr(NS->NodeName);
  FreeStr(NS->NodePhone);
  FreeStr(NS->NodeConnectScript);

  FreeStr(NS->SysPW);
  FreeStr(NS->SysPWScript);
  FreeStr(NS->SysPWPrompt);

  FreeStr(NS->NodePW);
  FreeStr(NS->NodePWScript);
  FreeStr(NS->NodePWPrompt);

  FreeStr(NS->UserNamePrompt);
  FreeStr(NS->UserPWPrompt);

  FreeStr(NS->NodeLogFile);
  FreeStr(NS->ModemLogFile);
  FreeStr(NS->CallersLogFile);
  FreeStr(NS->DoorLogFile);
  FreeStr(NS->NodePlayPen);
}


V_ERROR LoadNodeSettingsData(ULONG NodeNum,struct NodeSettingsData *NS )
{
  struct CfgFileData *NodeCFG;
  V_ERROR error=TYPE_NONE;
  UBYTE *filename=NULL;
  struct NodeData *ND;
  UBYTE ecode=0;

  if (NodeNum==NODE_GLOBAL) // as opposed to a valid nodenumber... hmm, does this mean we are limited to ULONG nodes ? :-))))))
  {
    // only clear for global
    ClearNodeData(NS);
    SetNodeSettingsDefaults(NS);
    filename=FILE_NODEGLOBAL;
  }
  else
  {
    if (ND=(struct NodeData*)GetNode(BBSGlobal->NodeList,NodeNum))
    {
      // erk, i can't belive i did this...                vvvvvvvvvvvvvvvvvvvvvvvvv
      if (filename=AllocVec(strlen(ND->NodeLocation)+30/*strlen(FILENAME_NODELOCAL)+1*/,MEMF_PUBLIC))
      {
        strcpy(filename,ND->NodeLocation);
        strcat(filename,FILENAME_NODELOCAL);
      }
    }
  }

  if (filename)
  {
    if (NodeCFG=HBBS_LoadConfig(filename,LCFG_NONE))
    {
      // get settings!
      if (!HBBS_GetSetting(NodeCFG,(void *)&NS->SysopAccount     ,VTYPE_STRING,OPT_NODE_SysopAccount,OPT_SINGLE) && NodeNum==NODE_GLOBAL) ecode=1; // *C* document required presence in NodeGlobal

      if (!HBBS_GetSetting(NodeCFG,(void *)&NS->NodeName         ,VTYPE_STRING,OPT_NODE_NodeName,OPT_SINGLE) && NodeNum!=NODE_GLOBAL) ecode=2;
      if (!HBBS_GetSetting(NodeCFG,(void *)&NS->NodePhone        ,VTYPE_STRING,OPT_NODE_NodePhone,OPT_SINGLE) && NodeNum!=NODE_GLOBAL) ecode=3;
      if (!HBBS_GetSetting(NodeCFG,(void *)&NS->NodeConnectScript,VTYPE_STRING,OPT_NODE_NodeConnectScript,OPT_SINGLE) && NodeNum!=NODE_GLOBAL) ecode=4;

      HBBS_GetSetting(NodeCFG,(void *)&NS->AskUserPW             ,VTYPE_BOOL,OPT_NODE_AskUserPW ,OPT_SINGLE);

//      if (!HBBS_GetSetting(NodeCFG,(void *)&NS->UseSysPW         ,VTYPE_BOOL,OPT_NODE_UseSysPW ,OPT_SINGLE) && NodeNum!=NODE_GLOBAL) ecode=5;
      HBBS_GetSetting(NodeCFG,(void *)&NS->UseSysPW              ,VTYPE_BOOL,OPT_NODE_UseSysPW ,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->SysPW                 ,VTYPE_STRING,OPT_NODE_SysPW,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->SysPWScript           ,VTYPE_STRING,OPT_NODE_SysPWScript,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->SysPWPrompt           ,VTYPE_STRING,OPT_NODE_SysPWPrompt ,OPT_SINGLE);

//      if (!HBBS_GetSetting(NodeCFG,(void *)&NS->UseNodePW        ,VTYPE_BOOL,OPT_NODE_UseNodePW ,OPT_SINGLE) && NodeNum!=NODE_GLOBAL) ecode=6;
      HBBS_GetSetting(NodeCFG,(void *)&NS->UseNodePW             ,VTYPE_BOOL,OPT_NODE_UseNodePW ,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->NodePW                ,VTYPE_STRING,OPT_NODE_NodePW,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->NodePWScript          ,VTYPE_STRING,OPT_NODE_NodePWScript,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->NodePWPrompt          ,VTYPE_STRING,OPT_NODE_NodePWPrompt ,OPT_SINGLE);

      HBBS_GetSetting(NodeCFG,(void *)&NS->UserNamePrompt        ,VTYPE_STRING,OPT_NODE_UserNamePrompt ,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->UserPWPrompt          ,VTYPE_STRING,OPT_NODE_UserPWPrompt ,OPT_SINGLE);

      if (!HBBS_GetSetting(NodeCFG,(void *)&NS->NodeLogFile      ,VTYPE_STRING,OPT_NODE_NodeLogFile,OPT_SINGLE) && NodeNum!=NODE_GLOBAL) ecode=7;
      if (!HBBS_GetSetting(NodeCFG,(void *)&NS->ModemLogFile     ,VTYPE_STRING,OPT_NODE_ModemLogFile ,OPT_SINGLE) && NodeNum!=NODE_GLOBAL) ecode=8;
      if (!HBBS_GetSetting(NodeCFG,(void *)&NS->CallersLogFile   ,VTYPE_STRING,OPT_NODE_CallersLogFile ,OPT_SINGLE) && NodeNum!=NODE_GLOBAL) ecode=9;
      if (!HBBS_GetSetting(NodeCFG,(void *)&NS->DoorLogFile      ,VTYPE_STRING,OPT_NODE_DoorLogFile ,OPT_SINGLE) && NodeNum!=NODE_GLOBAL) ecode=10;

      HBBS_GetSetting(NodeCFG,(void *)&NS->DoorLog          ,VTYPE_BOOL,OPT_NODE_DoorLog ,OPT_SINGLE);

      HBBS_GetSetting(NodeCFG,(void *)&NS->UploadLog        ,VTYPE_BOOL,OPT_NODE_UploadLog ,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->DownloadLog      ,VTYPE_BOOL,OPT_NODE_DownloadLog ,OPT_SINGLE);

      HBBS_GetSetting(NodeCFG,(void *)&NS->ChatFlag         ,VTYPE_BOOL,OPT_NODE_ChatFlag ,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->Iconified        ,VTYPE_BOOL,OPT_NODE_Iconified ,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->UseOwnScreen     ,VTYPE_BOOL,OPT_NODE_UseOwnScreen ,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->OpenWatch        ,VTYPE_BOOL,OPT_NODE_OpenWatch ,OPT_SINGLE);

      HBBS_GetSetting(NodeCFG,(void *)&NS->AccessRequired   ,VTYPE_SMALLNUM,OPT_NODE_AccessRequired,OPT_SINGLE);

      HBBS_GetSetting(NodeCFG,(void *)&NS->ScrModeID        ,VTYPE_BIGNUM,OPT_NODE_ScrModeID,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->ScrHeight        ,VTYPE_BIGNUM,OPT_NODE_ScrHeight,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->ScrWidth         ,VTYPE_BIGNUM,OPT_NODE_ScrWidth,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->ScrDepth         ,VTYPE_BIGNUM,OPT_NODE_ScrDepth,OPT_SINGLE);

      HBBS_GetSetting(NodeCFG,(void *)&NS->UseDevice        ,VTYPE_BOOL,OPT_NODE_UseDevice ,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->AllowNewUsers    ,VTYPE_BOOL,OPT_NODE_AllowNewUsers ,OPT_SINGLE);

      if (!HBBS_GetSetting(NodeCFG,(void *)&NS->NodePlayPen ,VTYPE_PATH,OPT_NODE_NodePlayPen ,OPT_SINGLE) && NodeNum!=NODE_GLOBAL) ecode=11;
      HBBS_GetSetting(NodeCFG,(void *)&NS->MaxDIZLines      ,VTYPE_SMALLNUM,OPT_NODE_MaxDIZLines ,OPT_SINGLE);

      HBBS_GetSetting(NodeCFG,(void *)&NS->InactivityDisconnectOverride,VTYPE_BOOL,OPT_NODE_InactivityDisconnectOverride,OPT_SINGLE);
      HBBS_GetSetting(NodeCFG,(void *)&NS->InactivitySeconds,VTYPE_BIGNUM,OPT_NODE_InactivitySeconds ,OPT_SINGLE);

      HBBS_GetSetting(NodeCFG,(void *)&NS->CheckNodeScreens ,VTYPE_BOOL,OPT_NODE_CheckNodeScreens ,OPT_SINGLE);

      HBBS_FlushConfig(NodeCFG);
    }

    if (ecode)
    {
      HBBS_DoErrorMessage(EMSG_NODESETTINGS+ecode-1,NodeNum,filename);
      error=TYPE_FATAL;
    }

    if (NodeNum!=NODE_GLOBAL) FreeVec(filename);
  }

  return(error);
}

