summaryrefslogtreecommitdiff
authorzecke <zecke>2004-12-20 22:04:43 (UTC)
committer zecke <zecke>2004-12-20 22:04:43 (UTC)
commite561899f6cf0c98b428f70df06eaee2ce1912291 (patch) (unidiff)
treedeb204bd5f6026c9b48a82089739a29dd564be07
parent4a9d317adb576fed2164638a1d4d15c75eebfd6b (diff)
downloadopie-e561899f6cf0c98b428f70df06eaee2ce1912291.zip
opie-e561899f6cf0c98b428f70df06eaee2ce1912291.tar.gz
opie-e561899f6cf0c98b428f70df06eaee2ce1912291.tar.bz2
A define to avoid writing static QString fromLatin1() {...}
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/oapplicationfactory.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/libopie2/opiecore/oapplicationfactory.h b/libopie2/opiecore/oapplicationfactory.h
index 6247776..cabaf79 100644
--- a/libopie2/opiecore/oapplicationfactory.h
+++ b/libopie2/opiecore/oapplicationfactory.h
@@ -1,333 +1,335 @@
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
57namespace Opie { 57namespace Opie {
58namespace Core { 58namespace Core {
59 struct NullType; 59 struct NullType;
60 60
61 template <class T, class U> 61 template <class T, class U>
62 struct Typelist 62 struct Typelist
63 { 63 {
64 typedef T Head; 64 typedef T Head;
65 typedef U Tail; 65 typedef U Tail;
66 }; 66 };
67 template< 67 template<
68 typename T1 = NullType, typename T2 = NullType, typename T3 = NullType, 68 typename T1 = NullType, typename T2 = NullType, typename T3 = NullType,
69 typename T4 = NullType, typename T5 = NullType, typename T6 = NullType, 69 typename T4 = NullType, typename T5 = NullType, typename T6 = NullType,
70 typename T7 = NullType, typename T8 = NullType, typename T9 = NullType, 70 typename T7 = NullType, typename T8 = NullType, typename T9 = NullType,
71 typename T10 = NullType, typename T11 = NullType, typename T12 = NullType, 71 typename T10 = NullType, typename T11 = NullType, typename T12 = NullType,
72 typename T13 = NullType, typename T14 = NullType, typename T15 = NullType, 72 typename T13 = NullType, typename T14 = NullType, typename T15 = NullType,
73 typename T16 = NullType, typename T17 = NullType, typename T18 = NullType 73 typename T16 = NullType, typename T17 = NullType, typename T18 = NullType
74 > 74 >
75 struct MakeTypelist{ 75 struct MakeTypelist{
76 private: 76 private:
77 typedef typename MakeTypelist 77 typedef typename MakeTypelist
78 < 78 <
79 T2 , T3 , T4 , 79 T2 , T3 , T4 ,
80 T5 , T6 , T7 , 80 T5 , T6 , T7 ,
81 T8 , T9 , T10, 81 T8 , T9 , T10,
82 T11, T12, T13, 82 T11, T12, T13,
83 T14, T15, T16, 83 T14, T15, T16,
84 T17, T18 84 T17, T18
85 > 85 >
86 ::Result TailResult; 86 ::Result TailResult;
87 87
88public: 88public:
89 typedef Typelist<T1, TailResult> Result; 89 typedef Typelist<T1, TailResult> Result;
90}; 90};
91 91
92template<> 92template<>
93struct MakeTypelist<> 93struct MakeTypelist<>
94{ 94{
95 typedef NullType Result; 95 typedef NullType Result;
96}; 96};
97 97
98 98
99/** 99/**
100 * To allow your application to be quick launched some one needs 100 * To allow your application to be quick launched some one needs
101 * to create the QWidget. 101 * to create the QWidget.
102 * This is this factory. Make surce your widget has static QString Widget::appName() 102 * This is this factory. Make surce your widget has static QString Widget::appName()
103 * as one of its functions. 103 * as one of its functions.
104 * 104 *
105 * This template takes one QWidget and initialized it in the form of 105 * This template takes one QWidget and initialized it in the form of
106 * MyWidget::MyWidget( QWidget* parent, const char* name, WFlags f ); 106 * MyWidget::MyWidget( QWidget* parent, const char* name, WFlags f );
107 * 107 *
108 * To use it on your app do that: 108 * To use it on your app do that:
109 * typedef OApplicationFactory<MyWidget> MyFactory; 109 * typedef OApplicationFactory<MyWidget> MyFactory;
110 * OPIE_EXPORT_APP( MyFactory ) 110 * OPIE_EXPORT_APP( MyFactory )
111 * 111 *
112 */ 112 */
113template <class Product> 113template <class Product>
114struct OApplicationFactory : public ApplicationInterface { 114struct OApplicationFactory : public ApplicationInterface {
115 QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { 115 QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) {
116 *iface = 0; 116 *iface = 0;
117 if ( uuid == IID_QUnknown ) *iface = this; 117 if ( uuid == IID_QUnknown ) *iface = this;
118 else if ( uuid == IID_QtopiaApplication ) *iface = this; 118 else if ( uuid == IID_QtopiaApplication ) *iface = this;
119 else return QS_FALSE; 119 else return QS_FALSE;
120 (*iface)->addRef(); 120 (*iface)->addRef();
121 return QS_OK; 121 return QS_OK;
122 } 122 }
123 123
124 /* 124 /*
125 * 125 *
126 */ 126 */
127 virtual QWidget *createMainWindow( const QString& appName, QWidget* parent, 127 virtual QWidget *createMainWindow( const QString& appName, QWidget* parent,
128 const char* name, Qt::WFlags f ) { 128 const char* name, Qt::WFlags f ) {
129 if (appName == Product::appName() ) 129 if (appName == Product::appName() )
130 return new Product(parent, name, f ); 130 return new Product(parent, name, f );
131 else 131 else
132 return 0l; 132 return 0l;
133 } 133 }
134 134
135 virtual QStringList applications()const { 135 virtual QStringList applications()const {
136 QStringList list; 136 QStringList list;
137 list << Product::appName() ; 137 list << Product::appName() ;
138 138
139 return list; 139 return list;
140 } 140 }
141 Q_REFCOUNT 141 Q_REFCOUNT
142 142
143}; 143};
144 144
145 145
146/* Internal */ 146/* Internal */
147 147
148template< class Product > 148template< class Product >
149struct OPrivate { 149struct OPrivate {
150 inline static QWidget *multiFactory( const QString& appName, QWidget* parent, 150 inline static QWidget *multiFactory( const QString& appName, QWidget* parent,
151 const char* name, Qt::WFlags fl ) { 151 const char* name, Qt::WFlags fl ) {
152 if ( appName == Product::appName() ) 152 if ( appName == Product::appName() )
153 return new Product( parent, name, fl ); 153 return new Product( parent, name, fl );
154 else 154 else
155 return 0; 155 return 0;
156 } 156 }
157 157
158 inline static QStringList multiString( const QStringList& _list ) { 158 inline static QStringList multiString( const QStringList& _list ) {
159 QStringList list = _list; 159 QStringList list = _list;
160 list << Product::appName(); 160 list << Product::appName();
161 return list; 161 return list;
162 } 162 }
163}; 163};
164 164
165template <> 165template <>
166struct OPrivate<Opie::Core::NullType > { 166struct OPrivate<Opie::Core::NullType > {
167 inline static QWidget* multiFactory ( const QString& , QWidget* , 167 inline static QWidget* multiFactory ( const QString& , QWidget* ,
168 const char* , Qt::WFlags ) { 168 const char* , Qt::WFlags ) {
169 return 0l; 169 return 0l;
170 } 170 }
171 inline static QStringList multiString( const QStringList& _list ) { 171 inline static QStringList multiString( const QStringList& _list ) {
172 return _list; 172 return _list;
173 } 173 }
174}; 174};
175 175
176/* 176/*
177template <> 177template <>
178struct OPrivate <Opie::NullType, Opie::NullType > { 178struct OPrivate <Opie::NullType, Opie::NullType > {
179 inline static QWidget* multiFactory( const QString& , QWidget* , 179 inline static QWidget* multiFactory( const QString& , QWidget* ,
180 const char* , Qt::WFlags ) { 180 const char* , Qt::WFlags ) {
181 return 0l; 181 return 0l;
182 } 182 }
183 183
184 inline static QStringList multiString( const QStringList& _list ) { 184 inline static QStringList multiString( const QStringList& _list ) {
185 return _list; 185 return _list;
186 } 186 }
187}; 187};
188*/ 188*/
189 189
190template <class Product, class ProductListTail> 190template <class Product, class ProductListTail>
191struct OPrivate< Opie::Core::Typelist<Product, ProductListTail> > { 191struct OPrivate< Opie::Core::Typelist<Product, ProductListTail> > {
192 inline static QWidget* multiFactory( const QString& appName, QWidget* parent, 192 inline static QWidget* multiFactory( const QString& appName, QWidget* parent,
193 const char* name, Qt::WFlags fl) { 193 const char* name, Qt::WFlags fl) {
194 QWidget* wid = OPrivate<Product>::multiFactory( appName, parent, name, fl ); 194 QWidget* wid = OPrivate<Product>::multiFactory( appName, parent, name, fl );
195 195
196 if (!wid ) 196 if (!wid )
197 wid = OPrivate<ProductListTail>::multiFactory( appName, parent, name, fl ); 197 wid = OPrivate<ProductListTail>::multiFactory( appName, parent, name, fl );
198 198
199 return wid; 199 return wid;
200 } 200 }
201 201
202 inline static QStringList multiString( const QStringList& _list ) { 202 inline static QStringList multiString( const QStringList& _list ) {
203 QStringList list = _list; 203 QStringList list = _list;
204 204
205 list = OPrivate<Product>::multiString( list ); 205 list = OPrivate<Product>::multiString( list );
206 list = OPrivate<ProductListTail>::multiString( list ); 206 list = OPrivate<ProductListTail>::multiString( list );
207 207
208 return list; 208 return list;
209 } 209 }
210}; 210};
211 211
212 212
213 213
214 214
215 215
216 216
217 217
218 218
219/* Internal END */ 219/* Internal END */
220 220
221/* 221/*
222 * If you want to export more than one Widget use that function 222 * If you want to export more than one Widget use that function
223 * Make sure all your Widgets provide the appName() static method 223 * Make sure all your Widgets provide the appName() static method
224 * otherwise you'll get a compiler error 224 * otherwise you'll get a compiler error
225 * 225 *
226 * typedef Opie::MakeTypeList<MyWidget, MyDialog, MyMediaPlayer >::Result MyTypes; 226 * typedef Opie::MakeTypeList<MyWidget, MyDialog, MyMediaPlayer >::Result MyTypes;
227 * OPIE_EXPORT_APP( OApplicationFactory<MyTypes> ) 227 * OPIE_EXPORT_APP( OApplicationFactory<MyTypes> )
228 */ 228 */
229 229
230template<class Product, class ProductListTail> 230template<class Product, class ProductListTail>
231struct OApplicationFactory< Opie::Core::Typelist<Product, ProductListTail > > 231struct OApplicationFactory< Opie::Core::Typelist<Product, ProductListTail > >
232 : ApplicationInterface { 232 : ApplicationInterface {
233 QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { 233 QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) {
234 *iface = 0; 234 *iface = 0;
235 if ( uuid == IID_QUnknown ) *iface = this; 235 if ( uuid == IID_QUnknown ) *iface = this;
236 else if ( uuid ==IID_QtopiaApplication ) *iface = this; 236 else if ( uuid ==IID_QtopiaApplication ) *iface = this;
237 else return QS_FALSE; 237 else return QS_FALSE;
238 (*iface)->addRef(); 238 (*iface)->addRef();
239 return QS_OK; 239 return QS_OK;
240 } 240 }
241 241
242 QWidget* createMainWindow ( const QString& appName, QWidget* parent, 242 QWidget* createMainWindow ( const QString& appName, QWidget* parent,
243 const char* name, Qt::WFlags fl ) { 243 const char* name, Qt::WFlags fl ) {
244 qWarning("StringList is %s", applications().join(":").latin1() ); 244 qWarning("StringList is %s", applications().join(":").latin1() );
245 return OPrivate< Opie::Core::Typelist<Product, ProductListTail > >::multiFactory( appName, parent, name, fl ); 245 return OPrivate< Opie::Core::Typelist<Product, ProductListTail > >::multiFactory( appName, parent, name, fl );
246 } 246 }
247 247
248 QStringList applications()const { 248 QStringList applications()const {
249 QStringList _list; 249 QStringList _list;
250 return OPrivate< Opie::Core::Typelist<Product, ProductListTail> >::multiString( _list ); 250 return OPrivate< Opie::Core::Typelist<Product, ProductListTail> >::multiString( _list );
251 } 251 }
252 252
253 Q_REFCOUNT 253 Q_REFCOUNT
254}; 254};
255 255
256} 256}
257} 257}
258 258
259/* If the library version should be build */ 259/* If the library version should be build */
260#ifdef OPIE_APP_INTERFACE 260#ifdef OPIE_APP_INTERFACE
261#define OPIE_EXPORT_APP( factory ) Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( factory ) } 261#define OPIE_EXPORT_APP( factory ) Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( factory ) }
262#else 262#else
263 263
264#include <qpe/qpeapplication.h> 264#include <qpe/qpeapplication.h>
265 265
266#define OPIE_EXPORT_APP( Factory ) \ 266#define OPIE_EXPORT_APP( Factory ) \
267int main( int argc, char **argv ) { \ 267int main( int argc, char **argv ) { \
268 QPEApplication a(argc, argv ); \ 268 QPEApplication a(argc, argv ); \
269 QWidget *mw = 0;\ 269 QWidget *mw = 0;\
270\ 270\
271 /* method from TT */ \ 271 /* method from TT */ \
272 QString executableName = QString::fromLatin1( argv[0] ); \ 272 QString executableName = QString::fromLatin1( argv[0] ); \
273 executableName = executableName.right(executableName.length() \ 273 executableName = executableName.right(executableName.length() \
274 - executableName.findRev('/') - 1); \ 274 - executableName.findRev('/') - 1); \
275 \ 275 \
276 Factory f; \ 276 Factory f; \
277 QStringList list = f.applications(); \ 277 QStringList list = f.applications(); \
278 if (list.contains(executableName) ) \ 278 if (list.contains(executableName) ) \
279 mw = f.createMainWindow(executableName, 0, 0, 0 ); \ 279 mw = f.createMainWindow(executableName, 0, 0, 0 ); \
280 else \ 280 else \
281 mw = f.createMainWindow( list[0], 0, 0, 0 ); \ 281 mw = f.createMainWindow( list[0], 0, 0, 0 ); \
282\ 282\
283 if( mw ) { \ 283 if( mw ) { \
284 if ( mw->metaObject()->slotNames().contains("setDocument(const QString&)" ) ) \ 284 if ( mw->metaObject()->slotNames().contains("setDocument(const QString&)" ) ) \
285 a.showMainDocumentWidget( mw ); \ 285 a.showMainDocumentWidget( mw ); \
286 else \ 286 else \
287 a.showMainWidget( mw ); \ 287 a.showMainWidget( mw ); \
288\ 288\
289 int rv = a.exec(); \ 289 int rv = a.exec(); \
290 delete mw; \ 290 delete mw; \
291 return rv; \ 291 return rv; \
292 }else \ 292 }else \
293 return -1; \ 293 return -1; \
294} 294}
295#endif 295#endif
296 296
297#ifdef OPIE_APP_INTERFACE 297#ifdef OPIE_APP_INTERFACE
298#define OPIE_EXPORT_APP_V2( factory,name ) Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( factory ) } 298#define OPIE_EXPORT_APP_V2( factory,name ) Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( factory ) }
299#else 299#else
300 300
301#include <opie2/oapplication.h> 301#include <opie2/oapplication.h>
302 302
303#define OPIE_EXPORT_APP_V2( Factory,name ) \ 303#define OPIE_EXPORT_APP_V2( Factory,name ) \
304int main( int argc, char **argv ) { \ 304int main( int argc, char **argv ) { \
305 Opie::Core::OApplication a(argc, argv, name ); \ 305 Opie::Core::OApplication a(argc, argv, name ); \
306 QWidget *mw = 0;\ 306 QWidget *mw = 0;\
307\ 307\
308 /* method from TT */ \ 308 /* method from TT */ \
309 QString executableName = QString::fromLatin1( argv[0] ); \ 309 QString executableName = QString::fromLatin1( argv[0] ); \
310 executableName = executableName.right(executableName.length() \ 310 executableName = executableName.right(executableName.length() \
311 - executableName.findRev('/') - 1); \ 311 - executableName.findRev('/') - 1); \
312 \ 312 \
313 Factory f; \ 313 Factory f; \
314 QStringList list = f.applications(); \ 314 QStringList list = f.applications(); \
315 if (list.contains(executableName) ) \ 315 if (list.contains(executableName) ) \
316 mw = f.createMainWindow(executableName, 0, 0, 0 ); \ 316 mw = f.createMainWindow(executableName, 0, 0, 0 ); \
317 else \ 317 else \
318 mw = f.createMainWindow( list[0], 0, 0, 0 ); \ 318 mw = f.createMainWindow( list[0], 0, 0, 0 ); \
319\ 319\
320 if( mw ) { \ 320 if( mw ) { \
321 if ( mw->metaObject()->slotNames().contains("setDocument(const QString&)" ) ) \ 321 if ( mw->metaObject()->slotNames().contains("setDocument(const QString&)" ) ) \
322 a.showMainDocumentWidget( mw ); \ 322 a.showMainDocumentWidget( mw ); \
323 else \ 323 else \
324 a.showMainWidget( mw ); \ 324 a.showMainWidget( mw ); \
325\ 325\
326 int rv = a.exec(); \ 326 int rv = a.exec(); \
327 delete mw; \ 327 delete mw; \
328 return rv; \ 328 return rv; \
329 }else \ 329 }else \
330 return -1; \ 330 return -1; \
331} 331}
332#endif 332#endif
333 333
334
335#define OPIE_EXPORT_APPNAME static QString appName() { return QString::fromLatin1( QUICKAPP_NAME ); }