/***************************************************************************
                          main.cpp  -  description
                             -------------------
    begin                : Dec 10 2003
    copyright            : (C) 2004 by Baryshev Dmitry
    email                : ksquirrel.iv@gmail.com
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#include <tqgl.h>
#include <tqdir.h>
#include <tqfile.h>

#include <tdeapplication.h>
#include <tdecmdlineargs.h>
#include <tdeaboutdata.h>
#include <tdelocale.h>
#include <tdeconfig.h>
#include <dcopclient.h>
#include <tdeglobal.h>
#include <kstandarddirs.h>

#include <cstdlib>

#include "ksquirrel.h"
#include "sq_splashscreen.h"
#include "sq_hloptions.h"

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

/* ****************************************************************** */

// Our command line options
static TDECmdLineOptions options[] =
{
    {"+[file to open]", I18N_NOOP("File to be opened at startup."), 0},
    {"l", I18N_NOOP("Print found libraries and exit."), 0},
    {"d", 0, 0},
    {"print-dcop", I18N_NOOP("Print available DCOP parameters"), 0},
    {"nodirectorybasket", I18N_NOOP("Folder basket"), 0},
    {"noimagebasket", I18N_NOOP("Image basket"), 0},
    {"nocategories", I18N_NOOP("Categories"), 0},
    {"nomountview", I18N_NOOP("Mount view"), 0},

    TDECmdLineLastOption
};

int main(int argc, char *argv[])
{
    KSquirrel            *SQ;
    SQ_HLOptions         *high;
    const TQCString App = "ksquirrel";

    TDEAboutData aboutData(
            "ksquirrel",
            "KSquirrel",
            VERSION,
            I18N_NOOP("KSquirrel - image viewer for TDE"),
            TDEAboutData::License_GPL,
            "(c) 2003-2007 Baryshev Dmitry",
            TQString(),
            "http://ksquirrel.sourceforge.net",
            "ksquirrel.iv@gmail.com");

    // setup 'About' dialog
    aboutData.addAuthor("Dmitry Baryshev aka Krasu", "Author", "ksquirrel.iv@gmail.com", TQString());
    aboutData.addCredit("Andrey Rahmatullin aka wrar", I18N_NOOP("Bug reports, patches"), "wrar@altlinux.ru", TQString());
    aboutData.addCredit("SeaJey", I18N_NOOP("Testing"), "seajey.serg@gmail.com", TQString());
    aboutData.addCredit("JaguarWan", I18N_NOOP("Bug reports"), "jaguarwan@gmail.com", TQString());
    aboutData.addCredit("NightGoblin", I18N_NOOP("Translation help"), 0, "http://nightgoblin.info");
    aboutData.addCredit(I18N_NOOP("TiamaT"), I18N_NOOP("Initial artwork for edit tools"), "plasticfantasy@tut.by", "http://www.livejournal.com/users/tiamatik/");
    aboutData.addCredit(I18N_NOOP("Fera"), I18N_NOOP("Great artwork for edit tools"), "morrigan171@mail.ru", TQString());
    aboutData.addCredit(I18N_NOOP("OpenGL forum at"), 0, 0, "http://opengl.org");
    aboutData.addCredit(I18N_NOOP("GameDev forum at"), 0, 0, "http://gamedev.ru");

    // parse command line
    TDECmdLineArgs::init(argc, argv, &aboutData);
    TDECmdLineArgs::addCmdLineOptions(options);
    TDECmdLineArgs *sq_args = TDECmdLineArgs::parsedArgs();

    //create high level options
    high = new SQ_HLOptions;

    if(sq_args->count())
        high->param = TQFile::decodeName(sq_args->arg(0));

    high->showLibsAndExit = sq_args->isSet("l");
    bool printDCOP = sq_args->isSet("d");

    high->have_directorybasket = sq_args->isSet("directorybasket");
    high->have_imagebasket     = sq_args->isSet("imagebasket");
    high->have_categories      = sq_args->isSet("categories");
    high->have_mountview       = sq_args->isSet("mountview");

    TDEApplication    a;

    if(!TQGLFormat::hasOpenGL())
    {
        tqWarning("KSquirrel: this system has no OpenGL support. Exiting." );
        exit(1);
    }

    // don't even try to connect to DCOP if -l specified - 
    // anyway we will exit later
    if(!high->showLibsAndExit)
    {
        bool reg = a.dcopClient()->isApplicationRegistered(App);

        // Check if KSquirrel already registered.
        // If registered, send an url to it.
        if(reg && !high->param.isEmpty())
        {
            // Yes, it is registered. Let's send a message to it.
            TQCString replyType;
            TQByteArray data, replyData;
            TQDataStream dataStream(data, IO_WriteOnly);

            dataStream << high->param;

            if(!a.dcopClient()->call(App, App, "load(TQString)", data, replyType, replyData))
                tqDebug("\nUnable to send data to old instance of KSquirrel: exiting.\n");

            sq_args->clear();
            delete high;

            exit(0);
        }
        // If registered, but no url was specified in command line
        else if(reg)
        {
            TQString data;

            if(!a.dcopClient()->send(App, App, "activate()", data))
                tqDebug("\nUnable to send data to old instance of KSquirrel: exiting.\n");

            sq_args->clear();
            delete high;

            exit(0);
        }
    }

    TDEGlobal::dirs()->addResourceType("data", TDEStandardDirs::kde_default("data") + TQString::fromLatin1("ksquirrel"));

    SQ_SplashScreen *splash = 0;

    // should we show a splash screen ?
    TDEConfig *config = new TDEConfig("ksquirrelrc");
    config->setGroup("Main");

    if(config->readBoolEntry("splash", true))
    {
        splash = new SQ_SplashScreen(0, "ksquirrel-splash-screen");
        if(!high->showLibsAndExit) splash->show(); // don't show splash when -l
        TDEApplication::flush();
    }

    delete config;

    // connect to DCOP server and register KSquirrel. Now we can
    // send messages to KSquirrel (see README for parameters)
    if(a.dcopClient()->attach())
        a.dcopClient()->registerAs(App, false);

    // create an instance
    SQ = new KSquirrel(0, App);

    if(printDCOP)
        SQ->printDCOP();

    a.setMainWidget(SQ);

    sq_args->clear();

    return a.exec();
}
