summaryrefslogtreecommitdiff
authormickeyl <mickeyl>2005-06-02 21:44:41 (UTC)
committer mickeyl <mickeyl>2005-06-02 21:44:41 (UTC)
commitd0f6a0721d7ab67a115d08990143944ee71d54ba (patch) (unidiff)
treeba22ad18027419a6417f3d6439a2faf67917ab74
parentf55a56f54de1d3fa9084160159a379079a317d96 (diff)
downloadopie-d0f6a0721d7ab67a115d08990143944ee71d54ba.zip
opie-d0f6a0721d7ab67a115d08990143944ee71d54ba.tar.gz
opie-d0f6a0721d7ab67a115d08990143944ee71d54ba.tar.bz2
- move addLanguage.sh and mkipks to scripts/ directory
- finish recursive directory locks and mention in ChangeLog beginning with `CVS:' are removed automatically CVS: CVS: Committing in . CVS: CVS: Modified Files: CVS: ChangeLog libopie2/opiecore/linux/ofilenotify.cpp CVS: libopie2/opiecore/linux/ofilenotify.h CVS: examples/opiecore/onotifytest/main.cpp CVS: examples/opiecore/onotifytest/main.h CVS: Added Files: CVS: scripts/addLanguage.sh scripts/mkipks CVS: ----------------------------------------------------------------------
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--ChangeLog3
-rw-r--r--examples/opiecore/onotifytest/main.cpp18
-rw-r--r--examples/opiecore/onotifytest/main.h10
-rw-r--r--libopie2/opiecore/linux/ofilenotify.cpp40
-rw-r--r--libopie2/opiecore/linux/ofilenotify.h3
-rwxr-xr-xscripts/addLanguage.sh33
-rwxr-xr-xscripts/mkipks261
7 files changed, 343 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index bce86d1..4dcee93 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,62 +1,63 @@
1 2005-??-??Opie 1.2.1 1 2005-??-??Opie 1.2.1
2 2
3 3
4 New Features 4 New Features
5 ------------ 5 ------------
6 * OpieStumbler: Scans WiFi networks using the wireless extension scanning (skyhusker) 6 * OpieStumbler: Scans WiFi networks using the wireless extension scanning (skyhusker)
7 * Opie-Reader: Support for document formats ArriereGo and Reb, add flite output (tim,pohly) 7 * Opie-Reader: Support for document formats ArriereGo and Reb, add flite output (tim,pohly)
8 * Opie-Networksettings: Add support for wlan-ng devices and improve WEP handling (Dirk Opfer) 8 * Opie-Networksettings: Add support for wlan-ng devices and improve WEP handling (Dirk Opfer)
9 * Wellenreiter: Remove Joining networks - use OpieStumbler for that (mickeyl) 9 * Wellenreiter: Remove Joining networks - use OpieStumbler for that (mickeyl)
10 * Opie-Mobilemsg has gone unsupported - it never really worked and there will be a replacement (mickeyl) 10 * Opie-Mobilemsg has gone unsupported - it never really worked and there will be a replacement (mickeyl)
11 * Opie-Tabmanager has gone unsupported - it barely works and there is not much of a use of it anyway (mickeyl) 11 * Opie-Tabmanager has gone unsupported - it barely works and there is not much of a use of it anyway (mickeyl)
12 12
13 Fixed Bugs 13 Fixed Bugs
14 ---------- 14 ----------
15 * #1476 - Wrong order of application entries in the O-menu (skyhusker) 15 * #1476 - Wrong order of application entries in the O-menu (skyhusker)
16 * #1535- Missing line break and unnecessary location shown with Today-Calendar plugin (deller) 16 * #1535- Missing line break and unnecessary location shown with Today-Calendar plugin (deller)
17 * #1565 - crash-fix in odevice.cpp while scanning the distribution table (deller) 17 * #1565 - crash-fix in odevice.cpp while scanning the distribution table (deller)
18 * #1614 - Make Opie-console start in $HOME instead of / (skyhusker) 18 * #1614 - Make Opie-console start in $HOME instead of / (skyhusker)
19 * n.a.- always show volume and wireless applet popups inside visible screen (deller) 19 * n.a.- always show volume and wireless applet popups inside visible screen (deller)
20 * n.a. - scale O-Menu-Applets appropriately (mickeyl) 20 * n.a. - scale O-Menu-Applets appropriately (mickeyl)
21 * n.a.- libopienet: fix bugs in wireless scanning and setting SSID (skyhusker) 21 * n.a.- libopienet: fix bugs in wireless scanning and setting SSID (skyhusker)
22 * n.a.- Wellenreiter: relax WE version matching test a bit (mickeyl) 22 * n.a.- Wellenreiter: relax WE version matching test a bit (mickeyl)
23 * n.a.- scale BluezApplet appropriately and use larger icons (mickeyl) 23 * n.a.- scale BluezApplet appropriately and use larger icons (mickeyl)
24 * n.a.- memoryapplet: fix crash in memoryapplet on kernels without swap support (seneca cunningham) 24 * n.a.- memoryapplet: fix crash in memoryapplet on kernels without swap support (seneca cunningham)
25 * n.a. - networksettings: ignore hostap control interfaces wifi* (mickeyl) 25 * n.a. - networksettings: ignore hostap control interfaces wifi* (mickeyl)
26 26
27 Internal 27 Internal
28 -------- 28 --------
29 * Make BluezApplet use OTaskbarApplet (mickeyl) 29 * Make BluezApplet use OTaskbarApplet (mickeyl)
30 * Rewrite OFileNotification to use the upcoming inotify interface instead of the deprecated dnotify (mickeyl) 30 * libopiecore: rewrite OFileNotification to use the Linux 2.6 inotify interface (mickeyl)
31 * libopiecore: add ODirNotification - recursive directory notifications (mickeyl)
31 * libopienet: Skip hostap control interfaces 'wifi' and improve robustness in ONetworkInterface (mickeyl) 32 * libopienet: Skip hostap control interfaces 'wifi' and improve robustness in ONetworkInterface (mickeyl)
32 * libopieui: Remove OVersatileView and OVersatileViewItem (mickeyl) 33 * libopieui: Remove OVersatileView and OVersatileViewItem (mickeyl)
33 * libopienet: Miscellaneous API cleanups (mickeyl) 34 * libopienet: Miscellaneous API cleanups (mickeyl)
34 * libopiecore: Add linux pcmcia system abstraction classes (mickeyl) 35 * libopiecore: Add linux pcmcia system abstraction classes (mickeyl)
35 36
36 2005-03-25Opie 1.2.0 37 2005-03-25Opie 1.2.0
37 38
38 Fixed Bugs 39 Fixed Bugs
39 ---------- 40 ----------
40 * #1613 - AdvancedFM - scale toolbar icons appropriately (drw) 41 * #1613 - AdvancedFM - scale toolbar icons appropriately (drw)
41 * #1620 - OFileSelector - show the button on press and not on press on hold (alwin) 42 * #1620 - OFileSelector - show the button on press and not on press on hold (alwin)
42 * #1473 - Opie-Eye - Same as #1620 but we lack a common FileSystem Button class (zecke) 43 * #1473 - Opie-Eye - Same as #1620 but we lack a common FileSystem Button class (zecke)
43 * n.a. - PackageManager - fix bug where messages show up multiple times in install dialog (drw) 44 * n.a. - PackageManager - fix bug where messages show up multiple times in install dialog (drw)
44 * n.a.- make qpeglobal.h include qglobal.h (zecke) 45 * n.a.- make qpeglobal.h include qglobal.h (zecke)
45 46
46 2005-03-20Opie 1.2.0-rc1 47 2005-03-20Opie 1.2.0-rc1
47 48
48 49
49 New Features 50 New Features
50 ------------ 51 ------------
51 * Launcher: Support a static background pixmap (mickeyl) 52 * Launcher: Support a static background pixmap (mickeyl)
52 * LauncherSettings: Choose whether to have a static background pixmap (mickeyl) 53 * LauncherSettings: Choose whether to have a static background pixmap (mickeyl)
53 * PackageManager supports the 'lists_dir' ipkg configuration option (drw) 54 * PackageManager supports the 'lists_dir' ipkg configuration option (drw)
54 * Added hi-res inline images for large resolution devices (drw) 55 * Added hi-res inline images for large resolution devices (drw)
55 * Improved launcher icons for consistency (ar) 56 * Improved launcher icons for consistency (ar)
56 * Datebook: Added plugin system to datebook so holidays and birthdays from contacts may displayed in datebook (alwin) 57 * Datebook: Added plugin system to datebook so holidays and birthdays from contacts may displayed in datebook (alwin)
57 58
58 Fixed Bugs 59 Fixed Bugs
59 ---------- 60 ----------
60 * #1236 - VCards contained empty home and work address entries causing Palms to crash (eilers) 61 * #1236 - VCards contained empty home and work address entries causing Palms to crash (eilers)
61 * #1412 - Launcher Settings - fixed default settings for background in Edit tab dialog (drw) 62 * #1412 - Launcher Settings - fixed default settings for background in Edit tab dialog (drw)
62 * #1472 - Opie textedit now check for unsaved changes on ESC key (ljp) 63 * #1472 - Opie textedit now check for unsaved changes on ESC key (ljp)
diff --git a/examples/opiecore/onotifytest/main.cpp b/examples/opiecore/onotifytest/main.cpp
index b773da9..7b7b0bc 100644
--- a/examples/opiecore/onotifytest/main.cpp
+++ b/examples/opiecore/onotifytest/main.cpp
@@ -2,65 +2,75 @@
2// LICENSE = "GPLv2" 2// LICENSE = "GPLv2"
3 3
4#include "main.h" 4#include "main.h"
5 5
6/* OPIE */ 6/* OPIE */
7#include <opie2/odebug.h> 7#include <opie2/odebug.h>
8#include <opie2/oapplication.h> 8#include <opie2/oapplication.h>
9#include <opie2/ofilenotify.h> 9#include <opie2/ofilenotify.h>
10using namespace Opie::Core; 10using namespace Opie::Core;
11 11
12/* QT */ 12/* QT */
13#include <qdir.h> 13#include <qdir.h>
14#include <qpushbutton.h> 14#include <qpushbutton.h>
15#include <qstringlist.h> 15#include <qstringlist.h>
16#include <qtextstream.h> 16#include <qtextstream.h>
17#include <qmessagebox.h> 17#include <qmessagebox.h>
18 18
19App::App( int argc, char** argv ) : QApplication( argc, argv ) 19App::App( int argc, char** argv ) : QApplication( argc, argv )
20{ 20{
21 odebug << "App()" << oendl; 21 odebug << "App()" << oendl;
22#if 0 22#if 0
23 tmpfoo = new OFile( "/tmp/foo" ); 23 tmpfoo = new OFile( "/tmp/foo" );
24 if ( tmpfoo->open( IO_ReadWrite ) ) 24 if ( tmpfoo->open( IO_ReadWrite ) )
25 { 25 {
26 QTextStream stream( tmpfoo ); 26 QTextStream stream( tmpfoo );
27 stream << "This is my content"; 27 stream << "This is my content";
28 } 28 }
29 29
30 QObject::connect( tmpfoo, SIGNAL(accessed(const QString&)), this, SLOT(quit()) ); 30 QObject::connect( tmpfoo, SIGNAL(accessed(const QString&)), this, SLOT(quit()) );
31 QObject::connect( tmpfoo, SIGNAL(closed(const QString&,bool)), this, SLOT(quit()) ); 31 QObject::connect( tmpfoo, SIGNAL(closed(const QString&,bool)), this, SLOT(quit()) );
32#endif 32#endif
33 33
34 ODirNotification* tmpfoo = new ODirNotification( 0, 0 ); 34 tmpfoo = new ODirNotification( 0, 0 );
35 35
36 int result = tmpfoo->watch( "/tmp/foo", false, CreateFile, 2 ); 36 int result = tmpfoo->watch( "/tmp/foo", false, CreateFile, 2 );
37 QObject::connect( tmpfoo, SIGNAL(triggered(const QString&,unsigned int,const QString&)), 37
38 this, SLOT(triggered(const QString&,unsigned int,const QString&)) ); 38 if ( result != -1 )
39 {
40 QObject::connect( tmpfoo, SIGNAL(triggered(const QString&,unsigned int,const QString&)),
41 this, SLOT(triggered(const QString&,unsigned int,const QString&)) );
42 }
43 else
44 {
45 QMessageBox::warning( qApp->desktop(), "info", "Couldn't watch /tmp/foo\nDoes it exist?" );
46 }
39} 47}
40 48
41App::~App() 49App::~App()
42{ 50{
43 odebug << "~App()" << oendl; 51 odebug << "~App()" << oendl;
52 delete tmpfoo;
44} 53}
45 54
46void App::triggered( const QString& str1, unsigned int id, const QString& str2 ) 55void App::triggered( const QString& str1, unsigned int id, const QString& str2 )
47{ 56{
48 QMessageBox::information( qApp->desktop(), "info", QString( "%1\n%2\n%3" ).arg( str1 ).arg( id ).arg( str2 ) ); 57 QMessageBox::information( qApp->desktop(), "info", QString().sprintf( "%s\n0x%08x\n%s",
58 (const char*) str1, id, (const char*) str2 ) );
49} 59}
50 60
51int main( int argc, char** argv ) 61int main( int argc, char** argv )
52{ 62{
53 App* app = new App( argc, argv ); 63 App* app = new App( argc, argv );
54 QPushButton* b = new QPushButton( "Click me to close", 0 ); 64 QPushButton* b = new QPushButton( "Click me to close", 0 );
55 QObject::connect( b, SIGNAL(clicked()), qApp, SLOT(quit()) ); 65 QObject::connect( b, SIGNAL(clicked()), qApp, SLOT(quit()) );
56 b->resize( 200, 200 ); 66 b->resize( 200, 200 );
57 b->move( 150, 150 ); 67 b->move( 150, 150 );
58 b->show(); 68 b->show();
59 app->setMainWidget( b ); 69 app->setMainWidget( b );
60 app->exec(); 70 app->exec();
61 delete app; 71 delete app;
62 72
63 return 0; 73 return 0;
64 74
65} 75}
66 76
diff --git a/examples/opiecore/onotifytest/main.h b/examples/opiecore/onotifytest/main.h
index afad947..7ce4b9f 100644
--- a/examples/opiecore/onotifytest/main.h
+++ b/examples/opiecore/onotifytest/main.h
@@ -1,23 +1,29 @@
1// (C) Michael 'Mickey' Lauer <mickey@Vanille.de> 1// (C) Michael 'Mickey' Lauer <mickey@Vanille.de>
2// LICENSE = "GPLv2" 2// LICENSE = "GPLv2"
3 3
4#ifndef MAIN_H 4#ifndef MAIN_H
5#define MAIN_H 5#define MAIN_H
6 6
7/* OPIE */
8#include <opie2/ofilenotify.h>
9
7/* QT */ 10/* QT */
8#include <qapplication.h> 11#include <qapplication.h>
9#include <qpushbutton.h> 12#include <qpushbutton.h>
10#include <qtextstream.h> 13#include <qtextstream.h>
11 14
12class App : public QApplication 15class App : public QApplication
13{ 16{
14 Q_OBJECT 17 Q_OBJECT
15public: 18 public:
16 App( int argc, char** argv ); 19 App( int argc, char** argv );
17 ~App(); 20 ~App();
18 21
19public slots: 22 public slots:
20 void triggered( const QString&, unsigned int, const QString& ); 23 void triggered( const QString&, unsigned int, const QString& );
24
25 private:
26 Opie::Core::ODirNotification* tmpfoo;
21}; 27};
22 28
23#endif 29#endif
diff --git a/libopie2/opiecore/linux/ofilenotify.cpp b/libopie2/opiecore/linux/ofilenotify.cpp
index a7820ee..68c5a96 100644
--- a/libopie2/opiecore/linux/ofilenotify.cpp
+++ b/libopie2/opiecore/linux/ofilenotify.cpp
@@ -207,194 +207,200 @@ void OFileNotification::stop()
207 _path = QString::null; 207 _path = QString::null;
208 _wd = 0; 208 _wd = 0;
209 _active = false; 209 _active = false;
210 if ( notification_list.isEmpty() ) 210 if ( notification_list.isEmpty() )
211 { 211 {
212 OFileNotification::unregisterEventHandler(); 212 OFileNotification::unregisterEventHandler();
213 } 213 }
214} 214}
215 215
216 216
217OFileNotificationType OFileNotification::type() const 217OFileNotificationType OFileNotification::type() const
218{ 218{
219 return _type; 219 return _type;
220} 220}
221 221
222 222
223QString OFileNotification::path() const 223QString OFileNotification::path() const
224{ 224{
225 return _path; 225 return _path;
226} 226}
227 227
228 228
229bool OFileNotification::isSingleShot() const 229bool OFileNotification::isSingleShot() const
230{ 230{
231 return !_multi; 231 return !_multi;
232} 232}
233 233
234 234
235bool OFileNotification::activate( const OFileNotificationEvent* e ) 235bool OFileNotification::activate( const OFileNotificationEvent* e )
236{ 236{
237 qDebug( "OFileNotification::activate(): e = ( %s, %d, 0x%08x, %d, %s )", (const char*) _path, e->descriptor(), e->mask(), e->cookie(), (const char*) e->name() ); 237 qDebug( "OFileNotification::activate(): e = ( %s, %d, 0x%08x, %d, %s )", (const char*) _path, e->descriptor(), e->mask(), e->cookie(), (const char*) e->name() );
238 238
239 //FIXME: Should we really deliver QueueOverflow and/or Ignore to user level code?
240
239 // dumb signal 241 // dumb signal
240 _signal.activate(); 242 _signal.activate();
241 243
242 // generic signal 244 // generic signal
243 emit triggered( _path, e->mask(), e->name() ); 245 emit triggered( _path, e->mask(), e->name() );
244 246
245 // specialized signals 247 // specialized signals
246 switch ( e->mask() ) 248 switch ( e->mask() )
247 { 249 {
248 case Access: emit accessed( _path ); break; 250 case Access: emit accessed( _path ); break;
249 case Modify: emit modified( _path ); break; 251 case Modify: emit modified( _path ); break;
250 case Attrib: emit attributed( _path); break; 252 case Attrib: emit attributed( _path); break;
251 case CloseWrite: emit closed( _path, true ); break; 253 case CloseWrite: emit closed( _path, true ); break;
252 case CloseNoWrite: emit closed( _path, false ); break; 254 case CloseNoWrite: emit closed( _path, false ); break;
253 case Open: emit opened( _path ); break; 255 case Open: emit opened( _path ); break;
254 case MovedFrom: emit movedFrom( _path, e->name() ); break; 256 case MovedFrom: emit movedFrom( _path, e->name() ); break;
255 case MovedTo: emit movedTo( _path, e->name() ); break; 257 case MovedTo: emit movedTo( _path, e->name() ); break;
256 case DeleteSubdir: emit deletedSubdir( _path, e->name() ); break; 258 case DeleteSubdir: emit deletedSubdir( _path, e->name() ); break;
257 case DeleteFile: emit deletedFile( _path, e->name() ); break; 259 case DeleteFile: emit deletedFile( _path, e->name() ); break;
258 case CreateSubdir: emit createdSubdir( _path, e->name() ); break; 260 case CreateSubdir: emit createdSubdir( _path, e->name() ); break;
259 case CreateFile: emit createdFile( _path, e->name() ); break; 261 case CreateFile: emit createdFile( _path, e->name() ); break;
260 case DeleteSelf: emit deleted( _path ); break; 262 case DeleteSelf: emit deleted( _path ); break;
261 case Unmount: emit unmounted( _path ); break; 263 case Unmount: emit unmounted( _path ); break;
264 case _QueueOverflow: qFatal( "OFileNotification::activate() - Inotify Event Queue Overload!" ); break;
265 case _Ignored: qWarning( "OFileNotification::activate() - Further Events for '%s' will be ignored", (const char*) _path ); break;
262 default: assert( 0 ); 266 default: assert( 0 );
263 } 267 }
264 268
269 delete e;
270
265 if ( !_multi ) stop(); 271 if ( !_multi ) stop();
266 272
267 return true; 273 return true;
268} 274}
269 275
270 276
271bool OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type ) 277bool OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type )
272{ 278{
273 OFileNotification* ofn = new OFileNotification(); 279 OFileNotification* ofn = new OFileNotification();
274 ofn->_signal.connect( receiver, member ); 280 ofn->_signal.connect( receiver, member );
275 return ofn->watch( path, true, type ) != -1; 281 return ofn->watch( path, true, type ) != -1;
276} 282}
277 283
278 284
279void OFileNotification::inotifyEventHandler() 285void OFileNotification::inotifyEventHandler()
280{ 286{
281 qDebug( "OFileNotification::inotifyEventHandler(): reached." ); 287 qDebug( "OFileNotification::inotifyEventHandler(): reached." );
282 288
283 char buffer[16384]; 289 char buffer[16384];
284 ssize_t buffer_i; 290 ssize_t buffer_i;
285 struct inotify_event *pevent, *event; 291 struct inotify_event *pevent, *event;
286 ssize_t r; 292 ssize_t r;
287 size_t event_size; 293 size_t event_size;
288 int count = 0; 294 int count = 0;
289 295
290 r = ::read(_fd, buffer, 16384); 296 r = ::read(_fd, buffer, 16384);
291 297
292 if ( r <= 0 ) 298 if ( r <= 0 )
293 return; 299 return;
294 300
295 buffer_i = 0; 301 buffer_i = 0;
296 while ( buffer_i < r ) 302 while ( buffer_i < r )
297 { 303 {
298 pevent = (struct inotify_event *)&buffer[buffer_i]; 304 pevent = (struct inotify_event *)&buffer[buffer_i];
299 event_size = sizeof(struct inotify_event) + pevent->len; 305 event_size = sizeof(struct inotify_event) + pevent->len;
300 OFileNotificationEvent* e = new OFileNotificationEvent( notification_list[ pevent->wd ], pevent->wd, pevent->mask, 306 OFileNotificationEvent* e = new OFileNotificationEvent( notification_list[ pevent->wd ], pevent->wd, pevent->mask,
301 pevent->cookie, pevent->len ? pevent->name : 0 ); 307 pevent->cookie, pevent->len ? pevent->name : 0 );
302 e->activate(); 308 e->activate();
303 buffer_i += event_size; 309 buffer_i += event_size;
304 count++; 310 count++;
305 } 311 }
306 312
307 qDebug( "OFileNotification::inotifyEventHandler(): processed %d events", count ); 313 qDebug( "OFileNotification::inotifyEventHandler(): processed %d events", count );
308} 314}
309 315
310 316
311bool OFileNotification::registerEventHandler() 317bool OFileNotification::registerEventHandler()
312{ 318{
313 OFileNotification::_fd = ::open( INOTIFY_DEVICE, O_RDONLY ); 319 OFileNotification::_fd = ::open( INOTIFY_DEVICE, O_RDONLY );
314 if ( OFileNotification::_fd < 0 ) 320 if ( OFileNotification::_fd < 0 )
315 { 321 {
316 qWarning( "OFileNotification::registerEventHandler(): couldn't register event handler: %s", strerror( errno ) ); 322 qWarning( "OFileNotification::registerEventHandler(): couldn't register event handler: %s", strerror( errno ) );
317 return false; 323 return false;
318 } 324 }
319 325
320 OFileNotification::_sn = new QSocketNotifier( _fd, QSocketNotifier::Read, this, "inotify event" ); 326 OFileNotification::_sn = new QSocketNotifier( _fd, QSocketNotifier::Read );
321 connect( OFileNotification::_sn, SIGNAL( activated(int) ), this, SLOT( inotifyEventHandler() ) ); 327 connect( OFileNotification::_sn, SIGNAL( activated(int) ), this, SLOT( inotifyEventHandler() ) );
322 328
323 qDebug( "OFileNotification::registerEventHandler(): done" ); 329 qDebug( "OFileNotification::registerEventHandler(): done" );
324 return true; 330 return true;
325} 331}
326 332
327 333
328void OFileNotification::unregisterEventHandler() 334void OFileNotification::unregisterEventHandler()
329{ 335{
330 if ( _sn ) delete _sn; 336 if ( _sn ) delete _sn;
331 if ( OFileNotification::_fd ) 337 if ( OFileNotification::_fd )
332 ::close( OFileNotification::_fd ); 338 ::close( OFileNotification::_fd );
333 qDebug( "OFileNotification::unregisterEventHandler(): done" ); 339 qDebug( "OFileNotification::unregisterEventHandler(): done" );
334} 340}
335 341
336//================================================================================================= 342//=================================================================================================
337// ODirNotification 343// ODirNotification
338//================================================================================================= 344//=================================================================================================
339ODirNotification::ODirNotification( QObject* parent, const char* name ) 345ODirNotification::ODirNotification( QObject* parent, const char* name )
340 :QObject( parent, name ), _topfilenotification( 0 ), _type( Nothing ), _depth( -123 ) 346 :QObject( parent, name ), _topfilenotification( 0 ), _type( Nothing ), _depth( -123 )
341{ 347{
342 qDebug( "ODirNotification::ODirNotification()" ); 348 qDebug( "ODirNotification::ODirNotification()" );
343} 349}
344 350
345 351
346ODirNotification::~ODirNotification() 352ODirNotification::~ODirNotification()
347{ 353{
348 qDebug( "ODirNotification::~ODirNotification()" ); 354 qDebug( "ODirNotification::~ODirNotification()" );
349} 355}
350 356
351/* 357/**
352 Love-Trowbridge recursive directory scanning algorithm: 358 Love-Trowbridge recursive directory scanning algorithm:
353 359
354 Step 1. Start at initial directory foo. Add watch. 360 Step 1. Start at initial directory foo. Add watch.
355 361
356 Step 2. Setup handlers for watch created in Step 1. 362 Step 2. Setup handlers for watch created in Step 1.
357 Specifically, ensure that a directory created 363 Specifically, ensure that a directory created
358 in foo will result in a handled CREATE_SUBDIR 364 in foo will result in a handled CREATE_SUBDIR
359 event. 365 event.
360 366
361 Step 3. Read the contents of foo. 367 Step 3. Read the contents of foo.
362 368
363 Step 4. For each subdirectory of foo read in step 3, repeat 369 Step 4. For each subdirectory of foo read in step 3, repeat
364 step 1. 370 step 1.
365 371
366 Step 5. For any CREATE_SUBDIR event on bar, if a watch is 372 Step 5. For any CREATE_SUBDIR event on bar, if a watch is
367 not yet created on bar, repeat step 1 on bar. 373 not yet created on bar, repeat step 1 on bar.
368*/ 374**/
369 375
370int ODirNotification::watch( const QString& path, bool sshot, OFileNotificationType type, int recurse ) 376int ODirNotification::watch( const QString& path, bool sshot, OFileNotificationType type, int recurse )
371{ 377{
372 if ( _type == Nothing ) _type = type; // only set it once - for the top level call 378 if ( _type == Nothing ) _type = type; // only set it once - for the top level call
373 OFileNotificationType subtype = ( recurse != 0 ) ? (OFileNotificationType) int( _type | CreateSubdir ) : _type; 379 OFileNotificationType subtype = ( recurse != 0 ) ? (OFileNotificationType) int( _type | CreateSubdir ) : _type;
374 qDebug( "ODirNotification::watch( %s, %d, 0x%08x, %d )", (const char*) path, sshot, subtype, recurse ); 380 qDebug( "ODirNotification::watch( %s, %d, 0x%08x, %d )", (const char*) path, sshot, subtype, recurse );
375 OFileNotification* fn = new OFileNotification( this, "ODirNotification delegate" ); 381 OFileNotification* fn = new OFileNotification( this, "ODirNotification delegate" );
376 382
377 int result = fn->startWatching( path, sshot, subtype ); 383 int result = fn->startWatching( path, sshot, subtype );
378 if ( result != -1 ) 384 if ( result != -1 )
379 { 385 {
380 386
381 if ( !_topfilenotification ) _topfilenotification = fn; // only set it once - for the top level call 387 if ( !_topfilenotification ) _topfilenotification = fn; // only set it once - for the top level call
382 if ( _depth == -123 ) _depth = recurse; // only set it once - for the top level call 388 if ( _depth == -123 ) _depth = recurse; // only set it once - for the top level call
383 389
384 connect( fn, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ), this, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ) ); 390 connect( fn, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ), this, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ) );
385 connect( fn, SIGNAL( accessed( const QString& ) ), this, SIGNAL( accessed( const QString& ) ) ); 391 connect( fn, SIGNAL( accessed( const QString& ) ), this, SIGNAL( accessed( const QString& ) ) );
386 connect( fn, SIGNAL( modified( const QString& ) ), this, SIGNAL( modified( const QString& ) ) ); 392 connect( fn, SIGNAL( modified( const QString& ) ), this, SIGNAL( modified( const QString& ) ) );
387 connect( fn, SIGNAL( attributed( const QString& ) ), this, SIGNAL( attributed( const QString& ) ) ); 393 connect( fn, SIGNAL( attributed( const QString& ) ), this, SIGNAL( attributed( const QString& ) ) );
388 connect( fn, SIGNAL( closed( const QString&, bool ) ), this, SIGNAL( closed( const QString&, bool ) ) ); 394 connect( fn, SIGNAL( closed( const QString&, bool ) ), this, SIGNAL( closed( const QString&, bool ) ) );
389 connect( fn, SIGNAL( opened( const QString& ) ), this, SIGNAL( opened( const QString& ) ) ); 395 connect( fn, SIGNAL( opened( const QString& ) ), this, SIGNAL( opened( const QString& ) ) );
390 connect( fn, SIGNAL( movedTo( const QString&, const QString& ) ), this, SIGNAL( movedTo( const QString&, const QString& ) ) ); 396 connect( fn, SIGNAL( movedTo( const QString&, const QString& ) ), this, SIGNAL( movedTo( const QString&, const QString& ) ) );
391 connect( fn, SIGNAL( movedFrom( const QString&, const QString& ) ), this, SIGNAL( movedFrom( const QString&, const QString& ) ) ); 397 connect( fn, SIGNAL( movedFrom( const QString&, const QString& ) ), this, SIGNAL( movedFrom( const QString&, const QString& ) ) );
392 connect( fn, SIGNAL( deletedSubdir( const QString&, const QString& ) ), this, SIGNAL( deletedSubdir( const QString&, const QString& ) ) ); 398 connect( fn, SIGNAL( deletedSubdir( const QString&, const QString& ) ), this, SIGNAL( deletedSubdir( const QString&, const QString& ) ) );
393 connect( fn, SIGNAL( deletedFile( const QString&, const QString& ) ), this, SIGNAL( deletedFile( const QString&, const QString& ) ) );; 399 connect( fn, SIGNAL( deletedFile( const QString&, const QString& ) ), this, SIGNAL( deletedFile( const QString&, const QString& ) ) );;
394 connect( fn, SIGNAL( createdSubdir( const QString&, const QString& ) ), this, SIGNAL( createdSubdir( const QString&, const QString& ) ) ); 400 connect( fn, SIGNAL( createdSubdir( const QString&, const QString& ) ), this, SIGNAL( createdSubdir( const QString&, const QString& ) ) );
395 connect( fn, SIGNAL( createdFile( const QString&, const QString& ) ), this, SIGNAL( createdFile( const QString&, const QString& ) ) ); 401 connect( fn, SIGNAL( createdFile( const QString&, const QString& ) ), this, SIGNAL( createdFile( const QString&, const QString& ) ) );
396 connect( fn, SIGNAL( deleted( const QString& ) ), this, SIGNAL( deleted( const QString& ) ) ); 402 connect( fn, SIGNAL( deleted( const QString& ) ), this, SIGNAL( deleted( const QString& ) ) );
397 connect( fn, SIGNAL( unmounted( const QString& ) ), this, SIGNAL( unmounted( const QString& ) ) ); 403 connect( fn, SIGNAL( unmounted( const QString& ) ), this, SIGNAL( unmounted( const QString& ) ) );
398 404
399 if ( recurse != 0 ) 405 if ( recurse != 0 )
400 { 406 {
diff --git a/libopie2/opiecore/linux/ofilenotify.h b/libopie2/opiecore/linux/ofilenotify.h
index 17e6b5d..c713b30 100644
--- a/libopie2/opiecore/linux/ofilenotify.h
+++ b/libopie2/opiecore/linux/ofilenotify.h
@@ -228,65 +228,66 @@ class OFileNotification : public QObject
228 void unmounted( const QString& ); 228 void unmounted( const QString& );
229 229
230 protected: 230 protected:
231 bool activate( const OFileNotificationEvent* e ); 231 bool activate( const OFileNotificationEvent* e );
232 232
233 private slots: 233 private slots:
234 void inotifyEventHandler(); 234 void inotifyEventHandler();
235 235
236 private: 236 private:
237 bool registerEventHandler(); 237 bool registerEventHandler();
238 void unregisterEventHandler(); 238 void unregisterEventHandler();
239 239
240 QString _path; 240 QString _path;
241 OFileNotificationType _type; 241 OFileNotificationType _type;
242 QSignal _signal; 242 QSignal _signal;
243 bool _active; 243 bool _active;
244 bool _multi; 244 bool _multi;
245 static QSocketNotifier* _sn; 245 static QSocketNotifier* _sn;
246 int _wd; // inotify watch descriptor 246 int _wd; // inotify watch descriptor
247 static int _fd; // inotify device descriptor 247 static int _fd; // inotify device descriptor
248 248
249 friend class OFileNotificationEvent; 249 friend class OFileNotificationEvent;
250}; 250};
251 251
252/*====================================================================================== 252/*======================================================================================
253 * ODirNotification 253 * ODirNotification
254 *======================================================================================*/ 254 *======================================================================================*/
255 255
256/** 256/**
257 * @brief Represents a directory notification 257 * @brief Represents a directory notification
258 * 258 *
259 * This class allows to watch for events happening to directories 259 * This class allows to watch for events happening to directories
260 * It uses the OFileNotification class 260 * It uses the OFileNotification class and (for recursive watches)
261 * implements the Love-Trowbridge recursive directory scanning algorithm.
261 * 262 *
262 * @see http://www.kernel.org/pub/linux/kernel/people/rml/inotify/ 263 * @see http://www.kernel.org/pub/linux/kernel/people/rml/inotify/
263 * 264 *
264 * @author Michael 'Mickey' Lauer <mickey@vanille.de> 265 * @author Michael 'Mickey' Lauer <mickey@vanille.de>
265 * 266 *
266 **/ 267 **/
267 268
268class ODirNotification : public QObject 269class ODirNotification : public QObject
269{ 270{
270 Q_OBJECT 271 Q_OBJECT
271 272
272 public: 273 public:
273 ODirNotification( QObject* parent = 0, const char* name = 0 ); 274 ODirNotification( QObject* parent = 0, const char* name = 0 );
274 ~ODirNotification(); 275 ~ODirNotification();
275 /** 276 /**
276 * Starts to watch for @a type changes to @a path. Recurse @a recurse levels down the filesystem tree, 277 * Starts to watch for @a type changes to @a path. Recurse @a recurse levels down the filesystem tree,
277 * use 0 for no recursion and -1 for unlimited recursion. 278 * use 0 for no recursion and -1 for unlimited recursion.
278 * Set @a sshot to True if you want to be notified only once. 279 * Set @a sshot to True if you want to be notified only once.
279 **/ 280 **/
280 int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify, int recurse = 0 ); 281 int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify, int recurse = 0 );
281 282
282 signals: 283 signals:
283 /** 284 /**
284 * This signal is emitted if an event happens of the specified type happens to the directory being watched. 285 * This signal is emitted if an event happens of the specified type happens to the directory being watched.
285 **/ 286 **/
286 void triggered( const QString&, unsigned int, const QString& ); 287 void triggered( const QString&, unsigned int, const QString& );
287 void accessed( const QString& ); 288 void accessed( const QString& );
288 void modified( const QString& ); 289 void modified( const QString& );
289 void attributed( const QString& ); 290 void attributed( const QString& );
290 void closed( const QString&, bool ); 291 void closed( const QString&, bool );
291 void opened( const QString& ); 292 void opened( const QString& );
292 void movedTo( const QString&, const QString& ); 293 void movedTo( const QString&, const QString& );
diff --git a/scripts/addLanguage.sh b/scripts/addLanguage.sh
new file mode 100755
index 0000000..e321804
--- a/dev/null
+++ b/scripts/addLanguage.sh
@@ -0,0 +1,33 @@
1#!/bin/bash
2
3# (c) 2002 Bruno Rodrigues <bruno.rodrigues@litux.org>
4# Under GPL Licence
5
6# Add a new TRANSLATION line to every .pro file if there
7# is already at least one TRANSLATION file and this LANG
8# is not present
9# The perl line would grab a TRANSLATION = something and
10# duplicate it to TRANSLATION += .../LANG/...
11
12LANG=$1
13
14if [ "$1x" == "x" ] ; then
15 echo "Usage: $0 <LANG>"
16 exit
17fi
18
19for i in `find . -name "*.pro"` ; do
20 grep TRANSLATIONS $i > /dev/null
21 if [ "$?" != 0 ] ; then
22 echo "$i: No Translations"
23 else
24 grep "../i18n/$LANG/" $i > /dev/null
25 if [ "$?" == 0 ] ; then
26 echo "$i: $LANG already there"
27 else
28 echo "$i: Adding $LANG"
29 perl -p -i.bak -e 's/^(TRANSLATIONS\s*\+?=\s*)(.+?i18n\/)(.+?)(\/.+?\.ts)(.*)$/$1$2$3$4 \\\n\t $2'$LANG'$4$5/' $i
30 fi
31 fi
32done
33
diff --git a/scripts/mkipks b/scripts/mkipks
new file mode 100755
index 0000000..f142029
--- a/dev/null
+++ b/scripts/mkipks
@@ -0,0 +1,261 @@
1#!/bin/sh
2
3if [ -z "$QTE_BASEVERSION" ]
4then
5 if [ -e $QTDIR/include/qglobal.h ]
6 then
7 QTE_BASEVERSION=`cat $QTDIR/include/qglobal.h|grep '^#define QT_VERSION'|grep -v STR|sed -e 's,#define QT_VERSION\t*,,;' -e 's,.*\([0-9]\)\([0-9]\)\([0-9]\).*,\1.\2.\3,;'`
8 else
9 QTE_BASEVERSION=2.3.4
10 fi
11fi
12if [ -z "$QTE_VERSION" ]
13then
14 if [ -e $QTDIR/include/qglobal.h ]
15 then
16 QTE_VERSION=`cat $QTDIR/include/qglobal.h|grep '^#define QT_VERSION_STR'|sed -e 's,#define QT_VERSION_STR\t*,,;' -e 's,.*"\([^"]*\)".*,\1,;'`
17 else
18 QTE_VERSION=2.3.4
19 fi
20fi
21[ -z "$QTE_REVISION" ] && QTE_REVISION=5
22DEB_VERSION=2.0
23
24# Have to do this here, since CVS can't store symlinks
25
26mkdir -p $OPIEDIR/etc/rcS.d
27ln -sf ../init.d/bootsplash $OPIEDIR/etc/rcS.d/S01bootsplash
28
29VERSION_MAJ=$(sed -n -e 's/.*QPE_VERSION "\([0-9]*\)\..*\..*".*/\1/p' <$OPIEDIR/include/qpe/version.h)
30VERSION_MIN=$(sed -n -e 's/.*QPE_VERSION ".*\.\([0-9]*\)\..*".*/\1/p' <$OPIEDIR/include/qpe/version.h)
31VERSION_PAT=$(sed -n -e 's/.*QPE_VERSION ".*\..*\.\([0-9]*\).*/\1/p' <$OPIEDIR/include/qpe/version.h)
32SUB_VERSION=$(sed -n -e 's,.*SUB_VERSION \"\(.*\)\".*,\1,p' <$OPIEDIR/include/qpe/version.h)
33if grep -q 'QPE_VERSION .*snapshot' $OPIEDIR/include/qpe/version.h
34then
35 [ -z "$VERSION_CVS" ] && VERSION_CVS="$(date +%Y%m%d)"
36 SUB_VERSION=$VERSION_CVS
37else
38 VERSION_CVS=""
39fi
40
41QPE_VERSION=$VERSION_MAJ.$VERSION_MIN.$VERSION_PAT
42
43ARCH=arm
44STRIP=arm-linux-strip
45STRIP_FILES="*ARM*not stripped"
46
47TDIR=/tmp/ipk$$
48DATADIR=$TDIR
49CTRLDIR=$TDIR/CONTROL
50
51IMAGEDIR=
52VERB=
53LIST=
54RPM=
55
56while [ $# -ne 0 ]
57do
58 case "$1" in
59 -v)
60 VERB=1
61 echo >&2 "Packaging for version $VERSION_MAJ.$VERSION_MIN.$VERSION_PAT$VERSION_CVS"
62 ;; -l)
63 LIST=1
64 ;; -i)
65 shift
66 IMAGEDIR=$1
67 DATADIR=$IMAGEDIR
68 mkdir -p $IMAGEDIR
69 ;; -classic)
70 classicopts=-c
71 ;; -rpm)
72 if [ "$OPIEDIR" != "/opt/Qtopia" ]
73 then
74 echo >&2 '$OPIEDIR is not the standard /usr/Qtopia directory.'
75 sleep 1
76 #exit 1
77 fi
78 RPM=1
79 ;; -arch)
80 shift
81 ARCH=$1
82 STRIP=
83 STRIP_FILES=
84 ;; /*)
85 FILES="$FILES $1"
86 ;; *)
87 FILES="$FILES $PWD/$1"
88 esac
89 shift
90done
91
92if [ -z "$FILES" ]
93then
94 FILES=`find $OPIEDIR -name "*.control" -print`
95fi
96
97RDIR=$PWD
98ORIGDIR=`pwd`
99cd $OPIEDIR
100
101for i in $FILES
102do
103 rm -rf $TDIR
104
105 mkdir -p $DATADIR
106 mkdir -p $CTRLDIR
107
108 packagename=${i##*/}; packagename=${packagename%.control}
109 version=$(eval echo '"'$(sed -n -e "s/^Version: *//p" $i)'"')
110 depends=$(eval echo '"'$(sed -n -e "s/^Depends: *//p" $i)'"')
111 files=$(eval echo $(sed -n -e "s/^Files://p" $i))
112 arch=$(eval echo $(sed -n -e "s/^Arch://p" $i))
113 section=$(sed -n -e "s/^Section: *//p" $i)
114 provides=$(sed -n -e "s/^Provides: *//p" $i)
115 conflicts=$(sed -n -e "s/^Conflicts: *//p" $i)
116 license=$(sed -n -e "s/^License: *//p" $i)
117 summary=$(sed -n -e "s/^Description: *//p" $i)
118 package=${packagename}_${version}_$ARCH
119 ERROR=
120 if [ -z "$files" ]
121 then
122 mkdir -p $DATADIR/usr/share/doc/$packagename
123 else
124 for f in $files
125 do
126 if [ -d $f ]
127 then
128 ffiles=$(find $f -type f -o -type b -o -type c -o -type l)
129 else
130 ffiles=$f
131 fi
132 for ff in $ffiles
133 do
134 case $ff in
135 */CVS/*)
136 continue
137 ;;*~)
138 continue
139 ;;*.control)
140 continue
141 ;; $QTDIR/*)
142 BASE=$(dirname /opt/QtPalmtop/${ff#$QTDIR/})
143 ;; etc/*.d/*)
144 BASE=$(dirname /$ff)
145 ;; root/*)
146 BASE=$(dirname ${ff#root})
147 ;; lib/*)
148 BASE=$(dirname /opt/QtPalmtop/$ff)
149 ;; $OPIEDIR/lib/*)
150 BASE=$(dirname /opt/QtPalmtop/${ff#$OPIEDIR/})
151 ;; $OPIEDIR/root/*)
152 BASE=$(dirname /${ff#$OPIEDIR/root/})
153 ;; *)
154 # For SHARP ROM compatibility. Should change to Qtopia.
155 BASE=/opt/QtPalmtop/$(dirname $ff)
156 esac
157
158 if [ -f $ff -o -b $ff -o -c $ff ]
159 then
160 D=$DATADIR$BASE
161 if [ -x $ff -a -n "$STRIP" ]
162 then
163 case $(file $ff) in
164 $STRIP_FILES)
165 $STRIP $ff
166 ;; *)
167 esac
168 fi
169 if [ -n "$RPM" ]
170 then
171 case "$ff" in
172 /*) RPMFILES="$RPMFILES $ff"
173 ;; *) RPMFILES="$RPMFILES $OPIEDIR/$ff"
174 esac
175 else
176 mkdir -p $D
177 if cp -a $ff $D
178 then
179 true
180 else
181 ERROR=1
182 fi
183 fi
184 else
185 echo >&2 "$0: $i: No such file: $ff"
186 ERROR=1
187 fi
188 done
189 done
190 fi
191 if [ -z "$ERROR" ]
192 then
193 if [ -n "$RPM" ]
194 then
195 SPEC=/tmp/mkipks-rpm-$$.spec
196 echo >$SPEC "Summary: $summary"
197 echo >>$SPEC "Name: $packagename"
198 echo >>$SPEC "Group: $section" ##########
199 echo >>$SPEC "License: $license"
200 echo >>$SPEC "Version: ${version%-*}"
201 echo >>$SPEC "Release: ${version#*-}"
202
203 echo >>$SPEC "%description"
204 sed -n -e '/^Description:/,$ p' $i | tail +2 >>$SPEC
205 echo >>$SPEC "%files"
206 echo >>$SPEC "%defattr(-,root,root)"
207 /bin/ls $RPMFILES >>$SPEC
208 rpm -bb --target $ARCH-unknown-linux $SPEC
209 # rm $SPEC
210 elif [ -z "$IMAGEDIR" ]
211 then
212 #size=$(du -h -s $DATADIR | sed -e 's/[ ].*//')
213 if (which mkfs.jffs2 >/dev/null 2>&1); then
214 size=$(mkfs.jffs2 -r $DATADIR | wc -c)
215 fi
216 if ! (cat $i|grep -q ^Package:); then
217 echo "Package: $packagename" >$CTRLDIR/control
218 fi
219 if [ ! -z "$size" ]; then
220 echo "Installed-Size: $size" >>$CTRLDIR/control
221 else
222 if [ -z "$SIZEWARNED" ]
223 then
224 echo "Warning, no mkfs.jffs2 found, unable to set Installed-Size."
225 SIZEWARNED=1
226 fi
227 fi
228 echo "Architecture: $ARCH" >>$CTRLDIR/control
229 echo "Version: $version" >>$CTRLDIR/control
230 [ ! -z "$depends" ] && echo "Depends: $depends" >>$CTRLDIR/control
231 [ ! -z "$provides" ] && echo "Provides: $provides" >>$CTRLDIR/control
232 [ ! -z "$conflicts" ] && echo "Conflicts: $conflicts" >>$CTRLDIR/control
233 egrep -v "^(Files|Version|Depends|Provides|Conflicts|Architecture):" >>$CTRLDIR/control $i
234 [ -n "$classicopts" ] && echo "$DEB_VERSION" >$TDIR/debian-binary
235 base=${i%.control}
236 scripts="preinst postinst prerm postrm"
237 for pf in $scripts
238 do
239 if [ -e ${base}.$pf ]
240 then
241 cp ${base}.$pf $CTRLDIR/$pf
242 chmod 755 $CTRLDIR/$pf
243 fi
244 done
245 cd $ORIGDIR; $OPIEDIR/scripts/ipkg-build $classicopts -o root -g root $TDIR; cd $OPIEDIR;
246 RESULT=$package.ipk
247 if [ -n "$VERB" ]
248 then
249 echo >&2 "Built $RESULT ($size)"
250 fi
251 if [ -n "$LIST" ]
252 then
253 echo $RESULT
254 fi
255 fi
256 else
257 echo >&2 "Not building $package package"
258 fi
259done
260# clean up
261rm -rf $TDIR