/* * Copyright (c) 2008, 2009, 2010, 2011, 2012 * Jonathan Schleifer <js@webkeks.org> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" @class OFString; @class OFArray; @class OFDictionary; @class OFMutableArray; @class OFMutableDictionary; #define OF_APPLICATION_DELEGATE(cls) \ int \ main(int argc, char *argv[]) \ { \ return of_application_main(&argc, &argv, [cls class]); \ } /** * \brief A protocol for delegates of OFApplication. */ #ifndef OF_APPLICATION_M @protocol OFApplicationDelegate <OFObject> #else @protocol OFApplicationDelegate #endif /** * \brief A method which is called when the application was initialized and is * running now. */ - (void)applicationDidFinishLaunching; #ifdef OF_HAVE_OPTIONAL_PROTOCOLS @optional #endif /** * \brief A method which is called when the application will terminate. */ - (void)applicationWillTerminate; /** * \brief A method which is called when the application received a SIGINT. * * \warning You are not allowed to send any messages inside this method, as * message dispatching is not signal-safe! You are only allowed to do * signal-safe operations like setting a variable or calling a * signal-safe function! */ - (void)applicationDidReceiveSIGINT; #ifndef _WIN32 /** * \brief A method which is called when the application received a SIGHUP. * * This signal is not available on Windows. * * \warning You are not allowed to send any messages inside this method, as * message dispatching is not signal-safe! You are only allowed to do * signal-safe operations like setting a variable or calling a * signal-safe function! */ - (void)applicationDidReceiveSIGHUP; /** * \brief A method which is called when the application received a SIGUSR1. * * This signal is not available on Windows. * * \warning You are not allowed to send any messages inside this method, as * message dispatching is not signal-safe! You are only allowed to do * signal-safe operations like setting a variable or calling a * signal-safe function! */ - (void)applicationDidReceiveSIGUSR1; /** * \brief A method which is called when the application received a SIGUSR2. * * This signal is not available on Windows. * * \warning You are not allowed to send any messages inside this method, as * message dispatching is not signal-safe! You are only allowed to do * signal-safe operations like setting a variable or calling a * signal-safe function! */ - (void)applicationDidReceiveSIGUSR2; #endif @end /** * \brief Represents the application as an object. */ @interface OFApplication: OFObject { OFString *programName; OFMutableArray *arguments; OFMutableDictionary *environment; int *argc; char ***argv; @public id <OFApplicationDelegate> delegate; void (*SIGINTHandler)(id, SEL); #ifndef _WIN32 void (*SIGHUPHandler)(id, SEL); void (*SIGUSR1Handler)(id, SEL); void (*SIGUSR2Handler)(id, SEL); #endif } #ifdef OF_HAVE_PROPERTIES @property (readonly, copy, nonatomic) OFString *programName; @property (readonly, copy, nonatomic) OFArray *arguments; @property (readonly, copy, nonatomic) OFDictionary *environment; @property (assign) id <OFApplicationDelegate> delegate; #endif /** * \brief Returns the only OFApplication instance in the application. * * \return The only OFApplication instance in the application */ + (OFApplication*)sharedApplication; /** * \brief Returns the name of the program (argv[0]). * * \return The name of the program (argv[0]) */ + (OFString*)programName; /** * \brief Returns the arguments passed to the application. * * \return The arguments passed to the application */ + (OFArray*)arguments; /** * \brief Returns the environment of the application. * * \return The environment of the application */ + (OFDictionary*)environment; /** * \brief Terminates the application. */ + (void)terminate; /** * \brief Terminates the application with the specified status. * * \param status The status with which the application will terminate */ + (void)terminateWithStatus: (int)status; /** * \brief Sets argc and argv. * * You should not call this directly, but use OF_APPLICATION_DELEGATE instead! * * \param argc The number of arguments * \param argv The argument values */ - (void)setArgumentCount: (int*)argc andArgumentValues: (char**[])argv; /** * \brief Gets args and argv. * * \param argc A pointer where a pointer to argc should be stored * \param argv A pointer where a pointer to argv should be stored */ - (void)getArgumentCount: (int**)argc andArgumentValues: (char***[])argv; /** * \brief Returns the name of the program (argv[0]). * * \return The name of the program (argv[0]) */ - (OFString*)programName; /** * \brief Returns the arguments passed to the application. * * \return The arguments passed to the application */ - (OFArray*)arguments; /** * \brief Returns the environment of the application. * * \return The environment of the application */ - (OFDictionary*)environment; /** * \brief Returns the delegate of the application. * * \return The delegate of the application */ - (id <OFApplicationDelegate>)delegate; /** * \brief Sets the delegate of the application. * * \param delegate The delegate for the application */ - (void)setDelegate: (id <OFApplicationDelegate>)delegate; /** * \brief Starts the application after everything has been initialized. * * You should not call this directly, but use OF_APPLICATION_DELEGATE instead! */ - (void)run; /** * \brief Terminates the application. */ - (void)terminate; /** * \brief Terminates the application with the specified status. * * \param status The status with which the application will terminate */ - (void)terminateWithStatus: (int)status; @end @interface OFObject (OFApplicationDelegate) <OFApplicationDelegate> @end #ifdef __cplusplus extern "C" { #endif extern int of_application_main(int*, char**[], Class); #ifdef __cplusplus } #endif