Use QByteArray::append instead of copying every byte with [] operator.
[kdenetwork.git] / kopete / protocols / oscar / liboscar / usersearchtask.cpp
bloba1f2434cf11ab1a2d55b23b1aa7d859d3ebce83e
1 /*
2 Kopete Oscar Protocol
3 usersearchtask.cpp - Search for contacts
5 Copyright (c) 2004 Gustavo Pichorim Boiko <gustavo.boiko@kdemail.net>
7 Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.org>
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 *************************************************************************
19 #include "usersearchtask.h"
21 #include "transfer.h"
22 #include "buffer.h"
23 #include "connection.h"
25 UserSearchTask::UserSearchTask( Task* parent )
26 : ICQTask( parent )
31 UserSearchTask::~UserSearchTask()
35 void UserSearchTask::onGo()
39 bool UserSearchTask::forMe( const Transfer* t ) const
41 const SnacTransfer* st = dynamic_cast<const SnacTransfer*>( t );
43 if ( !st )
44 return false;
46 if ( st->snacService() != 0x0015 || st->snacSubtype() != 0x0003 )
47 return false;
49 Buffer buf( st->buffer()->buffer() );
50 const_cast<UserSearchTask*>(this)->parseInitialData( buf );
52 if ( requestType() == 0x07da && ( requestSubType() == 0x01a4 || requestSubType() == 0x01ae ) )
53 return true;
55 return false;
58 bool UserSearchTask::take( Transfer* t )
60 if ( forMe( t ) )
62 setTransfer( t );
64 quint16 seq = 0;
65 SnacTransfer* st = dynamic_cast<SnacTransfer*>( t );
66 if ( st )
67 seq = st->snacRequest();
69 TLV tlv1 = transfer()->buffer()->getTLV();
71 if ( seq == 0 )
73 setTransfer( 0 );
74 return false;
77 Buffer* buffer = new Buffer( tlv1.data, tlv1.length );
78 ICQSearchResult result;
79 buffer->getLEWord(); // data chunk size
80 /*DWORD receiverUin =*/ buffer->getLEDWord(); // target uin
81 buffer->getLEWord(); // request type
82 buffer->getLEWord(); // request sequence number: 0x0002
83 buffer->getLEWord(); // request subtype
85 BYTE success = buffer->getByte(); // Success byte: always 0x0a
87 if ( ( success == 0x32 ) || ( success == 0x14 ) || ( success == 0x1E ) )
88 result.uin = 1;
89 else
90 result.fill( buffer );
92 m_results.append( result );
94 emit foundUser( result );
96 // Last user found reply
97 if ( requestSubType() == 0x01ae )
99 int moreUsersCount = buffer->getLEDWord();
100 emit searchFinished( moreUsersCount );
101 setSuccess( 0, QString::null );
103 setTransfer( 0 );
105 return true;
108 void UserSearchTask::searchUserByUIN( const QString& uin )
110 //create a new result list
111 m_type = UINSearch;
113 FLAP f = { 0x02, 0, 0 };
114 SNAC s = { 0x0015, 0x0002, 0x0000, client()->snacSequence() };
116 setRequestType( 0x07D0 ); //meta-information request
117 setRequestSubType( 0x0569 ); //subtype: META_SEARCH_BY_UIN
118 setSequence( f.sequence );
119 Buffer* tlvdata = new Buffer();
120 tlvdata->addLEWord( 0x0136 ); //tlv of type 0x0136 with length 4. all little endian
121 tlvdata->addLEWord( 0x0004 );
122 tlvdata->addLEDWord( uin.toULong() );
123 Buffer* buf = addInitialData( tlvdata );
124 delete tlvdata;
126 Transfer* t = createTransfer( f, s, buf );
127 send( t );
130 void UserSearchTask::searchWhitePages( const ICQWPSearchInfo& info )
132 m_type = WhitepageSearch;
134 FLAP f = { 0x02, 0, 0 };
135 SNAC s = { 0x0015, 0x0002, 0x0000, client()->snacSequence() };
137 setRequestType( 0x07D0 );
138 setRequestSubType( 0x055F );
139 setSequence( f.sequence );
140 Buffer* tlvData = new Buffer();
142 search.addLEWord(0x0533); // subtype: 1331
144 //LNTS FIRST
145 search.addLEWord(first.length());
146 if(first.length()>0)
147 search.addLEString(first.toLatin1(), first.length());
149 // LNTS LAST
150 search.addLEWord(last.length());
151 if(last.length()>0)
152 search.addLEString(last.toLatin1(), last.length());
154 // LNTS NICK
155 search.addLEWord(nick.length());
156 if(nick.length()>0)
157 search.addLEString(nick.toLatin1(), nick.length());
159 // LNTS EMAIL
160 search.addLEWord(mail.length());
161 if(mail.length()>0)
162 search.addLEString(mail.toLatin1(), mail.length());
164 // WORD.L MINAGE
165 search.addLEWord(minage);
167 // WORD.L MAXAGE
168 search.addLEWord(maxage);
170 // BYTE xx SEX 1=fem, 2=mal, 0=dontcare
171 if (sex==1)
172 search.addLEByte(0x01);
173 else if(sex==2)
174 search.addLEByte(0x02);
175 else
176 search.addLEByte(0x00);
178 // BYTE xx LANGUAGE
179 search.addLEByte(lang);
181 // LNTS CITY
182 search.addLEWord(city.length());
183 if(city.length()>0)
184 search.addLEString(city.toLatin1(), city.length());
186 // LNTS STATE
187 search.addLEWord(state.length());
188 if(state.length()>0)
189 search.addLEString(state.toLatin1(), state.length());
191 // WORD.L xx xx COUNTRY
192 search.addLEWord(country);
194 // LNTS COMPANY
195 search.addLEWord(company.length());
196 if(company.length()>0)
197 search.addLEString(company.toLatin1(), company.length());
199 // LNTS DEPARTMENT
200 search.addLEWord(department.length());
201 if(department.length()>0)
202 search.addLEString(department.toLatin1(), department.length());
204 // LNTS POSITION
205 search.addLEWord(position.length());
206 if(position.length()>0)
207 search.addLEString(position.toLatin1(), position.length());
209 // BYTE xx OCCUPATION
210 search.addLEByte(occupation);
212 //WORD.L xx xx PAST
213 search.addLEWord(0x0000);
215 //LNTS PASTDESC - The past description to search for.
216 search.addLEWord(0x0000);
218 // WORD.L xx xx INTERESTS - The interests category to search for.
219 search.addLEWord(0x0000);
221 // LNTS INTERDESC - The interests description to search for.
222 search.addLEWord(0x0000);
224 // WORD.L xx xx AFFILIATION - The affiliation to search for.
225 search.addLEWord(0x0000);
227 // LNTS AFFIDESC - The affiliation description to search for.
228 search.addLEWord(0x0000);
230 // WORD.L xx xx HOMEPAGE - The home page category to search for.
231 search.addLEWord(0x0000);
233 // LNTS HOMEDESC - The home page description to search for.
234 search.addLEWord(0x0000);
236 // BYTE xx ONLINE 1=online onliners, 0=dontcare
237 if(onlineOnly)
238 search.addLEByte(0x01);
239 else
240 search.addLEByte(0x00);
242 if ( !info.firstName.isEmpty() )
244 Buffer bufFileName;
245 bufFileName.addLEWord( info.firstName.length() );
246 bufFileName.addLEString( info.firstName, info.firstName.length() );
247 tlvData->addLETLV( 0x0140, bufFileName.buffer() );
250 if ( !info.lastName.isEmpty() )
252 Buffer bufLastName;
253 bufLastName.addLEWord( info.lastName.length() );
254 bufLastName.addLEString( info.lastName, info.lastName.length() );
255 tlvData->addLETLV( 0x014A, bufLastName.buffer() );
258 if ( !info.nickName.isEmpty() )
260 Buffer bufNickName;
261 bufNickName.addLEWord( info.nickName.length() );
262 bufNickName.addLEString( info.nickName, info.nickName.length() );
263 tlvData->addLETLV( 0x0154, bufNickName.buffer() );
266 if ( !info.email.isEmpty() )
268 Buffer bufEmail;
269 bufEmail.addLEWord( info.email.length() );
270 bufEmail.addLEString( info.email, info.email.length() );
271 tlvData->addLETLV( 0x015E, bufEmail.buffer() );
274 if ( info.age > 0 )
276 Buffer bufAge;
277 bufAge.addWord( info.age );
278 bufAge.addWord( info.age );
279 tlvData->addLETLV( 0x0168, bufAge.buffer() );
282 if ( info.gender > 0 )
283 tlvData->addLETLV8( 0x017C, info.gender );
285 if ( info.language > 0 )
286 tlvData->addLETLV16( 0x0186, info.language );
288 if ( info.country > 0 )
289 tlvData->addLETLV16( 0x01A4, info.country );
291 if ( !info.city.isEmpty() )
293 Buffer bufCity;
294 bufCity.addLEWord( info.city.length() );
295 bufCity.addLEString( info.city, info.city.length() );
296 tlvData->addLETLV( 0x0190, bufCity.buffer() );
299 if ( info.occupation > 0 )
300 tlvData->addLETLV16( 0x01CC, info.occupation );
302 if ( info.onlineOnly )
303 tlvData->addLETLV8( 0x0230, 0x01 );
305 Buffer* buf = addInitialData( tlvData );
306 delete tlvData; //we're done with it
308 Transfer* t = createTransfer( f, s, buf );
309 send( t );
313 #include "usersearchtask.moc"
315 //kate: indent-mode csands; tab-width 4; space-indent off; replace-tabs off;