-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | examples/opiecore/onotifytest/main.cpp | 18 | ||||
-rw-r--r-- | examples/opiecore/onotifytest/main.h | 10 | ||||
-rw-r--r-- | libopie2/opiecore/linux/ofilenotify.cpp | 40 | ||||
-rw-r--r-- | libopie2/opiecore/linux/ofilenotify.h | 3 | ||||
-rwxr-xr-x | scripts/addLanguage.sh | 33 | ||||
-rwxr-xr-x | scripts/mkipks | 261 |
7 files changed, 343 insertions, 25 deletions
@@ -22,17 +22,18 @@ | |||
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 |
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 | |||
@@ -26,31 +26,41 @@ App::App( int argc, char** argv ) : QApplication( argc, argv ) | |||
26 | QTextStream stream( tmpfoo ); | 26 | QTextStream stream( tmpfoo ); |
27 | stream << "This is my content"; | 27 | stream << "This is my content"; |
28 | } | 28 | } |
29 | 29 | ||
30 | QObject::connect( tmpfoo, SIGNAL(accessed(const QString&)), this, SLOT(quit()) ); | 30 | QObject::connect( tmpfoo, SIGNAL(accessed(const QString&)), this, SLOT(quit()) ); |
31 | QObject::connect( tmpfoo, SIGNAL(closed(const QString&,bool)), this, SLOT(quit()) ); | 31 | QObject::connect( tmpfoo, SIGNAL(closed(const QString&,bool)), this, SLOT(quit()) ); |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | ODirNotification* tmpfoo = new ODirNotification( 0, 0 ); | 34 | tmpfoo = new ODirNotification( 0, 0 ); |
35 | 35 | ||
36 | int result = tmpfoo->watch( "/tmp/foo", false, CreateFile, 2 ); | 36 | int result = tmpfoo->watch( "/tmp/foo", false, CreateFile, 2 ); |
37 | QObject::connect( tmpfoo, SIGNAL(triggered(const QString&,unsigned int,const QString&)), | 37 | |
38 | this, SLOT(triggered(const QString&,unsigned int,const QString&)) ); | 38 | if ( result != -1 ) |
39 | { | ||
40 | QObject::connect( tmpfoo, SIGNAL(triggered(const QString&,unsigned int,const QString&)), | ||
41 | this, SLOT(triggered(const QString&,unsigned int,const QString&)) ); | ||
42 | } | ||
43 | else | ||
44 | { | ||
45 | QMessageBox::warning( qApp->desktop(), "info", "Couldn't watch /tmp/foo\nDoes it exist?" ); | ||
46 | } | ||
39 | } | 47 | } |
40 | 48 | ||
41 | App::~App() | 49 | App::~App() |
42 | { | 50 | { |
43 | odebug << "~App()" << oendl; | 51 | odebug << "~App()" << oendl; |
52 | delete tmpfoo; | ||
44 | } | 53 | } |
45 | 54 | ||
46 | void App::triggered( const QString& str1, unsigned int id, const QString& str2 ) | 55 | void App::triggered( const QString& str1, unsigned int id, const QString& str2 ) |
47 | { | 56 | { |
48 | QMessageBox::information( qApp->desktop(), "info", QString( "%1\n%2\n%3" ).arg( str1 ).arg( id ).arg( str2 ) ); | 57 | QMessageBox::information( qApp->desktop(), "info", QString().sprintf( "%s\n0x%08x\n%s", |
58 | (const char*) str1, id, (const char*) str2 ) ); | ||
49 | } | 59 | } |
50 | 60 | ||
51 | int main( int argc, char** argv ) | 61 | int main( int argc, char** argv ) |
52 | { | 62 | { |
53 | App* app = new App( argc, argv ); | 63 | App* app = new App( argc, argv ); |
54 | QPushButton* b = new QPushButton( "Click me to close", 0 ); | 64 | QPushButton* b = new QPushButton( "Click me to close", 0 ); |
55 | QObject::connect( b, SIGNAL(clicked()), qApp, SLOT(quit()) ); | 65 | QObject::connect( b, SIGNAL(clicked()), qApp, SLOT(quit()) ); |
56 | b->resize( 200, 200 ); | 66 | b->resize( 200, 200 ); |
diff --git a/examples/opiecore/onotifytest/main.h b/examples/opiecore/onotifytest/main.h index afad947..7ce4b9f 100644 --- a/examples/opiecore/onotifytest/main.h +++ b/examples/opiecore/onotifytest/main.h | |||
@@ -1,23 +1,29 @@ | |||
1 | // (C) Michael 'Mickey' Lauer <mickey@Vanille.de> | 1 | // (C) Michael 'Mickey' Lauer <mickey@Vanille.de> |
2 | // LICENSE = "GPLv2" | 2 | // LICENSE = "GPLv2" |
3 | 3 | ||
4 | #ifndef MAIN_H | 4 | #ifndef MAIN_H |
5 | #define MAIN_H | 5 | #define MAIN_H |
6 | 6 | ||
7 | /* OPIE */ | ||
8 | #include <opie2/ofilenotify.h> | ||
9 | |||
7 | /* QT */ | 10 | /* QT */ |
8 | #include <qapplication.h> | 11 | #include <qapplication.h> |
9 | #include <qpushbutton.h> | 12 | #include <qpushbutton.h> |
10 | #include <qtextstream.h> | 13 | #include <qtextstream.h> |
11 | 14 | ||
12 | class App : public QApplication | 15 | class App : public QApplication |
13 | { | 16 | { |
14 | Q_OBJECT | 17 | Q_OBJECT |
15 | public: | 18 | public: |
16 | App( int argc, char** argv ); | 19 | App( int argc, char** argv ); |
17 | ~App(); | 20 | ~App(); |
18 | 21 | ||
19 | public slots: | 22 | public slots: |
20 | void triggered( const QString&, unsigned int, const QString& ); | 23 | void triggered( const QString&, unsigned int, const QString& ); |
24 | |||
25 | private: | ||
26 | Opie::Core::ODirNotification* tmpfoo; | ||
21 | }; | 27 | }; |
22 | 28 | ||
23 | #endif | 29 | #endif |
diff --git a/libopie2/opiecore/linux/ofilenotify.cpp b/libopie2/opiecore/linux/ofilenotify.cpp index a7820ee..68c5a96 100644 --- a/libopie2/opiecore/linux/ofilenotify.cpp +++ b/libopie2/opiecore/linux/ofilenotify.cpp | |||
@@ -231,42 +231,48 @@ bool OFileNotification::isSingleShot() const | |||
231 | return !_multi; | 231 | return !_multi; |
232 | } | 232 | } |
233 | 233 | ||
234 | 234 | ||
235 | bool OFileNotification::activate( const OFileNotificationEvent* e ) | 235 | bool OFileNotification::activate( const OFileNotificationEvent* e ) |
236 | { | 236 | { |
237 | qDebug( "OFileNotification::activate(): e = ( %s, %d, 0x%08x, %d, %s )", (const char*) _path, e->descriptor(), e->mask(), e->cookie(), (const char*) e->name() ); | 237 | qDebug( "OFileNotification::activate(): e = ( %s, %d, 0x%08x, %d, %s )", (const char*) _path, e->descriptor(), e->mask(), e->cookie(), (const char*) e->name() ); |
238 | 238 | ||
239 | //FIXME: Should we really deliver QueueOverflow and/or Ignore to user level code? | ||
240 | |||
239 | // dumb signal | 241 | // dumb signal |
240 | _signal.activate(); | 242 | _signal.activate(); |
241 | 243 | ||
242 | // generic signal | 244 | // generic signal |
243 | emit triggered( _path, e->mask(), e->name() ); | 245 | emit triggered( _path, e->mask(), e->name() ); |
244 | 246 | ||
245 | // specialized signals | 247 | // specialized signals |
246 | switch ( e->mask() ) | 248 | switch ( e->mask() ) |
247 | { | 249 | { |
248 | case Access: emit accessed( _path ); break; | 250 | case Access: emit accessed( _path ); break; |
249 | case Modify: emit modified( _path ); break; | 251 | case Modify: emit modified( _path ); break; |
250 | case Attrib: emit attributed( _path); break; | 252 | case Attrib: emit attributed( _path); break; |
251 | case CloseWrite: emit closed( _path, true ); break; | 253 | case CloseWrite: emit closed( _path, true ); break; |
252 | case CloseNoWrite: emit closed( _path, false ); break; | 254 | case CloseNoWrite: emit closed( _path, false ); break; |
253 | case Open: emit opened( _path ); break; | 255 | case Open: emit opened( _path ); break; |
254 | case MovedFrom: emit movedFrom( _path, e->name() ); break; | 256 | case MovedFrom: emit movedFrom( _path, e->name() ); break; |
255 | case MovedTo: emit movedTo( _path, e->name() ); break; | 257 | case MovedTo: emit movedTo( _path, e->name() ); break; |
256 | case DeleteSubdir: emit deletedSubdir( _path, e->name() ); break; | 258 | case DeleteSubdir: emit deletedSubdir( _path, e->name() ); break; |
257 | case DeleteFile: emit deletedFile( _path, e->name() ); break; | 259 | case DeleteFile: emit deletedFile( _path, e->name() ); break; |
258 | case CreateSubdir: emit createdSubdir( _path, e->name() ); break; | 260 | case CreateSubdir: emit createdSubdir( _path, e->name() ); break; |
259 | case CreateFile: emit createdFile( _path, e->name() ); break; | 261 | case CreateFile: emit createdFile( _path, e->name() ); break; |
260 | case DeleteSelf: emit deleted( _path ); break; | 262 | case DeleteSelf: emit deleted( _path ); break; |
261 | case Unmount: emit unmounted( _path ); break; | 263 | case Unmount: emit unmounted( _path ); break; |
264 | case _QueueOverflow: qFatal( "OFileNotification::activate() - Inotify Event Queue Overload!" ); break; | ||
265 | case _Ignored: qWarning( "OFileNotification::activate() - Further Events for '%s' will be ignored", (const char*) _path ); break; | ||
262 | default: assert( 0 ); | 266 | default: assert( 0 ); |
263 | } | 267 | } |
264 | 268 | ||
269 | delete e; | ||
270 | |||
265 | if ( !_multi ) stop(); | 271 | if ( !_multi ) stop(); |
266 | 272 | ||
267 | return true; | 273 | return true; |
268 | } | 274 | } |
269 | 275 | ||
270 | 276 | ||
271 | bool OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type ) | 277 | bool OFileNotification::singleShot( const QString& path, QObject* receiver, const char* member, OFileNotificationType type ) |
272 | { | 278 | { |
@@ -312,17 +318,17 @@ bool OFileNotification::registerEventHandler() | |||
312 | { | 318 | { |
313 | OFileNotification::_fd = ::open( INOTIFY_DEVICE, O_RDONLY ); | 319 | OFileNotification::_fd = ::open( INOTIFY_DEVICE, O_RDONLY ); |
314 | if ( OFileNotification::_fd < 0 ) | 320 | if ( OFileNotification::_fd < 0 ) |
315 | { | 321 | { |
316 | qWarning( "OFileNotification::registerEventHandler(): couldn't register event handler: %s", strerror( errno ) ); | 322 | qWarning( "OFileNotification::registerEventHandler(): couldn't register event handler: %s", strerror( errno ) ); |
317 | return false; | 323 | return false; |
318 | } | 324 | } |
319 | 325 | ||
320 | OFileNotification::_sn = new QSocketNotifier( _fd, QSocketNotifier::Read, this, "inotify event" ); | 326 | OFileNotification::_sn = new QSocketNotifier( _fd, QSocketNotifier::Read ); |
321 | connect( OFileNotification::_sn, SIGNAL( activated(int) ), this, SLOT( inotifyEventHandler() ) ); | 327 | connect( OFileNotification::_sn, SIGNAL( activated(int) ), this, SLOT( inotifyEventHandler() ) ); |
322 | 328 | ||
323 | qDebug( "OFileNotification::registerEventHandler(): done" ); | 329 | qDebug( "OFileNotification::registerEventHandler(): done" ); |
324 | return true; | 330 | return true; |
325 | } | 331 | } |
326 | 332 | ||
327 | 333 | ||
328 | void OFileNotification::unregisterEventHandler() | 334 | void OFileNotification::unregisterEventHandler() |
@@ -343,34 +349,34 @@ ODirNotification::ODirNotification( QObject* parent, const char* name ) | |||
343 | } | 349 | } |
344 | 350 | ||
345 | 351 | ||
346 | ODirNotification::~ODirNotification() | 352 | ODirNotification::~ODirNotification() |
347 | { | 353 | { |
348 | qDebug( "ODirNotification::~ODirNotification()" ); | 354 | qDebug( "ODirNotification::~ODirNotification()" ); |
349 | } | 355 | } |
350 | 356 | ||
351 | /* | 357 | /** |
352 | Love-Trowbridge recursive directory scanning algorithm: | 358 | Love-Trowbridge recursive directory scanning algorithm: |
353 | 359 | ||
354 | Step 1. Start at initial directory foo. Add watch. | 360 | Step 1. Start at initial directory foo. Add watch. |
355 | 361 | ||
356 | Step 2. Setup handlers for watch created in Step 1. | 362 | Step 2. Setup handlers for watch created in Step 1. |
357 | Specifically, ensure that a directory created | 363 | Specifically, ensure that a directory created |
358 | in foo will result in a handled CREATE_SUBDIR | 364 | in foo will result in a handled CREATE_SUBDIR |
359 | event. | 365 | event. |
360 | 366 | ||
361 | Step 3. Read the contents of foo. | 367 | Step 3. Read the contents of foo. |
362 | 368 | ||
363 | Step 4. For each subdirectory of foo read in step 3, repeat | 369 | Step 4. For each subdirectory of foo read in step 3, repeat |
364 | step 1. | 370 | step 1. |
365 | 371 | ||
366 | Step 5. For any CREATE_SUBDIR event on bar, if a watch is | 372 | Step 5. For any CREATE_SUBDIR event on bar, if a watch is |
367 | not yet created on bar, repeat step 1 on bar. | 373 | not yet created on bar, repeat step 1 on bar. |
368 | */ | 374 | **/ |
369 | 375 | ||
370 | int ODirNotification::watch( const QString& path, bool sshot, OFileNotificationType type, int recurse ) | 376 | int ODirNotification::watch( const QString& path, bool sshot, OFileNotificationType type, int recurse ) |
371 | { | 377 | { |
372 | if ( _type == Nothing ) _type = type; // only set it once - for the top level call | 378 | if ( _type == Nothing ) _type = type; // only set it once - for the top level call |
373 | OFileNotificationType subtype = ( recurse != 0 ) ? (OFileNotificationType) int( _type | CreateSubdir ) : _type; | 379 | OFileNotificationType subtype = ( recurse != 0 ) ? (OFileNotificationType) int( _type | CreateSubdir ) : _type; |
374 | qDebug( "ODirNotification::watch( %s, %d, 0x%08x, %d )", (const char*) path, sshot, subtype, recurse ); | 380 | qDebug( "ODirNotification::watch( %s, %d, 0x%08x, %d )", (const char*) path, sshot, subtype, recurse ); |
375 | OFileNotification* fn = new OFileNotification( this, "ODirNotification delegate" ); | 381 | OFileNotification* fn = new OFileNotification( this, "ODirNotification delegate" ); |
376 | 382 | ||
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 | |||
@@ -252,17 +252,18 @@ class OFileNotification : public QObject | |||
252 | /*====================================================================================== | 252 | /*====================================================================================== |
253 | * ODirNotification | 253 | * ODirNotification |
254 | *======================================================================================*/ | 254 | *======================================================================================*/ |
255 | 255 | ||
256 | /** | 256 | /** |
257 | * @brief Represents a directory notification | 257 | * @brief Represents a directory notification |
258 | * | 258 | * |
259 | * This class allows to watch for events happening to directories | 259 | * This class allows to watch for events happening to directories |
260 | * It uses the OFileNotification class | 260 | * It uses the OFileNotification class and (for recursive watches) |
261 | * implements the Love-Trowbridge recursive directory scanning algorithm. | ||
261 | * | 262 | * |
262 | * @see http://www.kernel.org/pub/linux/kernel/people/rml/inotify/ | 263 | * @see http://www.kernel.org/pub/linux/kernel/people/rml/inotify/ |
263 | * | 264 | * |
264 | * @author Michael 'Mickey' Lauer <mickey@vanille.de> | 265 | * @author Michael 'Mickey' Lauer <mickey@vanille.de> |
265 | * | 266 | * |
266 | **/ | 267 | **/ |
267 | 268 | ||
268 | class ODirNotification : public QObject | 269 | class ODirNotification : public QObject |
diff --git a/scripts/addLanguage.sh b/scripts/addLanguage.sh new file mode 100755 index 0000000..e321804 --- a/dev/null +++ b/scripts/addLanguage.sh | |||
@@ -0,0 +1,33 @@ | |||
1 | #!/bin/bash | ||
2 | |||
3 | # (c) 2002 Bruno Rodrigues <bruno.rodrigues@litux.org> | ||
4 | # Under GPL Licence | ||
5 | |||
6 | # Add a new TRANSLATION line to every .pro file if there | ||
7 | # is already at least one TRANSLATION file and this LANG | ||
8 | # is not present | ||
9 | # The perl line would grab a TRANSLATION = something and | ||
10 | # duplicate it to TRANSLATION += .../LANG/... | ||
11 | |||
12 | LANG=$1 | ||
13 | |||
14 | if [ "$1x" == "x" ] ; then | ||
15 | echo "Usage: $0 <LANG>" | ||
16 | exit | ||
17 | fi | ||
18 | |||
19 | for i in `find . -name "*.pro"` ; do | ||
20 | grep TRANSLATIONS $i > /dev/null | ||
21 | if [ "$?" != 0 ] ; then | ||
22 | echo "$i: No Translations" | ||
23 | else | ||
24 | grep "../i18n/$LANG/" $i > /dev/null | ||
25 | if [ "$?" == 0 ] ; then | ||
26 | echo "$i: $LANG already there" | ||
27 | else | ||
28 | echo "$i: Adding $LANG" | ||
29 | perl -p -i.bak -e 's/^(TRANSLATIONS\s*\+?=\s*)(.+?i18n\/)(.+?)(\/.+?\.ts)(.*)$/$1$2$3$4 \\\n\t $2'$LANG'$4$5/' $i | ||
30 | fi | ||
31 | fi | ||
32 | done | ||
33 | |||
diff --git a/scripts/mkipks b/scripts/mkipks new file mode 100755 index 0000000..f142029 --- a/dev/null +++ b/scripts/mkipks | |||
@@ -0,0 +1,261 @@ | |||
1 | #!/bin/sh | ||
2 | |||
3 | if [ -z "$QTE_BASEVERSION" ] | ||
4 | then | ||
5 | if [ -e $QTDIR/include/qglobal.h ] | ||
6 | then | ||
7 | QTE_BASEVERSION=`cat $QTDIR/include/qglobal.h|grep '^#define QT_VERSION'|grep -v STR|sed -e 's,#define QT_VERSION\t*,,;' -e 's,.*\([0-9]\)\([0-9]\)\([0-9]\).*,\1.\2.\3,;'` | ||
8 | else | ||
9 | QTE_BASEVERSION=2.3.4 | ||
10 | fi | ||
11 | fi | ||
12 | if [ -z "$QTE_VERSION" ] | ||
13 | then | ||
14 | if [ -e $QTDIR/include/qglobal.h ] | ||
15 | then | ||
16 | QTE_VERSION=`cat $QTDIR/include/qglobal.h|grep '^#define QT_VERSION_STR'|sed -e 's,#define QT_VERSION_STR\t*,,;' -e 's,.*"\([^"]*\)".*,\1,;'` | ||
17 | else | ||
18 | QTE_VERSION=2.3.4 | ||
19 | fi | ||
20 | fi | ||
21 | [ -z "$QTE_REVISION" ] && QTE_REVISION=5 | ||
22 | DEB_VERSION=2.0 | ||
23 | |||
24 | # Have to do this here, since CVS can't store symlinks | ||
25 | |||
26 | mkdir -p $OPIEDIR/etc/rcS.d | ||
27 | ln -sf ../init.d/bootsplash $OPIEDIR/etc/rcS.d/S01bootsplash | ||
28 | |||
29 | VERSION_MAJ=$(sed -n -e 's/.*QPE_VERSION "\([0-9]*\)\..*\..*".*/\1/p' <$OPIEDIR/include/qpe/version.h) | ||
30 | VERSION_MIN=$(sed -n -e 's/.*QPE_VERSION ".*\.\([0-9]*\)\..*".*/\1/p' <$OPIEDIR/include/qpe/version.h) | ||
31 | VERSION_PAT=$(sed -n -e 's/.*QPE_VERSION ".*\..*\.\([0-9]*\).*/\1/p' <$OPIEDIR/include/qpe/version.h) | ||
32 | SUB_VERSION=$(sed -n -e 's,.*SUB_VERSION \"\(.*\)\".*,\1,p' <$OPIEDIR/include/qpe/version.h) | ||
33 | if grep -q 'QPE_VERSION .*snapshot' $OPIEDIR/include/qpe/version.h | ||
34 | then | ||
35 | [ -z "$VERSION_CVS" ] && VERSION_CVS="$(date +%Y%m%d)" | ||
36 | SUB_VERSION=$VERSION_CVS | ||
37 | else | ||
38 | VERSION_CVS="" | ||
39 | fi | ||
40 | |||
41 | QPE_VERSION=$VERSION_MAJ.$VERSION_MIN.$VERSION_PAT | ||
42 | |||
43 | ARCH=arm | ||
44 | STRIP=arm-linux-strip | ||
45 | STRIP_FILES="*ARM*not stripped" | ||
46 | |||
47 | TDIR=/tmp/ipk$$ | ||
48 | DATADIR=$TDIR | ||
49 | CTRLDIR=$TDIR/CONTROL | ||
50 | |||
51 | IMAGEDIR= | ||
52 | VERB= | ||
53 | LIST= | ||
54 | RPM= | ||
55 | |||
56 | while [ $# -ne 0 ] | ||
57 | do | ||
58 | case "$1" in | ||
59 | -v) | ||
60 | VERB=1 | ||
61 | echo >&2 "Packaging for version $VERSION_MAJ.$VERSION_MIN.$VERSION_PAT$VERSION_CVS" | ||
62 | ;; -l) | ||
63 | LIST=1 | ||
64 | ;; -i) | ||
65 | shift | ||
66 | IMAGEDIR=$1 | ||
67 | DATADIR=$IMAGEDIR | ||
68 | mkdir -p $IMAGEDIR | ||
69 | ;; -classic) | ||
70 | classicopts=-c | ||
71 | ;; -rpm) | ||
72 | if [ "$OPIEDIR" != "/opt/Qtopia" ] | ||
73 | then | ||
74 | echo >&2 '$OPIEDIR is not the standard /usr/Qtopia directory.' | ||
75 | sleep 1 | ||
76 | #exit 1 | ||
77 | fi | ||
78 | RPM=1 | ||
79 | ;; -arch) | ||
80 | shift | ||
81 | ARCH=$1 | ||
82 | STRIP= | ||
83 | STRIP_FILES= | ||
84 | ;; /*) | ||
85 | FILES="$FILES $1" | ||
86 | ;; *) | ||
87 | FILES="$FILES $PWD/$1" | ||
88 | esac | ||
89 | shift | ||
90 | done | ||
91 | |||
92 | if [ -z "$FILES" ] | ||
93 | then | ||
94 | FILES=`find $OPIEDIR -name "*.control" -print` | ||
95 | fi | ||
96 | |||
97 | RDIR=$PWD | ||
98 | ORIGDIR=`pwd` | ||
99 | cd $OPIEDIR | ||
100 | |||
101 | for i in $FILES | ||
102 | do | ||
103 | rm -rf $TDIR | ||
104 | |||
105 | mkdir -p $DATADIR | ||
106 | mkdir -p $CTRLDIR | ||
107 | |||
108 | packagename=${i##*/}; packagename=${packagename%.control} | ||
109 | version=$(eval echo '"'$(sed -n -e "s/^Version: *//p" $i)'"') | ||
110 | depends=$(eval echo '"'$(sed -n -e "s/^Depends: *//p" $i)'"') | ||
111 | files=$(eval echo $(sed -n -e "s/^Files://p" $i)) | ||
112 | arch=$(eval echo $(sed -n -e "s/^Arch://p" $i)) | ||
113 | section=$(sed -n -e "s/^Section: *//p" $i) | ||
114 | provides=$(sed -n -e "s/^Provides: *//p" $i) | ||
115 | conflicts=$(sed -n -e "s/^Conflicts: *//p" $i) | ||
116 | license=$(sed -n -e "s/^License: *//p" $i) | ||
117 | summary=$(sed -n -e "s/^Description: *//p" $i) | ||
118 | package=${packagename}_${version}_$ARCH | ||
119 | ERROR= | ||
120 | if [ -z "$files" ] | ||
121 | then | ||
122 | mkdir -p $DATADIR/usr/share/doc/$packagename | ||
123 | else | ||
124 | for f in $files | ||
125 | do | ||
126 | if [ -d $f ] | ||
127 | then | ||
128 | ffiles=$(find $f -type f -o -type b -o -type c -o -type l) | ||
129 | else | ||
130 | ffiles=$f | ||
131 | fi | ||
132 | for ff in $ffiles | ||
133 | do | ||
134 | case $ff in | ||
135 | */CVS/*) | ||
136 | continue | ||
137 | ;;*~) | ||
138 | continue | ||
139 | ;;*.control) | ||
140 | continue | ||
141 | ;; $QTDIR/*) | ||
142 | BASE=$(dirname /opt/QtPalmtop/${ff#$QTDIR/}) | ||
143 | ;; etc/*.d/*) | ||
144 | BASE=$(dirname /$ff) | ||
145 | ;; root/*) | ||
146 | BASE=$(dirname ${ff#root}) | ||
147 | ;; lib/*) | ||
148 | BASE=$(dirname /opt/QtPalmtop/$ff) | ||
149 | ;; $OPIEDIR/lib/*) | ||
150 | BASE=$(dirname /opt/QtPalmtop/${ff#$OPIEDIR/}) | ||
151 | ;; $OPIEDIR/root/*) | ||
152 | BASE=$(dirname /${ff#$OPIEDIR/root/}) | ||
153 | ;; *) | ||
154 | # For SHARP ROM compatibility. Should change to Qtopia. | ||
155 | BASE=/opt/QtPalmtop/$(dirname $ff) | ||
156 | esac | ||
157 | |||
158 | if [ -f $ff -o -b $ff -o -c $ff ] | ||
159 | then | ||
160 | D=$DATADIR$BASE | ||
161 | if [ -x $ff -a -n "$STRIP" ] | ||
162 | then | ||
163 | case $(file $ff) in | ||
164 | $STRIP_FILES) | ||
165 | $STRIP $ff | ||
166 | ;; *) | ||
167 | esac | ||
168 | fi | ||
169 | if [ -n "$RPM" ] | ||
170 | then | ||
171 | case "$ff" in | ||
172 | /*) RPMFILES="$RPMFILES $ff" | ||
173 | ;; *) RPMFILES="$RPMFILES $OPIEDIR/$ff" | ||
174 | esac | ||
175 | else | ||
176 | mkdir -p $D | ||
177 | if cp -a $ff $D | ||
178 | then | ||
179 | true | ||
180 | else | ||
181 | ERROR=1 | ||
182 | fi | ||
183 | fi | ||
184 | else | ||
185 | echo >&2 "$0: $i: No such file: $ff" | ||
186 | ERROR=1 | ||
187 | fi | ||
188 | done | ||
189 | done | ||
190 | fi | ||
191 | if [ -z "$ERROR" ] | ||
192 | then | ||
193 | if [ -n "$RPM" ] | ||
194 | then | ||
195 | SPEC=/tmp/mkipks-rpm-$$.spec | ||
196 | echo >$SPEC "Summary: $summary" | ||
197 | echo >>$SPEC "Name: $packagename" | ||
198 | echo >>$SPEC "Group: $section" ########## | ||
199 | echo >>$SPEC "License: $license" | ||
200 | echo >>$SPEC "Version: ${version%-*}" | ||
201 | echo >>$SPEC "Release: ${version#*-}" | ||
202 | |||
203 | echo >>$SPEC "%description" | ||
204 | sed -n -e '/^Description:/,$ p' $i | tail +2 >>$SPEC | ||
205 | echo >>$SPEC "%files" | ||
206 | echo >>$SPEC "%defattr(-,root,root)" | ||
207 | /bin/ls $RPMFILES >>$SPEC | ||
208 | rpm -bb --target $ARCH-unknown-linux $SPEC | ||
209 | # rm $SPEC | ||
210 | elif [ -z "$IMAGEDIR" ] | ||
211 | then | ||
212 | #size=$(du -h -s $DATADIR | sed -e 's/[ ].*//') | ||
213 | if (which mkfs.jffs2 >/dev/null 2>&1); then | ||
214 | size=$(mkfs.jffs2 -r $DATADIR | wc -c) | ||
215 | fi | ||
216 | if ! (cat $i|grep -q ^Package:); then | ||
217 | echo "Package: $packagename" >$CTRLDIR/control | ||
218 | fi | ||
219 | if [ ! -z "$size" ]; then | ||
220 | echo "Installed-Size: $size" >>$CTRLDIR/control | ||
221 | else | ||
222 | if [ -z "$SIZEWARNED" ] | ||
223 | then | ||
224 | echo "Warning, no mkfs.jffs2 found, unable to set Installed-Size." | ||
225 | SIZEWARNED=1 | ||
226 | fi | ||
227 | fi | ||
228 | echo "Architecture: $ARCH" >>$CTRLDIR/control | ||
229 | echo "Version: $version" >>$CTRLDIR/control | ||
230 | [ ! -z "$depends" ] && echo "Depends: $depends" >>$CTRLDIR/control | ||
231 | [ ! -z "$provides" ] && echo "Provides: $provides" >>$CTRLDIR/control | ||
232 | [ ! -z "$conflicts" ] && echo "Conflicts: $conflicts" >>$CTRLDIR/control | ||
233 | egrep -v "^(Files|Version|Depends|Provides|Conflicts|Architecture):" >>$CTRLDIR/control $i | ||
234 | [ -n "$classicopts" ] && echo "$DEB_VERSION" >$TDIR/debian-binary | ||
235 | base=${i%.control} | ||
236 | scripts="preinst postinst prerm postrm" | ||
237 | for pf in $scripts | ||
238 | do | ||
239 | if [ -e ${base}.$pf ] | ||
240 | then | ||
241 | cp ${base}.$pf $CTRLDIR/$pf | ||
242 | chmod 755 $CTRLDIR/$pf | ||
243 | fi | ||
244 | done | ||
245 | cd $ORIGDIR; $OPIEDIR/scripts/ipkg-build $classicopts -o root -g root $TDIR; cd $OPIEDIR; | ||
246 | RESULT=$package.ipk | ||
247 | if [ -n "$VERB" ] | ||
248 | then | ||
249 | echo >&2 "Built $RESULT ($size)" | ||
250 | fi | ||
251 | if [ -n "$LIST" ] | ||
252 | then | ||
253 | echo $RESULT | ||
254 | fi | ||
255 | fi | ||
256 | else | ||
257 | echo >&2 "Not building $package package" | ||
258 | fi | ||
259 | done | ||
260 | # clean up | ||
261 | rm -rf $TDIR | ||