/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/***************************************************************************
 *            miav.cc
 *
 *  Sat Aug 21 17:32:24 2004
 *  Copyright  2004  deva
 *  deva@aasimon.org
 ****************************************************************************/

/*
 *    This file is part of MIaV.
 *
 *    MIaV 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.
 *
 *    MIaV is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with MIaV; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
 */

/*
 * $Id$
 */

/*
 * $Log$
 * Revision 1.14  2005/06/14 12:29:40  deva
 * Incorporated the use of the Info object everywhere... also using the log functionality.
 *
 * Revision 1.13  2005/06/09 11:00:03  deva
 * Added daemon code, and cleaned up using -Wall and -Werror
 *
 * Revision 1.12  2005/05/25 12:31:59  deva
 *
 * Made info (error message system) work correctly.
 *
 * Revision 1.11  2005/05/23 18:42:50  deva
 * Error message windows is now modal with mainwindow as its parent.
 *
 * Revision 1.10  2005/05/22 15:49:22  deva
 * Added multithreaded encoding support.
 *
 * Revision 1.9  2005/05/03 17:13:25  deva
 * Fixed some missong Info object references.
 *
 * Revision 1.8  2005/05/03 09:22:12  deva
 * Implemented the gui part of the info object.
 *
 * Revision 1.7  2005/05/03 08:31:59  deva
 * Removed the error object, and replaced it with a more generic info object.
 *
 * Revision 1.6  2005/05/02 19:47:43  deva
 * Fixed overlapping cpr numbers on the server (now it saves one cpr pr.
 * connection, and ignores any changes sent)
 *
 * Revision 1.5  2005/05/01 09:56:26  deva
 * Added Id and Log tags to all files
 */

#include <config.h>

#ifdef USE_GUI
#include <qapplication.h>
#include "mainwindow.h"
#include "miav.h"
#endif /* USE_GUI */


#include "miav_daemon.h"

#include "miav_config.h"

#include "info_gui.h"
#include "info_console.h"

#include <stdio.h>

typedef enum {
  MODE_UNKNOWN,
  MODE_GRAB,
  MODE_SERVER
} run_mode;


/** 
 * This function starts the MIaV gui.
 */
int grab(int argc, char *argv[]) {
#ifdef USE_GUI

  QApplication miav_grab( argc, argv );

  MiavConfig cfg(ETC"/miav.conf", NULL);
  InfoGui info(&miav_grab, NULL, &cfg);
  config = new MiavConfig(ETC"/miav.conf", &info);

  InfoEventHandler *eventhandler = new InfoEventHandler( );
  miav_grab.installEventFilter( eventhandler );
  
  MainWindow mainwindow( &miav_grab );
  miav_grab.setMainWidget( &mainwindow );

  info.setParent(&mainwindow);
  return miav_grab.exec();

#else /* USE_GUI */

  fprintf(stderr, "Error: MIaV was not compiled with GUI support...\n");
  return 0;

#endif /* USE_GUI */
}



/** 
 * This function starts the MIaV server.
 */
int server(int argc, char *argv[])
{
  MiavDaemon daemon;

  MiavConfig cfg(ETC"/miav.conf", NULL);
  
  int uid = cfg.readInt("server_uid");
  int gid = cfg.readInt("server_gid");
 
  return daemon.run(uid, gid);
}

#include "debug.h"

int main(int argc, char *argv[])
{
  run_mode mode = MODE_UNKNOWN;

  if(argc >= 2) {
    if(!strcmp(argv[1], "grab")) mode = MODE_GRAB;
    if(!strcmp(argv[1], "server")) mode = MODE_SERVER;
  }

  switch(mode) {
  case MODE_GRAB:
    {
      return grab(argc - 2, &argv[2]);
    }
  case MODE_SERVER:
    {
      return server(argc - 2, &argv[2]);
    }
  case MODE_UNKNOWN:
    {
      printf("Usage: %s [mode] [mode options]\n", argv[0]);
      printf("[mode] can be one of the following: grab or server.\n");
      return 1;
    }
  }
  return 0;
}