#include <unistd.h>

#include "WINGsP.h"

#include "wconfig.h"

#include "X11/Xlocale.h"


extern void W_InitNotificationCenter(void);


struct W_Application WMApplication;


char *_WINGS_progname = NULL;



Bool
W_ApplicationInitialized(void)
{
    return _WINGS_progname!=NULL;
}


void
WMInitializeApplication(char *applicationName, int *argc, char **argv)
{
    int i;

    assert(argc!=NULL);
    assert(argv!=NULL);
    assert(applicationName!=NULL);

    setlocale(LC_ALL, "");

#ifdef I18N
    if (getenv("NLSPATH"))
        bindtextdomain("WINGs", getenv("NLSPATH"));
    else
        bindtextdomain("WINGs", LOCALEDIR);
    bind_textdomain_codeset("WINGs", "UTF-8");
#endif

    _WINGS_progname = argv[0];

    WMApplication.applicationName = wstrdup(applicationName);
    WMApplication.argc = *argc;

    WMApplication.argv = wmalloc((*argc+1)*sizeof(char*));
    for (i=0; i<*argc; i++) {
        WMApplication.argv[i] = wstrdup(argv[i]);
    }
    WMApplication.argv[i] = NULL;

    /* initialize notification center */
    W_InitNotificationCenter();
}


void
WMSetResourcePath(char *path)
{
    if (WMApplication.resourcePath)
        wfree(WMApplication.resourcePath);
    WMApplication.resourcePath = wstrdup(path);
}


char*
WMGetApplicationName()
{
    return WMApplication.applicationName;
}


static char*
checkFile(char *path, char *folder, char *ext, char *resource)
{
    char *ret;
    int extralen;

    extralen = (ext ? strlen(ext) : 0) + (folder ? strlen(folder) : 0) + 4;
    ret = wmalloc(strlen(path)+strlen(resource)+extralen+8);
    strcpy(ret, path);
    if (folder) {
        strcat(ret, "/");
        strcat(ret, folder);
    }
    if (ext) {
        strcat(ret, "/");
        strcat(ret, ext);
    }
    strcat(ret, "/");
    strcat(ret, resource);

    if (access(ret, F_OK)!=0) {
        wfree(ret);
        ret = NULL;
    }

    return ret;
}


char*
WMPathForResourceOfType(char *resource, char *ext)
{
    char *path = NULL;
    char *tmp, *appdir;
    int i;

    /*
     * Paths are searched in this order:
     * - resourcePath/ext
     * - argv[0]/ext
     * - GNUSTEP_USER_ROOT/Applications/ApplicationName.app/ext
     * - ~/GNUstep/Applications/ApplicationName.app/ext
     * - GNUSTEP_LOCAL_ROOT/Applications/ApplicationName.app/ext
     * - /usr/local/GNUstep/Applications/ApplicationName.app/ext
     * - GNUSTEP_SYSTEM_ROOT/Applications/ApplicationName.app/ext
     * - /usr/GNUstep/Applications/ApplicationName.app/ext
     */

    if (WMApplication.resourcePath) {
        path = checkFile(WMApplication.resourcePath, NULL, ext, resource);
        if (path)
            return path;
    }

    if (WMApplication.argv[0]) {
        tmp = wstrdup(WMApplication.argv[0]);
        i = strlen(tmp);
        while (i > 0 && tmp[i]!='/')
            i--;
        tmp[i] = 0;
        if (i>0) {
            path = checkFile(tmp, NULL, ext, resource);
        } else {
            path = NULL;
        }
        wfree(tmp);
        if (path)
            return path;
    }

    appdir = wmalloc(strlen(WMApplication.applicationName)+20);
    sprintf(appdir, "Applications/%s.app", WMApplication.applicationName);

    if (getenv("GNUSTEP_USER_ROOT")) {
        path = checkFile(getenv("GNUSTEP_USER_ROOT"), appdir, ext, resource);
        if (path) {
            wfree(appdir);
            return path;
        }
    }

    tmp = wusergnusteppath();
    if (tmp) {
        path = checkFile(tmp, appdir, ext, resource);
        if (path) {
            wfree(appdir);
            return path;
        }
    }

    if (getenv("GNUSTEP_LOCAL_ROOT")) {
        path = checkFile(getenv("GNUSTEP_LOCAL_ROOT"), appdir, ext, resource);
        if (path) {
            wfree(appdir);
            return path;
        }
    }

    path = checkFile("/usr/local/GNUstep", appdir, ext, resource);
    if (path) {
        wfree(appdir);
        return path;
    }


    if (getenv("GNUSTEP_SYSTEM_ROOT")) {
        path = checkFile(getenv("GNUSTEP_SYSTEM_ROOT"), appdir, ext, resource);
        if (path) {
            wfree(appdir);
            return path;
        }
    }

    path = checkFile("/usr/GNUstep", appdir, ext, resource);
    if (path) {
        wfree(appdir);
        return path;
    }

    return NULL;
}




syntax highlighted by Code2HTML, v. 0.9.1