summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--ChangeLog3
-rw-r--r--examples/opiecore/onotifytest/main.cpp18
-rw-r--r--examples/opiecore/onotifytest/main.h10
-rw-r--r--libopie2/opiecore/linux/ofilenotify.cpp40
-rw-r--r--libopie2/opiecore/linux/ofilenotify.h3
-rwxr-xr-xscripts/addLanguage.sh33
-rwxr-xr-xscripts/mkipks261
7 files changed, 343 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index bce86d1..4dcee93 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,292 +1,293 @@
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)
159 * Ported brightnessapplet from Qtopia 1.7 (mickeyl) 160 * Ported brightnessapplet from Qtopia 1.7 (mickeyl)
160 * Opie-Eye got a Digital Camera File Backend (alwin,zecke) 161 * Opie-Eye got a Digital Camera File Backend (alwin,zecke)
161 * Support for Tuxpad1 of Tradesquare.NL (mickeyl,zecke) 162 * Support for Tuxpad1 of Tradesquare.NL (mickeyl,zecke)
162 * Opie-Console use Custom Font and Size in a Profile (harlekin) 163 * Opie-Console use Custom Font and Size in a Profile (harlekin)
163 * Opie-Console transparently log the Output and Input to a file (harlekin) 164 * Opie-Console transparently log the Output and Input to a file (harlekin)
164 * Added new O-menu icon to lock the PDA immediately: opie-lockapplet (clem) 165 * Added new O-menu icon to lock the PDA immediately: opie-lockapplet (clem)
165 * Opie-Security now hides the plugin-based authentication tabs if no auth. plugin package is installed (clem) 166 * Opie-Security now hides the plugin-based authentication tabs if no auth. plugin package is installed (clem)
166 * Opie-Security gained a 'test authentication' button (clem) 167 * Opie-Security gained a 'test authentication' button (clem)
167 * Opie-Eye got a more unique layout (menubar), a slideshow, user can setup some defaults 168 * Opie-Eye got a more unique layout (menubar), a slideshow, user can setup some defaults
168 * Opie-Mail improve the handling of POP mail boxes (alwin) 169 * Opie-Mail improve the handling of POP mail boxes (alwin)
169 * Both Opie-Eye and Opie-Mail were greatly improved due the hard work of Rajko Albrecht(alwin) 170 * Both Opie-Eye and Opie-Mail were greatly improved due the hard work of Rajko Albrecht(alwin)
170 * Opie IRC - backports of the 'NeIRC fork' (zecke) 171 * Opie IRC - backports of the 'NeIRC fork' (zecke)
171 172
172 Fixed Bugs 173 Fixed Bugs
173 ---------- 174 ----------
174 * #501 - Pickboard is able to show 'Umlaute' (TT,zecke) 175 * #501 - Pickboard is able to show 'Umlaute' (TT,zecke)
175 * #608 - Make Opie usable for left handed users (zecke) 176 * #608 - Make Opie usable for left handed users (zecke)
176 * #957 - Import of VCards/VTodos/VEvents with BASE64 encoding (ljp,zecke) 177 * #957 - Import of VCards/VTodos/VEvents with BASE64 encoding (ljp,zecke)
177 * #1245 - Opie-Go 'paused' (zecke) 178 * #1245 - Opie-Go 'paused' (zecke)
178 * #1358 - DocTab didn't show any MimeTypes (was fixed earlier) (zecke) 179 * #1358 - DocTab didn't show any MimeTypes (was fixed earlier) (zecke)
179 * #1380 - QDateBookAccess::remove() doesn't remove entries (eilers, zecke) 180 * #1380 - QDateBookAccess::remove() doesn't remove entries (eilers, zecke)
180 * #1395 - Build VNC Backend with gcc3.4 181 * #1395 - Build VNC Backend with gcc3.4
181 * #1440 - The icon of opie-mobilemsg is missing (CoreDump) 182 * #1440 - The icon of opie-mobilemsg is missing (CoreDump)
182 * #1426 - Add missing opie-bartender Icon (CoreDump) 183 * #1426 - Add missing opie-bartender Icon (CoreDump)
183 * #1445 - Opie-Sheet Has No Icon (CoreDump) 184 * #1445 - Opie-Sheet Has No Icon (CoreDump)
184 * #1448 - Brightness Applet added (mickeyl) 185 * #1448 - Brightness Applet added (mickeyl)
185 * #1450 - ZSame didn't clear the bonus item after winning a game (zecke) 186 * #1450 - ZSame didn't clear the bonus item after winning a game (zecke)
186 * #1482 - Fix OFileSelector to be able to sort by size (zecke) 187 * #1482 - Fix OFileSelector to be able to sort by size (zecke)
187 * n.a. - Opie-mail: fixed some crasher, some layout-problems 188 * n.a. - Opie-mail: fixed some crasher, some layout-problems
188 * n.a. - Converted applications to not hardcode /opt/QtPalmtop but to use QPEApplication::qpeDir (zecke) 189 * n.a. - Converted applications to not hardcode /opt/QtPalmtop but to use QPEApplication::qpeDir (zecke)
189 * n.a. - Converted usage of qpeDir() not to include a '/' as first charachter of the string (zecke) 190 * n.a. - Converted usage of qpeDir() not to include a '/' as first charachter of the string (zecke)
190 * n.a. - Build system: Enable distcc and ccache when crosscompiling too, and use them everywhere we can (clem) 191 * n.a. - Build system: Enable distcc and ccache when crosscompiling too, and use them everywhere we can (clem)
191 * n.a. - Build system: Fix deps in several config.in (and fix scripts/deps.pl too) to stop breaking builds, especially with make -j highNumber (clem) 192 * n.a. - Build system: Fix deps in several config.in (and fix scripts/deps.pl too) to stop breaking builds, especially with make -j highNumber (clem)
192 * n.a. - Removed hardcoded icon size in a couple of applets (mickeyl) 193 * n.a. - Removed hardcoded icon size in a couple of applets (mickeyl)
193 194
194 Internal 195 Internal
195 -------- 196 --------
196 * Opie-Qashmoney has been moved to unsupported (mickeyl) 197 * Opie-Qashmoney has been moved to unsupported (mickeyl)
197 * Opie-Ubrowser has been moved to unsupported (mickeyl) 198 * Opie-Ubrowser has been moved to unsupported (mickeyl)
198 199
199 2004-09-17Opie 1.1.6 200 2004-09-17Opie 1.1.6
200 201
201 New Features 202 New Features
202 ------------ 203 ------------
203 * Fifteen gained configurable number of items (zecke) 204 * Fifteen gained configurable number of items (zecke)
204 * Fifteen can have custom background images (zecke) 205 * Fifteen can have custom background images (zecke)
205 * Added daemonizing capabilities to QWS Server [via Qt/Embedded] (mickeyl) 206 * Added daemonizing capabilities to QWS Server [via Qt/Embedded] (mickeyl)
206 * Integrated the new security framework into libopie2 (zecke,clem) 207 * Integrated the new security framework into libopie2 (zecke,clem)
207 * Converted the launcher to use the new security framework (zecke) 208 * Converted the launcher to use the new security framework (zecke)
208 * Backup can now handle custom locations for backup and restore (ar) 209 * Backup can now handle custom locations for backup and restore (ar)
209 * Implemented right-on-hold feedback (wimpie,zecke) 210 * Implemented right-on-hold feedback (wimpie,zecke)
210 * Lots of new features in opie-reader (tim,pohly) 211 * Lots of new features in opie-reader (tim,pohly)
211 * Build system cleanups (schurig) 212 * Build system cleanups (schurig)
212 213
213 Fixed Bugs 214 Fixed Bugs
214 -------- 215 --------
215 * #1005 - Fixed backup to CompactFlash (ar) 216 * #1005 - Fixed backup to CompactFlash (ar)
216 * #1167 - Fixed Opie write crashing on more text than one page (ar) 217 * #1167 - Fixed Opie write crashing on more text than one page (ar)
217 * #1225 - Fixed repeated light flashing on Zaurus with keyz (mickeyl) 218 * #1225 - Fixed repeated light flashing on Zaurus with keyz (mickeyl)
218 * #1359 - Fixed bookmarks in Gutenbrowser (ljp) 219 * #1359 - Fixed bookmarks in Gutenbrowser (ljp)
219 * #1361 - Fixed auto upercase in Opie-Addressbook (eilers) 220 * #1361 - Fixed auto upercase in Opie-Addressbook (eilers)
220 * #1370 - Pimconverter now reacts on cancel key (eilers) 221 * #1370 - Pimconverter now reacts on cancel key (eilers)
221 * #1376 - Bring back the capslock/numlock display (zecke) 222 * #1376 - Bring back the capslock/numlock display (zecke)
222 * #1383 - Language settings now warns about losing open apps (Markus Litz) 223 * #1383 - Language settings now warns about losing open apps (Markus Litz)
223 * #1393 - Fixed line wrap issues in opie-console for the default profile (mickeyl) 224 * #1393 - Fixed line wrap issues in opie-console for the default profile (mickeyl)
224 * #1394 - Fixed oversized headline in opie-login (coredump) 225 * #1394 - Fixed oversized headline in opie-login (coredump)
225 * #1396 - Opie-console captures the escape key and vim is working (zecke) 226 * #1396 - Opie-console captures the escape key and vim is working (zecke)
226 * #1401 - Scrollbar is now only visible if necessary in DocTab (mickeyl) 227 * #1401 - Scrollbar is now only visible if necessary in DocTab (mickeyl)
227 228
228 2004-07-06Opie 1.1.4 229 2004-07-06Opie 1.1.4
229 230
230 New Features 231 New Features
231 ------------ 232 ------------
232 * Added four themes courtesy Robert Griebl (http://www.softforge.de/zstyle) 233 * Added four themes courtesy Robert Griebl (http://www.softforge.de/zstyle)
233 * Added Conversion tool for pim-data (eilers) 234 * Added Conversion tool for pim-data (eilers)
234 * Introduced new OPimAccessFactory and OBackendFactory which simplyfies database access (eilers) 235 * Introduced new OPimAccessFactory and OBackendFactory which simplyfies database access (eilers)
235 * Modified the PIM API for providing generic use of OPimRecords (eilers) 236 * Modified the PIM API for providing generic use of OPimRecords (eilers)
236 * Clicking on the application symbol now iterates over the application's top level widgets if already raised (zecke) 237 * Clicking on the application symbol now iterates over the application's top level widgets if already raised (zecke)
237 238
238 Fixed Bugs 239 Fixed Bugs
239 -------- 240 --------
240 * #1068 - Country Drop Down Box Off Screen 241 * #1068 - Country Drop Down Box Off Screen
241 * #1291 - Opie tinykate does not open .desktop files (ar) 242 * #1291 - Opie tinykate does not open .desktop files (ar)
242 * #1291 - Opie sheet not saving correctly (ar) 243 * #1291 - Opie sheet not saving correctly (ar)
243 * #1294 - Opie does not know about British Summer Time 244 * #1294 - Opie does not know about British Summer Time
244 * #1314 - Drawpad initialization (mickeyl) 245 * #1314 - Drawpad initialization (mickeyl)
245 * #1317 - Packagemanager crashes on hold-down or install (chicken) 246 * #1317 - Packagemanager crashes on hold-down or install (chicken)
246 * #1321 - Batteryapplet graphic glitch (harlekin) 247 * #1321 - Batteryapplet graphic glitch (harlekin)
247 * #1324 - ZSafe not starting up (mickeyl) 248 * #1324 - ZSafe not starting up (mickeyl)
248 * #1328 - Personal Home Address fields is trimmed to 1char (eilers) 249 * #1328 - Personal Home Address fields is trimmed to 1char (eilers)
249 * #1327 - Opie-mail ipk does not depend on libopiedb2 (chicken) 250 * #1327 - Opie-mail ipk does not depend on libopiedb2 (chicken)
250 * #1345 - Networksettingsplugin wlan plugin dependency on libpcap0 (mickeyl) 251 * #1345 - Networksettingsplugin wlan plugin dependency on libpcap0 (mickeyl)
251 * #1348 - Datebook dependency on libopiedb2 (chicken) 252 * #1348 - Datebook dependency on libopiedb2 (chicken)
252 * #1328 - Switched SQLDatabase and VCards char encoding from latin1 to unicode (eilers) 253 * #1328 - Switched SQLDatabase and VCards char encoding from latin1 to unicode (eilers)
253 254
254 2004-04-25Opie 1.1.3 255 2004-04-25Opie 1.1.3
255 256
256 * Introduced first implementation of SQL-Support using SQLite (eilers) 257 * Introduced first implementation of SQL-Support using SQLite (eilers)
257 * Added a new Gutenberg Project reader app - opie-gutenbrowser (ljp) 258 * Added a new Gutenberg Project reader app - opie-gutenbrowser (ljp)
258 * Added a real system graffiti character set (brad) 259 * Added a real system graffiti character set (brad)
259 * Added Generic Keyconfig Widget (zecke) 260 * Added Generic Keyconfig Widget (zecke)
260 * Improved Screenshotapplet and Drawpad integration. You can now open a screenshot in drawpad and take notes (zecke) 261 * Improved Screenshotapplet and Drawpad integration. You can now open a screenshot in drawpad and take notes (zecke)
261 * Added new Bible reader app - opie-dagger (drw) 262 * Added new Bible reader app - opie-dagger (drw)
262 * Added a new Image Viewer. Work is ongoing (zecke,alwin) 263 * Added a new Image Viewer. Work is ongoing (zecke,alwin)
263 * Added namespace usage in libopie2 and everywhere (zecke,alwin) 264 * Added namespace usage in libopie2 and everywhere (zecke,alwin)
264 * Enabled the possibility to pass command line arguments to applications (mickeyl) 265 * Enabled the possibility to pass command line arguments to applications (mickeyl)
265 * Added an about applet showing some credits and information about Opie (mickeyl) 266 * Added an about applet showing some credits and information about Opie (mickeyl)
266 * Added benchmarking functionality to sysinfo (mickeyl) 267 * Added benchmarking functionality to sysinfo (mickeyl)
267 * Added applet and configuration application for switching hardware keyboard layouts (alwin) 268 * Added applet and configuration application for switching hardware keyboard layouts (alwin)
268 * Ported applications from libopie1 to libopie2* (drw,ar,alwin) 269 * Ported applications from libopie1 to libopie2* (drw,ar,alwin)
269 * Imported fullscreen and font improvements from the Qkonsole fork to embeddedkonsole (waspe) 270 * Imported fullscreen and font improvements from the Qkonsole fork to embeddedkonsole (waspe)
270 * Clean-up of package information in control files (drw) 271 * Clean-up of package information in control files (drw)
271 * Repaired mediummount which was broken since integrating the quicklauncher (alwin) 272 * Repaired mediummount which was broken since integrating the quicklauncher (alwin)
272 * Improved big-screen support (zecke,ar) 273 * Improved big-screen support (zecke,ar)
273 * Improved multikeyboard support, added keyboard layout switching applet (mouse) 274 * Improved multikeyboard support, added keyboard layout switching applet (mouse)
274 * Added a new mail client based on libetpan (harlekin,alwin,jgf) 275 * Added a new mail client based on libetpan (harlekin,alwin,jgf)
275 * Added new package manager - opie-packagemanager (drw) 276 * Added new package manager - opie-packagemanager (drw)
276 * Improved light-n-power for C7x0 (mickeyl) 277 * Improved light-n-power for C7x0 (mickeyl)
277 * Added automatic rotation support for C7x0 (treke) 278 * Added automatic rotation support for C7x0 (treke)
278 * Split libopie1 up into a set of smaller - functionally grouped - libraries (mickeyl) 279 * Split libopie1 up into a set of smaller - functionally grouped - libraries (mickeyl)
279 * Added scanning the wireless network neighbourhood to networksettings (mickeyl) 280 * Added scanning the wireless network neighbourhood to networksettings (mickeyl)
280 281
281 2003-11-29Opie 1.0.3 282 2003-11-29Opie 1.0.3
282 283
283 * Released as Version 1.0.3 284 * Released as Version 1.0.3
284 * Improved i18n (various contributors) 285 * Improved i18n (various contributors)
285 * Reduced application startup time by integrating the TT quicklauncher (zecke,harlekin) 286 * Reduced application startup time by integrating the TT quicklauncher (zecke,harlekin)
286 * Made the Documents Tab optional (mickeyl) 287 * Made the Documents Tab optional (mickeyl)
287 * Integrated basic support for HP iPAQ 54xx and the Jornada 5xx (chicken) 288 * Integrated basic support for HP iPAQ 54xx and the Jornada 5xx (chicken)
288 289
289 2003-08-04Opie 1.0.0 290 2003-08-04Opie 1.0.0
290 291
291 * Released as Version 1.0.0 292 * Released as Version 1.0.0
292 * Including a PPP module for easy dial up (tille,harlekin,zecke) 293 * Including a PPP module for easy dial up (tille,harlekin,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>
10using namespace Opie::Core; 10using namespace Opie::Core;
11 11
12/* QT */ 12/* QT */
13#include <qdir.h> 13#include <qdir.h>
14#include <qpushbutton.h> 14#include <qpushbutton.h>
15#include <qstringlist.h> 15#include <qstringlist.h>
16#include <qtextstream.h> 16#include <qtextstream.h>
17#include <qmessagebox.h> 17#include <qmessagebox.h>
18 18
19App::App( int argc, char** argv ) : QApplication( argc, argv ) 19App::App( int argc, char** argv ) : QApplication( argc, argv )
20{ 20{
21 odebug << "App()" << oendl; 21 odebug << "App()" << oendl;
22#if 0 22#if 0
23 tmpfoo = new OFile( "/tmp/foo" ); 23 tmpfoo = new OFile( "/tmp/foo" );
24 if ( tmpfoo->open( IO_ReadWrite ) ) 24 if ( tmpfoo->open( IO_ReadWrite ) )
25 { 25 {
26 QTextStream stream( tmpfoo ); 26 QTextStream stream( tmpfoo );
27 stream << "This is my content"; 27 stream << "This is my content";
28 } 28 }
29 29
30 QObject::connect( tmpfoo, SIGNAL(accessed(const QString&)), this, SLOT(quit()) ); 30 QObject::connect( tmpfoo, SIGNAL(accessed(const QString&)), this, SLOT(quit()) );
31 QObject::connect( tmpfoo, SIGNAL(closed(const QString&,bool)), this, SLOT(quit()) ); 31 QObject::connect( tmpfoo, SIGNAL(closed(const QString&,bool)), this, SLOT(quit()) );
32#endif 32#endif
33 33
34 ODirNotification* tmpfoo = new ODirNotification( 0, 0 ); 34 tmpfoo = new ODirNotification( 0, 0 );
35 35
36 int result = tmpfoo->watch( "/tmp/foo", false, CreateFile, 2 ); 36 int result = tmpfoo->watch( "/tmp/foo", false, CreateFile, 2 );
37 QObject::connect( tmpfoo, SIGNAL(triggered(const QString&,unsigned int,const QString&)), 37
38 this, SLOT(triggered(const QString&,unsigned int,const QString&)) ); 38 if ( result != -1 )
39 {
40 QObject::connect( tmpfoo, SIGNAL(triggered(const QString&,unsigned int,const QString&)),
41 this, SLOT(triggered(const QString&,unsigned int,const QString&)) );
42 }
43 else
44 {
45 QMessageBox::warning( qApp->desktop(), "info", "Couldn't watch /tmp/foo\nDoes it exist?" );
46 }
39} 47}
40 48
41App::~App() 49App::~App()
42{ 50{
43 odebug << "~App()" << oendl; 51 odebug << "~App()" << oendl;
52 delete tmpfoo;
44} 53}
45 54
46void App::triggered( const QString& str1, unsigned int id, const QString& str2 ) 55void App::triggered( const QString& str1, unsigned int id, const QString& str2 )
47{ 56{
48 QMessageBox::information( qApp->desktop(), "info", QString( "%1\n%2\n%3" ).arg( str1 ).arg( id ).arg( str2 ) ); 57 QMessageBox::information( qApp->desktop(), "info", QString().sprintf( "%s\n0x%08x\n%s",
58 (const char*) str1, id, (const char*) str2 ) );
49} 59}
50 60
51int main( int argc, char** argv ) 61int main( int argc, char** argv )
52{ 62{
53 App* app = new App( argc, argv ); 63 App* app = new App( argc, argv );
54 QPushButton* b = new QPushButton( "Click me to close", 0 ); 64 QPushButton* b = new QPushButton( "Click me to close", 0 );
55 QObject::connect( b, SIGNAL(clicked()), qApp, SLOT(quit()) ); 65 QObject::connect( b, SIGNAL(clicked()), qApp, SLOT(quit()) );
56 b->resize( 200, 200 ); 66 b->resize( 200, 200 );
57 b->move( 150, 150 ); 67 b->move( 150, 150 );
58 b->show(); 68 b->show();
59 app->setMainWidget( b ); 69 app->setMainWidget( b );
60 app->exec(); 70 app->exec();
61 delete app; 71 delete app;
62 72
63 return 0; 73 return 0;
64 74
65} 75}
66 76
diff --git a/examples/opiecore/onotifytest/main.h b/examples/opiecore/onotifytest/main.h
index afad947..7ce4b9f 100644
--- a/examples/opiecore/onotifytest/main.h
+++ b/examples/opiecore/onotifytest/main.h
@@ -1,23 +1,29 @@
1// (C) Michael 'Mickey' Lauer <mickey@Vanille.de> 1// (C) Michael 'Mickey' Lauer <mickey@Vanille.de>
2// LICENSE = "GPLv2" 2// LICENSE = "GPLv2"
3 3
4#ifndef MAIN_H 4#ifndef MAIN_H
5#define MAIN_H 5#define MAIN_H
6 6
7/* OPIE */
8#include <opie2/ofilenotify.h>
9
7/* QT */ 10/* QT */
8#include <qapplication.h> 11#include <qapplication.h>
9#include <qpushbutton.h> 12#include <qpushbutton.h>
10#include <qtextstream.h> 13#include <qtextstream.h>
11 14
12class App : public QApplication 15class App : public QApplication
13{ 16{
14 Q_OBJECT 17 Q_OBJECT
15public: 18 public:
16 App( int argc, char** argv ); 19 App( int argc, char** argv );
17 ~App(); 20 ~App();
18 21
19public slots: 22 public slots:
20 void triggered( const QString&, unsigned int, const QString& ); 23 void triggered( const QString&, unsigned int, const QString& );
24
25 private:
26 Opie::Core::ODirNotification* tmpfoo;
21}; 27};
22 28
23#endif 29#endif
diff --git a/libopie2/opiecore/linux/ofilenotify.cpp b/libopie2/opiecore/linux/ofilenotify.cpp
index a7820ee..68c5a96 100644
--- a/libopie2/opiecore/linux/ofilenotify.cpp
+++ b/libopie2/opiecore/linux/ofilenotify.cpp
@@ -1,444 +1,450 @@
1/* 1/*
2                This file is part of the Opie Project 2                This file is part of the Opie Project
3 =. Copyright (C) 2004-2005 Michael 'Mickey' Lauer <mickey@Vanille.de> 3 =. Copyright (C) 2004-2005 Michael 'Mickey' Lauer <mickey@Vanille.de>
4 .=l. Copyright (C) The Opie Team <opie-devel@handhelds.org> 4 .=l. Copyright (C) The Opie Team <opie-devel@handhelds.org>
5          .>+-= 5          .>+-=
6_;:,     .>    :=|. This program is free software; you can 6_;:,     .>    :=|. This program is free software; you can
7.> <`_,   >  .   <= redistribute it and/or modify it under 7.> <`_,   >  .   <= redistribute it and/or modify it under
8:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 8:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
9.="- .-=="i,     .._ License as published by the Free Software 9.="- .-=="i,     .._ License as published by the Free Software
10- .   .-<_>     .<> Foundation; version 2 of the License. 10- .   .-<_>     .<> Foundation; version 2 of the License.
11    ._= =}       : 11    ._= =}       :
12   .%`+i>       _;_. 12   .%`+i>       _;_.
13   .i_,=:_.      -<s. This program is distributed in the hope that 13   .i_,=:_.      -<s. This program is distributed in the hope that
14    +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 14    +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
15   : ..    .:,     . . . without even the implied warranty of 15   : ..    .:,     . . . without even the implied warranty of
16   =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 16   =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
17 _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 17 _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
18..}^=.=       =       ; Library General Public License for more 18..}^=.=       =       ; Library General Public License for more
19++=   -.     .`     .: details. 19++=   -.     .`     .: details.
20:     =  ...= . :.=- 20:     =  ...= . :.=-
21-.   .:....=;==+<; You should have received a copy of the GNU 21-.   .:....=;==+<; You should have received a copy of the GNU
22 -_. . .   )=.  = Library General Public License along with 22 -_. . .   )=.  = Library General Public License along with
23   --        :-=` this library; see the file COPYING.LIB. 23   --        :-=` this library; see the file COPYING.LIB.
24 If not, write to the Free Software Foundation, 24 If not, write to the Free Software Foundation,
25 Inc., 59 Temple Place - Suite 330, 25 Inc., 59 Temple Place - Suite 330,
26 Boston, MA 02111-1307, USA. 26 Boston, MA 02111-1307, USA.
27*/ 27*/
28 28
29#include "ofilenotify.h" 29#include "ofilenotify.h"
30using namespace Opie::Core; 30using namespace Opie::Core;
31 31
32/* OPIE */ 32/* OPIE */
33 33
34/* QT */ 34/* QT */
35#include <qobject.h> 35#include <qobject.h>
36#include <qsocketnotifier.h> 36#include <qsocketnotifier.h>
37#include <qsignal.h> 37#include <qsignal.h>
38#include <qintdict.h> 38#include <qintdict.h>
39#include <qdir.h> 39#include <qdir.h>
40 40
41/* STD */ 41/* STD */
42#include <sys/types.h> 42#include <sys/types.h>
43#include <sys/stat.h> 43#include <sys/stat.h>
44#include <sys/ioctl.h> 44#include <sys/ioctl.h>
45#include <fcntl.h> 45#include <fcntl.h>
46#include <assert.h> 46#include <assert.h>
47#include <string.h> 47#include <string.h>
48#include <errno.h> 48#include <errno.h>
49#include <unistd.h> 49#include <unistd.h>
50 50
51static QIntDict<OFileNotification> notification_list; 51static QIntDict<OFileNotification> notification_list;
52 52
53QSocketNotifier* OFileNotification::_sn; 53QSocketNotifier* OFileNotification::_sn;
54int OFileNotification::_fd = -1; 54int OFileNotification::_fd = -1;
55 55
56#define INOTIFY_DEVICE "/dev/inotify" 56#define INOTIFY_DEVICE "/dev/inotify"
57 57
58namespace Opie { 58namespace Opie {
59namespace Core { 59namespace Core {
60 60
61//================================================================================================= 61//=================================================================================================
62// OFile 62// OFile
63//================================================================================================= 63//=================================================================================================
64 64
65OFile::OFile() : QObject( 0, 0 ), QFile() 65OFile::OFile() : QObject( 0, 0 ), QFile()
66{ 66{
67 qDebug( "OFile()" ); 67 qDebug( "OFile()" );
68} 68}
69 69
70OFile::OFile( const QString& name ) : QObject( 0, 0 ), QFile( name ) 70OFile::OFile( const QString& name ) : QObject( 0, 0 ), QFile( name )
71{ 71{
72 qDebug( "OFile()" ); 72 qDebug( "OFile()" );
73} 73}
74 74
75OFile::~OFile() 75OFile::~OFile()
76{ 76{
77 qDebug( "~OFile()" ); 77 qDebug( "~OFile()" );
78} 78}
79 79
80void OFile::connectNotify( const char *signal ) 80void OFile::connectNotify( const char *signal )
81{ 81{
82 QString s = normalizeSignalSlot( signal+1 ); 82 QString s = normalizeSignalSlot( signal+1 );
83 qDebug( "OFile::connectNotify() signal = '%s'", (const char*) s ); 83 qDebug( "OFile::connectNotify() signal = '%s'", (const char*) s );
84 84
85 if ( s.startsWith( "accessed" ) ) 85 if ( s.startsWith( "accessed" ) )
86 86
87 87
88 88
89 89
90 90
91 91
92 92
93 QObject::connectNotify( signal ); 93 QObject::connectNotify( signal );
94 94
95/* 95/*
96 void accessed( const QString& ); 96 void accessed( const QString& );
97 void modified( const QString& ); 97 void modified( const QString& );
98 void attributed( const QString& ); 98 void attributed( const QString& );
99 void closed( const QString&, bool ); 99 void closed( const QString&, bool );
100 void opened( const QString& ); 100 void opened( const QString& );
101 void deleted( const QString& ); 101 void deleted( const QString& );
102 void unmounted( const QString& ); 102 void unmounted( const QString& );
103*/ 103*/
104 104
105} 105}
106 106
107void OFile::disconnectNotify( const char* signal ) 107void OFile::disconnectNotify( const char* signal )
108{ 108{
109 qDebug( "OFile::disconnectNotify() signal = '%s'", signal ); 109 qDebug( "OFile::disconnectNotify() signal = '%s'", signal );
110 QObject::disconnectNotify( signal ); 110 QObject::disconnectNotify( signal );
111} 111}
112 112
113int OFile::startWatch( int mode ) 113int OFile::startWatch( int mode )
114{ 114{
115} 115}
116 116
117//================================================================================================= 117//=================================================================================================
118// OFileNotificationEvent 118// OFileNotificationEvent
119//================================================================================================= 119//=================================================================================================
120OFileNotificationEvent::OFileNotificationEvent( OFileNotification* parent, int wd, unsigned int mask, unsigned int cookie, const QString& name ) 120OFileNotificationEvent::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
127OFileNotificationEvent::~OFileNotificationEvent() 127OFileNotificationEvent::~OFileNotificationEvent()
128{ 128{
129 qDebug( "~OFileNotificationEvent()" ); 129 qDebug( "~OFileNotificationEvent()" );
130} 130}
131 131
132//================================================================================================= 132//=================================================================================================
133// OFileNotification 133// OFileNotification
134//================================================================================================= 134//=================================================================================================
135OFileNotification::OFileNotification( QObject* parent, const char* name ) 135OFileNotification::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
142OFileNotification::~OFileNotification() 142OFileNotification::~OFileNotification()
143{ 143{
144 stop(); 144 stop();
145 qDebug( "OFileNotification::~OFileNotification()" ); 145 qDebug( "OFileNotification::~OFileNotification()" );
146} 146}
147 147
148 148
149bool OFileNotification::isActive() const 149bool OFileNotification::isActive() const
150{ 150{
151 return _active; 151 return _active;
152} 152}
153 153
154 154
155int OFileNotification::watch( const QString& path, bool sshot, OFileNotificationType type ) 155int 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
174int OFileNotification::startWatching( const QString& path, bool sshot, OFileNotificationType type ) 174int 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
204void OFileNotification::stop() 204void 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
217OFileNotificationType OFileNotification::type() const 217OFileNotificationType OFileNotification::type() const
218{ 218{
219 return _type; 219 return _type;
220} 220}
221 221
222 222
223QString OFileNotification::path() const 223QString OFileNotification::path() const
224{ 224{
225 return _path; 225 return _path;
226} 226}
227 227
228 228
229bool OFileNotification::isSingleShot() const 229bool OFileNotification::isSingleShot() const
230{ 230{
231 return !_multi; 231 return !_multi;
232} 232}
233 233
234 234
235bool OFileNotification::activate( const OFileNotificationEvent* e ) 235bool OFileNotification::activate( const OFileNotificationEvent* e )
236{ 236{
237 qDebug( "OFileNotification::activate(): e = ( %s, %d, 0x%08x, %d, %s )", (const char*) _path, e->descriptor(), e->mask(), e->cookie(), (const char*) e->name() ); 237 qDebug( "OFileNotification::activate(): e = ( %s, %d, 0x%08x, %d, %s )", (const char*) _path, e->descriptor(), e->mask(), e->cookie(), (const char*) e->name() );
238 238
239 //FIXME: Should we really deliver QueueOverflow and/or Ignore to user level code?
240
239 // dumb signal 241 // dumb signal
240 _signal.activate(); 242 _signal.activate();
241 243
242 // generic signal 244 // generic signal
243 emit triggered( _path, e->mask(), e->name() ); 245 emit triggered( _path, e->mask(), e->name() );
244 246
245 // specialized signals 247 // specialized signals
246 switch ( e->mask() ) 248 switch ( e->mask() )
247 { 249 {
248 case Access: emit accessed( _path ); break; 250 case Access: emit accessed( _path ); break;
249 case Modify: emit modified( _path ); break; 251 case Modify: emit modified( _path ); break;
250 case Attrib: emit attributed( _path); break; 252 case Attrib: emit attributed( _path); break;
251 case CloseWrite: emit closed( _path, true ); break; 253 case CloseWrite: emit closed( _path, true ); break;
252 case CloseNoWrite: emit closed( _path, false ); break; 254 case CloseNoWrite: emit closed( _path, false ); break;
253 case Open: emit opened( _path ); break; 255 case Open: emit opened( _path ); break;
254 case MovedFrom: emit movedFrom( _path, e->name() ); break; 256 case MovedFrom: emit movedFrom( _path, e->name() ); break;
255 case MovedTo: emit movedTo( _path, e->name() ); break; 257 case MovedTo: emit movedTo( _path, e->name() ); break;
256 case DeleteSubdir: emit deletedSubdir( _path, e->name() ); break; 258 case DeleteSubdir: emit deletedSubdir( _path, e->name() ); break;
257 case DeleteFile: emit deletedFile( _path, e->name() ); break; 259 case DeleteFile: emit deletedFile( _path, e->name() ); break;
258 case CreateSubdir: emit createdSubdir( _path, e->name() ); break; 260 case CreateSubdir: emit createdSubdir( _path, e->name() ); break;
259 case CreateFile: emit createdFile( _path, e->name() ); break; 261 case CreateFile: emit createdFile( _path, e->name() ); break;
260 case DeleteSelf: emit deleted( _path ); break; 262 case DeleteSelf: emit deleted( _path ); break;
261 case Unmount: emit unmounted( _path ); break; 263 case Unmount: emit unmounted( _path ); break;
264 case _QueueOverflow: qFatal( "OFileNotification::activate() - Inotify Event Queue Overload!" ); break;
265 case _Ignored: qWarning( "OFileNotification::activate() - Further Events for '%s' will be ignored", (const char*) _path ); break;
262 default: assert( 0 ); 266 default: assert( 0 );
263 } 267 }
264 268
269 delete e;
270
265 if ( !_multi ) stop(); 271 if ( !_multi ) stop();
266 272
267 return true; 273 return true;
268} 274}
269 275
270 276
271bool OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type ) 277bool OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type )
272{ 278{
273 OFileNotification* ofn = new OFileNotification(); 279 OFileNotification* ofn = new OFileNotification();
274 ofn->_signal.connect( receiver, member ); 280 ofn->_signal.connect( receiver, member );
275 return ofn->watch( path, true, type ) != -1; 281 return ofn->watch( path, true, type ) != -1;
276} 282}
277 283
278 284
279void OFileNotification::inotifyEventHandler() 285void OFileNotification::inotifyEventHandler()
280{ 286{
281 qDebug( "OFileNotification::inotifyEventHandler(): reached." ); 287 qDebug( "OFileNotification::inotifyEventHandler(): reached." );
282 288
283 char buffer[16384]; 289 char buffer[16384];
284 ssize_t buffer_i; 290 ssize_t buffer_i;
285 struct inotify_event *pevent, *event; 291 struct inotify_event *pevent, *event;
286 ssize_t r; 292 ssize_t r;
287 size_t event_size; 293 size_t event_size;
288 int count = 0; 294 int count = 0;
289 295
290 r = ::read(_fd, buffer, 16384); 296 r = ::read(_fd, buffer, 16384);
291 297
292 if ( r <= 0 ) 298 if ( r <= 0 )
293 return; 299 return;
294 300
295 buffer_i = 0; 301 buffer_i = 0;
296 while ( buffer_i < r ) 302 while ( buffer_i < r )
297 { 303 {
298 pevent = (struct inotify_event *)&buffer[buffer_i]; 304 pevent = (struct inotify_event *)&buffer[buffer_i];
299 event_size = sizeof(struct inotify_event) + pevent->len; 305 event_size = sizeof(struct inotify_event) + pevent->len;
300 OFileNotificationEvent* e = new OFileNotificationEvent( notification_list[ pevent->wd ], pevent->wd, pevent->mask, 306 OFileNotificationEvent* e = new OFileNotificationEvent( notification_list[ pevent->wd ], pevent->wd, pevent->mask,
301 pevent->cookie, pevent->len ? pevent->name : 0 ); 307 pevent->cookie, pevent->len ? pevent->name : 0 );
302 e->activate(); 308 e->activate();
303 buffer_i += event_size; 309 buffer_i += event_size;
304 count++; 310 count++;
305 } 311 }
306 312
307 qDebug( "OFileNotification::inotifyEventHandler(): processed %d events", count ); 313 qDebug( "OFileNotification::inotifyEventHandler(): processed %d events", count );
308} 314}
309 315
310 316
311bool OFileNotification::registerEventHandler() 317bool OFileNotification::registerEventHandler()
312{ 318{
313 OFileNotification::_fd = ::open( INOTIFY_DEVICE, O_RDONLY ); 319 OFileNotification::_fd = ::open( INOTIFY_DEVICE, O_RDONLY );
314 if ( OFileNotification::_fd < 0 ) 320 if ( OFileNotification::_fd < 0 )
315 { 321 {
316 qWarning( "OFileNotification::registerEventHandler(): couldn't register event handler: %s", strerror( errno ) ); 322 qWarning( "OFileNotification::registerEventHandler(): couldn't register event handler: %s", strerror( errno ) );
317 return false; 323 return false;
318 } 324 }
319 325
320 OFileNotification::_sn = new QSocketNotifier( _fd, QSocketNotifier::Read, this, "inotify event" ); 326 OFileNotification::_sn = new QSocketNotifier( _fd, QSocketNotifier::Read );
321 connect( OFileNotification::_sn, SIGNAL( activated(int) ), this, SLOT( inotifyEventHandler() ) ); 327 connect( OFileNotification::_sn, SIGNAL( activated(int) ), this, SLOT( inotifyEventHandler() ) );
322 328
323 qDebug( "OFileNotification::registerEventHandler(): done" ); 329 qDebug( "OFileNotification::registerEventHandler(): done" );
324 return true; 330 return true;
325} 331}
326 332
327 333
328void OFileNotification::unregisterEventHandler() 334void OFileNotification::unregisterEventHandler()
329{ 335{
330 if ( _sn ) delete _sn; 336 if ( _sn ) delete _sn;
331 if ( OFileNotification::_fd ) 337 if ( OFileNotification::_fd )
332 ::close( OFileNotification::_fd ); 338 ::close( OFileNotification::_fd );
333 qDebug( "OFileNotification::unregisterEventHandler(): done" ); 339 qDebug( "OFileNotification::unregisterEventHandler(): done" );
334} 340}
335 341
336//================================================================================================= 342//=================================================================================================
337// ODirNotification 343// ODirNotification
338//================================================================================================= 344//=================================================================================================
339ODirNotification::ODirNotification( QObject* parent, const char* name ) 345ODirNotification::ODirNotification( QObject* parent, const char* name )
340 :QObject( parent, name ), _topfilenotification( 0 ), _type( Nothing ), _depth( -123 ) 346 :QObject( parent, name ), _topfilenotification( 0 ), _type( Nothing ), _depth( -123 )
341{ 347{
342 qDebug( "ODirNotification::ODirNotification()" ); 348 qDebug( "ODirNotification::ODirNotification()" );
343} 349}
344 350
345 351
346ODirNotification::~ODirNotification() 352ODirNotification::~ODirNotification()
347{ 353{
348 qDebug( "ODirNotification::~ODirNotification()" ); 354 qDebug( "ODirNotification::~ODirNotification()" );
349} 355}
350 356
351/* 357/**
352 Love-Trowbridge recursive directory scanning algorithm: 358 Love-Trowbridge recursive directory scanning algorithm:
353 359
354 Step 1. Start at initial directory foo. Add watch. 360 Step 1. Start at initial directory foo. Add watch.
355 361
356 Step 2. Setup handlers for watch created in Step 1. 362 Step 2. Setup handlers for watch created in Step 1.
357 Specifically, ensure that a directory created 363 Specifically, ensure that a directory created
358 in foo will result in a handled CREATE_SUBDIR 364 in foo will result in a handled CREATE_SUBDIR
359 event. 365 event.
360 366
361 Step 3. Read the contents of foo. 367 Step 3. Read the contents of foo.
362 368
363 Step 4. For each subdirectory of foo read in step 3, repeat 369 Step 4. For each subdirectory of foo read in step 3, repeat
364 step 1. 370 step 1.
365 371
366 Step 5. For any CREATE_SUBDIR event on bar, if a watch is 372 Step 5. For any CREATE_SUBDIR event on bar, if a watch is
367 not yet created on bar, repeat step 1 on bar. 373 not yet created on bar, repeat step 1 on bar.
368*/ 374**/
369 375
370int ODirNotification::watch( const QString& path, bool sshot, OFileNotificationType type, int recurse ) 376int ODirNotification::watch( const QString& path, bool sshot, OFileNotificationType type, int recurse )
371{ 377{
372 if ( _type == Nothing ) _type = type; // only set it once - for the top level call 378 if ( _type == Nothing ) _type = type; // only set it once - for the top level call
373 OFileNotificationType subtype = ( recurse != 0 ) ? (OFileNotificationType) int( _type | CreateSubdir ) : _type; 379 OFileNotificationType subtype = ( recurse != 0 ) ? (OFileNotificationType) int( _type | CreateSubdir ) : _type;
374 qDebug( "ODirNotification::watch( %s, %d, 0x%08x, %d )", (const char*) path, sshot, subtype, recurse ); 380 qDebug( "ODirNotification::watch( %s, %d, 0x%08x, %d )", (const char*) path, sshot, subtype, recurse );
375 OFileNotification* fn = new OFileNotification( this, "ODirNotification delegate" ); 381 OFileNotification* fn = new OFileNotification( this, "ODirNotification delegate" );
376 382
377 int result = fn->startWatching( path, sshot, subtype ); 383 int result = fn->startWatching( path, sshot, subtype );
378 if ( result != -1 ) 384 if ( result != -1 )
379 { 385 {
380 386
381 if ( !_topfilenotification ) _topfilenotification = fn; // only set it once - for the top level call 387 if ( !_topfilenotification ) _topfilenotification = fn; // only set it once - for the top level call
382 if ( _depth == -123 ) _depth = recurse; // only set it once - for the top level call 388 if ( _depth == -123 ) _depth = recurse; // only set it once - for the top level call
383 389
384 connect( fn, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ), this, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ) ); 390 connect( fn, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ), this, SIGNAL( triggered( const QString&, unsigned int, const QString& ) ) );
385 connect( fn, SIGNAL( accessed( const QString& ) ), this, SIGNAL( accessed( const QString& ) ) ); 391 connect( fn, SIGNAL( accessed( const QString& ) ), this, SIGNAL( accessed( const QString& ) ) );
386 connect( fn, SIGNAL( modified( const QString& ) ), this, SIGNAL( modified( const QString& ) ) ); 392 connect( fn, SIGNAL( modified( const QString& ) ), this, SIGNAL( modified( const QString& ) ) );
387 connect( fn, SIGNAL( attributed( const QString& ) ), this, SIGNAL( attributed( const QString& ) ) ); 393 connect( fn, SIGNAL( attributed( const QString& ) ), this, SIGNAL( attributed( const QString& ) ) );
388 connect( fn, SIGNAL( closed( const QString&, bool ) ), this, SIGNAL( closed( const QString&, bool ) ) ); 394 connect( fn, SIGNAL( closed( const QString&, bool ) ), this, SIGNAL( closed( const QString&, bool ) ) );
389 connect( fn, SIGNAL( opened( const QString& ) ), this, SIGNAL( opened( const QString& ) ) ); 395 connect( fn, SIGNAL( opened( const QString& ) ), this, SIGNAL( opened( const QString& ) ) );
390 connect( fn, SIGNAL( movedTo( const QString&, const QString& ) ), this, SIGNAL( movedTo( const QString&, const QString& ) ) ); 396 connect( fn, SIGNAL( movedTo( const QString&, const QString& ) ), this, SIGNAL( movedTo( const QString&, const QString& ) ) );
391 connect( fn, SIGNAL( movedFrom( const QString&, const QString& ) ), this, SIGNAL( movedFrom( const QString&, const QString& ) ) ); 397 connect( fn, SIGNAL( movedFrom( const QString&, const QString& ) ), this, SIGNAL( movedFrom( const QString&, const QString& ) ) );
392 connect( fn, SIGNAL( deletedSubdir( const QString&, const QString& ) ), this, SIGNAL( deletedSubdir( const QString&, const QString& ) ) ); 398 connect( fn, SIGNAL( deletedSubdir( const QString&, const QString& ) ), this, SIGNAL( deletedSubdir( const QString&, const QString& ) ) );
393 connect( fn, SIGNAL( deletedFile( const QString&, const QString& ) ), this, SIGNAL( deletedFile( const QString&, const QString& ) ) );; 399 connect( fn, SIGNAL( deletedFile( const QString&, const QString& ) ), this, SIGNAL( deletedFile( const QString&, const QString& ) ) );;
394 connect( fn, SIGNAL( createdSubdir( const QString&, const QString& ) ), this, SIGNAL( createdSubdir( const QString&, const QString& ) ) ); 400 connect( fn, SIGNAL( createdSubdir( const QString&, const QString& ) ), this, SIGNAL( createdSubdir( const QString&, const QString& ) ) );
395 connect( fn, SIGNAL( createdFile( const QString&, const QString& ) ), this, SIGNAL( createdFile( const QString&, const QString& ) ) ); 401 connect( fn, SIGNAL( createdFile( const QString&, const QString& ) ), this, SIGNAL( createdFile( const QString&, const QString& ) ) );
396 connect( fn, SIGNAL( deleted( const QString& ) ), this, SIGNAL( deleted( const QString& ) ) ); 402 connect( fn, SIGNAL( deleted( const QString& ) ), this, SIGNAL( deleted( const QString& ) ) );
397 connect( fn, SIGNAL( unmounted( const QString& ) ), this, SIGNAL( unmounted( const QString& ) ) ); 403 connect( fn, SIGNAL( unmounted( const QString& ) ), this, SIGNAL( unmounted( const QString& ) ) );
398 404
399 if ( recurse != 0 ) 405 if ( recurse != 0 )
400 { 406 {
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
423void ODirNotification::subdirCreated( const QString& dir, const QString& subdir ) 429void 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
@@ -1,339 +1,340 @@
1/* 1/*
2                This file is part of the Opie Project 2                This file is part of the Opie Project
3 =. Copyright (C) 2004-2005 Michael 'Mickey' Lauer <mickey@Vanille.de> 3 =. Copyright (C) 2004-2005 Michael 'Mickey' Lauer <mickey@Vanille.de>
4 .=l. Copyright (C) The Opie Team <opie-devel@handhelds.org> 4 .=l. Copyright (C) The Opie Team <opie-devel@handhelds.org>
5          .>+-= 5          .>+-=
6_;:,     .>    :=|. This program is free software; you can 6_;:,     .>    :=|. This program is free software; you can
7.> <`_,   >  .   <= redistribute it and/or modify it under 7.> <`_,   >  .   <= redistribute it and/or modify it under
8:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 8:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
9.="- .-=="i,     .._ License as published by the Free Software 9.="- .-=="i,     .._ License as published by the Free Software
10- .   .-<_>     .<> Foundation; version 2 of the License. 10- .   .-<_>     .<> Foundation; version 2 of the License.
11    ._= =}       : 11    ._= =}       :
12   .%`+i>       _;_. 12   .%`+i>       _;_.
13   .i_,=:_.      -<s. This program is distributed in the hope that 13   .i_,=:_.      -<s. This program is distributed in the hope that
14    +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 14    +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
15   : ..    .:,     . . . without even the implied warranty of 15   : ..    .:,     . . . without even the implied warranty of
16   =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 16   =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
17 _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 17 _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
18..}^=.=       =       ; Library General Public License for more 18..}^=.=       =       ; Library General Public License for more
19++=   -.     .`     .: details. 19++=   -.     .`     .: details.
20:     =  ...= . :.=- 20:     =  ...= . :.=-
21-.   .:....=;==+<; You should have received a copy of the GNU 21-.   .:....=;==+<; You should have received a copy of the GNU
22 -_. . .   )=.  = Library General Public License along with 22 -_. . .   )=.  = Library General Public License along with
23   --        :-=` this library; see the file COPYING.LIB. 23   --        :-=` this library; see the file COPYING.LIB.
24 If not, write to the Free Software Foundation, 24 If not, write to the Free Software Foundation,
25 Inc., 59 Temple Place - Suite 330, 25 Inc., 59 Temple Place - Suite 330,
26 Boston, MA 02111-1307, USA. 26 Boston, MA 02111-1307, USA.
27*/ 27*/
28 28
29#ifndef OFILENOTIFY_H 29#ifndef OFILENOTIFY_H
30#define OFILENOTIFY_H 30#define OFILENOTIFY_H
31#if defined (__GNUC__) && (__GNUC__ < 3) 31#if defined (__GNUC__) && (__GNUC__ < 3)
32#define _GNU_SOURCE 32#define _GNU_SOURCE
33#endif 33#endif
34 34
35#include "linux_inotify.h" 35#include "linux_inotify.h"
36 36
37/* QT */ 37/* QT */
38#include <qsocketnotifier.h> 38#include <qsocketnotifier.h>
39#include <qsignal.h> 39#include <qsignal.h>
40#include <qstring.h> 40#include <qstring.h>
41#include <qobject.h> 41#include <qobject.h>
42#include <qfile.h> 42#include <qfile.h>
43 43
44namespace Opie { 44namespace Opie {
45namespace Core { 45namespace Core {
46 46
47class OFile : public QObject, public QFile 47class OFile : public QObject, public QFile
48{ 48{
49 Q_OBJECT 49 Q_OBJECT
50 50
51 public: 51 public:
52 OFile(); 52 OFile();
53 OFile( const QString & name ); 53 OFile( const QString & name );
54 virtual ~OFile(); 54 virtual ~OFile();
55 55
56 protected: 56 protected:
57 virtual void connectNotify( const char* signal ); 57 virtual void connectNotify( const char* signal );
58 virtual void disconnectNotify( const char* signal ); 58 virtual void disconnectNotify( const char* signal );
59 59
60 private: 60 private:
61 int startWatch( int mode ); 61 int startWatch( int mode );
62 62
63 signals: 63 signals:
64 void accessed( const QString& ); 64 void accessed( const QString& );
65 void modified( const QString& ); 65 void modified( const QString& );
66 void attributed( const QString& ); 66 void attributed( const QString& );
67 void closed( const QString&, bool ); 67 void closed( const QString&, bool );
68 void opened( const QString& ); 68 void opened( const QString& );
69 void deleted( const QString& ); 69 void deleted( const QString& );
70 void unmounted( const QString& ); 70 void unmounted( const QString& );
71}; 71};
72 72
73/* 73/*
74 void movedTo( const QString&, const QString& ); 74 void movedTo( const QString&, const QString& );
75 void movedFrom( const QString&, const QString& ); 75 void movedFrom( const QString&, const QString& );
76 void deletedSubdir( const QString&, const QString& ); 76 void deletedSubdir( const QString&, const QString& );
77 void deletedFile( const QString&, const QString& ); 77 void deletedFile( const QString&, const QString& );
78 void createdSubdir( const QString&, const QString& ); 78 void createdSubdir( const QString&, const QString& );
79 void createdFile( const QString&, const QString& ); 79 void createdFile( const QString&, const QString& );
80*/ 80*/
81 81
82class OFileNotificationEvent; 82class OFileNotificationEvent;
83 83
84/*====================================================================================== 84/*======================================================================================
85 * OFileNotificationType 85 * OFileNotificationType
86 *======================================================================================*/ 86 *======================================================================================*/
87 87
88/** 88/**
89 * @brief An enumerate for the different types of file notifications 89 * @brief An enumerate for the different types of file notifications
90 * 90 *
91 * This enumerate provides a means to specify the type of events that you are interest in. 91 * This enumerate provides a means to specify the type of events that you are interest in.
92 * Valid values are: 92 * Valid values are:
93 * <ul> 93 * <ul>
94 * <li>Access: The file was accessed (read) 94 * <li>Access: The file was accessed (read)
95 * <li>Modify The file was modified (write,truncate) 95 * <li>Modify The file was modified (write,truncate)
96 * <li>Attrib = The file had its attributes changed (chmod,chown,chgrp) 96 * <li>Attrib = The file had its attributes changed (chmod,chown,chgrp)
97 * <li>CloseWrite = Writable file was closed 97 * <li>CloseWrite = Writable file was closed
98 * <li>CloseNoWrite = Unwritable file was closed 98 * <li>CloseNoWrite = Unwritable file was closed
99 * <li>Open = File was opened 99 * <li>Open = File was opened
100 * <li>MovedFrom = File was moved from X 100 * <li>MovedFrom = File was moved from X
101 * <li>MovedTo = File was moved to Y 101 * <li>MovedTo = File was moved to Y
102 * <li>DeleteSubdir = Subdir was deleted 102 * <li>DeleteSubdir = Subdir was deleted
103 * <li>DeleteFile = Subfile was deleted 103 * <li>DeleteFile = Subfile was deleted
104 * <li>CreateSubdir = Subdir was created 104 * <li>CreateSubdir = Subdir was created
105 * <li>CreateFile = Subfile was created 105 * <li>CreateFile = Subfile was created
106 * <li>DeleteSelf = Self was deleted 106 * <li>DeleteSelf = Self was deleted
107 * <li>Unmount = The backing filesystem was unmounted 107 * <li>Unmount = The backing filesystem was unmounted
108 * </ul> 108 * </ul>
109 * 109 *
110 **/ 110 **/
111 111
112enum OFileNotificationType 112enum OFileNotificationType
113{ 113{
114 Nothing = 0, 114 Nothing = 0,
115 Access = IN_ACCESS, 115 Access = IN_ACCESS,
116 Modify = IN_MODIFY, 116 Modify = IN_MODIFY,
117 Attrib = IN_ATTRIB, 117 Attrib = IN_ATTRIB,
118 CloseWrite = IN_CLOSE_WRITE, 118 CloseWrite = IN_CLOSE_WRITE,
119 CloseNoWrite = IN_CLOSE_NOWRITE, 119 CloseNoWrite = IN_CLOSE_NOWRITE,
120 Open = IN_OPEN, 120 Open = IN_OPEN,
121 MovedFrom = IN_MOVED_FROM, 121 MovedFrom = IN_MOVED_FROM,
122 MovedTo = IN_MOVED_TO, 122 MovedTo = IN_MOVED_TO,
123 DeleteSubdir = IN_DELETE_SUBDIR, 123 DeleteSubdir = IN_DELETE_SUBDIR,
124 DeleteFile = IN_DELETE_FILE, 124 DeleteFile = IN_DELETE_FILE,
125 CreateSubdir = IN_CREATE_SUBDIR, 125 CreateSubdir = IN_CREATE_SUBDIR,
126 CreateFile = IN_CREATE_FILE, 126 CreateFile = IN_CREATE_FILE,
127 DeleteSelf = IN_DELETE_SELF, 127 DeleteSelf = IN_DELETE_SELF,
128 Unmount = IN_UNMOUNT, 128 Unmount = IN_UNMOUNT,
129 _QueueOverflow = IN_Q_OVERFLOW, /* Internal, don't use this in client code */ 129 _QueueOverflow = IN_Q_OVERFLOW, /* Internal, don't use this in client code */
130 _Ignored = IN_IGNORED, /* Internal, don't use this in client code */ 130 _Ignored = IN_IGNORED, /* Internal, don't use this in client code */
131}; 131};
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
149class OFileNotification : public QObject 149class 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
268class ODirNotification : public QObject 269class ODirNotification : public QObject
269{ 270{
270 Q_OBJECT 271 Q_OBJECT
271 272
272 public: 273 public:
273 ODirNotification( QObject* parent = 0, const char* name = 0 ); 274 ODirNotification( QObject* parent = 0, const char* name = 0 );
274 ~ODirNotification(); 275 ~ODirNotification();
275 /** 276 /**
276 * Starts to watch for @a type changes to @a path. Recurse @a recurse levels down the filesystem tree, 277 * Starts to watch for @a type changes to @a path. Recurse @a recurse levels down the filesystem tree,
277 * use 0 for no recursion and -1 for unlimited recursion. 278 * use 0 for no recursion and -1 for unlimited recursion.
278 * Set @a sshot to True if you want to be notified only once. 279 * Set @a sshot to True if you want to be notified only once.
279 **/ 280 **/
280 int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify, int recurse = 0 ); 281 int watch( const QString& path, bool sshot = false, OFileNotificationType type = Modify, int recurse = 0 );
281 282
282 signals: 283 signals:
283 /** 284 /**
284 * This signal is emitted if an event happens of the specified type happens to the directory being watched. 285 * This signal is emitted if an event happens of the specified type happens to the directory being watched.
285 **/ 286 **/
286 void triggered( const QString&, unsigned int, const QString& ); 287 void triggered( const QString&, unsigned int, const QString& );
287 void accessed( const QString& ); 288 void accessed( const QString& );
288 void modified( const QString& ); 289 void modified( const QString& );
289 void attributed( const QString& ); 290 void attributed( const QString& );
290 void closed( const QString&, bool ); 291 void closed( const QString&, bool );
291 void opened( const QString& ); 292 void opened( const QString& );
292 void movedTo( const QString&, const QString& ); 293 void movedTo( const QString&, const QString& );
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
314class OFileNotificationEvent 315class 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
12LANG=$1
13
14if [ "$1x" == "x" ] ; then
15 echo "Usage: $0 <LANG>"
16 exit
17fi
18
19for i in `find . -name "*.pro"` ; do
20 grep TRANSLATIONS $i > /dev/null
21 if [ "$?" != 0 ] ; then
22 echo "$i: No Translations"
23 else
24 grep "../i18n/$LANG/" $i > /dev/null
25 if [ "$?" == 0 ] ; then
26 echo "$i: $LANG already there"
27 else
28 echo "$i: Adding $LANG"
29 perl -p -i.bak -e 's/^(TRANSLATIONS\s*\+?=\s*)(.+?i18n\/)(.+?)(\/.+?\.ts)(.*)$/$1$2$3$4 \\\n\t $2'$LANG'$4$5/' $i
30 fi
31 fi
32done
33
diff --git a/scripts/mkipks b/scripts/mkipks
new file mode 100755
index 0000000..f142029
--- a/dev/null
+++ b/scripts/mkipks
@@ -0,0 +1,261 @@
1#!/bin/sh
2
3if [ -z "$QTE_BASEVERSION" ]
4then
5 if [ -e $QTDIR/include/qglobal.h ]
6 then
7 QTE_BASEVERSION=`cat $QTDIR/include/qglobal.h|grep '^#define QT_VERSION'|grep -v STR|sed -e 's,#define QT_VERSION\t*,,;' -e 's,.*\([0-9]\)\([0-9]\)\([0-9]\).*,\1.\2.\3,;'`
8 else
9 QTE_BASEVERSION=2.3.4
10 fi
11fi
12if [ -z "$QTE_VERSION" ]
13then
14 if [ -e $QTDIR/include/qglobal.h ]
15 then
16 QTE_VERSION=`cat $QTDIR/include/qglobal.h|grep '^#define QT_VERSION_STR'|sed -e 's,#define QT_VERSION_STR\t*,,;' -e 's,.*"\([^"]*\)".*,\1,;'`
17 else
18 QTE_VERSION=2.3.4
19 fi
20fi
21[ -z "$QTE_REVISION" ] && QTE_REVISION=5
22DEB_VERSION=2.0
23
24# Have to do this here, since CVS can't store symlinks
25
26mkdir -p $OPIEDIR/etc/rcS.d
27ln -sf ../init.d/bootsplash $OPIEDIR/etc/rcS.d/S01bootsplash
28
29VERSION_MAJ=$(sed -n -e 's/.*QPE_VERSION "\([0-9]*\)\..*\..*".*/\1/p' <$OPIEDIR/include/qpe/version.h)
30VERSION_MIN=$(sed -n -e 's/.*QPE_VERSION ".*\.\([0-9]*\)\..*".*/\1/p' <$OPIEDIR/include/qpe/version.h)
31VERSION_PAT=$(sed -n -e 's/.*QPE_VERSION ".*\..*\.\([0-9]*\).*/\1/p' <$OPIEDIR/include/qpe/version.h)
32SUB_VERSION=$(sed -n -e 's,.*SUB_VERSION \"\(.*\)\".*,\1,p' <$OPIEDIR/include/qpe/version.h)
33if grep -q 'QPE_VERSION .*snapshot' $OPIEDIR/include/qpe/version.h
34then
35 [ -z "$VERSION_CVS" ] && VERSION_CVS="$(date +%Y%m%d)"
36 SUB_VERSION=$VERSION_CVS
37else
38 VERSION_CVS=""
39fi
40
41QPE_VERSION=$VERSION_MAJ.$VERSION_MIN.$VERSION_PAT
42
43ARCH=arm
44STRIP=arm-linux-strip
45STRIP_FILES="*ARM*not stripped"
46
47TDIR=/tmp/ipk$$
48DATADIR=$TDIR
49CTRLDIR=$TDIR/CONTROL
50
51IMAGEDIR=
52VERB=
53LIST=
54RPM=
55
56while [ $# -ne 0 ]
57do
58 case "$1" in
59 -v)
60 VERB=1
61 echo >&2 "Packaging for version $VERSION_MAJ.$VERSION_MIN.$VERSION_PAT$VERSION_CVS"
62 ;; -l)
63 LIST=1
64 ;; -i)
65 shift
66 IMAGEDIR=$1
67 DATADIR=$IMAGEDIR
68 mkdir -p $IMAGEDIR
69 ;; -classic)
70 classicopts=-c
71 ;; -rpm)
72 if [ "$OPIEDIR" != "/opt/Qtopia" ]
73 then
74 echo >&2 '$OPIEDIR is not the standard /usr/Qtopia directory.'
75 sleep 1
76 #exit 1
77 fi
78 RPM=1
79 ;; -arch)
80 shift
81 ARCH=$1
82 STRIP=
83 STRIP_FILES=
84 ;; /*)
85 FILES="$FILES $1"
86 ;; *)
87 FILES="$FILES $PWD/$1"
88 esac
89 shift
90done
91
92if [ -z "$FILES" ]
93then
94 FILES=`find $OPIEDIR -name "*.control" -print`
95fi
96
97RDIR=$PWD
98ORIGDIR=`pwd`
99cd $OPIEDIR
100
101for i in $FILES
102do
103 rm -rf $TDIR
104
105 mkdir -p $DATADIR
106 mkdir -p $CTRLDIR
107
108 packagename=${i##*/}; packagename=${packagename%.control}
109 version=$(eval echo '"'$(sed -n -e "s/^Version: *//p" $i)'"')
110 depends=$(eval echo '"'$(sed -n -e "s/^Depends: *//p" $i)'"')
111 files=$(eval echo $(sed -n -e "s/^Files://p" $i))
112 arch=$(eval echo $(sed -n -e "s/^Arch://p" $i))
113 section=$(sed -n -e "s/^Section: *//p" $i)
114 provides=$(sed -n -e "s/^Provides: *//p" $i)
115 conflicts=$(sed -n -e "s/^Conflicts: *//p" $i)
116 license=$(sed -n -e "s/^License: *//p" $i)
117 summary=$(sed -n -e "s/^Description: *//p" $i)
118 package=${packagename}_${version}_$ARCH
119 ERROR=
120 if [ -z "$files" ]
121 then
122 mkdir -p $DATADIR/usr/share/doc/$packagename
123 else
124 for f in $files
125 do
126 if [ -d $f ]
127 then
128 ffiles=$(find $f -type f -o -type b -o -type c -o -type l)
129 else
130 ffiles=$f
131 fi
132 for ff in $ffiles
133 do
134 case $ff in
135 */CVS/*)
136 continue
137 ;;*~)
138 continue
139 ;;*.control)
140 continue
141 ;; $QTDIR/*)
142 BASE=$(dirname /opt/QtPalmtop/${ff#$QTDIR/})
143 ;; etc/*.d/*)
144 BASE=$(dirname /$ff)
145 ;; root/*)
146 BASE=$(dirname ${ff#root})
147 ;; lib/*)
148 BASE=$(dirname /opt/QtPalmtop/$ff)
149 ;; $OPIEDIR/lib/*)
150 BASE=$(dirname /opt/QtPalmtop/${ff#$OPIEDIR/})
151 ;; $OPIEDIR/root/*)
152 BASE=$(dirname /${ff#$OPIEDIR/root/})
153 ;; *)
154 # For SHARP ROM compatibility. Should change to Qtopia.
155 BASE=/opt/QtPalmtop/$(dirname $ff)
156 esac
157
158 if [ -f $ff -o -b $ff -o -c $ff ]
159 then
160 D=$DATADIR$BASE
161 if [ -x $ff -a -n "$STRIP" ]
162 then
163 case $(file $ff) in
164 $STRIP_FILES)
165 $STRIP $ff
166 ;; *)
167 esac
168 fi
169 if [ -n "$RPM" ]
170 then
171 case "$ff" in
172 /*) RPMFILES="$RPMFILES $ff"
173 ;; *) RPMFILES="$RPMFILES $OPIEDIR/$ff"
174 esac
175 else
176 mkdir -p $D
177 if cp -a $ff $D
178 then
179 true
180 else
181 ERROR=1
182 fi
183 fi
184 else
185 echo >&2 "$0: $i: No such file: $ff"
186 ERROR=1
187 fi
188 done
189 done
190 fi
191 if [ -z "$ERROR" ]
192 then
193 if [ -n "$RPM" ]
194 then
195 SPEC=/tmp/mkipks-rpm-$$.spec
196 echo >$SPEC "Summary: $summary"
197 echo >>$SPEC "Name: $packagename"
198 echo >>$SPEC "Group: $section" ##########
199 echo >>$SPEC "License: $license"
200 echo >>$SPEC "Version: ${version%-*}"
201 echo >>$SPEC "Release: ${version#*-}"
202
203 echo >>$SPEC "%description"
204 sed -n -e '/^Description:/,$ p' $i | tail +2 >>$SPEC
205 echo >>$SPEC "%files"
206 echo >>$SPEC "%defattr(-,root,root)"
207 /bin/ls $RPMFILES >>$SPEC
208 rpm -bb --target $ARCH-unknown-linux $SPEC
209 # rm $SPEC
210 elif [ -z "$IMAGEDIR" ]
211 then
212 #size=$(du -h -s $DATADIR | sed -e 's/[ ].*//')
213 if (which mkfs.jffs2 >/dev/null 2>&1); then
214 size=$(mkfs.jffs2 -r $DATADIR | wc -c)
215 fi
216 if ! (cat $i|grep -q ^Package:); then
217 echo "Package: $packagename" >$CTRLDIR/control
218 fi
219 if [ ! -z "$size" ]; then
220 echo "Installed-Size: $size" >>$CTRLDIR/control
221 else
222 if [ -z "$SIZEWARNED" ]
223 then
224 echo "Warning, no mkfs.jffs2 found, unable to set Installed-Size."
225 SIZEWARNED=1
226 fi
227 fi
228 echo "Architecture: $ARCH" >>$CTRLDIR/control
229 echo "Version: $version" >>$CTRLDIR/control
230 [ ! -z "$depends" ] && echo "Depends: $depends" >>$CTRLDIR/control
231 [ ! -z "$provides" ] && echo "Provides: $provides" >>$CTRLDIR/control
232 [ ! -z "$conflicts" ] && echo "Conflicts: $conflicts" >>$CTRLDIR/control
233 egrep -v "^(Files|Version|Depends|Provides|Conflicts|Architecture):" >>$CTRLDIR/control $i
234 [ -n "$classicopts" ] && echo "$DEB_VERSION" >$TDIR/debian-binary
235 base=${i%.control}
236 scripts="preinst postinst prerm postrm"
237 for pf in $scripts
238 do
239 if [ -e ${base}.$pf ]
240 then
241 cp ${base}.$pf $CTRLDIR/$pf
242 chmod 755 $CTRLDIR/$pf
243 fi
244 done
245 cd $ORIGDIR; $OPIEDIR/scripts/ipkg-build $classicopts -o root -g root $TDIR; cd $OPIEDIR;
246 RESULT=$package.ipk
247 if [ -n "$VERB" ]
248 then
249 echo >&2 "Built $RESULT ($size)"
250 fi
251 if [ -n "$LIST" ]
252 then
253 echo $RESULT
254 fi
255 fi
256 else
257 echo >&2 "Not building $package package"
258 fi
259done
260# clean up
261rm -rf $TDIR