189 lines
5.3 KiB
Plaintext
189 lines
5.3 KiB
Plaintext
#import <sys/types.h>
|
|
#import <sys/wait.h>
|
|
#import <cstring>
|
|
#import <unistd.h>
|
|
#import <fcntl.h>
|
|
#import "Helper.h"
|
|
#import "InstallerWindowController.h"
|
|
#import "InstallerFile.h"
|
|
#import "Processor.h"
|
|
#import "Util.h"
|
|
|
|
void Error(const char *fmt, ...);
|
|
|
|
static id c;
|
|
|
|
void HandleFile(const CString& file, const CString& dir,
|
|
const CString& archivePath)
|
|
{
|
|
NSString *filePath = [NSString stringWithCString:dir];
|
|
|
|
filePath = [filePath stringByAppendingFormat:@"%s%s",
|
|
(dir == "/" ? "" : "/"), file.c_str()];
|
|
[c postMessage:filePath];
|
|
/* This is rediculus */
|
|
char path[] = "/bin/cp";
|
|
char arg[] = "-RP";
|
|
CString fromString = archivePath + '/' + file;
|
|
char from[fromString.length() + 1];
|
|
CString toString = dir + '/' + file;
|
|
char to[toString.length() + 1];
|
|
char *const arguments[] = {path, arg, from, to, NULL};
|
|
|
|
strcpy(from, fromString);
|
|
strcpy(to, toString);
|
|
MakeAllButLast(to);
|
|
|
|
int fd_dev_null = open("/dev/null", O_RDWR, 0);
|
|
|
|
if (CallTool3(true, -1, fd_dev_null, fileno(stderr), path, arguments))
|
|
[c postMessage:@"failed"];
|
|
close(fd_dev_null);
|
|
}
|
|
|
|
const CString GetPath(const CString& ID)
|
|
{
|
|
NSOpenPanel *panel = [NSOpenPanel openPanel];
|
|
|
|
[panel setCanChooseFiles:NO];
|
|
[panel setCanChooseDirectories:YES];
|
|
[panel setResolvesAliases:YES];
|
|
[panel setAllowsMultipleSelection:NO];
|
|
[panel setPrompt:@"Install"];
|
|
// Only in 10.3 and above
|
|
if ([panel respondsToSelector:@selector(setCanCreateDirectories:)])
|
|
[panel setCanCreateDirectories:YES];
|
|
[panel setTitle:@"Choose a location to install."];
|
|
int result = [panel runModalForTypes:[NSArray array]]; // No extensions
|
|
|
|
if (result != NSOKButton)
|
|
{
|
|
[c postMessage:@"Canceled install."];
|
|
[c finishedInstalling:NO];
|
|
[NSThread exit];
|
|
}
|
|
|
|
NSString *path = [panel filename]; //No need for NSOpenPanel's filenames method
|
|
|
|
[c postMessage:[NSString stringWithFormat:@"Chose file \"%@\".", path]];
|
|
|
|
return [path cString];
|
|
}
|
|
|
|
void Error(const char *fmt, ...)
|
|
{
|
|
va_list ap;
|
|
va_start(ap, fmt);
|
|
NSString *message = [[NSString alloc] initWithFormat:[NSString stringWithCString:fmt] arguments:ap];
|
|
va_end(ap);
|
|
[c postMessage:[message autorelease]];
|
|
}
|
|
|
|
bool AskFunc(const CString& question)
|
|
{
|
|
NSString *q = [NSString stringWithCString:question.c_str()];
|
|
BOOL answer = [c askQuestion:q];
|
|
|
|
[c postMessage:q];
|
|
[c postMessage:(answer ? @"YES" : @"NO")];
|
|
return answer;
|
|
}
|
|
|
|
void Echo(const CString& message, bool loud)
|
|
{
|
|
if (!loud)
|
|
{
|
|
[c postMessage:[NSString stringWithCString:message.c_str()]];
|
|
return;
|
|
}
|
|
|
|
NSBeginCriticalAlertSheet(@"Warning", @"OK", nil, nil, [c window], c, nil, nil, NULL,
|
|
[NSString stringWithCString:message.c_str()]);
|
|
}
|
|
|
|
@implementation Helper
|
|
- (id)initWithPath:(NSString *)path
|
|
{
|
|
[super init];
|
|
mPath = [path retain];
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
[mPath autorelease];
|
|
[super dealloc];
|
|
}
|
|
|
|
- (void)startHelper:(id)caller
|
|
{
|
|
c = caller;
|
|
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
|
CString configPath = [mPath cString];
|
|
//CString archivePath = configPath + "/archive.tar.gz";
|
|
CString archivePath = configPath;
|
|
BOOL success = NO;
|
|
|
|
configPath += "/config";
|
|
InstallerFile file(configPath);
|
|
try
|
|
{
|
|
do {
|
|
Processor p(archivePath, HandleFile, GetPath, AskFunc, YES);
|
|
|
|
p.SetErrorFunc(Error);
|
|
p.SetEchoFunc(Echo);
|
|
|
|
[c postMessage:@"Reading from the config file."];
|
|
|
|
if(!file.ReadFile())
|
|
{
|
|
[c postMessage:@"Couldn't read the config file"];
|
|
break;
|
|
}
|
|
|
|
unsigned nextLine = 0;
|
|
while (nextLine < file.GetNumLines())
|
|
p.ProcessLine(file.GetLine(nextLine), nextLine);
|
|
success = YES;
|
|
}
|
|
while(0);
|
|
}
|
|
catch (CString& e)
|
|
{
|
|
[c postMessage:[NSString stringWithCString:e]];
|
|
}
|
|
|
|
[c postMessage:@"Installation complete"];
|
|
[c finishedInstalling:YES];
|
|
[pool release];
|
|
}
|
|
|
|
@end
|
|
|
|
/*
|
|
* (c) 2003-2004 Steve Checkoway
|
|
* All rights reserved.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the
|
|
* "Software"), to deal in the Software without restriction, including
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
* distribute, and/or sell copies of the Software, and to permit persons to
|
|
* whom the Software is furnished to do so, provided that the above
|
|
* copyright notice(s) and this permission notice appear in all copies of
|
|
* the Software and that both the above copyright notice(s) and this
|
|
* permission notice appear in supporting documentation.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
|
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
|
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
|
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|