summaryrefslogtreecommitdiff
authoreilers <eilers>2005-03-23 08:31:19 (UTC)
committer eilers <eilers>2005-03-23 08:31:19 (UTC)
commit7d82b94d669746cac36dcabf026428bdc9286c72 (patch) (unidiff)
treee9b0f51426e8fedee8303b3b794d7c7d18188bd5
parent2f6d550d6e379d84aacbb01c46b10c5b6462a59b (diff)
downloadopie-7d82b94d669746cac36dcabf026428bdc9286c72.zip
opie-7d82b94d669746cac36dcabf026428bdc9286c72.tar.gz
opie-7d82b94d669746cac36dcabf026428bdc9286c72.tar.bz2
Add debug output to help developer to find a very silly bug, which takes
a lot of time to fix..
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/oapplicationfactory.h9
1 files changed, 8 insertions, 1 deletions
diff --git a/libopie2/opiecore/oapplicationfactory.h b/libopie2/opiecore/oapplicationfactory.h
index 8516565..8cb0ddd 100644
--- a/libopie2/opiecore/oapplicationfactory.h
+++ b/libopie2/opiecore/oapplicationfactory.h
@@ -1,335 +1,342 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) Holger Freyther <zecke@handhelds.org> 3              Copyright (C) Holger Freyther <zecke@handhelds.org>
4 =. 4 =.
5 .=l. 5 .=l.
6           .>+-= 6           .>+-=
7 _;:,     .>    :=|. This program is free software; you can 7 _;:,     .>    :=|. This program is free software; you can
8.> <`_,   >  .   <= redistribute it and/or modify it under 8.> <`_,   >  .   <= redistribute it and/or modify it under
9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
10.="- .-=="i,     .._ License as published by the Free Software 10.="- .-=="i,     .._ License as published by the Free Software
11 - .   .-<_>     .<> Foundation; either version 2 of the License, 11 - .   .-<_>     .<> Foundation; either version 2 of the License,
12     ._= =}       : or (at your option) any later version. 12     ._= =}       : or (at your option) any later version.
13    .%`+i>       _;_. 13    .%`+i>       _;_.
14    .i_,=:_.      -<s. This program is distributed in the hope that 14    .i_,=:_.      -<s. This program is distributed in the hope that
15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
16    : ..    .:,     . . . without even the implied warranty of 16    : ..    .:,     . . . without even the implied warranty of
17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
19..}^=.=       =       ; Library General Public License for more 19..}^=.=       =       ; Library General Public License for more
20++=   -.     .`     .: details. 20++=   -.     .`     .: details.
21 :     =  ...= . :.=- 21 :     =  ...= . :.=-
22 -.   .:....=;==+<; You should have received a copy of the GNU 22 -.   .:....=;==+<; You should have received a copy of the GNU
23  -_. . .   )=.  = Library General Public License along with 23  -_. . .   )=.  = Library General Public License along with
24    --        :-=` this library; see the file COPYING.LIB. 24    --        :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29 29
30/* 30/*
31 This work is derived from: 31 This work is derived from:
32 ---- 32 ----
33 The Loki Library 33 The Loki Library
34 Copyright (c) 2001 by Andrei Alexandrescu 34 Copyright (c) 2001 by Andrei Alexandrescu
35 This code accompanies the book: 35 This code accompanies the book:
36 Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design 36 Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design
37 Patterns Applied". Copyright (c) 2001. Addison-Wesley. 37 Patterns Applied". Copyright (c) 2001. Addison-Wesley.
38 Permission to use, copy, modify, distribute and sell this software for any 38 Permission to use, copy, modify, distribute and sell this software for any
39 purpose is hereby granted without fee, provided that the above copyright 39 purpose is hereby granted without fee, provided that the above copyright
40 notice appear in all copies and that both that copyright notice and this 40 notice appear in all copies and that both that copyright notice and this
41 permission notice appear in supporting documentation. 41 permission notice appear in supporting documentation.
42 The author or Addison-Welsey Longman make no representations about the 42 The author or Addison-Welsey Longman make no representations about the
43 suitability of this software for any purpose. It is provided "as is" 43 suitability of this software for any purpose. It is provided "as is"
44 without express or implied warranty. 44 without express or implied warranty.
45 ---- 45 ----
46 46
47 And KGenericFactor et all from Simon Hausmann <tronical@kde.org> 47 And KGenericFactor et all from Simon Hausmann <tronical@kde.org>
48 48
49*/ 49*/
50 50
51#include <qstring.h> 51#include <qstring.h>
52#include <qmetaobject.h> 52#include <qmetaobject.h>
53 53
54#include <qtopia/qcom.h> 54#include <qtopia/qcom.h>
55#include <qtopia/applicationinterface.h> 55#include <qtopia/applicationinterface.h>
56 56
57#include <opie2/odebug.h>
58
57namespace Opie { 59namespace Opie {
58namespace Core { 60namespace Core {
59 struct NullType; 61 struct NullType;
60 62
61 template <class T, class U> 63 template <class T, class U>
62 struct Typelist 64 struct Typelist
63 { 65 {
64 typedef T Head; 66 typedef T Head;
65 typedef U Tail; 67 typedef U Tail;
66 }; 68 };
67 template< 69 template<
68 typename T1 = NullType, typename T2 = NullType, typename T3 = NullType, 70 typename T1 = NullType, typename T2 = NullType, typename T3 = NullType,
69 typename T4 = NullType, typename T5 = NullType, typename T6 = NullType, 71 typename T4 = NullType, typename T5 = NullType, typename T6 = NullType,
70 typename T7 = NullType, typename T8 = NullType, typename T9 = NullType, 72 typename T7 = NullType, typename T8 = NullType, typename T9 = NullType,
71 typename T10 = NullType, typename T11 = NullType, typename T12 = NullType, 73 typename T10 = NullType, typename T11 = NullType, typename T12 = NullType,
72 typename T13 = NullType, typename T14 = NullType, typename T15 = NullType, 74 typename T13 = NullType, typename T14 = NullType, typename T15 = NullType,
73 typename T16 = NullType, typename T17 = NullType, typename T18 = NullType 75 typename T16 = NullType, typename T17 = NullType, typename T18 = NullType
74 > 76 >
75 struct MakeTypelist{ 77 struct MakeTypelist{
76 private: 78 private:
77 typedef typename MakeTypelist 79 typedef typename MakeTypelist
78 < 80 <
79 T2 , T3 , T4 , 81 T2 , T3 , T4 ,
80 T5 , T6 , T7 , 82 T5 , T6 , T7 ,
81 T8 , T9 , T10, 83 T8 , T9 , T10,
82 T11, T12, T13, 84 T11, T12, T13,
83 T14, T15, T16, 85 T14, T15, T16,
84 T17, T18 86 T17, T18
85 > 87 >
86 ::Result TailResult; 88 ::Result TailResult;
87 89
88public: 90public:
89 typedef Typelist<T1, TailResult> Result; 91 typedef Typelist<T1, TailResult> Result;
90}; 92};
91 93
92template<> 94template<>
93struct MakeTypelist<> 95struct MakeTypelist<>
94{ 96{
95 typedef NullType Result; 97 typedef NullType Result;
96}; 98};
97 99
98 100
99/** 101/**
100 * To allow your application to be quick launched some one needs 102 * To allow your application to be quick launched some one needs
101 * to create the QWidget. 103 * to create the QWidget.
102 * This is this factory. Make surce your widget has static QString Widget::appName() 104 * This is this factory. Make surce your widget has static QString Widget::appName()
103 * as one of its functions. 105 * as one of its functions.
104 * 106 *
105 * This template takes one QWidget and initialized it in the form of 107 * This template takes one QWidget and initialized it in the form of
106 * MyWidget::MyWidget( QWidget* parent, const char* name, WFlags f ); 108 * MyWidget::MyWidget( QWidget* parent, const char* name, WFlags f );
107 * 109 *
108 * To use it on your app do that: 110 * To use it on your app do that:
109 * typedef OApplicationFactory<MyWidget> MyFactory; 111 * typedef OApplicationFactory<MyWidget> MyFactory;
110 * OPIE_EXPORT_APP( MyFactory ) 112 * OPIE_EXPORT_APP( MyFactory )
111 * 113 *
112 */ 114 */
113template <class Product> 115template <class Product>
114struct OApplicationFactory : public ApplicationInterface { 116struct OApplicationFactory : public ApplicationInterface {
115 QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { 117 QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) {
116 *iface = 0; 118 *iface = 0;
117 if ( uuid == IID_QUnknown ) *iface = this; 119 if ( uuid == IID_QUnknown ) *iface = this;
118 else if ( uuid == IID_QtopiaApplication ) *iface = this; 120 else if ( uuid == IID_QtopiaApplication ) *iface = this;
119 else return QS_FALSE; 121 else return QS_FALSE;
120 (*iface)->addRef(); 122 (*iface)->addRef();
121 return QS_OK; 123 return QS_OK;
122 } 124 }
123 125
124 /* 126 /*
125 * 127 *
126 */ 128 */
127 virtual QWidget *createMainWindow( const QString& appName, QWidget* parent, 129 virtual QWidget *createMainWindow( const QString& appName, QWidget* parent,
128 const char* name, Qt::WFlags f ) { 130 const char* name, Qt::WFlags f ) {
129 if (appName == Product::appName() ) 131 if (appName == Product::appName() )
130 return new Product(parent, name, f ); 132 return new Product(parent, name, f );
131 else 133 else{
134 odebug << "Application Name = " << appName.latin1() << oendl;
135 odebug << "ProductName = " << Product::appName().latin1() << oendl;
136 odebug << "The application name is not equal to the product name!" << oendl;
137 odebug << "Please compare TARGET entry in the project file (*.pro) and the call of the OApplicationFactory< productName >" << oendl;
132 return 0l; 138 return 0l;
139 }
133 } 140 }
134 141
135 virtual QStringList applications()const { 142 virtual QStringList applications()const {
136 QStringList list; 143 QStringList list;
137 list << Product::appName() ; 144 list << Product::appName() ;
138 145
139 return list; 146 return list;
140 } 147 }
141 Q_REFCOUNT 148 Q_REFCOUNT
142 149
143}; 150};
144 151
145 152
146/* Internal */ 153/* Internal */
147 154
148template< class Product > 155template< class Product >
149struct OPrivate { 156struct OPrivate {
150 inline static QWidget *multiFactory( const QString& appName, QWidget* parent, 157 inline static QWidget *multiFactory( const QString& appName, QWidget* parent,
151 const char* name, Qt::WFlags fl ) { 158 const char* name, Qt::WFlags fl ) {
152 if ( appName == Product::appName() ) 159 if ( appName == Product::appName() )
153 return new Product( parent, name, fl ); 160 return new Product( parent, name, fl );
154 else 161 else
155 return 0; 162 return 0;
156 } 163 }
157 164
158 inline static QStringList multiString( const QStringList& _list ) { 165 inline static QStringList multiString( const QStringList& _list ) {
159 QStringList list = _list; 166 QStringList list = _list;
160 list << Product::appName(); 167 list << Product::appName();
161 return list; 168 return list;
162 } 169 }
163}; 170};
164 171
165template <> 172template <>
166struct OPrivate<Opie::Core::NullType > { 173struct OPrivate<Opie::Core::NullType > {
167 inline static QWidget* multiFactory ( const QString& , QWidget* , 174 inline static QWidget* multiFactory ( const QString& , QWidget* ,
168 const char* , Qt::WFlags ) { 175 const char* , Qt::WFlags ) {
169 return 0l; 176 return 0l;
170 } 177 }
171 inline static QStringList multiString( const QStringList& _list ) { 178 inline static QStringList multiString( const QStringList& _list ) {
172 return _list; 179 return _list;
173 } 180 }
174}; 181};
175 182
176/* 183/*
177template <> 184template <>
178struct OPrivate <Opie::NullType, Opie::NullType > { 185struct OPrivate <Opie::NullType, Opie::NullType > {
179 inline static QWidget* multiFactory( const QString& , QWidget* , 186 inline static QWidget* multiFactory( const QString& , QWidget* ,
180 const char* , Qt::WFlags ) { 187 const char* , Qt::WFlags ) {
181 return 0l; 188 return 0l;
182 } 189 }
183 190
184 inline static QStringList multiString( const QStringList& _list ) { 191 inline static QStringList multiString( const QStringList& _list ) {
185 return _list; 192 return _list;
186 } 193 }
187}; 194};
188*/ 195*/
189 196
190template <class Product, class ProductListTail> 197template <class Product, class ProductListTail>
191struct OPrivate< Opie::Core::Typelist<Product, ProductListTail> > { 198struct OPrivate< Opie::Core::Typelist<Product, ProductListTail> > {
192 inline static QWidget* multiFactory( const QString& appName, QWidget* parent, 199 inline static QWidget* multiFactory( const QString& appName, QWidget* parent,
193 const char* name, Qt::WFlags fl) { 200 const char* name, Qt::WFlags fl) {
194 QWidget* wid = OPrivate<Product>::multiFactory( appName, parent, name, fl ); 201 QWidget* wid = OPrivate<Product>::multiFactory( appName, parent, name, fl );
195 202
196 if (!wid ) 203 if (!wid )
197 wid = OPrivate<ProductListTail>::multiFactory( appName, parent, name, fl ); 204 wid = OPrivate<ProductListTail>::multiFactory( appName, parent, name, fl );
198 205
199 return wid; 206 return wid;
200 } 207 }
201 208
202 inline static QStringList multiString( const QStringList& _list ) { 209 inline static QStringList multiString( const QStringList& _list ) {
203 QStringList list = _list; 210 QStringList list = _list;
204 211
205 list = OPrivate<Product>::multiString( list ); 212 list = OPrivate<Product>::multiString( list );
206 list = OPrivate<ProductListTail>::multiString( list ); 213 list = OPrivate<ProductListTail>::multiString( list );
207 214
208 return list; 215 return list;
209 } 216 }
210}; 217};
211 218
212 219
213 220
214 221
215 222
216 223
217 224
218 225
219/* Internal END */ 226/* Internal END */
220 227
221/* 228/*
222 * If you want to export more than one Widget use that function 229 * If you want to export more than one Widget use that function
223 * Make sure all your Widgets provide the appName() static method 230 * Make sure all your Widgets provide the appName() static method
224 * otherwise you'll get a compiler error 231 * otherwise you'll get a compiler error
225 * 232 *
226 * typedef Opie::Core::MakeTypelist<MyWidget, MyDialog, MyMediaPlayer >::Result MyTypes; 233 * typedef Opie::Core::MakeTypelist<MyWidget, MyDialog, MyMediaPlayer >::Result MyTypes;
227 * OPIE_EXPORT_APP( OApplicationFactory<MyTypes> ) 234 * OPIE_EXPORT_APP( OApplicationFactory<MyTypes> )
228 */ 235 */
229 236
230template<class Product, class ProductListTail> 237template<class Product, class ProductListTail>
231struct OApplicationFactory< Opie::Core::Typelist<Product, ProductListTail > > 238struct OApplicationFactory< Opie::Core::Typelist<Product, ProductListTail > >
232 : ApplicationInterface { 239 : ApplicationInterface {
233 QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { 240 QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) {
234 *iface = 0; 241 *iface = 0;
235 if ( uuid == IID_QUnknown ) *iface = this; 242 if ( uuid == IID_QUnknown ) *iface = this;
236 else if ( uuid ==IID_QtopiaApplication ) *iface = this; 243 else if ( uuid ==IID_QtopiaApplication ) *iface = this;
237 else return QS_FALSE; 244 else return QS_FALSE;
238 (*iface)->addRef(); 245 (*iface)->addRef();
239 return QS_OK; 246 return QS_OK;
240 } 247 }
241 248
242 QWidget* createMainWindow ( const QString& appName, QWidget* parent, 249 QWidget* createMainWindow ( const QString& appName, QWidget* parent,
243 const char* name, Qt::WFlags fl ) { 250 const char* name, Qt::WFlags fl ) {
244 qWarning("StringList is %s", applications().join(":").latin1() ); 251 qWarning("StringList is %s", applications().join(":").latin1() );
245 return OPrivate< Opie::Core::Typelist<Product, ProductListTail > >::multiFactory( appName, parent, name, fl ); 252 return OPrivate< Opie::Core::Typelist<Product, ProductListTail > >::multiFactory( appName, parent, name, fl );
246 } 253 }
247 254
248 QStringList applications()const { 255 QStringList applications()const {
249 QStringList _list; 256 QStringList _list;
250 return OPrivate< Opie::Core::Typelist<Product, ProductListTail> >::multiString( _list ); 257 return OPrivate< Opie::Core::Typelist<Product, ProductListTail> >::multiString( _list );
251 } 258 }
252 259
253 Q_REFCOUNT 260 Q_REFCOUNT
254}; 261};
255 262
256} 263}
257} 264}
258 265
259/* If the library version should be build */ 266/* If the library version should be build */
260#ifdef OPIE_APP_INTERFACE 267#ifdef OPIE_APP_INTERFACE
261#define OPIE_EXPORT_APP( factory ) Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( factory ) } 268#define OPIE_EXPORT_APP( factory ) Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( factory ) }
262#else 269#else
263 270
264#include <qpe/qpeapplication.h> 271#include <qpe/qpeapplication.h>
265 272
266#define OPIE_EXPORT_APP( Factory ) \ 273#define OPIE_EXPORT_APP( Factory ) \
267int main( int argc, char **argv ) { \ 274int main( int argc, char **argv ) { \
268 QPEApplication a(argc, argv ); \ 275 QPEApplication a(argc, argv ); \
269 QWidget *mw = 0;\ 276 QWidget *mw = 0;\
270\ 277\
271 /* method from TT */ \ 278 /* method from TT */ \
272 QString executableName = QString::fromLatin1( argv[0] ); \ 279 QString executableName = QString::fromLatin1( argv[0] ); \
273 executableName = executableName.right(executableName.length() \ 280 executableName = executableName.right(executableName.length() \
274 - executableName.findRev('/') - 1); \ 281 - executableName.findRev('/') - 1); \
275 \ 282 \
276 Factory f; \ 283 Factory f; \
277 QStringList list = f.applications(); \ 284 QStringList list = f.applications(); \
278 if (list.contains(executableName) ) \ 285 if (list.contains(executableName) ) \
279 mw = f.createMainWindow(executableName, 0, 0, 0 ); \ 286 mw = f.createMainWindow(executableName, 0, 0, 0 ); \
280 else \ 287 else \
281 mw = f.createMainWindow( list[0], 0, 0, 0 ); \ 288 mw = f.createMainWindow( list[0], 0, 0, 0 ); \
282\ 289\
283 if( mw ) { \ 290 if( mw ) { \
284 if ( mw->metaObject()->slotNames().contains("setDocument(const QString&)" ) ) \ 291 if ( mw->metaObject()->slotNames().contains("setDocument(const QString&)" ) ) \
285 a.showMainDocumentWidget( mw ); \ 292 a.showMainDocumentWidget( mw ); \
286 else \ 293 else \
287 a.showMainWidget( mw ); \ 294 a.showMainWidget( mw ); \
288\ 295\
289 int rv = a.exec(); \ 296 int rv = a.exec(); \
290 delete mw; \ 297 delete mw; \
291 return rv; \ 298 return rv; \
292 }else \ 299 }else \
293 return -1; \ 300 return -1; \
294} 301}
295#endif 302#endif
296 303
297#ifdef OPIE_APP_INTERFACE 304#ifdef OPIE_APP_INTERFACE
298#define OPIE_EXPORT_APP_V2( factory,name ) Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( factory ) } 305#define OPIE_EXPORT_APP_V2( factory,name ) Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( factory ) }
299#else 306#else
300 307
301#include <opie2/oapplication.h> 308#include <opie2/oapplication.h>
302 309
303#define OPIE_EXPORT_APP_V2( Factory,name ) \ 310#define OPIE_EXPORT_APP_V2( Factory,name ) \
304int main( int argc, char **argv ) { \ 311int main( int argc, char **argv ) { \
305 Opie::Core::OApplication a(argc, argv, name ); \ 312 Opie::Core::OApplication a(argc, argv, name ); \
306 QWidget *mw = 0;\ 313 QWidget *mw = 0;\
307\ 314\
308 /* method from TT */ \ 315 /* method from TT */ \
309 QString executableName = QString::fromLatin1( argv[0] ); \ 316 QString executableName = QString::fromLatin1( argv[0] ); \
310 executableName = executableName.right(executableName.length() \ 317 executableName = executableName.right(executableName.length() \
311 - executableName.findRev('/') - 1); \ 318 - executableName.findRev('/') - 1); \
312 \ 319 \
313 Factory f; \ 320 Factory f; \
314 QStringList list = f.applications(); \ 321 QStringList list = f.applications(); \
315 if (list.contains(executableName) ) \ 322 if (list.contains(executableName) ) \
316 mw = f.createMainWindow(executableName, 0, 0, 0 ); \ 323 mw = f.createMainWindow(executableName, 0, 0, 0 ); \
317 else \ 324 else \
318 mw = f.createMainWindow( list[0], 0, 0, 0 ); \ 325 mw = f.createMainWindow( list[0], 0, 0, 0 ); \
319\ 326\
320 if( mw ) { \ 327 if( mw ) { \
321 if ( mw->metaObject()->slotNames().contains("setDocument(const QString&)" ) ) \ 328 if ( mw->metaObject()->slotNames().contains("setDocument(const QString&)" ) ) \
322 a.showMainDocumentWidget( mw ); \ 329 a.showMainDocumentWidget( mw ); \
323 else \ 330 else \
324 a.showMainWidget( mw ); \ 331 a.showMainWidget( mw ); \
325\ 332\
326 int rv = a.exec(); \ 333 int rv = a.exec(); \
327 delete mw; \ 334 delete mw; \
328 return rv; \ 335 return rv; \
329 }else \ 336 }else \
330 return -1; \ 337 return -1; \
331} 338}
332#endif 339#endif
333 340
334 341
335#define OPIE_EXPORT_APPNAME static QString appName() { return QString::fromLatin1( QUICKAPP_NAME ); } 342#define OPIE_EXPORT_APPNAME static QString appName() { return QString::fromLatin1( QUICKAPP_NAME ); }