Fix crash on login.
[kdenetwork.git] / kopete / protocols / oscar / liboscar / tasks / task.cpp
blobbadd4846cab75c795c8b74aa751fc1c36eed0351
1 /*
2 task.cpp - Kopete Groupwise Protocol
4 Copyright (c) 2004 SUSE Linux AG http://www.suse.com
6 Based on Iris, Copyright (C) 2003 Justin Karneges
8 Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.org>
10 *************************************************************************
11 * *
12 * This library is free software; you can redistribute it and/or *
13 * modify it under the terms of the GNU Lesser General Public *
14 * License as published by the Free Software Foundation; either *
15 * version 2 of the License, or (at your option) any later version. *
16 * *
17 *************************************************************************
20 #include <qtimer.h>
21 #include <qstring.h>
22 #include <kdebug.h>
24 #include "connection.h"
25 #include "transfer.h"
26 #include "safedelete.h"
27 #include "buffer.h"
28 #include "task.h"
31 class Task::TaskPrivate
33 public:
34 TaskPrivate() {}
36 quint32 id;
37 bool success;
38 int statusCode;
39 QString statusString;
40 Connection* client;
41 bool insignificant, deleteme, autoDelete;
42 bool done;
43 Transfer* transfer;
46 Task::Task(Task *parent)
47 :QObject(parent)
49 init();
50 d->client = parent->client();
51 connect(d->client, SIGNAL(disconnected()), SLOT(clientDisconnected()));
54 Task::Task(Connection* parent, bool)
55 :QObject(parent)
57 init();
58 d->client = parent;
59 connect(d->client, SIGNAL(disconnected()), SLOT(clientDisconnected()));
62 Task::~Task()
64 delete d->transfer;
65 delete d;
68 void Task::init()
70 d = new TaskPrivate;
71 d->success = false;
72 d->insignificant = false;
73 d->deleteme = false;
74 d->autoDelete = false;
75 d->done = false;
76 d->transfer = 0;
77 d->id = 0;
80 Task *Task::parent() const
82 return (Task *)QObject::parent();
85 Connection *Task::client() const
87 return d->client;
90 Transfer * Task::transfer() const
92 return d->transfer;
95 void Task::setTransfer( Transfer * transfer )
97 d->transfer = transfer;
100 quint32 Task::id() const
102 return d->id;
105 bool Task::success() const
107 return d->success;
110 int Task::statusCode() const
112 return d->statusCode;
115 const QString & Task::statusString() const
117 return d->statusString;
120 void Task::go(bool autoDelete)
122 d->autoDelete = autoDelete;
124 onGo();
127 bool Task::take( Transfer * transfer)
129 const QList<Task*> p = findChildren<Task*>();
131 // pass along the transfer to our children
132 foreach( Task* t, p)
134 if ( t->take( transfer ) )
135 return true;
138 return false;
141 void Task::safeDelete()
143 if(d->deleteme)
144 return;
146 d->deleteme = true;
147 if(!d->insignificant)
148 SafeDelete::deleteSingle(this);
151 void Task::onGo()
153 qDebug( "ERROR: calling default NULL onGo() for this task, you should reimplement this!");
156 void Task::onDisconnect()
158 if(!d->done) {
159 d->success = false;
160 d->statusCode = ErrDisc;
161 d->statusString = tr("Disconnected");
163 // delay this so that tasks that react don't block the shutdown
164 QTimer::singleShot(0, this, SLOT(done()));
168 void Task::send( Transfer * request )
170 client()->send( request );
173 void Task::setSuccess(int code, const QString &str)
175 if(!d->done) {
176 d->success = true;
177 d->statusCode = code;
178 d->statusString = str;
179 done();
183 void Task::setError(int code, const QString &str)
185 if(!d->done) {
186 d->success = false;
187 d->statusCode = code;
188 d->statusString = str;
189 done();
193 void Task::done()
195 kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << endl;
196 if(d->done || d->insignificant)
197 return;
198 d->done = true;
200 if(d->deleteme || d->autoDelete)
201 d->deleteme = true;
203 d->insignificant = true;
204 kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "emitting finished" << endl;
205 finished();
206 d->insignificant = false;
208 if(d->deleteme)
209 SafeDelete::deleteSingle(this);
212 void Task::clientDisconnected()
214 onDisconnect();
217 Transfer* Task::createTransfer( struct FLAP f, struct SNAC s, Buffer* buffer )
219 return new SnacTransfer( f, s, buffer );
222 Transfer* Task::createTransfer( struct FLAP f, Buffer* buffer )
224 return new FlapTransfer( f, buffer );
227 Transfer* Task::createTransfer( Buffer* buffer )
229 return new Transfer( buffer );
232 bool Task::forMe( const Transfer * transfer ) const
234 Q_UNUSED( transfer );
235 return false;
238 void Task::setId( quint32 id )
240 d->id = id;
243 #include "task.moc"
245 //kate: tab-width 4; indent-mode csands;