summaryrefslogtreecommitdiff
path: root/core/launcher
Unidiff
Diffstat (limited to 'core/launcher') (more/less context) (ignore 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.pro7
-rw-r--r--core/launcher/startmenu.cpp4
-rw-r--r--core/launcher/systray.cpp5
-rw-r--r--core/launcher/transferserver.cpp3
10 files changed, 309 insertions, 31 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
@@ -501,97 +501,101 @@ bool AppLauncher::execute(const QString &c, const QString &docParam, bool noRais
501 if ( !noRaise && f.open(IO_WriteOnly | IO_Append) ) { 501 if ( !noRaise && f.open(IO_WriteOnly | IO_Append) ) {
502#ifndef Q_OS_WIN32 502#ifndef Q_OS_WIN32
503 flock(f.handle(), LOCK_EX); 503 flock(f.handle(), LOCK_EX);
504#endif 504#endif
505 505
506 QDataStream ds(&f); 506 QDataStream ds(&f);
507 QByteArray b; 507 QByteArray b;
508 QDataStream bstream(b, IO_WriteOnly); 508 QDataStream bstream(b, IO_WriteOnly);
509 if ( !f.size() ) { 509 if ( !f.size() ) {
510 ds << channel << QCString("raise()") << b; 510 ds << channel << QCString("raise()") << b;
511 if ( !waitingHeartbeat.contains( appName ) && appKillerName != appName ) { 511 if ( !waitingHeartbeat.contains( appName ) && appKillerName != appName ) {
512 int id = startTimer(RAISE_TIMEOUT_MS); 512 int id = startTimer(RAISE_TIMEOUT_MS);
513 waitingHeartbeat.insert( appName, id ); 513 waitingHeartbeat.insert( appName, id );
514 } 514 }
515 } 515 }
516 if ( !docParam.isEmpty() ) { 516 if ( !docParam.isEmpty() ) {
517 bstream << docParam; 517 bstream << docParam;
518 ds << channel << QCString("setDocument(QString)") << b; 518 ds << channel << QCString("setDocument(QString)") << b;
519 } 519 }
520 520
521 f.flush(); 521 f.flush();
522#ifndef Q_OS_WIN32 522#ifndef Q_OS_WIN32
523 flock(f.handle(), LOCK_UN); 523 flock(f.handle(), LOCK_UN);
524#endif 524#endif
525 f.close(); 525 f.close();
526 } 526 }
527 if ( QCopChannel::isRegistered(channel) ) // avoid unnecessary warnings 527 if ( QCopChannel::isRegistered(channel) ) // avoid unnecessary warnings
528 QCopChannel::send(channel,"QPEProcessQCop()"); 528 QCopChannel::send(channel,"QPEProcessQCop()");
529 529
530 return TRUE; 530 return TRUE;
531 } 531 }
532 532
533#ifdef QT_NO_QWS_MULTIPROCESS 533#ifdef QT_NO_QWS_MULTIPROCESS
534 QMessageBox::warning( 0, tr("Error"), tr("<qt>Could not find the application %1</qt>").arg(c), 534 QMessageBox::warning( 0, tr("Error"), tr("<qt>Could not find the application %1</qt>").arg(c),
535 tr("OK"), 0, 0, 0, 1 ); 535 tr("OK"), 0, 0, 0, 1 );
536#else 536#else
537 537
538 QStrList slist; 538 QStrList slist;
539 unsigned j; 539 unsigned j;
540 for ( j = 0; j < list.count(); j++ ) 540 for ( j = 0; j < list.count(); j++ )
541 slist.append( list[j].utf8() ); 541 slist.append( list[j].utf8() );
542 542
543 const char **args = new const char *[slist.count() + 1]; 543 const char **args = new const char *[slist.count() + 1];
544 for ( j = 0; j < slist.count(); j++ ) 544 for ( j = 0; j < slist.count(); j++ )
545 args[j] = slist.at(j); 545 args[j] = slist.at(j);
546 args[j] = NULL; 546 args[j] = NULL;
547 547
548#ifndef Q_OS_WIN32 548#ifndef Q_OS_WIN32
549#ifdef Q_OS_MACX
550 if ( qlPid && qlReady && QFile::exists( QPEApplication::qpeDir()+"plugins/application/lib"+args[0] + ".dylib" ) ) {
551#else
549 if ( qlPid && qlReady && QFile::exists( QPEApplication::qpeDir()+"plugins/application/lib"+args[0] + ".so" ) ) { 552 if ( qlPid && qlReady && QFile::exists( QPEApplication::qpeDir()+"plugins/application/lib"+args[0] + ".so" ) ) {
553#endif /* Q_OS_MACX */
550 qDebug( "Quick launching: %s", args[0] ); 554 qDebug( "Quick launching: %s", args[0] );
551 if ( getuid() == 0 ) 555 if ( getuid() == 0 )
552 setpriority( PRIO_PROCESS, qlPid, 0 ); 556 setpriority( PRIO_PROCESS, qlPid, 0 );
553 QCString qlch("QPE/QuickLauncher-"); 557 QCString qlch("QPE/QuickLauncher-");
554 qlch += QString::number(qlPid); 558 qlch += QString::number(qlPid);
555 QCopEnvelope env( qlch, "execute(QStrList)" ); 559 QCopEnvelope env( qlch, "execute(QStrList)" );
556 env << slist; 560 env << slist;
557 runningApps[qlPid] = QString(args[0]); 561 runningApps[qlPid] = QString(args[0]);
558 emit launched(qlPid, QString(args[0])); 562 emit launched(qlPid, QString(args[0]));
559 QCopEnvelope e("QPE/System", "busy()"); 563 QCopEnvelope e("QPE/System", "busy()");
560 qlPid = 0; 564 qlPid = 0;
561 qlReady = FALSE; 565 qlReady = FALSE;
562 QTimer::singleShot( getuid() == 0 ? 800 : 1500, this, SLOT(createQuickLauncher()) ); 566 QTimer::singleShot( getuid() == 0 ? 800 : 1500, this, SLOT(createQuickLauncher()) );
563 } else { 567 } else {
564 int pid = ::vfork(); 568 int pid = ::vfork();
565 if ( !pid ) { 569 if ( !pid ) {
566 for ( int fd = 3; fd < 100; fd++ ) 570 for ( int fd = 3; fd < 100; fd++ )
567 ::close( fd ); 571 ::close( fd );
568 ::setpgid( ::getpid(), ::getppid() ); 572 ::setpgid( ::getpid(), ::getppid() );
569 // Try bindir first, so that foo/bar works too 573 // Try bindir first, so that foo/bar works too
570 ::execv( QPEApplication::qpeDir()+"bin/"+args[0], (char * const *)args ); 574 ::execv( QPEApplication::qpeDir()+"bin/"+args[0], (char * const *)args );
571 ::execvp( args[0], (char * const *)args ); 575 ::execvp( args[0], (char * const *)args );
572 _exit( -1 ); 576 _exit( -1 );
573 } 577 }
574 578
575 runningApps[pid] = QString(args[0]); 579 runningApps[pid] = QString(args[0]);
576 emit launched(pid, QString(args[0])); 580 emit launched(pid, QString(args[0]));
577 QCopEnvelope e("QPE/System", "busy()"); 581 QCopEnvelope e("QPE/System", "busy()");
578 } 582 }
579#else 583#else
580 QProcess *proc = new QProcess(this); 584 QProcess *proc = new QProcess(this);
581 if (proc){ 585 if (proc){
582 for (int i=0; i < slist.count(); i++) 586 for (int i=0; i < slist.count(); i++)
583 proc->addArgument(args[i]); 587 proc->addArgument(args[i]);
584 connect(proc, SIGNAL(processExited()), this, SLOT(processExited())); 588 connect(proc, SIGNAL(processExited()), this, SLOT(processExited()));
585 if (!proc->start()){ 589 if (!proc->start()){
586 qDebug("Unable to start application %s", args[0]); 590 qDebug("Unable to start application %s", args[0]);
587 }else{ 591 }else{
588 PROCESS_INFORMATION *procInfo = (PROCESS_INFORMATION *)proc->processIdentifier(); 592 PROCESS_INFORMATION *procInfo = (PROCESS_INFORMATION *)proc->processIdentifier();
589 if (procInfo){ 593 if (procInfo){
590 DWORD pid = procInfo->dwProcessId; 594 DWORD pid = procInfo->dwProcessId;
591 runningApps[pid] = QString(args[0]); 595 runningApps[pid] = QString(args[0]);
592 runningAppsProc.append(proc); 596 runningAppsProc.append(proc);
593 emit launched(pid, QString(args[0])); 597 emit launched(pid, QString(args[0]));
594 QCopEnvelope e("QPE/System", "busy()"); 598 QCopEnvelope e("QPE/System", "busy()");
595 }else{ 599 }else{
596 qDebug("Unable to read process inforation #1 for %s", args[0]); 600 qDebug("Unable to read process inforation #1 for %s", args[0]);
597 } 601 }
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
@@ -182,97 +182,101 @@ void InputMethods::showInputMethod(const QString& name)
182 int i = 0; 182 int i = 0;
183 QValueList<InputMethod>::Iterator it; 183 QValueList<InputMethod>::Iterator it;
184 InputMethod *im = 0; 184 InputMethod *im = 0;
185 for ( it = inputMethodList.begin(); it != inputMethodList.end(); ++it, i++ ) { 185 for ( it = inputMethodList.begin(); it != inputMethodList.end(); ++it, i++ ) {
186 QString lname = (*it).libName.mid((*it).libName.findRev('/') + 1); 186 QString lname = (*it).libName.mid((*it).libName.findRev('/') + 1);
187 if ( (*it).name() == name || lname == name ) { 187 if ( (*it).name() == name || lname == name ) {
188 im = &(*it); 188 im = &(*it);
189 break; 189 break;
190 } 190 }
191 } 191 }
192 if ( im ) 192 if ( im )
193 chooseKeyboard(im); 193 chooseKeyboard(im);
194} 194}
195 195
196void InputMethods::resetStates() 196void InputMethods::resetStates()
197{ 197{
198 if ( mkeyboard && !mkeyboard->newIM ) 198 if ( mkeyboard && !mkeyboard->newIM )
199 mkeyboard->interface->resetState(); 199 mkeyboard->interface->resetState();
200} 200}
201 201
202QRect InputMethods::inputRect() const 202QRect InputMethods::inputRect() const
203{ 203{
204 if ( !mkeyboard || !mkeyboard->widget || !mkeyboard->widget->isVisible() ) 204 if ( !mkeyboard || !mkeyboard->widget || !mkeyboard->widget->isVisible() )
205 return QRect(); 205 return QRect();
206 else 206 else
207 return mkeyboard->widget->geometry(); 207 return mkeyboard->widget->geometry();
208} 208}
209 209
210void InputMethods::unloadInputMethods() 210void InputMethods::unloadInputMethods()
211{ 211{
212 unloadMethod( inputMethodList ); 212 unloadMethod( inputMethodList );
213 unloadMethod( inputModifierList ); 213 unloadMethod( inputModifierList );
214 inputMethodList.clear(); 214 inputMethodList.clear();
215 inputModifierList.clear(); 215 inputModifierList.clear();
216 216
217} 217}
218 218
219void InputMethods::unloadMethod( QValueList<InputMethod>& list ) { 219void InputMethods::unloadMethod( QValueList<InputMethod>& list ) {
220 QValueList<InputMethod>::Iterator it; 220 QValueList<InputMethod>::Iterator it;
221 221
222 for (it = list.begin(); it != list.end(); ++it ) 222 for (it = list.begin(); it != list.end(); ++it )
223 (*it).releaseInterface(); 223 (*it).releaseInterface();
224 224
225} 225}
226 226
227 227
228QStringList InputMethods::plugins()const { 228QStringList InputMethods::plugins()const {
229 QString path = QPEApplication::qpeDir() + "/plugins/inputmethods"; 229 QString path = QPEApplication::qpeDir() + "/plugins/inputmethods";
230#ifdef Q_OS_MACX
231 QDir dir( path, "lib*.dylib" );
232#else
230 QDir dir( path, "lib*.so" ); 233 QDir dir( path, "lib*.so" );
234#endif /* Q_OS_MACX */
231 return dir.entryList(); 235 return dir.entryList();
232} 236}
233 237
234void InputMethods::installTranslator( const QString& type ) { 238void InputMethods::installTranslator( const QString& type ) {
235 QStringList langs = Global::languageList(); 239 QStringList langs = Global::languageList();
236 QStringList::ConstIterator lit; 240 QStringList::ConstIterator lit;
237 for ( lit= langs.begin(); lit!=langs.end(); ++lit) { 241 for ( lit= langs.begin(); lit!=langs.end(); ++lit) {
238 QString lang = *lit; 242 QString lang = *lit;
239 QTranslator * trans = new QTranslator(qApp); 243 QTranslator * trans = new QTranslator(qApp);
240 244
241 QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm"; 245 QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
242 246
243 if ( trans->load( tfn )) 247 if ( trans->load( tfn ))
244 qApp->installTranslator( trans ); 248 qApp->installTranslator( trans );
245 else 249 else
246 delete trans; 250 delete trans;
247 } 251 }
248} 252}
249 253
250void InputMethods::setPreferedHandlers() { 254void InputMethods::setPreferedHandlers() {
251 Config cfg("qpe"); 255 Config cfg("qpe");
252 cfg.setGroup("InputMethod"); 256 cfg.setGroup("InputMethod");
253 QString current = cfg.readEntry("current"); 257 QString current = cfg.readEntry("current");
254 QString im = cfg.readEntry("im"); 258 QString im = cfg.readEntry("im");
255 259
256 QValueList<InputMethod>::Iterator it; 260 QValueList<InputMethod>::Iterator it;
257 if (!inputModifierList.isEmpty() && !im.isEmpty() ) { 261 if (!inputModifierList.isEmpty() && !im.isEmpty() ) {
258 for (it = inputModifierList.begin(); it != inputModifierList.end(); ++it ) 262 for (it = inputModifierList.begin(); it != inputModifierList.end(); ++it )
259 if ( (*it).name() == im ) { 263 if ( (*it).name() == im ) {
260 imethod = &(*it); break; 264 imethod = &(*it); break;
261 } 265 }
262 266
263 } 267 }
264 if (!inputMethodList.isEmpty() && !current.isEmpty() ) { 268 if (!inputMethodList.isEmpty() && !current.isEmpty() ) {
265 for (it = inputMethodList.begin(); it != inputMethodList.end(); ++it ) 269 for (it = inputMethodList.begin(); it != inputMethodList.end(); ++it )
266 if ( (*it).name() == current ) { 270 if ( (*it).name() == current ) {
267 qWarning("preferred keyboard is %s", current.latin1() ); 271 qWarning("preferred keyboard is %s", current.latin1() );
268 mkeyboard = &(*it); 272 mkeyboard = &(*it);
269 kbdButton->setPixmap( *mkeyboard->icon() ); 273 kbdButton->setPixmap( *mkeyboard->icon() );
270 break; 274 break;
271 } 275 }
272 } 276 }
273 277
274} 278}
275 279
276void InputMethods::loadInputMethods() 280void InputMethods::loadInputMethods()
277{ 281{
278#ifndef QT_NO_COMPONENT 282#ifndef QT_NO_COMPONENT
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 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21 21
22#include "irserver.h" 22#include "irserver.h"
23 23
24#include <qtopia/qlibrary.h> 24#include <qtopia/qlibrary.h>
25#include <qtopia/qpeapplication.h> 25#include <qtopia/qpeapplication.h>
26 26
27#include <qtranslator.h> 27#include <qtranslator.h>
28 28
29#include "obexinterface.h" 29#include "obexinterface.h"
30 30
31#include <qdir.h> 31#include <qdir.h>
32 32
33IrServer::IrServer( QObject *parent, const char *name ) 33IrServer::IrServer( QObject *parent, const char *name )
34 : QObject( parent, name ), obexIface(0) 34 : QObject( parent, name ), obexIface(0)
35{ 35{
36 lib = 0; 36 lib = 0;
37 obexIface = 0; 37 obexIface = 0;
38 QString path = QPEApplication::qpeDir() + "/plugins/obex/"; 38 QString path = QPEApplication::qpeDir() + "/plugins/obex/";
39#ifdef Q_OS_MACX
40 QDir dir( path, "lib*.dylib" );
41#else
39 QDir dir( path, "lib*.so" ); 42 QDir dir( path, "lib*.so" );
43#endif /* Q_OS_MACX */
40 QStringList list = dir.entryList(); 44 QStringList list = dir.entryList();
41 QStringList::Iterator it; 45 QStringList::Iterator it;
42 for ( it = list.begin(); it != list.end(); ++it ) { 46 for ( it = list.begin(); it != list.end(); ++it ) {
43 QLibrary *trylib = new QLibrary( path + *it ); 47 QLibrary *trylib = new QLibrary( path + *it );
44 //qDebug("trying lib %s", (path + (*it)).latin1() ); 48 //qDebug("trying lib %s", (path + (*it)).latin1() );
45 if ( trylib->queryInterface( IID_ObexInterface, (QUnknownInterface**)&obexIface ) == QS_OK ) { 49 if ( trylib->queryInterface( IID_ObexInterface, (QUnknownInterface**)&obexIface ) == QS_OK ) {
46 lib = trylib; 50 lib = trylib;
47 //qDebug("found obex lib" ); 51 //qDebug("found obex lib" );
48 QString lang = getenv( "LANG" ); 52 QString lang = getenv( "LANG" );
49 QTranslator * trans = new QTranslator(qApp); 53 QTranslator * trans = new QTranslator(qApp);
50 QString type = (*it).left( (*it).find(".") ); 54 QString type = (*it).left( (*it).find(".") );
51 QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm"; 55 QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
52 //qDebug("tr fpr obex: %s", tfn.latin1() ); 56 //qDebug("tr fpr obex: %s", tfn.latin1() );
53 if ( trans->load( tfn )) 57 if ( trans->load( tfn ))
54 qApp->installTranslator( trans ); 58 qApp->installTranslator( trans );
55 else 59 else
56 delete trans; 60 delete trans;
57 61
58 break; 62 break;
59 } else { 63 } else {
60 delete lib; 64 delete lib;
61 } 65 }
62 } 66 }
63 if ( !lib ) 67 if ( !lib )
64 qDebug("could not load IR plugin" ); 68 qDebug("could not load IR plugin" );
65} 69}
66 70
67IrServer::~IrServer() 71IrServer::~IrServer()
68{ 72{
69 if ( obexIface ) 73 if ( obexIface )
70 obexIface->release(); 74 obexIface->release();
71 delete lib; 75 delete lib;
72} 76}
73 77
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
@@ -231,97 +231,99 @@ int initApplication( int argc, char ** argv )
231#ifdef QWS 231#ifdef QWS
232 QWSServer::setDesktopBackground( QImage() ); 232 QWSServer::setDesktopBackground( QImage() );
233#endif 233#endif
234 ServerApplication a( argc, argv, QApplication::GuiServer ); 234 ServerApplication a( argc, argv, QApplication::GuiServer );
235 235
236 refreshTimeZoneConfig(); 236 refreshTimeZoneConfig();
237 237
238 initKeyboard(); 238 initKeyboard();
239 239
240 // Don't use first use under Windows 240 // Don't use first use under Windows
241 if ( firstUse() ) { 241 if ( firstUse() ) {
242 a.restart(); 242 a.restart();
243 return 0; 243 return 0;
244 } 244 }
245 245
246 ODevice::inst ( )-> setSoftSuspend ( true ); 246 ODevice::inst ( )-> setSoftSuspend ( true );
247 247
248 { 248 {
249 QCopEnvelope e("QPE/System", "setBacklight(int)" ); 249 QCopEnvelope e("QPE/System", "setBacklight(int)" );
250 e << -3; // Forced on 250 e << -3; // Forced on
251 } 251 }
252 252
253 AlarmServer::initialize(); 253 AlarmServer::initialize();
254 254
255 255
256 256
257 Server *s = new Server(); 257 Server *s = new Server();
258 258
259 (void)new SysFileMonitor(s); 259 (void)new SysFileMonitor(s);
260#ifdef QWS 260#ifdef QWS
261 Network::createServer(s); 261 Network::createServer(s);
262#endif 262#endif
263 263
264 s->show(); 264 s->show();
265 265
266 /* THE ARM rtc has problem holdings the time on reset */ 266 /* THE ARM rtc has problem holdings the time on reset */
267 if ( QDate::currentDate ( ). year ( ) < 2000 ) { 267 if ( QDate::currentDate ( ). year ( ) < 2000 ) {
268 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 ) { 268 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 ) {
269 QCopEnvelope e ( "QPE/Application/systemtime", "setDocument(QString)" ); 269 QCopEnvelope e ( "QPE/Application/systemtime", "setDocument(QString)" );
270 e << QString ( ); 270 e << QString ( );
271 } 271 }
272 } 272 }
273 273
274 int rv = a.exec(); 274 int rv = a.exec();
275 275
276 qDebug("exiting..."); 276 qDebug("exiting...");
277 delete s; 277 delete s;
278 278
279#ifndef Q_OS_MACX
279 ODevice::inst()->setSoftSuspend( false ); 280 ODevice::inst()->setSoftSuspend( false );
281#endif
280 282
281 return rv; 283 return rv;
282} 284}
283 285
284static const char *pidfile_path = "/var/run/opie.pid"; 286static const char *pidfile_path = "/var/run/opie.pid";
285 287
286void create_pidfile ( ) 288void create_pidfile ( )
287{ 289{
288 FILE *f; 290 FILE *f;
289 291
290 if (( f = ::fopen ( pidfile_path, "w" ))) { 292 if (( f = ::fopen ( pidfile_path, "w" ))) {
291 ::fprintf ( f, "%d", getpid ( )); 293 ::fprintf ( f, "%d", getpid ( ));
292 ::fclose ( f ); 294 ::fclose ( f );
293 } 295 }
294} 296}
295 297
296void remove_pidfile ( ) 298void remove_pidfile ( )
297{ 299{
298 ::unlink ( pidfile_path ); 300 ::unlink ( pidfile_path );
299} 301}
300 302
301void handle_sigterm ( int /* sig */ ) 303void handle_sigterm ( int /* sig */ )
302{ 304{
303 if ( qApp ) 305 if ( qApp )
304 qApp-> quit ( ); 306 qApp-> quit ( );
305} 307}
306 308
307#ifndef Q_OS_WIN32 309#ifndef Q_OS_WIN32
308int main( int argc, char ** argv ) 310int main( int argc, char ** argv )
309{ 311{
310 312
311 ::signal ( SIGCHLD, SIG_IGN ); 313 ::signal ( SIGCHLD, SIG_IGN );
312 314
313 ::signal ( SIGTERM, handle_sigterm ); 315 ::signal ( SIGTERM, handle_sigterm );
314 ::signal ( SIGINT, handle_sigterm ); 316 ::signal ( SIGINT, handle_sigterm );
315 317
316 ::setsid ( ); 318 ::setsid ( );
317 ::setpgid ( 0, 0 ); 319 ::setpgid ( 0, 0 );
318 320
319 ::atexit ( remove_pidfile ); 321 ::atexit ( remove_pidfile );
320 create_pidfile ( ); 322 create_pidfile ( );
321 323
322 int retVal = initApplication( argc, argv ); 324 int retVal = initApplication( argc, argv );
323 325
324 // Have we been asked to restart? 326 // Have we been asked to restart?
325 if ( ServerApplication::doRestart ) { 327 if ( ServerApplication::doRestart ) {
326 for ( int fd = 3; fd < 100; fd++ ) 328 for ( int fd = 3; fd < 100; fd++ )
327 close( fd ); 329 close( fd );
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 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#include "packageslave.h" 21#include "packageslave.h"
22#include <qtopia/qprocess.h>
22 23
23#include <qpe/process.h> 24#ifdef Q_WS_QWS
24#include <qpe/qcopenvelope_qws.h> 25#include <qtopia/qcopenvelope_qws.h>
26#endif
25 27
26#include <qdatastream.h> 28#include <qdatastream.h>
29#ifdef Q_WS_QWS
27#include <qcopchannel_qws.h> 30#include <qcopchannel_qws.h>
31#endif
28 32
33#include <qtextstream.h>
34#include <qdir.h>
35
36#include <stdlib.h>
37#include <sys/stat.h> // mkdir()
38
39#if defined(_OS_LINUX_) || defined(Q_OS_LINUX)
29#include <unistd.h> 40#include <unistd.h>
41#include <sys/vfs.h>
42#include <mntent.h>
43#elif defined(Q_OS_WIN32)
44#include <windows.h>
45#include <winbase.h>
46#elif defined(Q_OS_MACX)
47#include <unistd.h>
48#endif
49
30 50
31PackageSlave::PackageSlave( QObject *parent, char* name ) 51PackageHandler::PackageHandler( QObject *parent, char* name )
32 : QObject( parent, name ), packageChannel( 0 ) 52 : QObject( parent, name ), packageChannel( 0 ), currentProcess( 0 ), mNoSpaceLeft( FALSE )
33{ 53{
34 // setup qcop channel 54 // setup qcop channel
55#ifndef QT_NO_COP
35 packageChannel = new QCopChannel( "QPE/Package", this ); 56 packageChannel = new QCopChannel( "QPE/Package", this );
36 connect( packageChannel, SIGNAL( received(const QCString &, const QByteArray &) ), 57 connect( packageChannel, SIGNAL( received(const QCString &, const QByteArray &) ),
37 this, SLOT( qcopMessage( const QCString &, const QByteArray &) ) ); 58 this, SLOT( qcopMessage( const QCString &, const QByteArray &) ) );
59#endif
38} 60}
39 61
40void PackageSlave::qcopMessage( const QCString &msg, const QByteArray &data ) 62void PackageHandler::qcopMessage( const QCString &msg, const QByteArray &data )
41{ 63{
42 QDataStream stream( data, IO_ReadOnly ); 64 QDataStream stream( data, IO_ReadOnly );
43 65
44 if ( msg == "installPackage(QString)" ) { 66 if ( msg == "installPackage(QString)" ) {
45 QString file; 67 QString file;
46 stream >> file; 68 stream >> file;
47 installPackage( file ); 69 installPackage( file );
48 } 70 } else if ( msg == "removePackage(QString)" ) {
49 else if ( msg == "removePackage(QString)" ) {
50 QString file; 71 QString file;
51 stream >> file; 72 stream >> file;
52 removePackage( file ); 73 removePackage( file );
74 } else if ( msg == "addPackageFiles(QString,QString)" ) {
75 QString location, listfile;
76 stream >> location >> listfile;
77 addPackageFiles( location, listfile);
78 } else if ( msg == "addPackages(QString)" ) {
79 QString location;
80 stream >> location;
81 addPackages( location );
82 } else if ( msg == "cleanupPackageFiles(QString)" ) {
83 QString listfile;
84 stream >> listfile;
85 cleanupPackageFiles( listfile );
86 } else if ( msg == "cleanupPackages(QString)" ) {
87 QString location;
88 stream >> location;
89 cleanupPackages( location );
90 } else if ( msg == "prepareInstall(QString,QString)" ) {
91 QString size, path;
92 stream >> size;
93 stream >> path;
94 prepareInstall( size, path );
53 } 95 }
54} 96}
55 97
56void PackageSlave::installPackage( const QString &package ) 98void PackageHandler::installPackage( const QString &package )
57{ 99{
58 Process proc( QStringList() << "ipkg" << "install" << package ); 100 if ( mNoSpaceLeft ) {
101 mNoSpaceLeft = FALSE;
102 // Don't emit that for now, I still couldn't test it (Wener)
103 //sendReply( "installFailed(QString)", package );
104 //return;
105 }
106
107 currentProcess = new QProcess( QStringList() << "ipkg" << "install" << package ); // No tr
108 connect( currentProcess, SIGNAL( processExited() ), SLOT( iProcessExited() ) );
109 connect( currentProcess, SIGNAL( readyReadStdout() ), SLOT( readyReadStdout() ) );
110 connect( currentProcess, SIGNAL( readyReadStderr() ), SLOT( readyReadStderr() ) );
111 currentPackage = package;
59 112
113 currentProcessError="";
60 sendReply( "installStarted(QString)", package ); 114 sendReply( "installStarted(QString)", package );
115 currentProcess->start();
116}
117
118void PackageHandler::removePackage( const QString &package )
119{
120 currentProcess = new QProcess( QStringList() << "ipkg" << "remove" << package ); // No tr
121 connect( currentProcess, SIGNAL( processExited() ), SLOT( rmProcessExited() ) );
122 connect( currentProcess, SIGNAL( readyReadStdout() ), SLOT( readyReadStdout() ) );
123 connect( currentProcess, SIGNAL( readyReadStderr() ), SLOT( readyReadStderr() ) );
124 currentPackage = package;
125
126 currentProcessError="";
127 sendReply( "removeStarted(QString)", package );
128 currentProcess->start();
129}
130
131void PackageHandler::sendReply( const QCString& msg, const QString& arg )
132{
133#ifndef QT_NO_COP
134 QCopEnvelope e( "QPE/Desktop", msg );
135 e << arg;
136#endif
137}
138
139void PackageHandler::addPackageFiles( const QString &location,
140 const QString &listfile )
141{
142 QFile f(listfile);
143#ifndef Q_OS_WIN32
144 //make a copy so we can remove the symlinks later
145 mkdir( ("/usr/lib/ipkg/info/"+location).ascii(), 0777 );
146 system(("cp " + f.name() + " /usr/lib/ipkg/info/"+location).ascii());
147#else
148 QDir d;
149 //#### revise
150 qDebug("Copy file at %s: %s", __FILE__, __LINE__ );
151 d.mkdir(("/usr/lib/ipkg/info/" + location).ascii());
152 system(("copy " + f.name() + " /usr/lib/ipkg/info/"+location).ascii());
153#endif
154
155
156 if ( f.open(IO_ReadOnly) ) {
157 QTextStream ts(&f);
158
159 QString s;
160 while ( !ts.eof() ) { // until end of file...
161 s = ts.readLine(); // line of text excluding '\n'
162 // for s, do link/mkdir.
163 if ( s.right(1) == "/" ) {
164 qDebug("do mkdir for %s", s.ascii());
165#ifndef Q_OS_WIN32
166 mkdir( s.ascii(), 0777 );
167 //possible optimization: symlink directories
168 //that don't exist already. -- Risky.
169#else
170 d.mkdir( s.ascii());
171#endif
172
173 } else {
174#ifndef Q_OS_WIN32
175 qDebug("do symlink for %s", s.ascii());
176 symlink( (location + s).ascii(), s.ascii() );
177#else
178 qDebug("Copy file instead of a symlink for WIN32");
179 if (!CopyFile((TCHAR*)qt_winTchar((location + s), TRUE), (TCHAR*)qt_winTchar(s, TRUE), FALSE))
180 qWarning("Unable to create symlinkfor %s",
181 (location + s).ascii());
182#endif
183 }
184 }
185 f.close();
186 }
187}
61 188
62 QString output; 189void PackageHandler::addPackages( const QString &location )
63 if ( proc.exec( "", output ) ) { 190{
64 sendReply( "installDone(QString)", package ); 191 // get list of *.list in location/usr/lib/ipkg/info/*.list
192 QDir dir(location + "/usr/lib/ipkg/info", "*.list", // No tr
193 QDir::Name, QDir::Files);
194 if ( !dir.exists() )
195 return;
196
197 QStringList packages = dir.entryList();
198 for ( QStringList::Iterator it = packages.begin();
199 it != packages.end(); ++it ) {
200 addPackageFiles( location, *it );
65 } 201 }
202}
203
204
205void PackageHandler::cleanupPackageFiles( const QString &listfile )
206{
207 QFile f(listfile);
208
209 if ( f.open(IO_ReadOnly) ) {
210 QTextStream ts(&f);
211
212 QString s;
213 while ( !ts.eof() ) { // until end of file...
214 s = ts.readLine(); // line of text excluding '\n'
215 // for s, do link/mkdir.
216 if ( s.right(1) == "/" ) {
217 //should rmdir if empty, after all files have been removed
218 } else {
219#ifndef Q_OS_WIN32
220 qDebug("remove symlink for %s", s.ascii());
221 //check if it is a symlink first (don't remove /etc/passwd...)
222 char buf[10]; //we don't care about the contents
223 if ( ::readlink( s.ascii(),buf, 10 >= 0 ) )
224 ::unlink( s.ascii() );
225 #else
226 // ### revise
227 qWarning("Unable to remove symlink %s:%s", __FILE__, __LINE__);
228#endif
229 }
230 }
231 f.close();
232
233 //remove the list file
234 ::unlink( listfile.ascii() );
235
236 }
237}
238
239void PackageHandler::cleanupPackages( const QString &location )
240{
241 // get list of *.list in location/usr/lib/ipkg/info/*.list
242 QDir dir( "/usr/lib/ipkg/info/"+location, "*.list", // No tr
243 QDir::Name, QDir::Files);
244 if ( !dir.exists() )
245 return;
246
247 QStringList packages = dir.entryList();
248 for ( QStringList::Iterator it = packages.begin();
249 it != packages.end(); ++it ) {
250 cleanupPackageFiles( *it );
251 }
252
253 //remove the backup directory
254 //###
255}
256
257void PackageHandler::prepareInstall( const QString& size, const QString& path )
258{
259 // Check whether there will be enough space to install the next package.
260 bool ok;
261 unsigned int s = size.toUInt( &ok );
262
263 if ( !ok )
264 return;
265
266 // Shamelessly stolen from the sysinfo application (Werner)
267#if defined(_OS_LINUX_) || defined(Q_OS_LINUX)
268 struct statfs fs;
269 if ( statfs( path.latin1(), &fs ) == 0 )
270 if ( s > fs.f_bsize * fs.f_bavail ) {
271 //qDebug("############### Not enough space left ###############");
272 mNoSpaceLeft = TRUE;
273 }
274#endif
275}
276
277void PackageHandler::iProcessExited()
278{
279 if ( currentProcess->normalExit() && currentProcess->exitStatus() == 0 )
280 sendReply( "installDone(QString)", currentPackage );
66 else { 281 else {
67 sendReply( "installFailed(QString)", package ); 282#ifndef QT_NO_COP
283 QCopEnvelope e( "QPE/Desktop", "installFailed(QString,int,QString)" );
284 e << currentPackage << currentProcess->exitStatus()
285 << currentProcessError;
286#endif
68 } 287 }
288
289 delete currentProcess;
290 currentProcess = 0;
291
292#ifndef QT_NO_COP
69 QCopEnvelope e("QPE/System", "linkChanged(QString)"); 293 QCopEnvelope e("QPE/System", "linkChanged(QString)");
70 QString lf = QString::null; 294 QString lf = QString::null;
71 e << lf; 295 e << lf;
72 unlink( package ); 296#endif
297 unlink( currentPackage );
73} 298}
74 299
75void PackageSlave::removePackage( const QString &package ) 300void PackageHandler::rmProcessExited()
76{ 301{
77 Process proc( QStringList() << "ipkg" << "remove" << package ); 302 if ( currentProcess->normalExit() && currentProcess->exitStatus() == 0 )
303 sendReply( "removeDone(QString)", currentPackage );
304 else
305 sendReply( "removeFailed(QString)", currentPackage );
78 306
79 sendReply( "removeStarted(QString)", package ); 307#ifndef QT_NO_COP
80
81 QString output;
82 if ( proc.exec( "", output ) ) {
83 sendReply( "removeDone(QString)", package );
84 }
85 else {
86 sendReply( "removeFailed(QString)", package );
87 }
88 QCopEnvelope e("QPE/System", "linkChanged(QString)"); 308 QCopEnvelope e("QPE/System", "linkChanged(QString)");
89 QString lf = QString::null; 309 QString lf = QString::null;
90 e << lf; 310 e << lf;
311#endif
91} 312}
92 313
93void PackageSlave::sendReply( const QCString& msg, const QString& arg ) 314void PackageHandler::readyReadStdout()
94{ 315{
95 QCopEnvelope e( "QPE/Desktop", msg ); 316 while ( currentProcess->canReadLineStdout() ) {
96 e << arg; 317 QString line = currentProcess->readLineStdout();
318 currentProcessError.append("OUT:"+line);
319 if ( line.contains( "Unpacking" ) ) // No tr
320 sendReply( "installStep(QString)", "one" ); // No tr
321 else if ( line.contains( "Configuring" ) ) // No tr
322 sendReply( "installStep(QString)", "two" ); // No tr
323 }
324}
325
326void PackageHandler::readyReadStderr()
327{
328 while ( currentProcess->canReadLineStderr() ) {
329 QString line = currentProcess->readLineStderr();
330 currentProcessError.append("ERR:"+line);
331 }
332}
333
334void PackageHandler::redoPackages()
335{
336 //get list of filesystems
337
338 //call cleanupPackages for the ones that have disappeared
339
340 //call addPackageFiles for the new ones
97} 341}
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
@@ -5,96 +5,99 @@
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21//#include "qplatformdefs.h" 21//#include "qplatformdefs.h"
22 22
23// Solaris redefines connect -> __xnet_connect with _XOPEN_SOURCE_EXTENDED. 23// Solaris redefines connect -> __xnet_connect with _XOPEN_SOURCE_EXTENDED.
24#if defined(connect) 24#if defined(connect)
25#undef connect 25#undef connect
26#endif 26#endif
27 27
28#include "qprocess.h" 28#include "qprocess.h"
29 29
30#ifndef QT_NO_PROCESS 30#ifndef QT_NO_PROCESS
31 31
32#include "qapplication.h" 32#include "qapplication.h"
33#include "qqueue.h" 33#include "qqueue.h"
34#include "qlist.h" 34#include "qlist.h"
35#include "qsocketnotifier.h" 35#include "qsocketnotifier.h"
36#include "qtimer.h" 36#include "qtimer.h"
37#include "qregexp.h" 37#include "qregexp.h"
38 38
39#include "qcleanuphandler_p.h" 39#include "qcleanuphandler_p.h"
40 40
41#include <stdlib.h> 41#include <stdlib.h>
42 42
43// ### FOR Qt 2.3 compat 43// ### FOR Qt 2.3 compat
44#include <unistd.h> 44#include <unistd.h>
45#include <signal.h> 45#include <signal.h>
46#include <sys/socket.h> 46#include <sys/socket.h>
47#include <sys/ioctl.h> 47#include <sys/ioctl.h>
48#include <sys/wait.h> 48#include <sys/wait.h>
49#include <sys/fcntl.h> 49#include <sys/fcntl.h>
50 50
51#include <errno.h> 51#include <errno.h>
52 52
53#ifdef Q_OS_MACX
54#include <sys/time.h>
55#endif
53#include <sys/resource.h> 56#include <sys/resource.h>
54 57
55#ifdef __MIPSEL__ 58#ifdef __MIPSEL__
56# ifndef SOCK_DGRAM 59# ifndef SOCK_DGRAM
57# define SOCK_DGRAM 1 60# define SOCK_DGRAM 1
58# endif 61# endif
59# ifndef SOCK_STREAM 62# ifndef SOCK_STREAM
60# define SOCK_STREAM 2 63# define SOCK_STREAM 2
61# endif 64# endif
62#endif 65#endif
63 66
64//#define QT_QPROCESS_DEBUG 67//#define QT_QPROCESS_DEBUG
65 68
66 69
67#ifdef Q_C_CALLBACKS 70#ifdef Q_C_CALLBACKS
68extern "C" { 71extern "C" {
69#endif // Q_C_CALLBACKS 72#endif // Q_C_CALLBACKS
70 73
71#define QT_SIGNAL_RETTYPE void 74#define QT_SIGNAL_RETTYPE void
72#define QT_SIGNAL_ARGS int 75#define QT_SIGNAL_ARGS int
73#define QT_SIGNAL_IGNORE SIG_IGN 76#define QT_SIGNAL_IGNORE SIG_IGN
74 77
75 QT_SIGNAL_RETTYPE qt_C_sigchldHnd(QT_SIGNAL_ARGS); 78 QT_SIGNAL_RETTYPE qt_C_sigchldHnd(QT_SIGNAL_ARGS);
76 QT_SIGNAL_RETTYPE qt_C_sigpipeHnd(QT_SIGNAL_ARGS); 79 QT_SIGNAL_RETTYPE qt_C_sigpipeHnd(QT_SIGNAL_ARGS);
77 80
78#ifdef Q_C_CALLBACKS 81#ifdef Q_C_CALLBACKS
79} 82}
80#endif // Q_C_CALLBACKS 83#endif // Q_C_CALLBACKS
81 84
82 85
83class QProc; 86class QProc;
84class QProcessManager; 87class QProcessManager;
85class QProcessPrivate 88class QProcessPrivate
86{ 89{
87public: 90public:
88 QProcessPrivate(); 91 QProcessPrivate();
89 ~QProcessPrivate(); 92 ~QProcessPrivate();
90 93
91 void closeOpenSocketsForChild(); 94 void closeOpenSocketsForChild();
92 void newProc( pid_t pid, QProcess *process ); 95 void newProc( pid_t pid, QProcess *process );
93 96
94 QByteArray bufStdout; 97 QByteArray bufStdout;
95 QByteArray bufStderr; 98 QByteArray bufStderr;
96 99
97 QQueue<QByteArray> stdinBuf; 100 QQueue<QByteArray> stdinBuf;
98 101
99 QSocketNotifier *notifierStdin; 102 QSocketNotifier *notifierStdin;
100 QSocketNotifier *notifierStdout; 103 QSocketNotifier *notifierStdout;
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
@@ -70,51 +70,56 @@ SOURCES += server.cpp \
70 packageslave.cpp \ 70 packageslave.cpp \
71 irserver.cpp \ 71 irserver.cpp \
72 qcopbridge.cpp \ 72 qcopbridge.cpp \
73 startmenu.cpp \ 73 startmenu.cpp \
74 main.cpp \ 74 main.cpp \
75 firstuse.cpp \ 75 firstuse.cpp \
76 $$(OPIEDIR)/rsync/base64.c \ 76 $$(OPIEDIR)/rsync/base64.c \
77 $$(OPIEDIR)/rsync/buf.c \ 77 $$(OPIEDIR)/rsync/buf.c \
78 $$(OPIEDIR)/rsync/checksum.c \ 78 $$(OPIEDIR)/rsync/checksum.c \
79 $$(OPIEDIR)/rsync/command.c \ 79 $$(OPIEDIR)/rsync/command.c \
80 $$(OPIEDIR)/rsync/delta.c \ 80 $$(OPIEDIR)/rsync/delta.c \
81 $$(OPIEDIR)/rsync/emit.c \ 81 $$(OPIEDIR)/rsync/emit.c \
82 $$(OPIEDIR)/rsync/hex.c \ 82 $$(OPIEDIR)/rsync/hex.c \
83 $$(OPIEDIR)/rsync/job.c \ 83 $$(OPIEDIR)/rsync/job.c \
84 $$(OPIEDIR)/rsync/mdfour.c \ 84 $$(OPIEDIR)/rsync/mdfour.c \
85 $$(OPIEDIR)/rsync/mksum.c \ 85 $$(OPIEDIR)/rsync/mksum.c \
86 $$(OPIEDIR)/rsync/msg.c \ 86 $$(OPIEDIR)/rsync/msg.c \
87 $$(OPIEDIR)/rsync/netint.c \ 87 $$(OPIEDIR)/rsync/netint.c \
88 $$(OPIEDIR)/rsync/patch.c \ 88 $$(OPIEDIR)/rsync/patch.c \
89 $$(OPIEDIR)/rsync/prototab.c \ 89 $$(OPIEDIR)/rsync/prototab.c \
90 $$(OPIEDIR)/rsync/readsums.c \ 90 $$(OPIEDIR)/rsync/readsums.c \
91 $$(OPIEDIR)/rsync/scoop.c \ 91 $$(OPIEDIR)/rsync/scoop.c \
92 $$(OPIEDIR)/rsync/search.c \ 92 $$(OPIEDIR)/rsync/search.c \
93 $$(OPIEDIR)/rsync/stats.c \ 93 $$(OPIEDIR)/rsync/stats.c \
94 $$(OPIEDIR)/rsync/stream.c \ 94 $$(OPIEDIR)/rsync/stream.c \
95 $$(OPIEDIR)/rsync/sumset.c \ 95 $$(OPIEDIR)/rsync/sumset.c \
96 $$(OPIEDIR)/rsync/trace.c \ 96 $$(OPIEDIR)/rsync/trace.c \
97 $$(OPIEDIR)/rsync/tube.c \ 97 $$(OPIEDIR)/rsync/tube.c \
98 $$(OPIEDIR)/rsync/util.c \ 98 $$(OPIEDIR)/rsync/util.c \
99 $$(OPIEDIR)/rsync/version.c \ 99 $$(OPIEDIR)/rsync/version.c \
100 $$(OPIEDIR)/rsync/whole.c \ 100 $$(OPIEDIR)/rsync/whole.c \
101 $$(OPIEDIR)/rsync/qrsync.cpp \ 101 $$(OPIEDIR)/rsync/qrsync.cpp \
102 syncdialog.cpp \ 102 syncdialog.cpp \
103 serverapp.cpp \ 103 serverapp.cpp \
104 launcherglobal.cpp \ 104 launcherglobal.cpp \
105 qprocess.cpp \ 105 qprocess.cpp \
106 qprocess_unix.cpp \ 106 qprocess_unix.cpp \
107 screensaver.cpp 107 screensaver.cpp
108 108
109 109
110INCLUDEPATH += $(OPIEDIR)/core/apps/calibrate 110INCLUDEPATH += $(OPIEDIR)/core/apps/calibrate
111 DEPENDPATH+= $(OPIEDIR)/core/apps/calibrate 111 DEPENDPATH+= $(OPIEDIR)/core/apps/calibrate
112 112
113INCLUDEPATH += $(OPIEDIR)/include $(OPIEDIR)/rsync 113INCLUDEPATH += $(OPIEDIR)/include $(OPIEDIR)/rsync
114 DEPENDPATH+= $(OPIEDIR)/rsync 114 DEPENDPATH+= $(OPIEDIR)/rsync
115 115
116 TARGET = qpe 116 TARGET = qpe
117 117
118 LIBS+= -lcrypt -lqpe -lopie 118CONFTEST = $$system( echo $CONFIG_TARGET_MACOSX )
119contains( CONFTEST, y ){
120 LIBS += -lqpe -lopie
121}else{
122 LIBS+= -lcrypt -lqpe -lopie
123}
119 124
120include ( $(OPIEDIR)/include.pro ) 125include ( $(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
@@ -211,97 +211,101 @@ void StartMenu::launch()
211 211
212 212
213 213
214static int compareAppletPositions(const void *a, const void *b) 214static int compareAppletPositions(const void *a, const void *b)
215{ 215{
216 const MenuApplet* aa = *(const MenuApplet**)a; 216 const MenuApplet* aa = *(const MenuApplet**)a;
217 const MenuApplet* ab = *(const MenuApplet**)b; 217 const MenuApplet* ab = *(const MenuApplet**)b;
218 int d = aa->iface->position() - ab->iface->position(); 218 int d = aa->iface->position() - ab->iface->position();
219 if ( d ) return d; 219 if ( d ) return d;
220 return QString::compare(aa->library->library(),ab->library->library()); 220 return QString::compare(aa->library->library(),ab->library->library());
221} 221}
222 222
223void StartMenu::clearApplets() 223void StartMenu::clearApplets()
224{ 224{
225 if (launchMenu ) 225 if (launchMenu )
226 launchMenu-> hide(); 226 launchMenu-> hide();
227 227
228 for ( QIntDictIterator<MenuApplet> it ( m_applets ); it. current ( ); ++it ) { 228 for ( QIntDictIterator<MenuApplet> it ( m_applets ); it. current ( ); ++it ) {
229 MenuApplet *applet = it. current ( ); 229 MenuApplet *applet = it. current ( );
230 if ( launchMenu ) { 230 if ( launchMenu ) {
231 launchMenu-> removeItem ( applet-> id ); 231 launchMenu-> removeItem ( applet-> id );
232 delete applet-> popup; 232 delete applet-> popup;
233 } 233 }
234 234
235 applet-> iface-> release(); 235 applet-> iface-> release();
236 applet-> library-> unload(); 236 applet-> library-> unload();
237 delete applet-> library; 237 delete applet-> library;
238 } 238 }
239 m_applets.clear(); 239 m_applets.clear();
240} 240}
241 241
242 242
243 243
244 244
245void StartMenu::loadApplets() 245void StartMenu::loadApplets()
246{ 246{
247 Config cfg( "StartMenu" ); 247 Config cfg( "StartMenu" );
248 cfg.setGroup( "Applets" ); 248 cfg.setGroup( "Applets" );
249 249
250 // SafeMode causes too much problems, so we disable it for now -- 250 // SafeMode causes too much problems, so we disable it for now --
251 // maybe we should reenable it for OPIE 1.0 - sandman 26.09.02 251 // maybe we should reenable it for OPIE 1.0 - sandman 26.09.02
252 // removed in the remerge PluginManager could handle it 252 // removed in the remerge PluginManager could handle it
253 // we don't currently use it -zecke 253 // we don't currently use it -zecke
254 254
255 QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' ); 255 QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' );
256 256
257 QString lang = getenv( "LANG" ); 257 QString lang = getenv( "LANG" );
258 QString path = QPEApplication::qpeDir() + "/plugins/applets"; 258 QString path = QPEApplication::qpeDir() + "/plugins/applets";
259#ifdef Q_OS_MACX
260 QDir dir( path, "lib*.dylib" );
261#else
259 QDir dir( path, "lib*.so" ); 262 QDir dir( path, "lib*.so" );
263#endif /* Q_OS_MACX */
260 QStringList list = dir.entryList(); 264 QStringList list = dir.entryList();
261 QStringList::Iterator it; 265 QStringList::Iterator it;
262 int napplets=0; 266 int napplets=0;
263 MenuApplet* *xapplets = new MenuApplet*[list.count()]; 267 MenuApplet* *xapplets = new MenuApplet*[list.count()];
264 for ( it = list.begin(); it != list.end(); ++it ) { 268 for ( it = list.begin(); it != list.end(); ++it ) {
265 if ( exclude.find( *it ) != exclude.end() ) 269 if ( exclude.find( *it ) != exclude.end() )
266 continue; 270 continue;
267 MenuAppletInterface *iface = 0; 271 MenuAppletInterface *iface = 0;
268 QLibrary *lib = new QLibrary( path + "/" + *it ); 272 QLibrary *lib = new QLibrary( path + "/" + *it );
269 if (( lib->queryInterface( IID_MenuApplet, (QUnknownInterface**)&iface ) == QS_OK ) && iface ) { 273 if (( lib->queryInterface( IID_MenuApplet, (QUnknownInterface**)&iface ) == QS_OK ) && iface ) {
270 MenuApplet *applet = new MenuApplet; 274 MenuApplet *applet = new MenuApplet;
271 xapplets[napplets++] = applet; 275 xapplets[napplets++] = applet;
272 applet->library = lib; 276 applet->library = lib;
273 applet->iface = iface; 277 applet->iface = iface;
274 278
275 QTranslator *trans = new QTranslator(qApp); 279 QTranslator *trans = new QTranslator(qApp);
276 QString type = (*it).left( (*it).find(".") ); 280 QString type = (*it).left( (*it).find(".") );
277 QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm"; 281 QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
278 if ( trans->load( tfn )) 282 if ( trans->load( tfn ))
279 qApp->installTranslator( trans ); 283 qApp->installTranslator( trans );
280 else 284 else
281 delete trans; 285 delete trans;
282 } else { 286 } else {
283 exclude += *it; 287 exclude += *it;
284 delete lib; 288 delete lib;
285 } 289 }
286 } 290 }
287 cfg.writeEntry( "ExcludeApplets", exclude, ',' ); 291 cfg.writeEntry( "ExcludeApplets", exclude, ',' );
288 qsort(xapplets,napplets,sizeof(m_applets[0]),compareAppletPositions); 292 qsort(xapplets,napplets,sizeof(m_applets[0]),compareAppletPositions);
289 293
290 294
291 int foo = ( launchMenu-> count ( )) ? launchMenu-> insertSeparator ( ) : 0; 295 int foo = ( launchMenu-> count ( )) ? launchMenu-> insertSeparator ( ) : 0;
292 296
293 while (napplets--) { 297 while (napplets--) {
294 MenuApplet *applet = xapplets[napplets]; 298 MenuApplet *applet = xapplets[napplets];
295 299
296 applet-> popup = applet-> iface-> popup ( this ); 300 applet-> popup = applet-> iface-> popup ( this );
297 301
298 if ( applet-> popup ) 302 if ( applet-> popup )
299 applet-> id = launchMenu-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ), applet-> popup ); 303 applet-> id = launchMenu-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ), applet-> popup );
300 else 304 else
301 applet-> id = launchMenu-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ) ); 305 applet-> id = launchMenu-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ) );
302 306
303 307
304 m_applets.insert ( applet-> id, new MenuApplet(*applet)); 308 m_applets.insert ( applet-> id, new MenuApplet(*applet));
305 } 309 }
306 delete [] xapplets; 310 delete [] xapplets;
307 311
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
@@ -57,93 +57,98 @@ static int compareAppletPositions(const void *a, const void *b)
57 if ( d ) return d; 57 if ( d ) return d;
58 return QString::compare(ab->name,aa->name); 58 return QString::compare(ab->name,aa->name);
59} 59}
60 60
61void SysTray::loadApplets() 61void SysTray::loadApplets()
62{ 62{
63 hide(); 63 hide();
64 clearApplets(); 64 clearApplets();
65 addApplets(); 65 addApplets();
66} 66}
67 67
68void SysTray::clearApplets() 68void SysTray::clearApplets()
69{ 69{
70#ifndef QT_NO_COMPONENTS 70#ifndef QT_NO_COMPONENTS
71 71
72 /* 72 /*
73 * Note on clearing. SOme applets delete their 73 * Note on clearing. SOme applets delete their
74 * applets themselves some don't do it 74 * applets themselves some don't do it
75 * and on restart this can crash. If we delete it 75 * and on restart this can crash. If we delete it
76 * here we might end up in a double deletion. We could 76 * here we might end up in a double deletion. We could
77 * use QGuardedPtr but that would be one QOBject 77 * use QGuardedPtr but that would be one QOBject
78 * for every applet more but only useful for restart 78 * for every applet more but only useful for restart
79 */ 79 */
80 QValueList<TaskbarApplet>::Iterator mit; 80 QValueList<TaskbarApplet>::Iterator mit;
81 for ( mit = appletList.begin(); mit != appletList.end(); ++mit ) { 81 for ( mit = appletList.begin(); mit != appletList.end(); ++mit ) {
82 (*mit).iface->release(); 82 (*mit).iface->release();
83 (*mit).library->unload(); 83 (*mit).library->unload();
84 delete (*mit).library; 84 delete (*mit).library;
85 } 85 }
86 86
87#endif 87#endif
88 appletList.clear(); 88 appletList.clear();
89 if ( layout ) 89 if ( layout )
90 delete layout; 90 delete layout;
91 layout = new QHBoxLayout( this, 0, 1 ); 91 layout = new QHBoxLayout( this, 0, 1 );
92 layout->setAutoAdd(TRUE); 92 layout->setAutoAdd(TRUE);
93} 93}
94 94
95void SysTray::addApplets() 95void SysTray::addApplets()
96{ 96{
97 hide(); 97 hide();
98#ifndef QT_NO_COMPONENTS 98#ifndef QT_NO_COMPONENTS
99 Config cfg( "Taskbar" ); 99 Config cfg( "Taskbar" );
100 cfg.setGroup( "Applets" ); 100 cfg.setGroup( "Applets" );
101 QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' ); 101 QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' );
102 102
103 QString lang = getenv( "LANG" ); 103 QString lang = getenv( "LANG" );
104 QString path = QPEApplication::qpeDir() + "/plugins/applets"; 104 QString path = QPEApplication::qpeDir() + "/plugins/applets";
105#ifdef Q_OS_MACX
106 QDir dir( path, "lib*.dylib" );
107#else
105 QDir dir( path, "lib*.so" ); 108 QDir dir( path, "lib*.so" );
109#endif /* Q_OS_MACX */
106 QStringList list = dir.entryList(); 110 QStringList list = dir.entryList();
107 QStringList::Iterator it; 111 QStringList::Iterator it;
108 int napplets=0; 112 int napplets=0;
109 TaskbarApplet* *applets = new TaskbarApplet*[list.count()]; 113 TaskbarApplet* *applets = new TaskbarApplet*[list.count()];
110 for ( it = list.begin(); it != list.end(); ++it ) { 114 for ( it = list.begin(); it != list.end(); ++it ) {
111 if ( exclude.find( *it ) != exclude.end() ) 115 if ( exclude.find( *it ) != exclude.end() )
112 continue; 116 continue;
117 qWarning( "Found Applet: %s", (*it).latin1() );
113 TaskbarAppletInterface *iface = 0; 118 TaskbarAppletInterface *iface = 0;
114 QLibrary *lib = new QLibrary( path + "/" + *it ); 119 QLibrary *lib = new QLibrary( path + "/" + *it );
115 if (( lib->queryInterface( IID_TaskbarApplet, (QUnknownInterface**)&iface ) == QS_OK ) && iface ) { 120 if (( lib->queryInterface( IID_TaskbarApplet, (QUnknownInterface**)&iface ) == QS_OK ) && iface ) {
116 TaskbarApplet *applet = new TaskbarApplet; 121 TaskbarApplet *applet = new TaskbarApplet;
117 applets[napplets++] = applet; 122 applets[napplets++] = applet;
118 applet->library = lib; 123 applet->library = lib;
119 applet->iface = iface; 124 applet->iface = iface;
120 125
121 QTranslator *trans = new QTranslator(qApp); 126 QTranslator *trans = new QTranslator(qApp);
122 QString type = (*it).left( (*it).find(".") ); 127 QString type = (*it).left( (*it).find(".") );
123 QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm"; 128 QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
124 if ( trans->load( tfn )) 129 if ( trans->load( tfn ))
125 qApp->installTranslator( trans ); 130 qApp->installTranslator( trans );
126 else 131 else
127 delete trans; 132 delete trans;
128 } else { 133 } else {
129 exclude += *it; 134 exclude += *it;
130 delete lib; 135 delete lib;
131 } 136 }
132 } 137 }
133 cfg.writeEntry( "ExcludeApplets", exclude, ',' ); 138 cfg.writeEntry( "ExcludeApplets", exclude, ',' );
134 qsort(applets,napplets,sizeof(applets[0]),compareAppletPositions); 139 qsort(applets,napplets,sizeof(applets[0]),compareAppletPositions);
135 while (napplets--) { 140 while (napplets--) {
136 TaskbarApplet *applet = applets[napplets]; 141 TaskbarApplet *applet = applets[napplets];
137 applet->applet = applet->iface->applet( this ); 142 applet->applet = applet->iface->applet( this );
138 appletList.append(*applet); 143 appletList.append(*applet);
139 } 144 }
140 delete [] applets; 145 delete [] applets;
141#else /* ## FIXME single app */ 146#else /* ## FIXME single app */
142 TaskbarApplet * const applet = new TaskbarApplet(); 147 TaskbarApplet * const applet = new TaskbarApplet();
143 applet->iface = new ClockAppletImpl(); 148 applet->iface = new ClockAppletImpl();
144 applet->applet = applet->iface->applet( this ); 149 applet->applet = applet->iface->applet( this );
145 appletList.append( applet ); 150 appletList.append( applet );
146#endif 151#endif
147 show(); 152 show();
148} 153}
149 154
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,80 +1,83 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20//#define _XOPEN_SOURCE 20//#define _XOPEN_SOURCE
21 21
22#include <qtopia/global.h> 22#include <qtopia/global.h>
23#include <qtopia/qpeapplication.h> 23#include <qtopia/qpeapplication.h>
24 24
25#ifndef Q_OS_WIN32 25#ifndef Q_OS_WIN32
26#include <pwd.h> 26#include <pwd.h>
27#include <sys/types.h> 27#include <sys/types.h>
28#include <unistd.h> 28#include <unistd.h>
29#include <stdlib.h> 29#include <stdlib.h>
30#include <time.h> 30#include <time.h>
31
32#ifndef Q_OS_MACX
31#include <shadow.h> 33#include <shadow.h>
32#include <crypt.h> 34#include <crypt.h>
35#endif /* Q_OS_MACX */
33 36
34#else 37#else
35#include <stdlib.h> 38#include <stdlib.h>
36#include <time.h> 39#include <time.h>
37#endif 40#endif
38 41
39 42
40#if defined(_OS_LINUX_) 43#if defined(_OS_LINUX_)
41#include <shadow.h> 44#include <shadow.h>
42#endif 45#endif
43 46
44#include <qdir.h> 47#include <qdir.h>
45#include <qfile.h> 48#include <qfile.h>
46#include <qtextstream.h> 49#include <qtextstream.h>
47#include <qdatastream.h> 50#include <qdatastream.h>
48#include <qmessagebox.h> 51#include <qmessagebox.h>
49#include <qstringlist.h> 52#include <qstringlist.h>
50#include <qfileinfo.h> 53#include <qfileinfo.h>
51#include <qregexp.h> 54#include <qregexp.h>
52//#include <qtopia/qcopchannel_qws.h> 55//#include <qtopia/qcopchannel_qws.h>
53#include <qtopia/process.h> 56#include <qtopia/process.h>
54#include <qtopia/global.h> 57#include <qtopia/global.h>
55#include <qtopia/config.h> 58#include <qtopia/config.h>
56#include <qtopia/private/contact.h> 59#include <qtopia/private/contact.h>
57#include <qtopia/quuid.h> 60#include <qtopia/quuid.h>
58#include <qtopia/version.h> 61#include <qtopia/version.h>
59#ifdef Q_WS_QWS 62#ifdef Q_WS_QWS
60#include <qtopia/qcopenvelope_qws.h> 63#include <qtopia/qcopenvelope_qws.h>
61#endif 64#endif
62 65
63#include "launcherglobal.h" 66#include "launcherglobal.h"
64 67
65#include "transferserver.h" 68#include "transferserver.h"
66#include <qtopia/qprocess.h> 69#include <qtopia/qprocess.h>
67 70
68const int block_size = 51200; 71const int block_size = 51200;
69 72
70TransferServer::TransferServer( Q_UINT16 port, QObject *parent, 73TransferServer::TransferServer( Q_UINT16 port, QObject *parent,
71 const char* name) 74 const char* name)
72 : QServerSocket( port, 1, parent, name ) 75 : QServerSocket( port, 1, parent, name )
73{ 76{
74 connections.setAutoDelete( TRUE ); 77 connections.setAutoDelete( TRUE );
75 if ( !ok() ) 78 if ( !ok() )
76 qWarning( "Failed to bind to port %d", port ); 79 qWarning( "Failed to bind to port %d", port );
77} 80}
78 81
79void TransferServer::authorizeConnections() 82void TransferServer::authorizeConnections()
80{ 83{