This is Preferences_Defaults.m in view mode; [Download] [Up]
/* Split the default manipulation routines off from the main
Preferences class */
#import <appkit/appkit.h>
#import "Preferences.h"
#import "InspectorManager.h"
#import <pfs.h>
#import <archie.h>
/*\ -------------- Defaults Stuff -------------- \*/
/* The virgin defaults */
// General preference defaults
#define vShowNewQueries "YES"
#define vAudioNotification "YES"
#define vUntitledFirstWindow "YES"
#define vDebuggingEnabled "NO"
#define vAppDebugLevel "0"
#define vDirLoadedSnd "DirNotifySnd"
#define vQueryReceivedSnd "QueryNotifySnd"
#define vFTPTransferSnd "FTPNotifySnd"
// Archie preference defaults
#define vQueryType "C"
#define vMaxReplies "100"
#define vSortFlag "0"
#define vExactMode "YES"
#define vNiceLevel "0"
#define vHostname "archie.sura.net"
#define vHostTag "5"
#define vIsCustomHost "NO"
#define vDebugLevel "2"
// Query preference defaults
#define vModalArchieQuery "NO"
#define vModalDirQuery "NO"
#define vServerTimeout "4"
#define vServerRetries "3"
#define vMaxDirListingThreads "2"
// FTP preference defaults
#define vRetrieveSubDirs "NO"
#define vCollisionWarn "YES"
#define vMaxFileSize "20"
#define vTransferPriority "0"
#define vPrefixCase "NO"
#define vSuffixCase "NO"
#define vFtpDebugLevel "0"
#define vAnonLoginPasswd "me"
#define vTransferDir 0
#define vFileTypesList "readme,.txt,index"
/* The owner of the application defaults */
const char *NeXTArchieOwner = "NeXTArchie_SMS";
enum {QueryType,MaxReplies,SortFlag,ExactMode,
NiceLevel,Hostname,IsCustomHost,DebugLevel,ModalArchieQuery,
ModalDirQuery,ServerTimeout,ServerRetries,MaxDirListingThreads,
RetrieveSubDirs,CollisionWarn,MaxFileSize,PrefixCase,
SuffixCase,FtpDebugLevel,AnonLoginPasswd,FileTypesList,
ShowNewQueries, AudioNotification, UntitledFirstWindow, DebuggingEnabled,
AppDebugLevel, TransferDir, DirLoadedSnd, QueryReceivedSnd, FTPTransferSnd,
TransferPriority, N_Defaults};
#define DStringValue(name) {#name, v ## name}
static NXDefaultsVector NextArchieDefaults = {
DStringValue(QueryType),
DStringValue(MaxReplies),
DStringValue(SortFlag),
DStringValue(ExactMode),
DStringValue(NiceLevel),
DStringValue(Hostname),
DStringValue(IsCustomHost),
DStringValue(DebugLevel),
DStringValue(ModalArchieQuery),
DStringValue(ModalDirQuery),
DStringValue(ServerTimeout),
DStringValue(ServerRetries),
DStringValue(MaxDirListingThreads),
DStringValue(RetrieveSubDirs),
DStringValue(CollisionWarn),
DStringValue(MaxFileSize),
DStringValue(PrefixCase),
DStringValue(SuffixCase),
DStringValue(FtpDebugLevel),
DStringValue(AnonLoginPasswd),
DStringValue(FileTypesList),
DStringValue(ShowNewQueries),
DStringValue(AudioNotification),
DStringValue(UntitledFirstWindow),
DStringValue(DebuggingEnabled),
DStringValue(AppDebugLevel),
DStringValue(TransferDir),
DStringValue(DirLoadedSnd),
DStringValue(QueryReceivedSnd),
DStringValue(FTPTransferSnd),
DStringValue(TransferPriority),
{NULL, NULL}
};
/* A macro for retriveing default values */
#define GET_VALUE(STR) NXGetDefaultValue(NeXTArchieOwner, STR)
@implementation Preferences(Defaults)
/* Initialization */
+ initialize
{
char tmp[128], host[64];
[self debug: MAX_DEBUG method: _cmd, "%s(Defaults)", [self name]];
// Kill any obsolete defaults
NXRemoveDefault(NeXTArchieOwner, "HostTag");
/* Set user@hostname as default anonymous password */
gethostname(host,63);
host[63] = '\0';
sprintf(tmp,"%s@%s", NXUserName(), host);
NextArchieDefaults[AnonLoginPasswd].value = tmp;
/* Set home dir as default transfer dir */
NextArchieDefaults[TransferDir].value = NXHomeDirectory();
/* Register the defaults for the preference items */
if( NXRegisterDefaults(NeXTArchieOwner, NextArchieDefaults) != 1 )
[self error: INTERNAL_ALERT method:_cmd key: NXDEFAULTS_FAILURE];
return self;
}
- loadDefaults
{
char *defaultValue;
int defaultNo;
Sound *snd;
/* Save the init time default values */
for(defaultNo = 0; defaultNo < N_Defaults; defaultNo ++)
{
defaultValue = GET_VALUE(NextArchieDefaults[defaultNo].name);
NextArchieDefaults[defaultNo].value = defaultValue;
}
// General
defaultValue = NextArchieDefaults[ShowNewQueries].value;
oldPrefs.showNewQueries = (*defaultValue == 'Y' ? YES : NO);
defaultValue = NextArchieDefaults[AudioNotification].value;
oldPrefs.audioNotification = (*defaultValue == 'Y' ? YES : NO);
defaultValue = NextArchieDefaults[UntitledFirstWindow].value;
oldPrefs.untitledFirstWindow = (*defaultValue == 'Y' ? YES : NO);
defaultValue = NextArchieDefaults[DebuggingEnabled].value;
oldPrefs.debuggingEnabled = (*defaultValue == 'Y' ? YES : NO);
/* Set the application debug level if enabled */
defaultValue = NextArchieDefaults[AppDebugLevel].value;
oldPrefs.appDebugLevel = atoi(defaultValue);
if( oldPrefs.debuggingEnabled == YES )
[self setAppDebugLevel: oldPrefs.appDebugLevel];
defaultValue = NextArchieDefaults[DirLoadedSnd].value;
snd = [Sound findSoundFor: defaultValue];
if( snd == nil )
snd = [Sound findSoundFor:
[Preferences notificationDefault: DirLoaded]];
[snd setName: defaultValue];
oldPrefs.sounds[DirLoaded] = snd;
defaultValue = NextArchieDefaults[QueryReceivedSnd].value;
snd = [Sound findSoundFor: defaultValue];
if( snd == nil )
snd = [Sound findSoundFor:
[Preferences notificationDefault: QueryReceived]];
[snd setName: defaultValue];
oldPrefs.sounds[QueryReceived] = snd;
defaultValue = NextArchieDefaults[FTPTransferSnd].value;
snd = [Sound findSoundFor: defaultValue];
if( snd == nil )
snd = [Sound findSoundFor:
[Preferences notificationDefault: FTPTransfer]];
[snd setName: defaultValue];
oldPrefs.sounds[FTPTransfer] = snd;
// Archie
oldPrefs.serverHost = NextArchieDefaults[Hostname].value;
defaultValue = NextArchieDefaults[IsCustomHost].value;
oldPrefs.isCustomHost = (*defaultValue == 'Y' ? YES : NO);
oldPrefs.customHost[0] = '\0';
if( oldPrefs.isCustomHost == YES )
strcpy(oldPrefs.customHost, oldPrefs.serverHost);
defaultValue = NextArchieDefaults[QueryType].value;
oldPrefs.queryType = *defaultValue;
oldPrefs.maxReplies = atoi(NextArchieDefaults[MaxReplies].value);
oldPrefs.sortFlag = atoi(NextArchieDefaults[SortFlag].value);
if( oldPrefs.sortFlag == 0 )
cmpProc = AQ_DEFCMP;
else
cmpProc = AQ_INVDATECMP;
defaultValue = NextArchieDefaults[ExactMode].value;
oldPrefs.exactMode = (*defaultValue == 'Y' ? YES : NO);
oldPrefs.niceLevel = atoi(NextArchieDefaults[NiceLevel].value);
// Query
defaultValue = NextArchieDefaults[ModalArchieQuery].value;
oldPrefs.modalArchieQueries = (*defaultValue == 'Y' ? YES : NO);
defaultValue = NextArchieDefaults[ModalDirQuery].value;
oldPrefs.modalDirQueries = (*defaultValue == 'Y' ? YES : NO);
oldPrefs.serverTimeout = atoi(NextArchieDefaults[ServerTimeout].value);
oldPrefs.serverRetries = atoi(NextArchieDefaults[ServerRetries].value);
oldPrefs.maxThreadCount = atoi(NextArchieDefaults[MaxDirListingThreads].value);
oldPrefs.debugLevel = atoi(NextArchieDefaults[DebugLevel].value);
// FTP
defaultValue = NextArchieDefaults[RetrieveSubDirs].value;
oldPrefs.retrieveSubDirs = (*defaultValue == 'Y' ? YES : NO);
defaultValue = NextArchieDefaults[CollisionWarn].value;
oldPrefs.collisionWarnings = (*defaultValue == 'Y' ? YES : NO);
oldPrefs.maxFileSize = atoi(NextArchieDefaults[MaxFileSize].value);
defaultValue = NextArchieDefaults[PrefixCase].value;
oldPrefs.prefixCaseSensitive = (*defaultValue == 'Y' ? YES : NO);
defaultValue = NextArchieDefaults[SuffixCase].value;
oldPrefs.suffixCaseSensitive = (*defaultValue == 'Y' ? YES : NO);
oldPrefs.anonPasswd = NextArchieDefaults[AnonLoginPasswd].value;
oldPrefs.transferDir = NextArchieDefaults[TransferDir].value;
oldPrefs.fileTypeList = NextArchieDefaults[FileTypesList].value;
oldPrefs.transferPriority = atoi(NextArchieDefaults[TransferPriority].value);
prefs = oldPrefs;
return self;
}
enum {String=1, Int, Char, Bool};
typedef union
{
char c;
int i;
char *str;
} Union;
static char *StringForValue(Preferences *self, int defaultNo,
void *value, int type)
{
int int_val0, int_val1;
char c_val0, c_val1;
char *str_val0, *str_val1, tmp[128];
switch( type )
{
case String:
str_val0 = NextArchieDefaults[defaultNo].value;
str_val1 = * ((char **) value);
[self debug: MAX_DEBUG method:NULL, "StringForValue(%s,%d): s0 = %s; s1 = %s\n",
NextArchieDefaults[defaultNo].name, defaultNo, str_val0, str_val1];
if( strcmp(str_val0, str_val1) != 0 )
{
str_val0 = malloc(strlen(str_val1)+1);
strcpy(str_val0, str_val1);
return str_val0;
}
break;
case Int:
int_val0 = atoi(NextArchieDefaults[defaultNo].value);
int_val1 = *((int *) value);
[self debug: MAX_DEBUG method:NULL, "StringForValue(%s,%d): i0 = %d; i1 = %d\n",
NextArchieDefaults[defaultNo].name, defaultNo, int_val0, int_val1];
if( int_val0 != int_val1 )
{
sprintf(tmp, "%d", int_val1);
str_val0 = malloc(strlen(tmp)+1);
strcpy(str_val0, tmp);
return str_val0;
}
break;
case Char:
c_val0 = *NextArchieDefaults[defaultNo].value;
c_val1 = *((char *) value);
[self debug: MAX_DEBUG method:NULL, "StringForValue(%s,%d): c0 = %c; c1 = %c\n",
NextArchieDefaults[defaultNo].name, defaultNo, c_val0, c_val1];
if( c_val0 != c_val1 )
{
str_val0 = (char *) malloc(2);
str_val0[0] = c_val1;
str_val0[1] = '\0';
return str_val0;
}
break;
case Bool:
if( *NextArchieDefaults[defaultNo].value == 'Y' )
c_val0 = YES;
else
c_val0 = NO;
c_val1 = *((char *) value);
[self debug: MAX_DEBUG method:NULL, "StringForValue(%s,%d): c0 = %d; c1 = %d\n",
NextArchieDefaults[defaultNo].name, defaultNo, c_val0, c_val1];
if( c_val0 != c_val1 )
{
str_val0 = (char *) malloc(4);
strcpy(str_val0, (c_val1 == YES ? "YES" : "NO"));
str_val0[3] = '\0';
return str_val0;
}
break;
default:
[self error: INTERNAL_ERROR method:NULL key: BAD_DEFAULT_VAL_TYPE];
break;
}
return NULL;
}
/* Update the defaults database with those preferences that have been changed.
FtpDebugLevel is not saved by this routine. */
- saveDefaults: sender
{
/* --- MethodDescription
ReturnValue: self;
Description: This method updates the application default values to
those in the instance variable prefs. A value is updated only if
it differs from the value read in [self init] and saved in
NextArchieDefaults. It is invoked whenever the user selects the
save button in the preferences panel.;
Args:
sender: The save button in the preferences panel;
*/
int count = 0;
char *stringValue;
struct _NXDefault newDefaults[N_Defaults];
#define CHECK_DEFAULT(defaultNo, member, type) \
{\
if( (stringValue = StringForValue(self, defaultNo, (void *)&prefs.member,\
type)) != NULL )\
{\
newDefaults[count].name = NextArchieDefaults[defaultNo].name;\
newDefaults[count ++].value = stringValue;\
/* Update current default reference */\
NextArchieDefaults[defaultNo].value = stringValue;\
[self debug: MAX_DEBUG method:_cmd, "%s = %s", NextArchieDefaults[defaultNo].name, stringValue];\
}}
#define CHECK_DEFAULT2(defaultNo, ptrvalue, type) \
{\
if( (stringValue = StringForValue(self, defaultNo, (void *)ptrvalue,\
type)) != NULL )\
{\
newDefaults[count].name = NextArchieDefaults[defaultNo].name;\
newDefaults[count ++].value = stringValue;\
/* Update current default reference */\
NextArchieDefaults[defaultNo].value = stringValue;\
[self debug: MAX_DEBUG method:_cmd, "%s = %s", NextArchieDefaults[defaultNo].name, stringValue];\
}}
// General
CHECK_DEFAULT(ShowNewQueries,showNewQueries,Bool);
CHECK_DEFAULT(AudioNotification,audioNotification, Bool);
CHECK_DEFAULT(UntitledFirstWindow,untitledFirstWindow, Bool);
stringValue = [prefs.sounds[DirLoaded] name];
CHECK_DEFAULT2(DirLoadedSnd,&stringValue, String);
stringValue = [prefs.sounds[QueryReceived] name];
CHECK_DEFAULT2(QueryReceivedSnd,&stringValue, String);
stringValue = [prefs.sounds[FTPTransfer] name];
CHECK_DEFAULT2(FTPTransferSnd,&stringValue, String);
// Archie
CHECK_DEFAULT(Hostname,serverHost, String);
CHECK_DEFAULT(IsCustomHost,isCustomHost, Bool);
CHECK_DEFAULT(QueryType,queryType, Char);
CHECK_DEFAULT(MaxReplies,maxReplies, Int);
CHECK_DEFAULT(SortFlag,sortFlag, Int);
CHECK_DEFAULT(ExactMode,exactMode, Bool);
CHECK_DEFAULT(NiceLevel,niceLevel, Int);
// Query
CHECK_DEFAULT(ModalArchieQuery,modalArchieQueries, Bool);
CHECK_DEFAULT(ModalDirQuery,modalDirQueries, Bool);
CHECK_DEFAULT(ServerTimeout,serverTimeout,Int);
CHECK_DEFAULT(ServerRetries,serverRetries,Int);
CHECK_DEFAULT(MaxDirListingThreads,maxThreadCount,Int);
CHECK_DEFAULT(DebugLevel,debugLevel,Int);
// FTP
CHECK_DEFAULT(RetrieveSubDirs,retrieveSubDirs, Bool);
CHECK_DEFAULT(CollisionWarn,collisionWarnings, Bool);
CHECK_DEFAULT(MaxFileSize,maxFileSize,Int);
CHECK_DEFAULT(PrefixCase,prefixCaseSensitive, Bool);
CHECK_DEFAULT(SuffixCase,suffixCaseSensitive, Bool);
CHECK_DEFAULT(AnonLoginPasswd,anonPasswd,String);
CHECK_DEFAULT(TransferDir,transferDir,String);
CHECK_DEFAULT(FileTypesList,fileTypeList, String);
CHECK_DEFAULT(TransferPriority, transferPriority, Int);
/* If there are any new values write them out */
if( count > 0 )
{
newDefaults[count].name = newDefaults[count].value = NULL;
NXWriteDefaults(NeXTArchieOwner, newDefaults);
while( count > 0 )
{
free(newDefaults[count].value);
count --;
}
/* Update the backup prefs */
oldPrefs = prefs;
}
return self;
}
- restoreDefaults: sender
{
int group;
/* Restore the defaults that were loaded at -init time */
prefs = oldPrefs;
/* Reset the preferences panel objects */
group = [sender group];
if( group == generalPrefsGrp )
resetPrefPanel |= GENERAL_PREFS_BIT;
else if( group == archiePrefsGrp )
resetPrefPanel |= ARCHIE_PREFS_BIT;
else if( group == queryPrefsGrp )
resetPrefPanel |= QUERY_PREFS_BIT;
else if( group == ftpPrefsGrp )
resetPrefPanel |= FTP_PREFS_BIT;
[self display];
return self;
}
@end
/* RCS Information:
$Author: me $;
$Date: 94/01/08 14:40:59 $;
$Source: /usr1/me/NeXTSrc/Archie/RCS/Preferences_Defaults.m,v $;
$Revision: 1.1 $;
$Log: Preferences_Defaults.m,v $
Revision 1.1 94/01/08 14:40:59 me
Check point of 2.09a version.
Revision 1.2 93/03/02 16:04:06 me
Corrected DebuggingEnabled default name.
Revision 1.1 93/02/23 02:11:27 me
Version 2.01a of the project.
;
*/
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.