summaryrefslogtreecommitdiff
path: root/core/launcher
authoreilers <eilers>2003-11-03 16:52:18 (UTC)
committer eilers <eilers>2003-11-03 16:52:18 (UTC)
commitd34dc773591a2d467c68875a68a671d6a809f861 (patch) (side-by-side diff)
treeb57e5ae15c51e3d87ca95d57aedfd1ca3db57bfe /core/launcher
parentce84f2d8bdd65c438821f0457cdad6bbbfa73380 (diff)
downloadopie-d34dc773591a2d467c68875a68a671d6a809f861.zip
opie-d34dc773591a2d467c68875a68a671d6a809f861.tar.gz
opie-d34dc773591a2d467c68875a68a671d6a809f861.tar.bz2
Porting Opie to MacOS-X.
The base system and all platform independent applications and platforms should work. Please see $OPIEDIR/development/macosx for details
Diffstat (limited to 'core/launcher') (more/less context) (show whitespace changes)
-rw-r--r--core/launcher/applauncher.cpp4
-rw-r--r--core/launcher/inputmethods.cpp4
-rw-r--r--core/launcher/irserver.cpp4
-rw-r--r--core/launcher/main.cpp2
-rw-r--r--core/launcher/packageslave.cpp304
-rw-r--r--core/launcher/qprocess_unix.cpp3
-rw-r--r--core/launcher/server.pro5
-rw-r--r--core/launcher/startmenu.cpp4
-rw-r--r--core/launcher/systray.cpp5
-rw-r--r--core/launcher/transferserver.cpp3
10 files changed, 308 insertions, 30 deletions
diff --git a/core/launcher/applauncher.cpp b/core/launcher/applauncher.cpp
index d6f93da..0ac043b 100644
--- a/core/launcher/applauncher.cpp
+++ b/core/launcher/applauncher.cpp
@@ -453,193 +453,197 @@ bool AppLauncher::executeBuiltin(const QString &c, const QString &document)
if (builtin) {
for (int i = 0; builtin[i].file; i++) {
if ( builtin[i].file == c ) {
if ( running[i] ) {
if ( !document.isNull() && builtin[i].documentary )
Global::setDocument(running[i], document);
running[i]->raise();
running[i]->show();
running[i]->setActiveWindow();
} else {
running[i] = builtin[i].func( builtin[i].maximized );
}
#ifndef QT_NO_COP
QCopEnvelope e("QPE/System", "notBusy(QString)" );
e << c; // that was quick ;-)
#endif
return TRUE;
}
}
}
// Convert the command line in to a list of arguments
QStringList list = QStringList::split(QRegExp(" *"),c);
QString ap=list[0];
if ( ap == "suspend" ) { // No tr
QWSServer::processKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE );
return TRUE;
}
return FALSE;
}
bool AppLauncher::execute(const QString &c, const QString &docParam, bool noRaise)
{
qWarning("AppLauncher::execute");
// Convert the command line in to a list of arguments
QStringList list = QStringList::split(QRegExp(" *"),c);
if ( !docParam.isEmpty() )
list.append( docParam );
QString appName = list[0];
if ( isRunning(appName) ) {
QCString channel = "QPE/Application/";
channel += appName.latin1();
// Need to lock it to avoid race conditions with QPEApplication::processQCopFile
QFile f(Opie::Global::tempDir() + "qcop-msg-" + appName);
if ( !noRaise && f.open(IO_WriteOnly | IO_Append) ) {
#ifndef Q_OS_WIN32
flock(f.handle(), LOCK_EX);
#endif
QDataStream ds(&f);
QByteArray b;
QDataStream bstream(b, IO_WriteOnly);
if ( !f.size() ) {
ds << channel << QCString("raise()") << b;
if ( !waitingHeartbeat.contains( appName ) && appKillerName != appName ) {
int id = startTimer(RAISE_TIMEOUT_MS);
waitingHeartbeat.insert( appName, id );
}
}
if ( !docParam.isEmpty() ) {
bstream << docParam;
ds << channel << QCString("setDocument(QString)") << b;
}
f.flush();
#ifndef Q_OS_WIN32
flock(f.handle(), LOCK_UN);
#endif
f.close();
}
if ( QCopChannel::isRegistered(channel) ) // avoid unnecessary warnings
QCopChannel::send(channel,"QPEProcessQCop()");
return TRUE;
}
#ifdef QT_NO_QWS_MULTIPROCESS
QMessageBox::warning( 0, tr("Error"), tr("<qt>Could not find the application %1</qt>").arg(c),
tr("OK"), 0, 0, 0, 1 );
#else
QStrList slist;
unsigned j;
for ( j = 0; j < list.count(); j++ )
slist.append( list[j].utf8() );
const char **args = new const char *[slist.count() + 1];
for ( j = 0; j < slist.count(); j++ )
args[j] = slist.at(j);
args[j] = NULL;
#ifndef Q_OS_WIN32
+#ifdef Q_OS_MACX
+ if ( qlPid && qlReady && QFile::exists( QPEApplication::qpeDir()+"plugins/application/lib"+args[0] + ".dylib" ) ) {
+#else
if ( qlPid && qlReady && QFile::exists( QPEApplication::qpeDir()+"plugins/application/lib"+args[0] + ".so" ) ) {
+#endif /* Q_OS_MACX */
qDebug( "Quick launching: %s", args[0] );
if ( getuid() == 0 )
setpriority( PRIO_PROCESS, qlPid, 0 );
QCString qlch("QPE/QuickLauncher-");
qlch += QString::number(qlPid);
QCopEnvelope env( qlch, "execute(QStrList)" );
env << slist;
runningApps[qlPid] = QString(args[0]);
emit launched(qlPid, QString(args[0]));
QCopEnvelope e("QPE/System", "busy()");
qlPid = 0;
qlReady = FALSE;
QTimer::singleShot( getuid() == 0 ? 800 : 1500, this, SLOT(createQuickLauncher()) );
} else {
int pid = ::vfork();
if ( !pid ) {
for ( int fd = 3; fd < 100; fd++ )
::close( fd );
::setpgid( ::getpid(), ::getppid() );
// Try bindir first, so that foo/bar works too
::execv( QPEApplication::qpeDir()+"bin/"+args[0], (char * const *)args );
::execvp( args[0], (char * const *)args );
_exit( -1 );
}
runningApps[pid] = QString(args[0]);
emit launched(pid, QString(args[0]));
QCopEnvelope e("QPE/System", "busy()");
}
#else
QProcess *proc = new QProcess(this);
if (proc){
for (int i=0; i < slist.count(); i++)
proc->addArgument(args[i]);
connect(proc, SIGNAL(processExited()), this, SLOT(processExited()));
if (!proc->start()){
qDebug("Unable to start application %s", args[0]);
}else{
PROCESS_INFORMATION *procInfo = (PROCESS_INFORMATION *)proc->processIdentifier();
if (procInfo){
DWORD pid = procInfo->dwProcessId;
runningApps[pid] = QString(args[0]);
runningAppsProc.append(proc);
emit launched(pid, QString(args[0]));
QCopEnvelope e("QPE/System", "busy()");
}else{
qDebug("Unable to read process inforation #1 for %s", args[0]);
}
}
}else{
qDebug("Unable to create process for application %s", args[0]);
return FALSE;
}
#endif
#endif //QT_NO_QWS_MULTIPROCESS
delete [] args;
return TRUE;
}
void AppLauncher::kill( int pid )
{
#ifndef Q_OS_WIN32
::kill( pid, SIGTERM );
#else
for ( QProcess *proc = runningAppsProc.first(); proc; proc = runningAppsProc.next() ) {
if ( proc->processIdentifier() == pid ) {
proc->kill();
break;
}
}
#endif
}
int AppLauncher::pidForName( const QString &appName )
{
int pid = -1;
QMap<int, QString>::Iterator it;
for (it = runningApps.begin(); it!= runningApps.end(); ++it) {
if (*it == appName) {
pid = it.key();
break;
}
}
return pid;
}
void AppLauncher::createQuickLauncher()
{
static bool disabled = FALSE;
if (disabled)
return;
qlReady = FALSE;
diff --git a/core/launcher/inputmethods.cpp b/core/launcher/inputmethods.cpp
index 8f3e812..62e316c 100644
--- a/core/launcher/inputmethods.cpp
+++ b/core/launcher/inputmethods.cpp
@@ -134,193 +134,197 @@ InputMethods::InputMethods( QWidget *parent ) :
imButton = new QWidgetStack( this ); // later a widget stack
imButton->setFocusPolicy(NoFocus);
if (parent->sizeHint().height() > 0)
imButton->setFixedHeight( parent->sizeHint().height() );
hbox->addWidget(imButton);
imChoice = new QToolButton( this );
imChoice->setFocusPolicy(NoFocus);
imChoice->setPixmap( QPixmap( (const char **)tri_xpm ) );
if (parent->sizeHint().height() > 0)
imChoice->setFixedHeight( parent->sizeHint().height() );
imChoice->setFixedWidth( 13 );
imChoice->setAutoRaise( TRUE );
hbox->addWidget( imChoice );
connect( imChoice, SIGNAL(clicked()), this, SLOT(chooseIm()) );
loadInputMethods();
QCopChannel *channel = new QCopChannel( "QPE/IME", this );
connect( channel, SIGNAL(received(const QCString&, const QByteArray&)),
this, SLOT(qcopReceive(const QCString&, const QByteArray&)) );
}
InputMethods::~InputMethods()
{
Config cfg("qpe");
cfg.setGroup("InputMethod");
if (imethod)
cfg.writeEntry("im", imethod->name() );
if (mkeyboard)
cfg.writeEntry("current", mkeyboard->name() );
unloadInputMethods();
}
void InputMethods::hideInputMethod()
{
kbdButton->setOn( FALSE );
}
void InputMethods::showInputMethod()
{
kbdButton->setOn( TRUE );
}
void InputMethods::showInputMethod(const QString& name)
{
int i = 0;
QValueList<InputMethod>::Iterator it;
InputMethod *im = 0;
for ( it = inputMethodList.begin(); it != inputMethodList.end(); ++it, i++ ) {
QString lname = (*it).libName.mid((*it).libName.findRev('/') + 1);
if ( (*it).name() == name || lname == name ) {
im = &(*it);
break;
}
}
if ( im )
chooseKeyboard(im);
}
void InputMethods::resetStates()
{
if ( mkeyboard && !mkeyboard->newIM )
mkeyboard->interface->resetState();
}
QRect InputMethods::inputRect() const
{
if ( !mkeyboard || !mkeyboard->widget || !mkeyboard->widget->isVisible() )
return QRect();
else
return mkeyboard->widget->geometry();
}
void InputMethods::unloadInputMethods()
{
unloadMethod( inputMethodList );
unloadMethod( inputModifierList );
inputMethodList.clear();
inputModifierList.clear();
}
void InputMethods::unloadMethod( QValueList<InputMethod>& list ) {
QValueList<InputMethod>::Iterator it;
for (it = list.begin(); it != list.end(); ++it )
(*it).releaseInterface();
}
QStringList InputMethods::plugins()const {
QString path = QPEApplication::qpeDir() + "/plugins/inputmethods";
+#ifdef Q_OS_MACX
+ QDir dir( path, "lib*.dylib" );
+#else
QDir dir( path, "lib*.so" );
+#endif /* Q_OS_MACX */
return dir.entryList();
}
void InputMethods::installTranslator( const QString& type ) {
QStringList langs = Global::languageList();
QStringList::ConstIterator lit;
for ( lit= langs.begin(); lit!=langs.end(); ++lit) {
QString lang = *lit;
QTranslator * trans = new QTranslator(qApp);
QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
if ( trans->load( tfn ))
qApp->installTranslator( trans );
else
delete trans;
}
}
void InputMethods::setPreferedHandlers() {
Config cfg("qpe");
cfg.setGroup("InputMethod");
QString current = cfg.readEntry("current");
QString im = cfg.readEntry("im");
QValueList<InputMethod>::Iterator it;
if (!inputModifierList.isEmpty() && !im.isEmpty() ) {
for (it = inputModifierList.begin(); it != inputModifierList.end(); ++it )
if ( (*it).name() == im ) {
imethod = &(*it); break;
}
}
if (!inputMethodList.isEmpty() && !current.isEmpty() ) {
for (it = inputMethodList.begin(); it != inputMethodList.end(); ++it )
if ( (*it).name() == current ) {
qWarning("preferred keyboard is %s", current.latin1() );
mkeyboard = &(*it);
kbdButton->setPixmap( *mkeyboard->icon() );
break;
}
}
}
void InputMethods::loadInputMethods()
{
#ifndef QT_NO_COMPONENT
hideInputMethod();
mkeyboard = 0;
unloadInputMethods();
QString path = QPEApplication::qpeDir() + "/plugins/inputmethods";
QStringList list = plugins();
QStringList::Iterator it;
for ( it = list.begin(); it != list.end(); ++it ) {
InputMethodInterface *iface = 0;
ExtInputMethodInterface *eface = 0;
QLibrary *lib = new QLibrary( path + "/" + *it );
if ( lib->queryInterface( IID_InputMethod, (QUnknownInterface**)&iface ) == QS_OK ) {
InputMethod input;
input.newIM = FALSE;
input.library = lib;
input.libName = *it;
input.interface = iface;
input.widget = input.interface->inputMethod( 0, inputWidgetStyle );
input.interface->onKeyPress( this, SLOT(sendKey(ushort,ushort,ushort,bool,bool)) );
inputMethodList.append( input );
} else if ( lib->queryInterface( IID_ExtInputMethod, (QUnknownInterface**)&eface ) == QS_OK ) {
InputMethod input;
input.newIM = TRUE;
input.library = lib;
input.libName = *it;
input.extInterface = eface;
input.widget = input.extInterface->keyboardWidget( 0, inputWidgetStyle );
// may be either a simple, or advanced.
if (input.widget) {
//qDebug("its a keyboard");
inputMethodList.append( input );
} else {
//qDebug("its a real im");
input.widget = input.extInterface->statusWidget( 0, 0 );
if (input.widget) {
//qDebug("blah");
inputModifierList.append( input );
imButton->addWidget(input.widget, inputModifierList.count());
}
}
}else{
delete lib;
lib = 0l;
}
installTranslator( (*it).left( (*it).find(".") ) );
}
diff --git a/core/launcher/irserver.cpp b/core/launcher/irserver.cpp
index 579c78c..63f8d05 100644
--- a/core/launcher/irserver.cpp
+++ b/core/launcher/irserver.cpp
@@ -1,73 +1,77 @@
/**********************************************************************
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "irserver.h"
#include <qtopia/qlibrary.h>
#include <qtopia/qpeapplication.h>
#include <qtranslator.h>
#include "obexinterface.h"
#include <qdir.h>
IrServer::IrServer( QObject *parent, const char *name )
: QObject( parent, name ), obexIface(0)
{
lib = 0;
obexIface = 0;
QString path = QPEApplication::qpeDir() + "/plugins/obex/";
+#ifdef Q_OS_MACX
+ QDir dir( path, "lib*.dylib" );
+#else
QDir dir( path, "lib*.so" );
+#endif /* Q_OS_MACX */
QStringList list = dir.entryList();
QStringList::Iterator it;
for ( it = list.begin(); it != list.end(); ++it ) {
QLibrary *trylib = new QLibrary( path + *it );
//qDebug("trying lib %s", (path + (*it)).latin1() );
if ( trylib->queryInterface( IID_ObexInterface, (QUnknownInterface**)&obexIface ) == QS_OK ) {
lib = trylib;
//qDebug("found obex lib" );
QString lang = getenv( "LANG" );
QTranslator * trans = new QTranslator(qApp);
QString type = (*it).left( (*it).find(".") );
QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
//qDebug("tr fpr obex: %s", tfn.latin1() );
if ( trans->load( tfn ))
qApp->installTranslator( trans );
else
delete trans;
break;
} else {
delete lib;
}
}
if ( !lib )
qDebug("could not load IR plugin" );
}
IrServer::~IrServer()
{
if ( obexIface )
obexIface->release();
delete lib;
}
diff --git a/core/launcher/main.cpp b/core/launcher/main.cpp
index 74965df..5416d33 100644
--- a/core/launcher/main.cpp
+++ b/core/launcher/main.cpp
@@ -183,172 +183,174 @@ void initEnvironment()
static void initKeyboard()
{
Config config("qpe");
config.setGroup( "Keyboard" );
int ard = config.readNumEntry( "RepeatDelay" );
int arp = config.readNumEntry( "RepeatPeriod" );
if ( ard > 0 && arp > 0 )
qwsSetKeyboardAutoRepeat( ard, arp );
QString layout = config.readEntry( "Layout", "us101" );
Server::setKeyboardLayout( layout );
}
static bool firstUse()
{
bool needFirstUse = FALSE;
if ( QWSServer::mouseHandler() &&
QWSServer::mouseHandler() ->inherits("QCalibratedMouseHandler") ) {
if ( !QFile::exists( "/etc/pointercal" ) )
needFirstUse = TRUE;
}
{
Config config( "qpe" );
config.setGroup( "Startup" );
needFirstUse |= config.readBoolEntry( "FirstUse", TRUE );
}
if ( !needFirstUse )
return FALSE;
FirstUse *fu = new FirstUse();
fu->exec();
bool rs = fu->restartNeeded();
delete fu;
return rs;
}
int initApplication( int argc, char ** argv )
{
cleanup();
initEnvironment();
//Don't flicker at startup:
#ifdef QWS
QWSServer::setDesktopBackground( QImage() );
#endif
ServerApplication a( argc, argv, QApplication::GuiServer );
refreshTimeZoneConfig();
initKeyboard();
// Don't use first use under Windows
if ( firstUse() ) {
a.restart();
return 0;
}
ODevice::inst ( )-> setSoftSuspend ( true );
{
QCopEnvelope e("QPE/System", "setBacklight(int)" );
e << -3; // Forced on
}
AlarmServer::initialize();
Server *s = new Server();
(void)new SysFileMonitor(s);
#ifdef QWS
Network::createServer(s);
#endif
s->show();
/* THE ARM rtc has problem holdings the time on reset */
if ( QDate::currentDate ( ). year ( ) < 2000 ) {
if ( QMessageBox::information ( 0, ServerApplication::tr( "Information" ), ServerApplication::tr( "<p>The system date doesn't seem to be valid.\n(%1)</p><p>Do you want to correct the clock ?</p>" ). arg( TimeString::dateString ( QDate::currentDate ( ))), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) {
QCopEnvelope e ( "QPE/Application/systemtime", "setDocument(QString)" );
e << QString ( );
}
}
int rv = a.exec();
qDebug("exiting...");
delete s;
+#ifndef Q_OS_MACX
ODevice::inst()->setSoftSuspend( false );
+#endif
return rv;
}
static const char *pidfile_path = "/var/run/opie.pid";
void create_pidfile ( )
{
FILE *f;
if (( f = ::fopen ( pidfile_path, "w" ))) {
::fprintf ( f, "%d", getpid ( ));
::fclose ( f );
}
}
void remove_pidfile ( )
{
::unlink ( pidfile_path );
}
void handle_sigterm ( int /* sig */ )
{
if ( qApp )
qApp-> quit ( );
}
#ifndef Q_OS_WIN32
int main( int argc, char ** argv )
{
::signal ( SIGCHLD, SIG_IGN );
::signal ( SIGTERM, handle_sigterm );
::signal ( SIGINT, handle_sigterm );
::setsid ( );
::setpgid ( 0, 0 );
::atexit ( remove_pidfile );
create_pidfile ( );
int retVal = initApplication( argc, argv );
// Have we been asked to restart?
if ( ServerApplication::doRestart ) {
for ( int fd = 3; fd < 100; fd++ )
close( fd );
execl( (QPEApplication::qpeDir()+"bin/qpe").latin1(), "qpe", 0 );
}
// Kill them. Kill them all.
::kill ( 0, SIGTERM );
::sleep ( 1 );
::kill ( 0, SIGKILL );
return retVal;
}
#else
int main( int argc, char ** argv )
{
int retVal = initApplication( argc, argv );
if ( DesktopApplication::doRestart ) {
qDebug("Trying to restart");
execl( (QPEApplication::qpeDir()+"bin\\qpe").latin1(), "qpe", 0 );
}
return retVal;
}
#endif
diff --git a/core/launcher/packageslave.cpp b/core/launcher/packageslave.cpp
index 4f149a5..bf34368 100644
--- a/core/launcher/packageslave.cpp
+++ b/core/launcher/packageslave.cpp
@@ -1,97 +1,341 @@
/**********************************************************************
-** Copyright (C) 2000 Trolltech AS. All rights reserved.
+** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
-** This file is part of Qtopia Environment.
+** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "packageslave.h"
+#include <qtopia/qprocess.h>
-#include <qpe/process.h>
-#include <qpe/qcopenvelope_qws.h>
+#ifdef Q_WS_QWS
+#include <qtopia/qcopenvelope_qws.h>
+#endif
#include <qdatastream.h>
+#ifdef Q_WS_QWS
#include <qcopchannel_qws.h>
+#endif
+#include <qtextstream.h>
+#include <qdir.h>
+
+#include <stdlib.h>
+#include <sys/stat.h> // mkdir()
+
+#if defined(_OS_LINUX_) || defined(Q_OS_LINUX)
+#include <unistd.h>
+#include <sys/vfs.h>
+#include <mntent.h>
+#elif defined(Q_OS_WIN32)
+#include <windows.h>
+#include <winbase.h>
+#elif defined(Q_OS_MACX)
#include <unistd.h>
+#endif
-PackageSlave::PackageSlave( QObject *parent, char* name )
- : QObject( parent, name ), packageChannel( 0 )
+
+PackageHandler::PackageHandler( QObject *parent, char* name )
+ : QObject( parent, name ), packageChannel( 0 ), currentProcess( 0 ), mNoSpaceLeft( FALSE )
{
// setup qcop channel
+#ifndef QT_NO_COP
packageChannel = new QCopChannel( "QPE/Package", this );
connect( packageChannel, SIGNAL( received(const QCString &, const QByteArray &) ),
this, SLOT( qcopMessage( const QCString &, const QByteArray &) ) );
+#endif
}
-void PackageSlave::qcopMessage( const QCString &msg, const QByteArray &data )
+void PackageHandler::qcopMessage( const QCString &msg, const QByteArray &data )
{
QDataStream stream( data, IO_ReadOnly );
if ( msg == "installPackage(QString)" ) {
QString file;
stream >> file;
installPackage( file );
- }
- else if ( msg == "removePackage(QString)" ) {
+ } else if ( msg == "removePackage(QString)" ) {
QString file;
stream >> file;
removePackage( file );
+ } else if ( msg == "addPackageFiles(QString,QString)" ) {
+ QString location, listfile;
+ stream >> location >> listfile;
+ addPackageFiles( location, listfile);
+ } else if ( msg == "addPackages(QString)" ) {
+ QString location;
+ stream >> location;
+ addPackages( location );
+ } else if ( msg == "cleanupPackageFiles(QString)" ) {
+ QString listfile;
+ stream >> listfile;
+ cleanupPackageFiles( listfile );
+ } else if ( msg == "cleanupPackages(QString)" ) {
+ QString location;
+ stream >> location;
+ cleanupPackages( location );
+ } else if ( msg == "prepareInstall(QString,QString)" ) {
+ QString size, path;
+ stream >> size;
+ stream >> path;
+ prepareInstall( size, path );
}
}
-void PackageSlave::installPackage( const QString &package )
+void PackageHandler::installPackage( const QString &package )
{
- Process proc( QStringList() << "ipkg" << "install" << package );
+ if ( mNoSpaceLeft ) {
+ mNoSpaceLeft = FALSE;
+ // Don't emit that for now, I still couldn't test it (Wener)
+ //sendReply( "installFailed(QString)", package );
+ //return;
+ }
+
+ currentProcess = new QProcess( QStringList() << "ipkg" << "install" << package ); // No tr
+ connect( currentProcess, SIGNAL( processExited() ), SLOT( iProcessExited() ) );
+ connect( currentProcess, SIGNAL( readyReadStdout() ), SLOT( readyReadStdout() ) );
+ connect( currentProcess, SIGNAL( readyReadStderr() ), SLOT( readyReadStderr() ) );
+ currentPackage = package;
+ currentProcessError="";
sendReply( "installStarted(QString)", package );
+ currentProcess->start();
+}
+
+void PackageHandler::removePackage( const QString &package )
+{
+ currentProcess = new QProcess( QStringList() << "ipkg" << "remove" << package ); // No tr
+ connect( currentProcess, SIGNAL( processExited() ), SLOT( rmProcessExited() ) );
+ connect( currentProcess, SIGNAL( readyReadStdout() ), SLOT( readyReadStdout() ) );
+ connect( currentProcess, SIGNAL( readyReadStderr() ), SLOT( readyReadStderr() ) );
+ currentPackage = package;
- QString output;
- if ( proc.exec( "", output ) ) {
- sendReply( "installDone(QString)", package );
+ currentProcessError="";
+ sendReply( "removeStarted(QString)", package );
+ currentProcess->start();
}
- else {
- sendReply( "installFailed(QString)", package );
+
+void PackageHandler::sendReply( const QCString& msg, const QString& arg )
+{
+#ifndef QT_NO_COP
+ QCopEnvelope e( "QPE/Desktop", msg );
+ e << arg;
+#endif
+}
+
+void PackageHandler::addPackageFiles( const QString &location,
+ const QString &listfile )
+{
+ QFile f(listfile);
+#ifndef Q_OS_WIN32
+ //make a copy so we can remove the symlinks later
+ mkdir( ("/usr/lib/ipkg/info/"+location).ascii(), 0777 );
+ system(("cp " + f.name() + " /usr/lib/ipkg/info/"+location).ascii());
+#else
+ QDir d;
+ //#### revise
+ qDebug("Copy file at %s: %s", __FILE__, __LINE__ );
+ d.mkdir(("/usr/lib/ipkg/info/" + location).ascii());
+ system(("copy " + f.name() + " /usr/lib/ipkg/info/"+location).ascii());
+#endif
+
+
+ if ( f.open(IO_ReadOnly) ) {
+ QTextStream ts(&f);
+
+ QString s;
+ while ( !ts.eof() ) { // until end of file...
+ s = ts.readLine(); // line of text excluding '\n'
+ // for s, do link/mkdir.
+ if ( s.right(1) == "/" ) {
+ qDebug("do mkdir for %s", s.ascii());
+#ifndef Q_OS_WIN32
+ mkdir( s.ascii(), 0777 );
+ //possible optimization: symlink directories
+ //that don't exist already. -- Risky.
+#else
+ d.mkdir( s.ascii());
+#endif
+
+ } else {
+#ifndef Q_OS_WIN32
+ qDebug("do symlink for %s", s.ascii());
+ symlink( (location + s).ascii(), s.ascii() );
+#else
+ qDebug("Copy file instead of a symlink for WIN32");
+ if (!CopyFile((TCHAR*)qt_winTchar((location + s), TRUE), (TCHAR*)qt_winTchar(s, TRUE), FALSE))
+ qWarning("Unable to create symlinkfor %s",
+ (location + s).ascii());
+#endif
+ }
+ }
+ f.close();
}
- QCopEnvelope e("QPE/System", "linkChanged(QString)");
- QString lf = QString::null;
- e << lf;
- unlink( package );
}
-void PackageSlave::removePackage( const QString &package )
+void PackageHandler::addPackages( const QString &location )
{
- Process proc( QStringList() << "ipkg" << "remove" << package );
+ // get list of *.list in location/usr/lib/ipkg/info/*.list
+ QDir dir(location + "/usr/lib/ipkg/info", "*.list", // No tr
+ QDir::Name, QDir::Files);
+ if ( !dir.exists() )
+ return;
- sendReply( "removeStarted(QString)", package );
+ QStringList packages = dir.entryList();
+ for ( QStringList::Iterator it = packages.begin();
+ it != packages.end(); ++it ) {
+ addPackageFiles( location, *it );
+ }
+}
+
+
+void PackageHandler::cleanupPackageFiles( const QString &listfile )
+{
+ QFile f(listfile);
- QString output;
- if ( proc.exec( "", output ) ) {
- sendReply( "removeDone(QString)", package );
+ if ( f.open(IO_ReadOnly) ) {
+ QTextStream ts(&f);
+
+ QString s;
+ while ( !ts.eof() ) { // until end of file...
+ s = ts.readLine(); // line of text excluding '\n'
+ // for s, do link/mkdir.
+ if ( s.right(1) == "/" ) {
+ //should rmdir if empty, after all files have been removed
+ } else {
+#ifndef Q_OS_WIN32
+ qDebug("remove symlink for %s", s.ascii());
+ //check if it is a symlink first (don't remove /etc/passwd...)
+ char buf[10]; //we don't care about the contents
+ if ( ::readlink( s.ascii(),buf, 10 >= 0 ) )
+ ::unlink( s.ascii() );
+#else
+ // ### revise
+ qWarning("Unable to remove symlink %s:%s", __FILE__, __LINE__);
+#endif
+ }
}
+ f.close();
+
+ //remove the list file
+ ::unlink( listfile.ascii() );
+
+ }
+}
+
+void PackageHandler::cleanupPackages( const QString &location )
+{
+ // get list of *.list in location/usr/lib/ipkg/info/*.list
+ QDir dir( "/usr/lib/ipkg/info/"+location, "*.list", // No tr
+ QDir::Name, QDir::Files);
+ if ( !dir.exists() )
+ return;
+
+ QStringList packages = dir.entryList();
+ for ( QStringList::Iterator it = packages.begin();
+ it != packages.end(); ++it ) {
+ cleanupPackageFiles( *it );
+ }
+
+ //remove the backup directory
+ //###
+}
+
+void PackageHandler::prepareInstall( const QString& size, const QString& path )
+{
+ // Check whether there will be enough space to install the next package.
+ bool ok;
+ unsigned int s = size.toUInt( &ok );
+
+ if ( !ok )
+ return;
+
+ // Shamelessly stolen from the sysinfo application (Werner)
+#if defined(_OS_LINUX_) || defined(Q_OS_LINUX)
+ struct statfs fs;
+ if ( statfs( path.latin1(), &fs ) == 0 )
+ if ( s > fs.f_bsize * fs.f_bavail ) {
+ //qDebug("############### Not enough space left ###############");
+ mNoSpaceLeft = TRUE;
+ }
+#endif
+}
+
+void PackageHandler::iProcessExited()
+{
+ if ( currentProcess->normalExit() && currentProcess->exitStatus() == 0 )
+ sendReply( "installDone(QString)", currentPackage );
else {
- sendReply( "removeFailed(QString)", package );
+#ifndef QT_NO_COP
+ QCopEnvelope e( "QPE/Desktop", "installFailed(QString,int,QString)" );
+ e << currentPackage << currentProcess->exitStatus()
+ << currentProcessError;
+#endif
}
+
+ delete currentProcess;
+ currentProcess = 0;
+
+#ifndef QT_NO_COP
QCopEnvelope e("QPE/System", "linkChanged(QString)");
QString lf = QString::null;
e << lf;
+#endif
+ unlink( currentPackage );
}
-void PackageSlave::sendReply( const QCString& msg, const QString& arg )
+void PackageHandler::rmProcessExited()
{
- QCopEnvelope e( "QPE/Desktop", msg );
- e << arg;
+ if ( currentProcess->normalExit() && currentProcess->exitStatus() == 0 )
+ sendReply( "removeDone(QString)", currentPackage );
+ else
+ sendReply( "removeFailed(QString)", currentPackage );
+
+#ifndef QT_NO_COP
+ QCopEnvelope e("QPE/System", "linkChanged(QString)");
+ QString lf = QString::null;
+ e << lf;
+#endif
+}
+
+void PackageHandler::readyReadStdout()
+{
+ while ( currentProcess->canReadLineStdout() ) {
+ QString line = currentProcess->readLineStdout();
+ currentProcessError.append("OUT:"+line);
+ if ( line.contains( "Unpacking" ) ) // No tr
+ sendReply( "installStep(QString)", "one" ); // No tr
+ else if ( line.contains( "Configuring" ) ) // No tr
+ sendReply( "installStep(QString)", "two" ); // No tr
+ }
+}
+
+void PackageHandler::readyReadStderr()
+{
+ while ( currentProcess->canReadLineStderr() ) {
+ QString line = currentProcess->readLineStderr();
+ currentProcessError.append("ERR:"+line);
+ }
+}
+
+void PackageHandler::redoPackages()
+{
+ //get list of filesystems
+
+ //call cleanupPackages for the ones that have disappeared
+
+ //call addPackageFiles for the new ones
}
diff --git a/core/launcher/qprocess_unix.cpp b/core/launcher/qprocess_unix.cpp
index a07bf64..19a8c93 100644
--- a/core/launcher/qprocess_unix.cpp
+++ b/core/launcher/qprocess_unix.cpp
@@ -1,148 +1,151 @@
/**********************************************************************
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
//#include "qplatformdefs.h"
// Solaris redefines connect -> __xnet_connect with _XOPEN_SOURCE_EXTENDED.
#if defined(connect)
#undef connect
#endif
#include "qprocess.h"
#ifndef QT_NO_PROCESS
#include "qapplication.h"
#include "qqueue.h"
#include "qlist.h"
#include "qsocketnotifier.h"
#include "qtimer.h"
#include "qregexp.h"
#include "qcleanuphandler_p.h"
#include <stdlib.h>
// ### FOR Qt 2.3 compat
#include <unistd.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <sys/fcntl.h>
#include <errno.h>
+#ifdef Q_OS_MACX
+#include <sys/time.h>
+#endif
#include <sys/resource.h>
#ifdef __MIPSEL__
# ifndef SOCK_DGRAM
# define SOCK_DGRAM 1
# endif
# ifndef SOCK_STREAM
# define SOCK_STREAM 2
# endif
#endif
//#define QT_QPROCESS_DEBUG
#ifdef Q_C_CALLBACKS
extern "C" {
#endif // Q_C_CALLBACKS
#define QT_SIGNAL_RETTYPE void
#define QT_SIGNAL_ARGS int
#define QT_SIGNAL_IGNORE SIG_IGN
QT_SIGNAL_RETTYPE qt_C_sigchldHnd(QT_SIGNAL_ARGS);
QT_SIGNAL_RETTYPE qt_C_sigpipeHnd(QT_SIGNAL_ARGS);
#ifdef Q_C_CALLBACKS
}
#endif // Q_C_CALLBACKS
class QProc;
class QProcessManager;
class QProcessPrivate
{
public:
QProcessPrivate();
~QProcessPrivate();
void closeOpenSocketsForChild();
void newProc( pid_t pid, QProcess *process );
QByteArray bufStdout;
QByteArray bufStderr;
QQueue<QByteArray> stdinBuf;
QSocketNotifier *notifierStdin;
QSocketNotifier *notifierStdout;
QSocketNotifier *notifierStderr;
ssize_t stdinBufRead;
QProc *proc;
bool exitValuesCalculated;
bool socketReadCalled;
static QProcessManager *procManager;
};
/***********************************************************************
*
* QProc
*
**********************************************************************/
/*
The class QProcess does not necessarily map exactly to the running
child processes: if the process is finished, the QProcess class may still be
there; furthermore a user can use QProcess to start more than one process.
The helper-class QProc has the semantics that one instance of this class maps
directly to a running child process.
*/
class QProc
{
public:
QProc( pid_t p, QProcess *proc=0 ) : pid(p), process(proc)
{
#if defined(QT_QPROCESS_DEBUG)
qDebug( "QProc: Constructor for pid %d and QProcess %p", pid, process );
#endif
socketStdin = 0;
socketStdout = 0;
socketStderr = 0;
}
~QProc()
{
#if defined(QT_QPROCESS_DEBUG)
qDebug( "QProc: Destructor for pid %d and QProcess %p", pid, process );
#endif
if ( process != 0 ) {
if ( process->d->notifierStdin )
process->d->notifierStdin->setEnabled( FALSE );
if ( process->d->notifierStdout )
process->d->notifierStdout->setEnabled( FALSE );
if ( process->d->notifierStderr )
diff --git a/core/launcher/server.pro b/core/launcher/server.pro
index 93baeb4..0513536 100644
--- a/core/launcher/server.pro
+++ b/core/launcher/server.pro
@@ -22,99 +22,104 @@ HEADERS += server.h \
$$(OPIEDIR)/core/apps/calibrate/calibrate.h \
startmenu.h \
transferserver.h \
qcopbridge.h \
packageslave.h \
irserver.h \
firstuse.h \
$$(OPIEDIR)/rsync/buf.h \
$$(OPIEDIR)/rsync/checksum.h \
$$(OPIEDIR)/rsync/command.h \
$$(OPIEDIR)/rsync/emit.h \
$$(OPIEDIR)/rsync/job.h \
$$(OPIEDIR)/rsync/netint.h \
$$(OPIEDIR)/rsync/protocol.h \
$$(OPIEDIR)/rsync/prototab.h \
$$(OPIEDIR)/rsync/rsync.h \
$$(OPIEDIR)/rsync/search.h \
$$(OPIEDIR)/rsync/stream.h \
$$(OPIEDIR)/rsync/sumset.h \
$$(OPIEDIR)/rsync/trace.h \
$$(OPIEDIR)/rsync/types.h \
$$(OPIEDIR)/rsync/util.h \
$$(OPIEDIR)/rsync/whole.h \
$$(OPIEDIR)/rsync/config_rsync.h \
$$(OPIEDIR)/rsync/qrsync.h \
syncdialog.h \
serverapp.h \
launcherglobal.h \
qprocess.h \
screensaver.h
SOURCES += server.cpp \
serverinterface.cpp \
launchertab.cpp \
documentlist.cpp \
appicons.cpp \
taskbar.cpp \
runningappbar.cpp \
applauncher.cpp \
stabmon.cpp \
inputmethods.cpp \
systray.cpp \
wait.cpp \
shutdownimpl.cpp \
launcher.cpp \
launcherview.cpp \
$$(OPIEDIR)/core/apps/calibrate/calibrate.cpp \
transferserver.cpp \
packageslave.cpp \
irserver.cpp \
qcopbridge.cpp \
startmenu.cpp \
main.cpp \
firstuse.cpp \
$$(OPIEDIR)/rsync/base64.c \
$$(OPIEDIR)/rsync/buf.c \
$$(OPIEDIR)/rsync/checksum.c \
$$(OPIEDIR)/rsync/command.c \
$$(OPIEDIR)/rsync/delta.c \
$$(OPIEDIR)/rsync/emit.c \
$$(OPIEDIR)/rsync/hex.c \
$$(OPIEDIR)/rsync/job.c \
$$(OPIEDIR)/rsync/mdfour.c \
$$(OPIEDIR)/rsync/mksum.c \
$$(OPIEDIR)/rsync/msg.c \
$$(OPIEDIR)/rsync/netint.c \
$$(OPIEDIR)/rsync/patch.c \
$$(OPIEDIR)/rsync/prototab.c \
$$(OPIEDIR)/rsync/readsums.c \
$$(OPIEDIR)/rsync/scoop.c \
$$(OPIEDIR)/rsync/search.c \
$$(OPIEDIR)/rsync/stats.c \
$$(OPIEDIR)/rsync/stream.c \
$$(OPIEDIR)/rsync/sumset.c \
$$(OPIEDIR)/rsync/trace.c \
$$(OPIEDIR)/rsync/tube.c \
$$(OPIEDIR)/rsync/util.c \
$$(OPIEDIR)/rsync/version.c \
$$(OPIEDIR)/rsync/whole.c \
$$(OPIEDIR)/rsync/qrsync.cpp \
syncdialog.cpp \
serverapp.cpp \
launcherglobal.cpp \
qprocess.cpp \
qprocess_unix.cpp \
screensaver.cpp
INCLUDEPATH += $(OPIEDIR)/core/apps/calibrate
DEPENDPATH += $(OPIEDIR)/core/apps/calibrate
INCLUDEPATH += $(OPIEDIR)/include $(OPIEDIR)/rsync
DEPENDPATH += $(OPIEDIR)/rsync
TARGET = qpe
+CONFTEST = $$system( echo $CONFIG_TARGET_MACOSX )
+contains( CONFTEST, y ){
+ LIBS += -lqpe -lopie
+}else{
LIBS += -lcrypt -lqpe -lopie
+}
include ( $(OPIEDIR)/include.pro )
diff --git a/core/launcher/startmenu.cpp b/core/launcher/startmenu.cpp
index 014418d..08ae885 100644
--- a/core/launcher/startmenu.cpp
+++ b/core/launcher/startmenu.cpp
@@ -163,171 +163,175 @@ bool StartMenu::loadMenu( QPopupMenu *menu )
if ( cfg.isValid() ) {
QString nm = cfg.readEntry("Name");
QString ic = cfg.readEntry("Icon");
if ( !!nm && !!ic ) {
tabs.append(d);
menu->insertItem( Resource::loadIconSet(ic), nm, ntabs++ );
}
} else if ( lot && d.right(8)==".desktop") {
AppLnk* applnk = new AppLnk(dir.path()+"/"+d);
if ( applnk->isValid() ) {
if ( applnk->type() == "Separator" ) { // No tr
if ( lot ) {
menu->insertSeparator();
sepfirst = f && !ltabs;
}
delete applnk;
} else {
f = FALSE;
other.append(applnk);
menu->insertItem( Resource::loadIconSet(applnk->icon()),
applnk->name(), 20+nother++ );
}
} else {
delete applnk;
}
}
}
if ( !menu->count() )
sepfirst = TRUE;
}
launchMenu->setName(sepfirst ? "accessories" : "accessories_need_sep"); // No tr
return (nother || ntabs );
}
void StartMenu::launch()
{
int y = mapToGlobal( QPoint() ).y() - launchMenu->sizeHint().height();
if ( launchMenu->isVisible() )
launchMenu->hide();
else
launchMenu->popup( QPoint( 1, y ) );
}
static int compareAppletPositions(const void *a, const void *b)
{
const MenuApplet* aa = *(const MenuApplet**)a;
const MenuApplet* ab = *(const MenuApplet**)b;
int d = aa->iface->position() - ab->iface->position();
if ( d ) return d;
return QString::compare(aa->library->library(),ab->library->library());
}
void StartMenu::clearApplets()
{
if (launchMenu )
launchMenu-> hide();
for ( QIntDictIterator<MenuApplet> it ( m_applets ); it. current ( ); ++it ) {
MenuApplet *applet = it. current ( );
if ( launchMenu ) {
launchMenu-> removeItem ( applet-> id );
delete applet-> popup;
}
applet-> iface-> release();
applet-> library-> unload();
delete applet-> library;
}
m_applets.clear();
}
void StartMenu::loadApplets()
{
Config cfg( "StartMenu" );
cfg.setGroup( "Applets" );
// SafeMode causes too much problems, so we disable it for now --
// maybe we should reenable it for OPIE 1.0 - sandman 26.09.02
// removed in the remerge PluginManager could handle it
// we don't currently use it -zecke
QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' );
QString lang = getenv( "LANG" );
QString path = QPEApplication::qpeDir() + "/plugins/applets";
+#ifdef Q_OS_MACX
+ QDir dir( path, "lib*.dylib" );
+#else
QDir dir( path, "lib*.so" );
+#endif /* Q_OS_MACX */
QStringList list = dir.entryList();
QStringList::Iterator it;
int napplets=0;
MenuApplet* *xapplets = new MenuApplet*[list.count()];
for ( it = list.begin(); it != list.end(); ++it ) {
if ( exclude.find( *it ) != exclude.end() )
continue;
MenuAppletInterface *iface = 0;
QLibrary *lib = new QLibrary( path + "/" + *it );
if (( lib->queryInterface( IID_MenuApplet, (QUnknownInterface**)&iface ) == QS_OK ) && iface ) {
MenuApplet *applet = new MenuApplet;
xapplets[napplets++] = applet;
applet->library = lib;
applet->iface = iface;
QTranslator *trans = new QTranslator(qApp);
QString type = (*it).left( (*it).find(".") );
QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
if ( trans->load( tfn ))
qApp->installTranslator( trans );
else
delete trans;
} else {
exclude += *it;
delete lib;
}
}
cfg.writeEntry( "ExcludeApplets", exclude, ',' );
qsort(xapplets,napplets,sizeof(m_applets[0]),compareAppletPositions);
int foo = ( launchMenu-> count ( )) ? launchMenu-> insertSeparator ( ) : 0;
while (napplets--) {
MenuApplet *applet = xapplets[napplets];
applet-> popup = applet-> iface-> popup ( this );
if ( applet-> popup )
applet-> id = launchMenu-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ), applet-> popup );
else
applet-> id = launchMenu-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ) );
m_applets.insert ( applet-> id, new MenuApplet(*applet));
}
delete [] xapplets;
}
/*
* Launcher calls loadMenu too often fix that
*/
void StartMenu::addApplets(QPopupMenu* pop) {
QIntDict<MenuApplet> dict;
if( pop-> count ( ))
pop-> insertSeparator ( );
for ( QIntDictIterator<MenuApplet> it ( m_applets ); it. current ( ); ++it ) {
MenuApplet *applet = it. current ( );
if ( applet-> popup )
applet-> id = pop-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ), applet-> popup );
else
applet-> id = pop-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ) );
dict.insert( applet->id, new MenuApplet(*applet) );
}
/* need to update the key */
m_applets.setAutoDelete( true );
m_applets.clear();
m_applets.setAutoDelete( false );
m_applets = dict;
}
diff --git a/core/launcher/systray.cpp b/core/launcher/systray.cpp
index 6122770..691f6b8 100644
--- a/core/launcher/systray.cpp
+++ b/core/launcher/systray.cpp
@@ -9,141 +9,146 @@
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include <qtopia/qpeapplication.h>
#include <qtopia/qlibrary.h>
#include <qtopia/config.h>
#include <qlayout.h>
#include <qdir.h>
#include <qmessagebox.h>
#include <qtranslator.h>
#include "systray.h"
#include <stdlib.h>
/* ### Single build floppies ### */
#if 0
#ifdef QT_NO_COMPONENTS
#include "../plugins/applets/clockapplet/clockappletimpl.h"
#endif
#endif
SysTray::SysTray( QWidget *parent ) : QFrame( parent ), layout(0)
{
//setFrameStyle( QFrame::Panel | QFrame::Sunken );
loadApplets();
}
SysTray::~SysTray()
{
clearApplets();
}
static int compareAppletPositions(const void *a, const void *b)
{
const TaskbarApplet* aa = *(const TaskbarApplet**)a;
const TaskbarApplet* ab = *(const TaskbarApplet**)b;
int d = ab->iface->position() - aa->iface->position();
if ( d ) return d;
return QString::compare(ab->name,aa->name);
}
void SysTray::loadApplets()
{
hide();
clearApplets();
addApplets();
}
void SysTray::clearApplets()
{
#ifndef QT_NO_COMPONENTS
/*
* Note on clearing. SOme applets delete their
* applets themselves some don't do it
* and on restart this can crash. If we delete it
* here we might end up in a double deletion. We could
* use QGuardedPtr but that would be one QOBject
* for every applet more but only useful for restart
*/
QValueList<TaskbarApplet>::Iterator mit;
for ( mit = appletList.begin(); mit != appletList.end(); ++mit ) {
(*mit).iface->release();
(*mit).library->unload();
delete (*mit).library;
}
#endif
appletList.clear();
if ( layout )
delete layout;
layout = new QHBoxLayout( this, 0, 1 );
layout->setAutoAdd(TRUE);
}
void SysTray::addApplets()
{
hide();
#ifndef QT_NO_COMPONENTS
Config cfg( "Taskbar" );
cfg.setGroup( "Applets" );
QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' );
QString lang = getenv( "LANG" );
QString path = QPEApplication::qpeDir() + "/plugins/applets";
+#ifdef Q_OS_MACX
+ QDir dir( path, "lib*.dylib" );
+#else
QDir dir( path, "lib*.so" );
+#endif /* Q_OS_MACX */
QStringList list = dir.entryList();
QStringList::Iterator it;
int napplets=0;
TaskbarApplet* *applets = new TaskbarApplet*[list.count()];
for ( it = list.begin(); it != list.end(); ++it ) {
if ( exclude.find( *it ) != exclude.end() )
continue;
+ qWarning( "Found Applet: %s", (*it).latin1() );
TaskbarAppletInterface *iface = 0;
QLibrary *lib = new QLibrary( path + "/" + *it );
if (( lib->queryInterface( IID_TaskbarApplet, (QUnknownInterface**)&iface ) == QS_OK ) && iface ) {
TaskbarApplet *applet = new TaskbarApplet;
applets[napplets++] = applet;
applet->library = lib;
applet->iface = iface;
QTranslator *trans = new QTranslator(qApp);
QString type = (*it).left( (*it).find(".") );
QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
if ( trans->load( tfn ))
qApp->installTranslator( trans );
else
delete trans;
} else {
exclude += *it;
delete lib;
}
}
cfg.writeEntry( "ExcludeApplets", exclude, ',' );
qsort(applets,napplets,sizeof(applets[0]),compareAppletPositions);
while (napplets--) {
TaskbarApplet *applet = applets[napplets];
applet->applet = applet->iface->applet( this );
appletList.append(*applet);
}
delete [] applets;
#else /* ## FIXME single app */
TaskbarApplet * const applet = new TaskbarApplet();
applet->iface = new ClockAppletImpl();
applet->applet = applet->iface->applet( this );
appletList.append( applet );
#endif
show();
}
diff --git a/core/launcher/transferserver.cpp b/core/launcher/transferserver.cpp
index c69df2d..439e110 100644
--- a/core/launcher/transferserver.cpp
+++ b/core/launcher/transferserver.cpp
@@ -1,128 +1,131 @@
/**********************************************************************
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
//#define _XOPEN_SOURCE
#include <qtopia/global.h>
#include <qtopia/qpeapplication.h>
#ifndef Q_OS_WIN32
#include <pwd.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
+
+#ifndef Q_OS_MACX
#include <shadow.h>
#include <crypt.h>
+#endif /* Q_OS_MACX */
#else
#include <stdlib.h>
#include <time.h>
#endif
#if defined(_OS_LINUX_)
#include <shadow.h>
#endif
#include <qdir.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qdatastream.h>
#include <qmessagebox.h>
#include <qstringlist.h>
#include <qfileinfo.h>
#include <qregexp.h>
//#include <qtopia/qcopchannel_qws.h>
#include <qtopia/process.h>
#include <qtopia/global.h>
#include <qtopia/config.h>
#include <qtopia/private/contact.h>
#include <qtopia/quuid.h>
#include <qtopia/version.h>
#ifdef Q_WS_QWS
#include <qtopia/qcopenvelope_qws.h>
#endif
#include "launcherglobal.h"
#include "transferserver.h"
#include <qtopia/qprocess.h>
const int block_size = 51200;
TransferServer::TransferServer( Q_UINT16 port, QObject *parent,
const char* name)
: QServerSocket( port, 1, parent, name )
{
connections.setAutoDelete( TRUE );
if ( !ok() )
qWarning( "Failed to bind to port %d", port );
}
void TransferServer::authorizeConnections()
{
QListIterator<ServerPI> it(connections);
while ( it.current() ) {
if ( !it.current()->verifyAuthorised() ) {
disconnect( it.current(), SIGNAL(connectionClosed(ServerPI *)), this, SLOT( closed(ServerPI *)) );
connections.removeRef( it.current() );
} else
++it;
}
}
void TransferServer::closed(ServerPI *item)
{
connections.removeRef(item);
}
TransferServer::~TransferServer()
{
}
void TransferServer::newConnection( int socket )
{
ServerPI *ptr = new ServerPI( socket, this );
connect( ptr, SIGNAL(connectionClosed(ServerPI *)), this, SLOT( closed(ServerPI *)) );
connections.append( ptr );
}
QString SyncAuthentication::serverId()
{
Config cfg("Security");
cfg.setGroup("Sync");
QString r = cfg.readEntry("serverid");
if ( r.isEmpty() ) {
r = Opie::Global::uuid();
cfg.writeEntry("serverid", r );
}
return r;
}
QString SyncAuthentication::ownerName()
{
QString vfilename = Global::applicationFileName("addressbook",
"businesscard.vcf");
if (QFile::exists(vfilename)) {
Contact c;
c = Contact::readVCard( vfilename )[0];
return c.fullName();
}