summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/oapplicationfactory.h14
1 files changed, 8 insertions, 6 deletions
diff --git a/libopie2/opiecore/oapplicationfactory.h b/libopie2/opiecore/oapplicationfactory.h
index 6e10552..4518174 100644
--- a/libopie2/opiecore/oapplicationfactory.h
+++ b/libopie2/opiecore/oapplicationfactory.h
@@ -34,88 +34,88 @@
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 {
58 struct NullType; 59 struct NullType;
59 60
60 template <class T, class U> 61 template <class T, class U>
61 struct Typelist 62 struct Typelist
62 { 63 {
63 typedef T Head; 64 typedef T Head;
64 typedef U Tail; 65 typedef U Tail;
65 }; 66 };
66 template< 67 template<
67 typename T1 = NullType, typename T2 = NullType, typename T3 = NullType, 68 typename T1 = NullType, typename T2 = NullType, typename T3 = NullType,
68 typename T4 = NullType, typename T5 = NullType, typename T6 = NullType, 69 typename T4 = NullType, typename T5 = NullType, typename T6 = NullType,
69 typename T7 = NullType, typename T8 = NullType, typename T9 = NullType, 70 typename T7 = NullType, typename T8 = NullType, typename T9 = NullType,
70 typename T10 = NullType, typename T11 = NullType, typename T12 = NullType, 71 typename T10 = NullType, typename T11 = NullType, typename T12 = NullType,
71 typename T13 = NullType, typename T14 = NullType, typename T15 = NullType, 72 typename T13 = NullType, typename T14 = NullType, typename T15 = NullType,
72 typename T16 = NullType, typename T17 = NullType, typename T18 = NullType 73 typename T16 = NullType, typename T17 = NullType, typename T18 = NullType
73 > 74 >
74 struct MakeTypelist{ 75 struct MakeTypelist{
75 private: 76 private:
76 typedef typename MakeTypelist 77 typedef typename MakeTypelist
77 < 78 <
78 T2 , T3 , T4 , 79 T2 , T3 , T4 ,
79 T5 , T6 , T7 , 80 T5 , T6 , T7 ,
80 T8 , T9 , T10, 81 T8 , T9 , T10,
81 T11, T12, T13, 82 T11, T12, T13,
82 T14, T15, T16, 83 T14, T15, T16,
83 T17, T18 84 T17, T18
84 > 85 >
85 ::Result TailResult; 86 ::Result TailResult;
86 87
87public: 88public:
88 typedef Typelist<T1, TailResult> Result; 89 typedef Typelist<T1, TailResult> Result;
89}; 90};
90 91
91template<> 92template<>
92struct MakeTypelist<> 93struct MakeTypelist<>
93{ 94{
94 typedef NullType Result; 95 typedef NullType Result;
95}; 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;
@@ -142,138 +142,140 @@ struct OApplicationFactory : public ApplicationInterface {
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::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::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::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::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::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}
257}
256 258
257/* If the library version should be build */ 259/* If the library version should be build */
258#ifdef OPIE_APP_INTERFACE 260#ifdef OPIE_APP_INTERFACE
259#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 ) }
260#else 262#else
261 263
262#include <qpe/qpeapplication.h> 264#include <qpe/qpeapplication.h>
263 265
264#define OPIE_EXPORT_APP( Factory ) \ 266#define OPIE_EXPORT_APP( Factory ) \
265int main( int argc, char **argv ) { \ 267int main( int argc, char **argv ) { \
266 QPEApplication a(argc, argv ); \ 268 QPEApplication a(argc, argv ); \
267 QWidget *mw = 0;\ 269 QWidget *mw = 0;\
268\ 270\
269 /* method from TT */ \ 271 /* method from TT */ \
270 QString executableName = QString::fromLatin1( argv[0] ); \ 272 QString executableName = QString::fromLatin1( argv[0] ); \
271 executableName = executableName.right(executableName.length() \ 273 executableName = executableName.right(executableName.length() \
272 - executableName.findRev('/') - 1); \ 274 - executableName.findRev('/') - 1); \
273 \ 275 \
274 Factory f; \ 276 Factory f; \
275 QStringList list = f.applications(); \ 277 QStringList list = f.applications(); \
276 if (list.contains(executableName) ) \ 278 if (list.contains(executableName) ) \
277 mw = f.createMainWindow(executableName, 0, 0, 0 ); \ 279 mw = f.createMainWindow(executableName, 0, 0, 0 ); \
278 else \ 280 else \
279 mw = f.createMainWindow( list[0], 0, 0, 0 ); \ 281 mw = f.createMainWindow( list[0], 0, 0, 0 ); \