
/* Generated by Interface Builder */

#import "Main.h"
#import "Protos.h"
#import "Server.h"
#import <appkit/Application.h>
#import <appkit/Listener.h>
#import <appkit/Speaker.h>
#import <appkit/Panel.h>
#import <objc/List.h>
#import <stdio.h>
#import <libc.h>
#import <appkit/defaults.h>

// Temporary files for updating services.
#define SERVICE_FILE "/tmp/NewFileService"
#define EXEC_FILE "/tmp/NewFileExec"

@implementation Main

// The application's folder.
- (char *)appdir
{
	return appdir;
}

// Translate a prototype's name into an absolute pathname stored in fullname.
// Returns fullname.
- (char *)fullprotoname:(char *)fullname:(char *)name
{
	sprintf(fullname, "%s/blanks/%s", [self appdir], name);
	return fullname;
}

// Copy a file/directory.
- (int)copyfile:(char *)to:(char *)from
{
	int reply;
	char command[3*MAXPATHLEN];
	sprintf(command,"/bin/cp -rp '%s' '%s'", from, to);
	reply = system(command);
	return reply;;
}

- appDidInit:sender
{
	//Find the application's folder.
	strcpy(appdir, NXArgv[0]);
	*rindex(appdir, '/') = '\0';

	listener = [NXApp appListener];
	speaker = [NXApp appSpeaker];
	[listener setServicesDelegate:server];
	
	// Read in list of types.
	[self loadstate];
	// Tell the servier to initialize itself.
	[server inittypes:[protos protoslist]];
	
	return self;
}

/* Intercept termination to write text and defaults.*/
- appWillTerminate:sender
{
	[self savestate];
	return self;
}


// Initialization proper.
- loadstate
{
	char	rc[MAXPATHLEN];
	FILE *fp;
	
	// First, check for rc file in the user's home directory.
	sprintf(rc, "%s/.NewFilerc", getenv("HOME"));
	fp = fopen(rc, "r");
	if (fp)
	{
		[protos readprotos:fp];
		fclose(fp);
	}
	else
	{
		// No rc file in home directory, so use the one in the app's folder,
		sprintf(rc, "%s/NewFilerc", [self appdir]);
		fp = fopen(rc, "r");
		if (fp)
		{
			[protos readprotos:fp];
			fclose(fp);
		}
		else
			// Should never get to here.
			fprintf(stderr, "NewFile: can't open rc file: your version of NewFile is incomplete.\n");
	}
	
	return self;
}

// Store the defaults.
- savestate;
{
	char	rc[MAXPATHLEN];
	FILE *fp;
	sprintf(rc, "%s/.NewFilerc", getenv("HOME"));
	fp = fopen(rc, "w");
	if (fp)
	{
		[protos writeprotos:fp];
		fclose(fp);
	}
	else
		fprintf(stderr, "NewFile: can't open rc file\n");
	return self;
}


// Open a file by messaging the Workspace Manager.
- openinws:(char *)file
{
	int msgDelivered, fileOpened;
	port_t	wsport;

	wsport = NXPortFromName(NX_WORKSPACEREQUEST, NULL);
	if (wsport == PORT_NULL) fprintf(stderr, "NewFile: Can't get Workspace port\n");
	[speaker setSendPort:wsport];
	msgDelivered = [speaker openFile:file ok:&fileOpened];
	if ((msgDelivered!=0) || (fileOpened==NO))
		fprintf(stderr, "NewFile: Couldn't open %s\n", file);
	return self;
}

// Open a file by messaging an application.
- openineditor:(char *)file:(char *)app
{
	int msgDelivered, fileOpened; 
	port_t port;
	
	port = NXPortFromName(app, NULL);
	if (port!=PORT_NULL)
	{
		[speaker setSendPort:port];
		msgDelivered = [speaker openFile:file ok:&fileOpened];
		if ((msgDelivered!=0) || (fileOpened==NO))
			fprintf(stderr, "NewFile: Couldn't open %s\n", file);
	}
	else
	{
		fprintf(stderr, "NewFile: Couldn't get port for %s. Opening in Workspace\n", app);
		[self openinws:file];
	}
	return self;
}

// I'd rather discuss this.
- updateservices:sender
{
	char cmd[MAXPATHLEN];
	FILE *serviceFile;
	int i, count;
	id	list;
	char	*typename;
	
	if (NXRunAlertPanel("Update services?", "This action will alter the executable file and exit NewFile.", "Go ahead", "Cancel", NULL) == NX_ALERTDEFAULT)
	{
		[self savestate];
		if ((serviceFile = fopen(SERVICE_FILE, "w")) == NULL) {
			NXRunAlertPanel(NULL, "Could not open temporary file %s", NULL, NULL, 
				NULL, SERVICE_FILE);
			exit(1);
		}
		
		list = [protos protoslist];
		count = [list count];
		for (i=0;i<count;i++)
		{
			typename = [[list objectAt:i] typename];
			fprintf(serviceFile, "Message: createNew\nPort: NewFile\nMenu Item: New File/%s\nUser Data: %s\nSend Type: NXFilenamePboardType\nDeactivate Requestor: YES\n\n", typename, typename);
		}
		fclose(serviceFile);
	
		/*
			* OK, now we have a new service file, so insert it in the executable.
			*/
			sprintf(cmd, "/bin/segedit %s -r __ICON __services %s -o %s", NXArgv[0],
			SERVICE_FILE, EXEC_FILE);
		if (system(cmd) != 0) {
			NXRunAlertPanel(NULL, "Command %s failed!\nYou should copy NewFile.app into ~/Apps. See Help.", NULL, NULL, NULL, cmd);
			exit(1);
		}
		sprintf(cmd, "/bin/rm -f %s ; /bin/mv %s %s ; chmod a+x %s", NXArgv[0], EXEC_FILE, 
		NXArgv[0], NXArgv[0]);
		if (system(cmd) != 0) {
			NXRunAlertPanel(NULL, "Command %s failed!\nYou should copy NewFile.app into ~/Apps. See Help.", NULL, NULL, NULL, cmd);
			exit(1);
		}
		if (system("make_services") != 0) {
			NXRunAlertPanel(NULL, "Command make_services failed!", NULL, NULL, NULL);
			exit(1);
		}
		NXRunAlertPanel(NULL, "Update of services complete. Applications launched from now on should show new services.", NULL, NULL, NULL);
		exit(0);
	}
	return self;	
}

@end
