You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
6.3 KiB
192 lines
6.3 KiB
/***************************************************************************
|
|
main.cpp
|
|
-------------------
|
|
begin : Sat Dec 8 03:23:02 CET 2001
|
|
copyright : (C) 2001-2003 by Tim Jansen
|
|
email : tim@tjansen.de
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* 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 "trayicon.h"
|
|
#include "configuration.h"
|
|
#include "krfbifaceimpl.h"
|
|
#include "rfbcontroller.h"
|
|
|
|
#include <kpixmap.h>
|
|
#include <tdeaction.h>
|
|
#include <kdebug.h>
|
|
#include <kapplication.h>
|
|
#include <knotifyclient.h>
|
|
#include <ksystemtray.h>
|
|
#include <kcmdlineargs.h>
|
|
#include <kaboutdata.h>
|
|
#include <kaboutapplication.h>
|
|
#include <klocale.h>
|
|
#include <kmessagebox.h>
|
|
#include <tqobject.h>
|
|
#include <tqwindowdefs.h>
|
|
#include <tqcstring.h>
|
|
#include <tqdatastream.h>
|
|
#include <dcopref.h>
|
|
|
|
#include <signal.h>
|
|
|
|
#undef VERSION
|
|
#define VERSION "1.0"
|
|
|
|
static const char description[] = I18N_NOOP("VNC-compatible server to share "
|
|
"TDE desktops");
|
|
#define ARG_KINETD "kinetd"
|
|
|
|
|
|
static KCmdLineOptions options[] =
|
|
{
|
|
{ ARG_KINETD " ", I18N_NOOP("Used for calling from kinetd"), 0},
|
|
KCmdLineLastOption
|
|
};
|
|
|
|
void checkKInetd(bool &kinetdAvailable, bool &krfbAvailable) {
|
|
DCOPRef ref("kded", "kinetd");
|
|
ref.setDCOPClient(TDEApplication::dcopClient());
|
|
|
|
DCOPReply r = ref.call("isInstalled", TQString("krfb"));
|
|
if (!r.isValid()) {
|
|
kinetdAvailable = false;
|
|
krfbAvailable = false;
|
|
return;
|
|
}
|
|
|
|
r.get(krfbAvailable);
|
|
kinetdAvailable = true;
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
TDEAboutData aboutData( "krfb", I18N_NOOP("Desktop Sharing"),
|
|
VERSION, description, TDEAboutData::License_GPL,
|
|
"(c) 2001-2003, Tim Jansen\n"
|
|
"(c) 2001, Johannes E. Schindelin\n"
|
|
"(c) 2000, heXoNet Support GmbH, D-66424 Homburg\n"
|
|
"(c) 2000-2001, Const Kaplinsky\n"
|
|
"(c) 2000, Tridia Corporation\n"
|
|
"(c) 1999, AT&T Laboratories Cambridge\n",
|
|
0, "", "tim@tjansen.de");
|
|
aboutData.addAuthor("Tim Jansen", "", "tim@tjansen.de");
|
|
aboutData.addAuthor("Ian Reinhart Geiser", "DCOP interface", "geiseri@kde.org");
|
|
aboutData.addCredit("Johannes E. Schindelin",
|
|
I18N_NOOP("libvncserver"));
|
|
aboutData.addCredit("Const Kaplinsky",
|
|
I18N_NOOP("TightVNC encoder"));
|
|
aboutData.addCredit("Tridia Corporation",
|
|
I18N_NOOP("ZLib encoder"));
|
|
aboutData.addCredit("AT&T Laboratories Cambridge",
|
|
I18N_NOOP("original VNC encoders and "
|
|
"protocol design"));
|
|
aboutData.addCredit("Jens Wagner (heXoNet Support GmbH)",
|
|
I18N_NOOP("X11 update scanner, "
|
|
"original code base"));
|
|
aboutData.addCredit("Jason Spisak",
|
|
I18N_NOOP("Connection side image"),
|
|
"kovalid@yahoo.com");
|
|
aboutData.addCredit("Karl Vogel",
|
|
I18N_NOOP("KDesktop background deactivation"));
|
|
TDECmdLineArgs::init(argc, argv, &aboutData);
|
|
TDECmdLineArgs::addCmdLineOptions(options);
|
|
|
|
TDEApplication app;
|
|
|
|
Configuration *config;
|
|
TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs();
|
|
TQString fdString;
|
|
if (!args->isSet(ARG_KINETD)) {
|
|
bool kinetdA, krfbA;
|
|
checkKInetd(kinetdA, krfbA);
|
|
if (!kinetdA) {
|
|
KMessageBox::error(0,
|
|
i18n("Cannot find KInetD. "
|
|
"The TDE daemon (kded) may have crashed or has not been started at all, or the installation failed."),
|
|
i18n("Desktop Sharing Error"));
|
|
return 1;
|
|
}
|
|
if (!krfbA) {
|
|
KMessageBox::error(0,
|
|
i18n("Cannot find KInetD service for Desktop Sharing (krfb). "
|
|
"The installation is incomplete or failed."),
|
|
i18n("Desktop Sharing Error"));
|
|
return 1;
|
|
}
|
|
|
|
config = new Configuration(KRFB_INVITATION_MODE);
|
|
config->showInvitationDialog();
|
|
return 0;
|
|
}
|
|
fdString = args->getOption(ARG_KINETD);
|
|
config = new Configuration(KRFB_KINETD_MODE);
|
|
args->clear();
|
|
|
|
if ((!config->allowUninvitedConnections()) && (config->invitations().size() == 0)) {
|
|
KNotifyClient::event("UnexpectedConnection");
|
|
return 1;
|
|
}
|
|
|
|
if (!RFBController::checkX11Capabilities())
|
|
return 1;
|
|
|
|
TrayIcon trayicon(new KAboutApplication(&aboutData),
|
|
config);
|
|
RFBController controller(config);
|
|
KRfbIfaceImpl dcopiface(&controller);
|
|
|
|
TQObject::connect(&app, TQT_SIGNAL(lastWindowClosed()), // dont show passivepopup
|
|
&trayicon, TQT_SLOT(prepareQuit()));
|
|
TQObject::connect(&app, TQT_SIGNAL(lastWindowClosed()),
|
|
&controller, TQT_SLOT(closeConnection()));
|
|
|
|
TQObject::connect(&trayicon, TQT_SIGNAL(showManageInvitations()),
|
|
config, TQT_SLOT(showManageInvitationsDialog()));
|
|
TQObject::connect(&trayicon, TQT_SIGNAL(enableDesktopControl(bool)),
|
|
&controller, TQT_SLOT(enableDesktopControl(bool)));
|
|
TQObject::connect(&trayicon, TQT_SIGNAL(diconnectedMessageDisplayed()),
|
|
&app, TQT_SLOT(quit()));
|
|
|
|
TQObject::connect(&dcopiface, TQT_SIGNAL(exitApp()),
|
|
&controller, TQT_SLOT(closeConnection()));
|
|
TQObject::connect(&dcopiface, TQT_SIGNAL(exitApp()),
|
|
&app, TQT_SLOT(quit()));
|
|
|
|
TQObject::connect(&controller, TQT_SIGNAL(sessionRefused()),
|
|
&app, TQT_SLOT(quit()));
|
|
TQObject::connect(&controller, TQT_SIGNAL(sessionEstablished(TQString)),
|
|
&trayicon, TQT_SLOT(showConnectedMessage(TQString)));
|
|
TQObject::connect(&controller, TQT_SIGNAL(sessionFinished()),
|
|
&trayicon, TQT_SLOT(showDisconnectedMessage()));
|
|
TQObject::connect(&controller, TQT_SIGNAL(desktopControlSettingChanged(bool)),
|
|
&trayicon, TQT_SLOT(setDesktopControlSetting(bool)));
|
|
TQObject::connect(&controller, TQT_SIGNAL(quitApp()),
|
|
&app, TQT_SLOT(quit()));
|
|
|
|
sigset_t sigs;
|
|
sigemptyset(&sigs);
|
|
sigaddset(&sigs, SIGPIPE);
|
|
sigprocmask(SIG_BLOCK, &sigs, 0);
|
|
|
|
bool ok;
|
|
int fdNum = fdString.toInt(&ok);
|
|
if (!ok) {
|
|
kdError() << "kinetd fd was not numeric." << endl;
|
|
return 2;
|
|
}
|
|
controller.startServer(fdNum);
|
|
|
|
return app.exec();
|
|
}
|
|
|