-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | examples/opiecore/onotifytest/main.cpp | 18 | ||||
-rw-r--r-- | examples/opiecore/onotifytest/main.h | 10 | ||||
-rw-r--r-- | libopie2/opiecore/linux/ofilenotify.cpp | 40 | ||||
-rw-r--r-- | libopie2/opiecore/linux/ofilenotify.h | 3 | ||||
-rwxr-xr-x | scripts/addLanguage.sh | 33 | ||||
-rwxr-xr-x | scripts/mkipks | 261 |
7 files changed, 343 insertions, 25 deletions
@@ -1,78 +1,79 @@ | |||
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) |
63 | * #1474 - Implement GUI for Scrollbars on the Left in Appearance (zecke) | 64 | * #1474 - Implement GUI for Scrollbars on the Left in Appearance (zecke) |
64 | * #1482 - Fix double '/' in paths (zecke) | 65 | * #1482 - Fix double '/' in paths (zecke) |
65 | * #1536 - Autosave of custom locations in opie backup (ar) | 66 | * #1536 - Autosave of custom locations in opie backup (ar) |
66 | * #1539 - Fixed displaying too long path in the delete dialog in opie-eye (zecke) | 67 | * #1539 - Fixed displaying too long path in the delete dialog in opie-eye (zecke) |
67 | * #1540 - Implemented deletion of DocLnks in opie-eye (zecke) | 68 | * #1540 - Implemented deletion of DocLnks in opie-eye (zecke) |
68 | * #1542 - Fixed Todo crash when priority < 1 or > 5 (drw) | 69 | * #1542 - Fixed Todo crash when priority < 1 or > 5 (drw) |
69 | * #1550 - Browse for alarm sound start in QPEDIR/sounds/ (zecke) | 70 | * #1550 - Browse for alarm sound start in QPEDIR/sounds/ (zecke) |
70 | * #1554 - Fixed Opie-Console name in .desktop file (mickeyl) | 71 | * #1554 - Fixed Opie-Console name in .desktop file (mickeyl) |
71 | * #1556 - Start to look for sound files in /opt/QtPalmtop/sounds (zecke) | 72 | * #1556 - Start to look for sound files in /opt/QtPalmtop/sounds (zecke) |
72 | * #1558 - Fixed opie-login breaking opie startup (mickeyl) | 73 | * #1558 - Fixed opie-login breaking opie startup (mickeyl) |
73 | * #1560 - Fixed Opie-Console picking up the wrong shell (bluelightning) | 74 | * #1560 - Fixed Opie-Console picking up the wrong shell (bluelightning) |
74 | * #1570 - Confirmation needed befor Restore a backup and overwrite local data (ar) | 75 | * #1570 - Confirmation needed befor Restore a backup and overwrite local data (ar) |
75 | * #1591 - Addressbook sortorder changed by clicking on column 0 (eilers) | 76 | * #1591 - Addressbook sortorder changed by clicking on column 0 (eilers) |
76 | * #1599 - Security - change recommendation for opie-multiauth to opie-securityplugin (gints) | 77 | * #1599 - Security - change recommendation for opie-multiauth to opie-securityplugin (gints) |
77 | * #1604 - Checkbook crashed on startup (drw) | 78 | * #1604 - Checkbook crashed on startup (drw) |
78 | * #1608 - Addressbook crashed after search, which may caused by not initialzed member variable (eilers) | 79 | * #1608 - Addressbook crashed after search, which may caused by not initialzed member variable (eilers) |
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 | |||
@@ -1,66 +1,76 @@ | |||
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 | #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> |
10 | using namespace Opie::Core; | 10 | using 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 | ||
19 | App::App( int argc, char** argv ) : QApplication( argc, argv ) | 19 | App::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 | ||
41 | App::~App() | 49 | App::~App() |
42 | { | 50 | { |
43 | odebug << "~App()" << oendl; | 51 | odebug << "~App()" << oendl; |
52 | delete tmpfoo; | ||
44 | } | 53 | } |
45 | 54 | ||
46 | void App::triggered( const QString& str1, unsigned int id, const QString& str2 ) | 55 | void 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 | ||
51 | int main( int argc, char** argv ) | 61 | int 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 | ||
12 | class App : public QApplication | 15 | class App : public QApplication |
13 | { | 16 | { |
14 | Q_OBJECT | 17 | Q_OBJECT |
15 | public: | 18 | public: |
16 | App( int argc, char** argv ); | 19 | App( int argc, char** argv ); |
17 | ~App(); | 20 | ~App(); |
18 | 21 | ||
19 | public 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 | |||
@@ -191,226 +191,232 @@ int OFileNotification::startWatching( const QString& path, bool sshot, OFileNoti | |||
191 | return -1; | 191 | return -1; |
192 | } | 192 | } |
193 | 193 | ||
194 | notification_list.insert( _wd, this ); | 194 | notification_list.insert( _wd, this ); |
195 | _path = path; | 195 | _path = path; |
196 | _multi = !sshot; | 196 | _multi = !sshot; |
197 | _type = type; | 197 | _type = type; |
198 | _active = true; | 198 | _active = true; |
199 | qDebug( "OFileNotification::watch(): watching '%s' [wd=%d].", (const char*) path, _wd ); | 199 | qDebug( "OFileNotification::watch(): watching '%s' [wd=%d].", (const char*) path, _wd ); |
200 | return _wd; | 200 | return _wd; |
201 | } | 201 | } |
202 | 202 | ||
203 | 203 | ||
204 | void OFileNotification::stop() | 204 | void OFileNotification::stop() |
205 | { | 205 | { |
206 | notification_list.remove( _wd ); | 206 | notification_list.remove( _wd ); |
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 | ||
217 | OFileNotificationType OFileNotification::type() const | 217 | OFileNotificationType OFileNotification::type() const |
218 | { | 218 | { |
219 | return _type; | 219 | return _type; |
220 | } | 220 | } |
221 | 221 | ||
222 | 222 | ||
223 | QString OFileNotification::path() const | 223 | QString OFileNotification::path() const |
224 | { | 224 | { |
225 | return _path; | 225 | return _path; |
226 | } | 226 | } |
227 | 227 | ||
228 | 228 | ||
229 | bool OFileNotification::isSingleShot() const | 229 | bool OFileNotification::isSingleShot() const |
230 | { | 230 | { |
231 | return !_multi; | 231 | return !_multi; |
232 | } | 232 | } |
233 | 233 | ||
234 | 234 | ||
235 | bool OFileNotification::activate( const OFileNotificationEvent* e ) | 235 | bool 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 | ||
271 | bool OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type ) | 277 | bool 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 | ||
279 | void OFileNotification::inotifyEventHandler() | 285 | void 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 | ||
311 | bool OFileNotification::registerEventHandler() | 317 | bool 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 | ||
328 | void OFileNotification::unregisterEventHandler() | 334 | void 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 | //================================================================================================= |
339 | ODirNotification::ODirNotification( QObject* parent, const char* name ) | 345 | ODirNotification::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 | ||
346 | ODirNotification::~ODirNotification() | 352 | ODirNotification::~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 | ||
370 | int ODirNotification::watch( const QString& path, bool sshot, OFileNotificationType type, int recurse ) | 376 | int 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 | { |
401 | connect( fn, SIGNAL( createdSubdir( const QString&, const QString& ) ), this, SLOT( subdirCreated( const QString&, const QString& ) ) ); | 407 | connect( fn, SIGNAL( createdSubdir( const QString&, const QString& ) ), this, SLOT( subdirCreated( const QString&, const QString& ) ) ); |
402 | 408 | ||
403 | QDir directory( path ); | 409 | QDir directory( path ); |
404 | QStringList subdirs = directory.entryList( QDir::Dirs ); | 410 | QStringList subdirs = directory.entryList( QDir::Dirs ); |
405 | 411 | ||
406 | for ( QStringList::Iterator it = subdirs.begin(); it != subdirs.end(); ++it ) | 412 | for ( QStringList::Iterator it = subdirs.begin(); it != subdirs.end(); ++it ) |
407 | { | 413 | { |
408 | if ( (*it) == "." || (*it) == ".." ) continue; | 414 | if ( (*it) == "." || (*it) == ".." ) continue; |
409 | QString subpath = QString( "%1/%2" ).arg( path ).arg( *it ); | 415 | QString subpath = QString( "%1/%2" ).arg( path ).arg( *it ); |
410 | int subresult = watch( subpath, sshot, subtype, recurse-1 ); | 416 | int subresult = watch( subpath, sshot, subtype, recurse-1 ); |
411 | if ( subresult == -1 ) | 417 | if ( subresult == -1 ) |
412 | { | 418 | { |
413 | qDebug( "ODirNotification::watch(): subresult for '%s' was -1. Interrupting", (const char*) (*it) ); | 419 | qDebug( "ODirNotification::watch(): subresult for '%s' was -1. Interrupting", (const char*) (*it) ); |
414 | return -1; | 420 | return -1; |
415 | } | 421 | } |
416 | } | 422 | } |
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 | |||
@@ -212,97 +212,98 @@ class OFileNotification : public QObject | |||
212 | int startWatching( const QString& path, bool sshot = false, OFileNotificationType type = Modify ); | 212 | int startWatching( const QString& path, bool sshot = false, OFileNotificationType type = Modify ); |
213 | 213 | ||
214 | signals: | 214 | signals: |
215 | void triggered( const QString&, unsigned int, const QString& ); | 215 | void triggered( const QString&, unsigned int, const QString& ); |
216 | void accessed( const QString& ); | 216 | void accessed( const QString& ); |
217 | void modified( const QString& ); | 217 | void modified( const QString& ); |
218 | void attributed( const QString& ); | 218 | void attributed( const QString& ); |
219 | void closed( const QString&, bool ); | 219 | void closed( const QString&, bool ); |
220 | void opened( const QString& ); | 220 | void opened( const QString& ); |
221 | void movedTo( const QString&, const QString& ); | 221 | void movedTo( const QString&, const QString& ); |
222 | void movedFrom( const QString&, const QString& ); | 222 | void movedFrom( const QString&, const QString& ); |
223 | void deletedSubdir( const QString&, const QString& ); | 223 | void deletedSubdir( const QString&, const QString& ); |
224 | void deletedFile( const QString&, const QString& ); | 224 | void deletedFile( const QString&, const QString& ); |
225 | void createdSubdir( const QString&, const QString& ); | 225 | void createdSubdir( const QString&, const QString& ); |
226 | void createdFile( const QString&, const QString& ); | 226 | void createdFile( const QString&, const QString& ); |
227 | void deleted( const QString& ); | 227 | void deleted( const QString& ); |
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 | ||
268 | class ODirNotification : public QObject | 269 | class 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& ); |
293 | void movedFrom( const QString&, const QString& ); | 294 | void movedFrom( const QString&, const QString& ); |
294 | void deletedSubdir( const QString&, const QString& ); | 295 | void deletedSubdir( const QString&, const QString& ); |
295 | void deletedFile( const QString&, const QString& ); | 296 | void deletedFile( const QString&, const QString& ); |
296 | void createdSubdir( const QString&, const QString& ); | 297 | void createdSubdir( const QString&, const QString& ); |
297 | void createdFile( const QString&, const QString& ); | 298 | void createdFile( const QString&, const QString& ); |
298 | void deleted( const QString& ); | 299 | void deleted( const QString& ); |
299 | void unmounted( const QString& ); | 300 | void unmounted( const QString& ); |
300 | 301 | ||
301 | private slots: | 302 | private slots: |
302 | void subdirCreated( const QString&, const QString& ); | 303 | void subdirCreated( const QString&, const QString& ); |
303 | 304 | ||
304 | private: | 305 | private: |
305 | OFileNotification* _topfilenotification; | 306 | OFileNotification* _topfilenotification; |
306 | OFileNotificationType _type; | 307 | OFileNotificationType _type; |
307 | int _depth; | 308 | int _depth; |
308 | }; | 309 | }; |
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 | |||
12 | LANG=$1 | ||
13 | |||
14 | if [ "$1x" == "x" ] ; then | ||
15 | echo "Usage: $0 <LANG>" | ||
16 | exit | ||
17 | fi | ||
18 | |||
19 | for 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 | ||
32 | done | ||
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 | |||
3 | if [ -z "$QTE_BASEVERSION" ] | ||
4 | then | ||
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 | ||
11 | fi | ||
12 | if [ -z "$QTE_VERSION" ] | ||
13 | then | ||
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 | ||
20 | fi | ||
21 | [ -z "$QTE_REVISION" ] && QTE_REVISION=5 | ||
22 | DEB_VERSION=2.0 | ||
23 | |||
24 | # Have to do this here, since CVS can't store symlinks | ||
25 | |||
26 | mkdir -p $OPIEDIR/etc/rcS.d | ||
27 | ln -sf ../init.d/bootsplash $OPIEDIR/etc/rcS.d/S01bootsplash | ||
28 | |||
29 | VERSION_MAJ=$(sed -n -e 's/.*QPE_VERSION "\([0-9]*\)\..*\..*".*/\1/p' <$OPIEDIR/include/qpe/version.h) | ||
30 | VERSION_MIN=$(sed -n -e 's/.*QPE_VERSION ".*\.\([0-9]*\)\..*".*/\1/p' <$OPIEDIR/include/qpe/version.h) | ||
31 | VERSION_PAT=$(sed -n -e 's/.*QPE_VERSION ".*\..*\.\([0-9]*\).*/\1/p' <$OPIEDIR/include/qpe/version.h) | ||
32 | SUB_VERSION=$(sed -n -e 's,.*SUB_VERSION \"\(.*\)\".*,\1,p' <$OPIEDIR/include/qpe/version.h) | ||
33 | if grep -q 'QPE_VERSION .*snapshot' $OPIEDIR/include/qpe/version.h | ||
34 | then | ||
35 | [ -z "$VERSION_CVS" ] && VERSION_CVS="$(date +%Y%m%d)" | ||
36 | SUB_VERSION=$VERSION_CVS | ||
37 | else | ||
38 | VERSION_CVS="" | ||
39 | fi | ||
40 | |||
41 | QPE_VERSION=$VERSION_MAJ.$VERSION_MIN.$VERSION_PAT | ||
42 | |||
43 | ARCH=arm | ||
44 | STRIP=arm-linux-strip | ||
45 | STRIP_FILES="*ARM*not stripped" | ||
46 | |||
47 | TDIR=/tmp/ipk$$ | ||
48 | DATADIR=$TDIR | ||
49 | CTRLDIR=$TDIR/CONTROL | ||
50 | |||
51 | IMAGEDIR= | ||
52 | VERB= | ||
53 | LIST= | ||
54 | RPM= | ||
55 | |||
56 | while [ $# -ne 0 ] | ||
57 | do | ||
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 | ||
90 | done | ||
91 | |||
92 | if [ -z "$FILES" ] | ||
93 | then | ||
94 | FILES=`find $OPIEDIR -name "*.control" -print` | ||
95 | fi | ||
96 | |||
97 | RDIR=$PWD | ||
98 | ORIGDIR=`pwd` | ||
99 | cd $OPIEDIR | ||
100 | |||
101 | for i in $FILES | ||
102 | do | ||
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 | ||
259 | done | ||
260 | # clean up | ||
261 | rm -rf $TDIR | ||