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
@@ -26,9 +26,10 @@
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)
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
@@ -30,23 +30,33 @@ App::App( int argc, char** argv ) : QApplication( argc, argv )
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{
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
@@ -3,21 +3,27 @@
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
@@ -235,8 +235,10 @@ bool OFileNotification::isSingleShot() const
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
@@ -244,25 +246,29 @@ bool OFileNotification::activate( const OFileNotificationEvent* e )
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}
@@ -316,9 +322,9 @@ bool OFileNotification::registerEventHandler()
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;
@@ -347,9 +353,9 @@ ODirNotification::~ODirNotification()
347{ 353{
348 qDebug( "ODirNotification::~ODirNotification()" ); 354 qDebug( "ODirNotification::~ODirNotification()" );
349} 355}
350 356
351/* 357/**
352 Love-Trowbridge recursive directory scanning algorithm: 358 Love-Trowbridge recursive directory scanning algorithm:
353 359
354 Step 1. Start at initial directory foo. Add watch. 360 Step 1. Start at initial directory foo. Add watch.
355 361
@@ -364,9 +370,9 @@ ODirNotification::~ODirNotification()
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
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
@@ -256,9 +256,10 @@ class OFileNotification : public QObject
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>
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