author | mickeyl <mickeyl> | 2005-06-02 21:44:41 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2005-06-02 21:44:41 (UTC) |
commit | d0f6a0721d7ab67a115d08990143944ee71d54ba (patch) (unidiff) | |
tree | ba22ad18027419a6417f3d6439a2faf67917ab74 | |
parent | f55a56f54de1d3fa9084160159a379079a317d96 (diff) | |
download | opie-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:
----------------------------------------------------------------------
-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,158 +1,159 @@ | |||
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) |
79 | * #1608 - QueryByExampe-Datediff on SQL database did not worked properly (eilers) | 80 | * #1608 - QueryByExampe-Datediff on SQL database did not worked properly (eilers) |
80 | * n.a. - Netsystemtime - fixed UI to prevent error dialog from displaying when it shouldn't, get rid of some compiler warnings (drw) | 81 | * n.a. - Netsystemtime - fixed UI to prevent error dialog from displaying when it shouldn't, get rid of some compiler warnings (drw) |
81 | * n.a. - PackageManager - fixed where last package in status file was not shown as installed when it should be (drw) | 82 | * n.a. - PackageManager - fixed where last package in status file was not shown as installed when it should be (drw) |
82 | * n.a. - PackageManager - fixed bug where lists_dir was not being honored at startup (drw) | 83 | * n.a. - PackageManager - fixed bug where lists_dir was not being honored at startup (drw) |
83 | * n.a. - PackageManager - provided default value for lists_dir when none is entered in configuration dialog (drw) | 84 | * n.a. - PackageManager - provided default value for lists_dir when none is entered in configuration dialog (drw) |
84 | * n.a. - OTabWidget - fixed scroll buttons, fix display position of tabs (drw) | 85 | * n.a. - OTabWidget - fixed scroll buttons, fix display position of tabs (drw) |
85 | * n.a. - AddressBook - fixed sorting by 'File As' name (drw) | 86 | * n.a. - AddressBook - fixed sorting by 'File As' name (drw) |
86 | * n.a. - AddressBook - fixed category handling for 'All' and 'Unfiled' (eilers) | 87 | * n.a. - AddressBook - fixed category handling for 'All' and 'Unfiled' (eilers) |
87 | * n.a. - AddressBook - fixed letter picker record selection and sort records afterwards (drw) | 88 | * n.a. - AddressBook - fixed letter picker record selection and sort records afterwards (drw) |
88 | 89 | ||
89 | Internal | 90 | Internal |
90 | -------- | 91 | -------- |
91 | * Worked around bug in Qt/Embedded 2.3.10: qt_version() returns 231 (mickeyl) | 92 | * Worked around bug in Qt/Embedded 2.3.10: qt_version() returns 231 (mickeyl) |
92 | * Killed the need for weak symbols in QtE (zecke) | 93 | * Killed the need for weak symbols in QtE (zecke) |
93 | * Added optional building libqpe without inline images (mickeyl) | 94 | * Added optional building libqpe without inline images (mickeyl) |
94 | * OColorButton - fixed so does not emit a colorSelected signal inside of resizeEvent (drw) | 95 | * OColorButton - fixed so does not emit a colorSelected signal inside of resizeEvent (drw) |
95 | 96 | ||
96 | 2005-02-03Opie 1.1.9 | 97 | 2005-02-03Opie 1.1.9 |
97 | 98 | ||
98 | New Features | 99 | New Features |
99 | ------------ | 100 | ------------ |
100 | * Number of icon columns in Launcher is customizable through Launcher.conf (hrw,zecke,mickeyl) | 101 | * Number of icon columns in Launcher is customizable through Launcher.conf (hrw,zecke,mickeyl) |
101 | * Number of icon columns in Launcher is customizable through LauncherSettings (mickeyl) | 102 | * Number of icon columns in Launcher is customizable through LauncherSettings (mickeyl) |
102 | * Usability enhancements in OpieIRC (skyhusker) | 103 | * Usability enhancements in OpieIRC (skyhusker) |
103 | 104 | ||
104 | Fixed Bugs | 105 | Fixed Bugs |
105 | ---------- | 106 | ---------- |
106 | * #1501 - Fixed bug in todo sql backend (eilers) | 107 | * #1501 - Fixed bug in todo sql backend (eilers) |
107 | * #1505 - Added more Swap sizes in memoryapplet (mickeyl) | 108 | * #1505 - Added more Swap sizes in memoryapplet (mickeyl) |
108 | * #1525 - Hopefully fixed double alarms and not removing alarms set with the Clock application (zecke) | 109 | * #1525 - Hopefully fixed double alarms and not removing alarms set with the Clock application (zecke) |
109 | * #1533 - Security Owner Dialog (shown in case of unsuccessfull authentiacation) wasn't able to display information in non latin1 encoding (zecke) | 110 | * #1533 - Security Owner Dialog (shown in case of unsuccessfull authentiacation) wasn't able to display information in non latin1 encoding (zecke) |
110 | * n.a. - Removed hard coded font sizes in a couple of inputmethods (mickeyl) | 111 | * n.a. - Removed hard coded font sizes in a couple of inputmethods (mickeyl) |
111 | * n.a. - Removed MediumDlg appearing prior to FirstUsage wizard (i.e. calibration) (mickeyl) | 112 | * n.a. - Removed MediumDlg appearing prior to FirstUsage wizard (i.e. calibration) (mickeyl) |
112 | * n.a. - Fixed numerous buglets in OpieIRC (skyhusker) | 113 | * n.a. - Fixed numerous buglets in OpieIRC (skyhusker) |
113 | 114 | ||
114 | Internal | 115 | Internal |
115 | -------- | 116 | -------- |
116 | * Added the Qtopia 1.7 SDK macros for quick-apps to easa compilation of 3rd party apps against our headers (mickeyl) | 117 | * Added the Qtopia 1.7 SDK macros for quick-apps to easa compilation of 3rd party apps against our headers (mickeyl) |
117 | * You can now use the Opie build system in combination with a OpenEmbedded staging area which makes a nice cross development environment (mickeyl) | 118 | * You can now use the Opie build system in combination with a OpenEmbedded staging area which makes a nice cross development environment (mickeyl) |
118 | * Made Opie compilable with Qt/Embedded 2.3.10 (ar) | 119 | * Made Opie compilable with Qt/Embedded 2.3.10 (ar) |
119 | * Changed Launcher to get default orientation from ODevice w/ QWS_DISPLAY overriding (mickeyl) | 120 | * Changed Launcher to get default orientation from ODevice w/ QWS_DISPLAY overriding (mickeyl) |
120 | * Build tree cleanups (mickeyl) | 121 | * Build tree cleanups (mickeyl) |
121 | 122 | ||
122 | 2004-11-26Opie 1.1.8 | 123 | 2004-11-26Opie 1.1.8 |
123 | 124 | ||
124 | New Features | 125 | New Features |
125 | ------------ | 126 | ------------ |
126 | * PackageManager supports installation of local ipkg files (drw) | 127 | * PackageManager supports installation of local ipkg files (drw) |
127 | * PackageManager supports linking of applications to root (drw) | 128 | * PackageManager supports linking of applications to root (drw) |
128 | * PackageManager supports src/gz feeds (drw,wimpie) | 129 | * PackageManager supports src/gz feeds (drw,wimpie) |
129 | * Added a syslog information tab to sysinfo (mickeyl) | 130 | * Added a syslog information tab to sysinfo (mickeyl) |
130 | * Added new, more consistent, PIM icons + a GIMP teplate (ar) | 131 | * Added new, more consistent, PIM icons + a GIMP teplate (ar) |
131 | 132 | ||
132 | Fixed Bugs | 133 | Fixed Bugs |
133 | ---------- | 134 | ---------- |
134 | * #1017 - Tetrix doesn't display correctly for high resolution screens (drw) | 135 | * #1017 - Tetrix doesn't display correctly for high resolution screens (drw) |
135 | * #1269 - VCards were imported into personal area if it was activated (eilers) | 136 | * #1269 - VCards were imported into personal area if it was activated (eilers) |
136 | * #1464 - Packagemanager dont set active filter after install a package (drw) | 137 | * #1464 - Packagemanager dont set active filter after install a package (drw) |
137 | * #1479 - Improved VCard-Parser to import VCards created by Evolution 2 and Apple Addressbook (eilers) | 138 | * #1479 - Improved VCard-Parser to import VCards created by Evolution 2 and Apple Addressbook (eilers) |
138 | * #1493 - Fixed one column layout bug of the launcher (hrw) | 139 | * #1493 - Fixed one column layout bug of the launcher (hrw) |
139 | * n.a. - PackageManager - (Minor UI tweak) in filter dialog, when option is enabled, set focus to widget that corresponds to that option (drw) | 140 | * n.a. - PackageManager - (Minor UI tweak) in filter dialog, when option is enabled, set focus to widget that corresponds to that option (drw) |
140 | * n.a. - PackageManager - (Minor UI tweak) fix double entry in source feed configuration when adding a new feed (drw) | 141 | * n.a. - PackageManager - (Minor UI tweak) fix double entry in source feed configuration when adding a new feed (drw) |
141 | * n.a. - Battery Applet - fix sizing of battery info popup (drw,mickeyl) | 142 | * n.a. - Battery Applet - fix sizing of battery info popup (drw,mickeyl) |
142 | 143 | ||
143 | Internal | 144 | Internal |
144 | -------- | 145 | -------- |
145 | * Moved libopie1 to unsupported (mickeyl) | 146 | * Moved libopie1 to unsupported (mickeyl) |
146 | * Implemented generic queryByExample() with incremental searching. A lot of internal changes of the Pim2-library (eilers) | 147 | * Implemented generic queryByExample() with incremental searching. A lot of internal changes of the Pim2-library (eilers) |
147 | * Added fast and full featured and incremental sorted() for SQL addressbook backend (eilers) | 148 | * Added fast and full featured and incremental sorted() for SQL addressbook backend (eilers) |
148 | 149 | ||
149 | 2004-11-14Opie 1.1.7 | 150 | 2004-11-14Opie 1.1.7 |
150 | 151 | ||
151 | New Features | 152 | New Features |
152 | ------------ | 153 | ------------ |
153 | * libOpieDB now uses SQLite V3 instead V2. Remember to upgrade your database files! (eilers) | 154 | * libOpieDB now uses SQLite V3 instead V2. Remember to upgrade your database files! (eilers) |
154 | * Backup now uses the busy indicator when backing up and restore (ar) | 155 | * Backup now uses the busy indicator when backing up and restore (ar) |
155 | * OpiePlayer2 gained adding of Directories to the playlist (zecke) | 156 | * OpiePlayer2 gained adding of Directories to the playlist (zecke) |
156 | * OpiePlayer2 better error handling (zecke) | 157 | * OpiePlayer2 better error handling (zecke) |
157 | * OpiePlayer2 progress indication while streaming (zecke) | 158 | * OpiePlayer2 progress indication while streaming (zecke) |
158 | * OpiePlayer2 ported to use libxine 1.0.0-rc6a (brad,zecke) | 159 | * OpiePlayer2 ported to use libxine 1.0.0-rc6a (brad,zecke) |
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 | |||
@@ -111,334 +111,340 @@ void OFile::disconnectNotify( const char* signal ) | |||
111 | } | 111 | } |
112 | 112 | ||
113 | int OFile::startWatch( int mode ) | 113 | int OFile::startWatch( int mode ) |
114 | { | 114 | { |
115 | } | 115 | } |
116 | 116 | ||
117 | //================================================================================================= | 117 | //================================================================================================= |
118 | // OFileNotificationEvent | 118 | // OFileNotificationEvent |
119 | //================================================================================================= | 119 | //================================================================================================= |
120 | OFileNotificationEvent::OFileNotificationEvent( OFileNotification* parent, int wd, unsigned int mask, unsigned int cookie, const QString& name ) | 120 | OFileNotificationEvent::OFileNotificationEvent( OFileNotification* parent, int wd, unsigned int mask, unsigned int cookie, const QString& name ) |
121 | :_parent( parent ), _wd( wd ), _mask( mask ), _cookie( cookie ), _name( name ) | 121 | :_parent( parent ), _wd( wd ), _mask( mask ), _cookie( cookie ), _name( name ) |
122 | { | 122 | { |
123 | qDebug( "OFileNotificationEvent()" ); | 123 | qDebug( "OFileNotificationEvent()" ); |
124 | } | 124 | } |
125 | 125 | ||
126 | 126 | ||
127 | OFileNotificationEvent::~OFileNotificationEvent() | 127 | OFileNotificationEvent::~OFileNotificationEvent() |
128 | { | 128 | { |
129 | qDebug( "~OFileNotificationEvent()" ); | 129 | qDebug( "~OFileNotificationEvent()" ); |
130 | } | 130 | } |
131 | 131 | ||
132 | //================================================================================================= | 132 | //================================================================================================= |
133 | // OFileNotification | 133 | // OFileNotification |
134 | //================================================================================================= | 134 | //================================================================================================= |
135 | OFileNotification::OFileNotification( QObject* parent, const char* name ) | 135 | OFileNotification::OFileNotification( QObject* parent, const char* name ) |
136 | :QObject( parent, name ), _active( false ), _multi( true ) | 136 | :QObject( parent, name ), _active( false ), _multi( true ) |
137 | { | 137 | { |
138 | qDebug( "OFileNotification::OFileNotification()" ); | 138 | qDebug( "OFileNotification::OFileNotification()" ); |
139 | } | 139 | } |
140 | 140 | ||
141 | 141 | ||
142 | OFileNotification::~OFileNotification() | 142 | OFileNotification::~OFileNotification() |
143 | { | 143 | { |
144 | stop(); | 144 | stop(); |
145 | qDebug( "OFileNotification::~OFileNotification()" ); | 145 | qDebug( "OFileNotification::~OFileNotification()" ); |
146 | } | 146 | } |
147 | 147 | ||
148 | 148 | ||
149 | bool OFileNotification::isActive() const | 149 | bool OFileNotification::isActive() const |
150 | { | 150 | { |
151 | return _active; | 151 | return _active; |
152 | } | 152 | } |
153 | 153 | ||
154 | 154 | ||
155 | int OFileNotification::watch( const QString& path, bool sshot, OFileNotificationType type ) | 155 | int OFileNotification::watch( const QString& path, bool sshot, OFileNotificationType type ) |
156 | { | 156 | { |
157 | // check if path exists and is a regular file | 157 | // check if path exists and is a regular file |
158 | struct stat s; | 158 | struct stat s; |
159 | if ( ::stat( (const char*) path, &s ) == -1 ) | 159 | if ( ::stat( (const char*) path, &s ) == -1 ) |
160 | { | 160 | { |
161 | qWarning( "OFileNotification::watch(): Can't watch '%s': %s.", (const char*) path, strerror( errno ) ); | 161 | qWarning( "OFileNotification::watch(): Can't watch '%s': %s.", (const char*) path, strerror( errno ) ); |
162 | return -1; | 162 | return -1; |
163 | } | 163 | } |
164 | if ( !S_ISREG( s.st_mode ) ) | 164 | if ( !S_ISREG( s.st_mode ) ) |
165 | { | 165 | { |
166 | qWarning( "OFileNotification::watch(): Can't watch '%s': %s.", (const char*) path, "not a regular file" ); | 166 | qWarning( "OFileNotification::watch(): Can't watch '%s': %s.", (const char*) path, "not a regular file" ); |
167 | return -1; | 167 | return -1; |
168 | } | 168 | } |
169 | 169 | ||
170 | return startWatching( path, sshot, type ); | 170 | return startWatching( path, sshot, type ); |
171 | } | 171 | } |
172 | 172 | ||
173 | 173 | ||
174 | int OFileNotification::startWatching( const QString& path, bool sshot, OFileNotificationType type ) | 174 | int OFileNotification::startWatching( const QString& path, bool sshot, OFileNotificationType type ) |
175 | { | 175 | { |
176 | if ( notification_list.isEmpty() ) | 176 | if ( notification_list.isEmpty() ) |
177 | { | 177 | { |
178 | OFileNotification::registerEventHandler(); | 178 | OFileNotification::registerEventHandler(); |
179 | } | 179 | } |
180 | 180 | ||
181 | struct inotify_watch_request iwr; | 181 | struct inotify_watch_request iwr; |
182 | ::memset( &iwr, 0, sizeof iwr ); | 182 | ::memset( &iwr, 0, sizeof iwr ); |
183 | iwr.name = const_cast<char*>( (const char*) path ); | 183 | iwr.name = const_cast<char*>( (const char*) path ); |
184 | iwr.mask = type; | 184 | iwr.mask = type; |
185 | 185 | ||
186 | _wd = ::ioctl( OFileNotification::_fd, INOTIFY_WATCH, &iwr ); | 186 | _wd = ::ioctl( OFileNotification::_fd, INOTIFY_WATCH, &iwr ); |
187 | 187 | ||
188 | if ( _wd < 0 ) | 188 | if ( _wd < 0 ) |
189 | { | 189 | { |
190 | qWarning( "OFileNotification::watch(): inotify can't watch '%s': %s.", (const char*) path, strerror( errno ) ); | 190 | qWarning( "OFileNotification::watch(): inotify can't watch '%s': %s.", (const char*) path, strerror( errno ) ); |
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 | } |
417 | } | 423 | } |
418 | } | 424 | } |
419 | else return -1; | 425 | else return -1; |
420 | } | 426 | } |
421 | 427 | ||
422 | 428 | ||
423 | void ODirNotification::subdirCreated( const QString& dir, const QString& subdir ) | 429 | void ODirNotification::subdirCreated( const QString& dir, const QString& subdir ) |
424 | { | 430 | { |
425 | qDebug( "*** ODirNotification::subdirCreated '%s/%s'", (const char*) dir, (const char*) subdir ); | 431 | qDebug( "*** ODirNotification::subdirCreated '%s/%s'", (const char*) dir, (const char*) subdir ); |
426 | QString newdir = dir; | 432 | QString newdir = dir; |
427 | if ( newdir.startsWith( _topfilenotification->path() ) ) | 433 | if ( newdir.startsWith( _topfilenotification->path() ) ) |
428 | { | 434 | { |
429 | newdir.replace( _topfilenotification->path(), "" ); | 435 | newdir.replace( _topfilenotification->path(), "" ); |
430 | int level = newdir.contains( '/' ); | 436 | int level = newdir.contains( '/' ); |
431 | qDebug( "*** dirpart = '%s' ==> level = %d", (const char*) newdir, level ); | 437 | qDebug( "*** dirpart = '%s' ==> level = %d", (const char*) newdir, level ); |
432 | 438 | ||
433 | if ( _depth == -1 || _depth > level ) | 439 | if ( _depth == -1 || _depth > level ) |
434 | { | 440 | { |
435 | watch( QString( "%1/%2" ).arg( dir ).arg( subdir ), _topfilenotification->isSingleShot(), _topfilenotification->type(), _depth == -1 ? -1 : _depth-level-1 ); | 441 | watch( QString( "%1/%2" ).arg( dir ).arg( subdir ), _topfilenotification->isSingleShot(), _topfilenotification->type(), _depth == -1 ? -1 : _depth-level-1 ); |
436 | } | 442 | } |
437 | 443 | ||
438 | } | 444 | } |
439 | } | 445 | } |
440 | 446 | ||
441 | 447 | ||
442 | } // namespace Ui | 448 | } // namespace Ui |
443 | 449 | ||
444 | } // namespace Opie | 450 | } // namespace Opie |
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 | |||
@@ -132,208 +132,209 @@ enum OFileNotificationType | |||
132 | 132 | ||
133 | /*====================================================================================== | 133 | /*====================================================================================== |
134 | * OFileNotification | 134 | * OFileNotification |
135 | *======================================================================================*/ | 135 | *======================================================================================*/ |
136 | 136 | ||
137 | /** | 137 | /** |
138 | * @brief Represents a file notification | 138 | * @brief Represents a file notification |
139 | * | 139 | * |
140 | * This class allows to watch for events happening to files. | 140 | * This class allows to watch for events happening to files. |
141 | * It uses the inotify linux (2.6.x) kernel interface. | 141 | * It uses the inotify linux (2.6.x) kernel interface. |
142 | * | 142 | * |
143 | * @see http://www.kernel.org/pub/linux/kernel/people/rml/inotify/ | 143 | * @see http://www.kernel.org/pub/linux/kernel/people/rml/inotify/ |
144 | * | 144 | * |
145 | * @author Michael 'Mickey' Lauer <mickey@vanille.de> | 145 | * @author Michael 'Mickey' Lauer <mickey@vanille.de> |
146 | * | 146 | * |
147 | **/ | 147 | **/ |
148 | 148 | ||
149 | class OFileNotification : public QObject | 149 | class OFileNotification : public QObject |
150 | { | 150 | { |
151 | Q_OBJECT | 151 | Q_OBJECT |
152 | 152 | ||
153 | public: | 153 | public: |
154 | OFileNotification( QObject* parent = 0, const char* name = 0 ); | 154 | OFileNotification( QObject* parent = 0, const char* name = 0 ); |
155 | ~OFileNotification(); | 155 | ~OFileNotification(); |
156 | /** | 156 | /** |
157 | * This static function calls a slot when an event with @a type happens to file @a path. | 157 | * This static function calls a slot when an event with @a type happens to file @a path. |
158 | * | 158 | * |
159 | * It is very convenient to use this function because you do not need to | 159 | * It is very convenient to use this function because you do not need to |
160 | * bother with a timerEvent or to create a local QTimer object. | 160 | * bother with a timerEvent or to create a local QTimer object. |
161 | * | 161 | * |
162 | * Example: | 162 | * Example: |
163 | * <pre> | 163 | * <pre> |
164 | * | 164 | * |
165 | * #include <opie2/oapplication.h> | 165 | * #include <opie2/oapplication.h> |
166 | * #include <opie2/ofilenotify.h> | 166 | * #include <opie2/ofilenotify.h> |
167 | * using namespace Opie::Core; | 167 | * using namespace Opie::Core; |
168 | * | 168 | * |
169 | * int main( int argc, char **argv ) | 169 | * int main( int argc, char **argv ) |
170 | * { | 170 | * { |
171 | * OApplication a( argc, argv, "File Notification Example" ); | 171 | * OApplication a( argc, argv, "File Notification Example" ); |
172 | * OFileNotification::singleShot( "/tmp/quit", &a, SLOT(quit()), Access ); | 172 | * OFileNotification::singleShot( "/tmp/quit", &a, SLOT(quit()), Access ); |
173 | * ... // create and show your widgets | 173 | * ... // create and show your widgets |
174 | * return a.exec(); | 174 | * return a.exec(); |
175 | * } | 175 | * } |
176 | * </pre> | 176 | * </pre> |
177 | * | 177 | * |
178 | * This sample program automatically terminates when the file "/tmp/quit" has been accessed. | 178 | * This sample program automatically terminates when the file "/tmp/quit" has been accessed. |
179 | * | 179 | * |
180 | * | 180 | * |
181 | * The @a receiver is the receiving object and the @a member is the slot. | 181 | * The @a receiver is the receiving object and the @a member is the slot. |
182 | **/ | 182 | **/ |
183 | static bool singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type = Modify ); | 183 | static bool singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type = Modify ); |
184 | /** | 184 | /** |
185 | * Starts to watch for @a type changes to @a path. Set @a sshot to True if you want to be notified only once. | 185 | * Starts to watch for @a type changes to @a path. Set @a sshot to True if you want to be notified only once. |
186 | * Note that in that case it may be more convenient to use @ref OFileNotification::singleShot() then. | 186 | * Note that in that case it may be more convenient to use @ref OFileNotification::singleShot() then. |
187 | **/ | 187 | **/ |
188 | int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify ); | 188 | int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify ); |
189 | /** | 189 | /** |
190 | * Stop watching for file events. | 190 | * Stop watching for file events. |
191 | **/ | 191 | **/ |
192 | void stop(); | 192 | void stop(); |
193 | /** | 193 | /** |
194 | * @returns the notification type as set by @ref start(). | 194 | * @returns the notification type as set by @ref start(). |
195 | **/ | 195 | **/ |
196 | OFileNotificationType type() const; | 196 | OFileNotificationType type() const; |
197 | /** | 197 | /** |
198 | * @returns the path to the file being watched by this instance. | 198 | * @returns the path to the file being watched by this instance. |
199 | **/ | 199 | **/ |
200 | QString path() const; | 200 | QString path() const; |
201 | /** | 201 | /** |
202 | * @returns if the notification is single-shot | 202 | * @returns if the notification is single-shot |
203 | */ | 203 | */ |
204 | bool isSingleShot() const; | 204 | bool isSingleShot() const; |
205 | /** | 205 | /** |
206 | * @returns if a file is currently being watched. | 206 | * @returns if a file is currently being watched. |
207 | **/ | 207 | **/ |
208 | bool isActive() const; | 208 | bool isActive() const; |
209 | /** | 209 | /** |
210 | * @internal | 210 | * @internal |
211 | */ | 211 | */ |
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 | }; |
309 | 310 | ||
310 | /*====================================================================================== | 311 | /*====================================================================================== |
311 | * OFileNotificationEvent | 312 | * OFileNotificationEvent |
312 | *======================================================================================*/ | 313 | *======================================================================================*/ |
313 | 314 | ||
314 | class OFileNotificationEvent | 315 | class OFileNotificationEvent |
315 | { | 316 | { |
316 | public: | 317 | public: |
317 | OFileNotificationEvent( OFileNotification* parent, int wd, unsigned int mask, unsigned int cookie, const QString& name ); | 318 | OFileNotificationEvent( OFileNotification* parent, int wd, unsigned int mask, unsigned int cookie, const QString& name ); |
318 | ~OFileNotificationEvent(); | 319 | ~OFileNotificationEvent(); |
319 | OFileNotification* parent() const { return _parent; }; | 320 | OFileNotification* parent() const { return _parent; }; |
320 | int descriptor() const { return _wd; }; | 321 | int descriptor() const { return _wd; }; |
321 | unsigned int mask() const { return _mask; }; | 322 | unsigned int mask() const { return _mask; }; |
322 | unsigned int cookie() const { return _cookie; }; | 323 | unsigned int cookie() const { return _cookie; }; |
323 | QString name() const { return _name; }; | 324 | QString name() const { return _name; }; |
324 | void activate() { _parent->activate( this ); }; | 325 | void activate() { _parent->activate( this ); }; |
325 | 326 | ||
326 | private: | 327 | private: |
327 | OFileNotification* _parent; | 328 | OFileNotification* _parent; |
328 | int _wd; | 329 | int _wd; |
329 | unsigned int _mask; | 330 | unsigned int _mask; |
330 | unsigned int _cookie; | 331 | unsigned int _cookie; |
331 | QString _name; | 332 | QString _name; |
332 | }; | 333 | }; |
333 | 334 | ||
334 | 335 | ||
335 | } | 336 | } |
336 | } | 337 | } |
337 | 338 | ||
338 | #endif | 339 | #endif |
339 | 340 | ||
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 | ||