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