1 /*
2 Kopete Oscar Protocol
3 aimlogintask.h - Handles logging into to the AIM service
4
5 Copyright (c) 2004 Matt Rogers <mattr@kde.org>
6
7 Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.org>
8
9 *************************************************************************
10 * *
11 * This library is free software; you can redistribute it and/or *
12 * modify it under the terms of the GNU Lesser General Public *
13 * License as published by the Free Software Foundation; either *
14 * version 2 of the License, or (at your option) any later version. *
15 * *
16 *************************************************************************
17 */
18 #include "ownuserinfotask.h"
19 #include <kdebug.h>
20 #include "buffer.h"
21 #include "connection.h"
22 #include "oscartypes.h"
23 #include "oscarutils.h"
24 #include "transfer.h"
25 #include "userdetails.h"
26 #include "contactmanager.h"
27
28 using namespace Oscar;
29
OwnUserInfoTask(Task * parent)30 OwnUserInfoTask::OwnUserInfoTask( Task* parent ) : Task( parent )
31 {
32 }
33
~OwnUserInfoTask()34 OwnUserInfoTask::~OwnUserInfoTask()
35 {
36 }
37
forMe(const Transfer * transfer) const38 bool OwnUserInfoTask::forMe( const Transfer* transfer ) const
39 {
40 const SnacTransfer* st = dynamic_cast<const SnacTransfer*>( transfer );
41 if ( !st )
42 return false;
43 else
44 {
45 if ( st->snacService() == 0x01 &&
46 ( st->snacSubtype() == 0x0F || st->snacSubtype() == 0x21 ) )
47 return true;
48 else
49 return false;
50 }
51
52 }
53
take(Transfer * transfer)54 bool OwnUserInfoTask::take( Transfer* transfer )
55 {
56 if ( forMe( transfer ) )
57 {
58 SnacTransfer* st = dynamic_cast<SnacTransfer*>( transfer );
59 if ( !st )
60 return false;
61
62 Buffer* b = transfer->buffer();
63 if ( st->snacSubtype() == 0x0F )
64 {
65 UserDetails ud;
66 ud.fill( b );
67 m_details = ud;
68 emit gotInfo();
69 setSuccess( 0, QString() );
70 return true;
71 }
72 else
73 {
74 bool needUpload = false;
75 Oscar::WORD infoType = b->getWord();
76 if ( infoType == 0x0000 || infoType == 0x0001 )
77 {
78 Oscar::BYTE flags = b->getByte();
79 if ( flags == 0x41 ) //we need to do a buddy upload when bit 8 = 1
80 needUpload = true;
81
82 QByteArray qba;
83 if ( b->bytesAvailable() != 0 )
84 { //buffer might be empty if flags bit 8 = 1
85 Oscar::BYTE checksumLength = b->getByte();
86 qba = b->getBlock( checksumLength );
87 kDebug(OSCAR_RAW_DEBUG) << "Self icon checksum: " << qba.toHex();
88 }
89
90 if ( needUpload )
91 {
92 kDebug(OSCAR_RAW_DEBUG) << "Buddy icon upload requested";
93 emit buddyIconUploadRequested();
94 }
95 else
96 {
97 kDebug(OSCAR_RAW_DEBUG) << "no item for hash found";
98 }
99 }
100
101 if ( infoType == 0x0002 )
102 {
103 QString availableMsg( b->getBSTR() );
104 kDebug(OSCAR_RAW_DEBUG) << "self available message: ";
105 }
106
107 setSuccess( 0, QString() );
108 return true;
109 }
110
111 }
112
113 return false;
114 }
115
onGo()116 void OwnUserInfoTask::onGo()
117 {
118 //Send SNAC( 0x01, 0x0E )
119 FLAP f = { 0x02, 0, 0 };
120 SNAC s = { 0x0001, 0x000E, 0x0000, client()->snacSequence() };
121 Buffer *b = new Buffer(); //empty snac data
122 Transfer* t = createTransfer( f, s, b );
123 send( t );
124 }
125
getInfo() const126 UserDetails OwnUserInfoTask::getInfo() const
127 {
128 return m_details;
129 }
130
131