Nebula/src/preferences.c

377 lines
12 KiB
C

/* --------------------------------------------------------------------- *
* preferences.c *
* --------------------------------------------------------------------- *
* This file is part of the nebula irc client *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Xm/Xm.h>
#include <Xm/Form.h>
#include <Xm/PushB.h>
#include <Xm/Label.h>
#include <Xm/TextF.h>
#include <Xm/Text.h>
#include <Xm/SelectioB.h>
#include <Xm/MessageB.h>
#include "main.h"
#include "preferences.h"
#include "network.h"
#ifndef XmFONTLIST_DEFAULT_TAG
#define XmFONTLIST_DEFAULT_TAG ""
#endif
#define FILE_BUFF_SIZE 1024
extern systemStatusRecord sysState;
extern XtAppContext nebulaIrcAppContext;
Widget startPref;
Widget startPrefDiag;
void okButtStartupCbk();
void helpButtStartupCbk();
void okButtPrefCbk();
void helpButtPrefCbk();
Widget nickTextForm;
Widget nameTextForm;
Widget serverTextForm;
Widget portTextForm;
void okButtStartupCbk()
{
char *nick;
char *name;
char *server;
char *port;
char theServer[MAX_SERVERNAME_LEN];
nick = XmTextGetString(nickTextForm);
name = XmTextGetString(nameTextForm);
server = XmTextGetString(serverTextForm);
port = XmTextGetString(portTextForm);
if (strlen(nick) > 0 && strlen(nick) <= MAX_NICK_LEN)
strcpy(sysState.myNick, nick);
else
strcpy(sysState.myNick, "");
if (strlen(name) > 0 && strlen(name) <= MAX_NAME_LEN)
strcpy(sysState.myName, name);
else
strcpy(sysState.myName, "noname");
if (strlen(server) > 0 &&strlen(server) <= MAX_SERVERNAME_LEN)
strcpy(theServer, server);
else
strcpy(theServer, "");
printf("port: %s, %d\n", port, atoi(port));
if (strlen(port) > 0 && strlen(port) <= 5)
{
sysState.port = atoi(port);
if (sysState.port <= 0)
sysState.port = 6666;
} else
sysState.port = 6666;
connectToServer(theServer, sysState.port);
}
void helpButtStartupCbk()
{
XmString theXmString, theXmString2;
Arg args[8];
int argcount;
Widget remove;
Widget startupPrefsHelpDlgBox;
argcount = 0;
theXmString = XM_STRING_CREATE("Help");
XtSetArg(args[argcount], XmNdialogTitle, theXmString); argcount++;
theXmString2 = XM_STRING_GEN_COMP("Set nickname and name you want to use.\n\nEnter the server you want to connect to.");
XtSetArg(args[argcount], XmNmessageString, theXmString2); argcount++;
XtSetArg(args[argcount], XmNautoUnmanage, True); argcount++;
startupPrefsHelpDlgBox = XmCreateInformationDialog(startPrefDiag, "help", args, argcount);
XmStringFree(theXmString);
XmStringFree(theXmString2);
/* Now get rid of the things we don't want */
remove = XmMessageBoxGetChild(startupPrefsHelpDlgBox, XmDIALOG_HELP_BUTTON);
XtUnmanageChild(remove);
remove = XmMessageBoxGetChild(startupPrefsHelpDlgBox, XmDIALOG_CANCEL_BUTTON);
XtUnmanageChild(remove);
XtManageChild(startupPrefsHelpDlgBox);
}
/* ---- set preferences ----- */
void setPreferences(Widget mainWin)
{
Widget prefForm;
Widget portLabel;
Widget child;
XmString labelString;
Arg args[4];
int argcount;
FILE *confFile;
char serverPortNum[6];
char *confFilePath;
char serverName[MAX_SERVERNAME_LEN];
char myNick[MAX_NICK_LEN];
char myName[MAX_NAME_LEN];
argcount = 0;
labelString = XM_STRING_CREATE("Startup Prefs");
XtSetArg(args[argcount], XmNdialogTitle, labelString); argcount++;
XtSetArg(args[argcount], XmNautoUnmanage, True); argcount++;
startPrefDiag = XmCreatePromptDialog(mainWin, "startup_prefs", args, argcount);
XmStringFree(labelString);
/* Now get rid of the things we don't want */
child = XmSelectionBoxGetChild(startPrefDiag, XmDIALOG_SELECTION_LABEL);
XtUnmanageChild(child);
child = XmSelectionBoxGetChild(startPrefDiag, XmDIALOG_TEXT);
XtUnmanageChild(child);
prefForm = XtVaCreateWidget("form", xmFormWidgetClass, startPrefDiag,
XmNfractionBase, 18, NULL);
labelString = XM_STRING_CREATE("Name:");
XtVaCreateManagedWidget("name_label",
xmLabelWidgetClass, prefForm,
XmNlabelString, labelString,
XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 0,
XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0,
NULL);
XmStringFree(labelString);
labelString = XM_STRING_CREATE("Nick:");
XtVaCreateManagedWidget("nick_label",
xmLabelWidgetClass, prefForm,
XmNlabelString, labelString,
XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 6,
XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0,
NULL);
XmStringFree(labelString);
labelString = XM_STRING_CREATE("Server:");
XtVaCreateManagedWidget("server_label",
xmLabelWidgetClass, prefForm,
XmNlabelString, labelString,
XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 12,
XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0,
NULL);
XmStringFree(labelString);
nameTextForm = XtVaCreateManagedWidget("name_form",
xmTextFieldWidgetClass, prefForm,
XmNmaxLength, MAX_NAME_LEN,
XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 0,
XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4,
XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 18,
NULL);
nickTextForm = XtVaCreateManagedWidget("nick_form",
xmTextFieldWidgetClass, prefForm,
XmNmaxLength, MAX_NICK_LEN,
XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 6,
XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4,
XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 18,
NULL);
portTextForm = XtVaCreateManagedWidget("port_form",
xmTextFieldWidgetClass, prefForm,
XmNmaxLength, 5,
XmNcolumns, 5,
XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 12,
XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 18,
NULL);
labelString = XM_STRING_CREATE("Port: ");
portLabel = XtVaCreateManagedWidget("port_label",
xmLabelWidgetClass, prefForm,
XmNlabelString, labelString,
XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 12,
XmNrightAttachment, XmATTACH_WIDGET, XmNrightWidget, portTextForm,
NULL);
XmStringFree(labelString);
serverTextForm = XtVaCreateManagedWidget("server_form",
xmTextFieldWidgetClass, prefForm,
XmNmaxLength, MAX_SERVERNAME_LEN,
XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 12,
XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4,
XmNrightAttachment, XmATTACH_WIDGET, XmNrightWidget, portLabel,
NULL);
XtAddCallback(startPrefDiag, XmNokCallback, okButtPrefCbk, NULL);
XtAddCallback(startPrefDiag, XmNhelpCallback, helpButtPrefCbk, NULL);
XtManageChild(prefForm);
XtManageChild(startPrefDiag);
/* read configuration file */
if ((confFilePath = getPreferencesFilePath()))
{
confFile = fopen (confFilePath, "r");
if (confFile)
{
char buff[FILE_BUFF_SIZE];
char *pos;
fgets(buff, FILE_BUFF_SIZE, confFile);
if (buff[strlen(buff)-1] == '\n')
buff[strlen(buff)-1] = '\0';
if(!strncmp(buff, "DefaultNick", strlen("DefaultNick")))
if ((pos = strchr(buff, ' ')))
strcpy(myNick, pos+1);
fgets(buff, FILE_BUFF_SIZE, confFile);
if (buff[strlen(buff)-1] == '\n')
buff[strlen(buff)-1] = '\0';
if(!strncmp(buff, "DefaultName", strlen("DefaultName")))
if ((pos = strchr(buff, ' ')))
strcpy(myName, pos+1);
fgets(buff, FILE_BUFF_SIZE, confFile);
if (buff[strlen(buff)-1] == '\n')
buff[strlen(buff)-1] = '\0';
if(!strncmp(buff, "DefaultServer", strlen("DefaultServer")))
if ((pos = strchr(buff, ' ')))
strcpy(serverName, pos+1);
fgets(buff, FILE_BUFF_SIZE, confFile);
if (buff[strlen(buff)-1] == '\n')
buff[strlen(buff)-1] = '\0';
if(!strncmp(buff, "DefaultPortNum", strlen("DefaultPortNum")))
if ((pos = strchr(buff, ' ')))
strcpy(serverPortNum, pos+1);
fclose(confFile);
} else
{
printf("config file not found.\n");
strcpy(myNick, "");
strcpy(myName, "");
strcpy(serverName, "");
strcpy(serverPortNum, "");
}
free(confFilePath);
}
XmTextSetString(nickTextForm, myNick);
XmTextSetString(nameTextForm, myName);
XmTextSetString(serverTextForm, serverName);
XmTextSetString(portTextForm, serverPortNum);
}
void okButtPrefCbk()
{
char *nick;
char *name;
char *server;
char *port;
char theServer[MAX_SERVERNAME_LEN];
char myNick[MAX_NICK_LEN];
char myName[MAX_NAME_LEN];
char serverPort[6];
FILE *confFile;
char *confFilePath;
nick = XmTextGetString(nickTextForm);
name = XmTextGetString(nameTextForm);
server = XmTextGetString(serverTextForm);
port = XmTextGetString(portTextForm);
if (strlen(nick) > 0 && strlen(nick) <= MAX_NICK_LEN)
strcpy(myNick, nick);
else
strcpy(myNick, "");
if (strlen(name) > 0 && strlen(name) <= MAX_NAME_LEN)
strcpy(myName, name);
else
strcpy(myName, "noname");
if (strlen(server) > 0 &&strlen(server) <= MAX_SERVERNAME_LEN)
strcpy(theServer, server);
else
strcpy(theServer, "");
if (strlen(port) > 0 && strlen(port) <= 5)
strcpy(serverPort, port);
else
strcpy(serverPort, "");
/* write out configuration file */
if((confFilePath = getPreferencesFilePath()))
{
confFile = fopen (confFilePath, "w");
if (confFile)
{
fprintf(confFile, "DefaultNick: %s\n", myNick);
fprintf(confFile, "DefaultName: %s\n", myName);
fprintf(confFile, "DefaultServer: %s\n", theServer);
fprintf(confFile, "DefaultPortNum: %s\n", port);
fclose(confFile);
}
free(confFilePath);
}
}
void helpButtPrefCbk()
{
XmString theXmString, theXmString2;
Arg args[8];
int argcount;
Widget remove;
Widget startupPrefsHelpDlgBox;
argcount = 0;
theXmString = XM_STRING_CREATE("Help");
XtSetArg(args[argcount], XmNdialogTitle, theXmString); argcount++;
theXmString2 = XM_STRING_GEN_COMP("This panel sets the startup preferences.\n\
Ok will save them to the user\'s defaults.\n\n\
Set nickname and name you want to use.\nEnter the server you want to connect to.");
XtSetArg(args[argcount], XmNmessageString, theXmString2); argcount++;
XtSetArg(args[argcount], XmNautoUnmanage, True); argcount++;
startupPrefsHelpDlgBox = XmCreateInformationDialog(startPrefDiag, "help", args, argcount);
XmStringFree(theXmString);
XmStringFree(theXmString2);
/* Now get rid of the things we don't want */
remove = XmMessageBoxGetChild(startupPrefsHelpDlgBox, XmDIALOG_HELP_BUTTON);
XtUnmanageChild(remove);
remove = XmMessageBoxGetChild(startupPrefsHelpDlgBox, XmDIALOG_CANCEL_BUTTON);
XtUnmanageChild(remove);
XtManageChild(startupPrefsHelpDlgBox);
}
/*
* Return the full path to the user preferences file
* the caller is responsible of freeing the string if the call was successful
* failure will return a NULL pointer
*/
char* getPreferencesFilePath()
{
char *homeDirPath;
char *filePath;
filePath = NULL;
homeDirPath = getenv("HOME");
if (homeDirPath)
{
filePath = malloc ((strlen(homeDirPath) + strlen(PREF_FILE_NAME) + 1) * sizeof(char)); /* 1 is for the slash */
if (filePath == NULL)
{
perror("Could not allocate string buffer for config file Path");
} else
{
strcpy(filePath, homeDirPath);
strcat(filePath, "/");
strcat(filePath, PREF_FILE_NAME);
}
} else
{
perror("Could not determine home path of the user.");
}
return filePath;
}
#include "copyright.h"