/* main.c: PerlWrapper main source file
 * ------------------------------------------------------------------------
 * Starts a Perl interpreter, sets a few variables and library paths.
 * Executes 'start.pl'.
 * ------------------------------------------------------------------------
 * $Id: main.c 11 2004-10-17 22:19:26Z crenz $
 * Copyright (C) 2004 Christian Renz <crenz@web42.com>.
 * All rights reserved.
 */
 
#include <unistd.h>
#include <CoreFoundation/CoreFoundation.h>
#include <CoreServices/CoreServices.h>
#include <Carbon/Carbon.h> // kAlertStopAlert
#include <perlinterpreter.h>

int get_bundle_path(char sPath[1024]) {
	CFBundleRef mainBundle = CFBundleGetMainBundle();
	CFURLRef myURL;
	FSRef fsref;

	myURL = CFBundleCopyBundleURL(mainBundle);
	if (!CFURLGetFSRef (myURL, &fsref)) {
		printf("[Wrapped Perl Application] Error getting FSRef\n");
		return 1;
	}
	FSRefMakePath(&fsref, (UInt8 *) sPath, 1023);

	return 0;
}

int get_resource_path(char sPath[1024]) {
	CFBundleRef mainBundle = CFBundleGetMainBundle();
	CFURLRef myURL;
	FSRef fsref;

	myURL = CFBundleCopyResourcesDirectoryURL(mainBundle);
	if (!CFURLGetFSRef (myURL, &fsref)) {
		printf("[Wrapped Perl Application] Error getting FSRef\n");

		return 1;
	}
	FSRefMakePath(&fsref, (UInt8 *) sPath, 1023);

	return 0;
}

int main(int argc, char* argv[], char** env) {
	char sPath[1024];
	char source[2200];

	perl_init(&argc,&argv,&env);
	perl_exec("$PerlWrapper::Version = '0.1'");

	// Store bundle path in perl variable
	if (get_bundle_path(sPath))
		return 1;
	sprintf(source,
		"$PerlWrapper::BundlePath = '%s';"
		"$^X = '%s/Contents/MacOS/perl';",
		sPath, sPath);
	perl_exec(source);

	// Change path so dynamic libraries will be found
	chdir(sPath);

	// Store resources path in perl variable
	if (get_resource_path(sPath))
		return 1;
	sprintf(source,
		"$PerlWrapper::ResourcesPath = '%s';"
		"@INC = '%s/Perl-Libraries';",
		sPath, sPath);
	perl_exec(source);

	if (strcmp(strrchr(argv[0], '/') + 1, "perl") == 0) {
		perl_init_argv(argc, argv);
		sprintf(source,
			"eval { require '%s'; 1 } or die",
			argv[1]);
		perl_exec(source);
	}
	else {
		sprintf(source,
			"eval { require '%s/Perl-Source/main.pl' }; $PerlWrapper::Error = $@;",
			sPath);
		perl_exec(source);
	}

	char *err = perl_getstring("PerlWrapper::Error");
	if (err && strlen(err) > 0) {
		CFOptionFlags btnhit;

		printf("[Wrapped Perl Application] Perl Error:\n%s\n", err);
		CFStringRef caption = CFStringCreateWithCString(kCFAllocatorSystemDefault, "Perl Error", kCFStringEncodingUTF8);
		CFStringRef message = CFStringCreateWithCString(kCFAllocatorSystemDefault, err, kCFStringEncodingUTF8);
		CFUserNotificationDisplayAlert(
		    0, kAlertStopAlert, NULL, NULL, NULL, caption, message,
		    NULL, NULL, NULL, &btnhit );
		CFRelease(caption);
		CFRelease(message);
	}
	
	perl_destroy();

	// todo: Get perl's return code
	return 0;
}

/* eof *******************************************************************/