#! /usr/bin/env python
# -*- coding: UTF-8 -*-

import __builtin__
import main
import os
import sys


# set up i18n
from utils import i18n
__builtin__._ = i18n.Translator("gdesklets")


# setup GTK
try:
    import pygtk
    pygtk.require("2.0")
except StandardError:
    print _("You need a recent version of PyGTK to run this program.\n")
    sys.exit(1983)


def _detach_as_daemon():

    """
    Performs the UNIX double fork to detach as a daemon process as described at
    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/278731 and
    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012
    """

    # fork() on win32??? are you joking?
    if (HAVE_WIN32): return

    try:
        pid = os.fork()
        if (pid > 0):
            os._exit(0)

        os.chdir("/")
        os.setsid()

        pid = os.fork()
        if (pid > 0):
            os._exit(0)

    except StandardError:
        print _("Could not fork daemon.\n")
        sys.exit(1)


def _write_pid():

    import main
    import utils
    import os
    import atexit

    try:
        utils.makedirs(main.USERHOME)
    except OSError, exc:
        print
        print exc
        sys.exit(1)
    try:
        f = file(main.PID_PATH, 'w')
        print >>f, os.getpid()
    except IOError, exc:
        print _("The following error occurred: %s\n" % `exc`)
        sys.exit(1)
    else:
        f.close() # ensure it's written NOW

    atexit.register(os.remove, main.PID_PATH)


def _redirect_to_logfile():

    """
    Redirects stdout and stderr to the given logfile and stdin to /dev/null.
    """

    from main import LOGFILE
    from utils.logger import SyncWriter

    try:
        out_log = file(LOGFILE, "w", 0)
    except IOError, exc:
        print _("The following error occurred: %s\n" % `exc`)
        sys.exit(1)
    else:
        sys.stderr = sys.stdout = SyncWriter(out_log)

    if (not HAVE_WIN32):
        sys.stdin = file("/dev/null", "r")

    # dummy write
    print "Log messages of %s" % (LOGFILE,)
    sys.stdout.flush()


def _gdesklets_main():

    """ gdesklets main function to start """

    # prepare gdesklets (locale, signals, program_init)
    from main import init
    init()

    # tell the user who just switched version some important stuff
    from main import transition

    # build our sockets, trayicon and start them
    from main.Starter import Starter
    Starter()

    # enter gtk's mainloop
    import gtk
    gtk.threads_enter()
    gtk.main()
    gtk.threads_leave()


_detach_as_daemon()
_write_pid()
_redirect_to_logfile()
_gdesklets_main()

