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 *************************************************************************
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. *
16 *************************************************************************
19 #include "usersearchtask.h"
23 #include "connection.h"
25 UserSearchTask::UserSearchTask( Task
* 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
);
46 if ( st
->snacService() != 0x0015 || st
->snacSubtype() != 0x0003 )
49 Buffer
buf( st
->buffer()->buffer() );
50 const_cast<UserSearchTask
*>(this)->parseInitialData( buf
);
52 if ( requestType() == 0x07da && ( requestSubType() == 0x01a4 || requestSubType() == 0x01ae ) )
58 bool UserSearchTask::take( Transfer
* t
)
65 SnacTransfer
* st
= dynamic_cast<SnacTransfer
*>( t
);
67 seq
= st
->snacRequest();
69 TLV tlv1
= transfer()->buffer()->getTLV();
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 ) )
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
);
108 void UserSearchTask::searchUserByUIN( const QString
& uin
)
110 //create a new result list
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
);
126 Transfer
* t
= createTransfer( f
, s
, buf
);
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
145 search.addLEWord(first.length());
147 search.addLEString(first.toLatin1(), first.length());
150 search.addLEWord(last.length());
152 search.addLEString(last.toLatin1(), last.length());
155 search.addLEWord(nick.length());
157 search.addLEString(nick.toLatin1(), nick.length());
160 search.addLEWord(mail.length());
162 search.addLEString(mail.toLatin1(), mail.length());
165 search.addLEWord(minage);
168 search.addLEWord(maxage);
170 // BYTE xx SEX 1=fem, 2=mal, 0=dontcare
172 search.addLEByte(0x01);
174 search.addLEByte(0x02);
176 search.addLEByte(0x00);
179 search.addLEByte(lang);
182 search.addLEWord(city.length());
184 search.addLEString(city.toLatin1(), city.length());
187 search.addLEWord(state.length());
189 search.addLEString(state.toLatin1(), state.length());
191 // WORD.L xx xx COUNTRY
192 search.addLEWord(country);
195 search.addLEWord(company.length());
196 if(company.length()>0)
197 search.addLEString(company.toLatin1(), company.length());
200 search.addLEWord(department.length());
201 if(department.length()>0)
202 search.addLEString(department.toLatin1(), department.length());
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);
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
238 search.addLEByte(0x01);
240 search.addLEByte(0x00);
242 if ( !info
.firstName
.isEmpty() )
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() )
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() )
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() )
269 bufEmail
.addLEWord( info
.email
.length() );
270 bufEmail
.addLEString( info
.email
, info
.email
.length() );
271 tlvData
->addLETLV( 0x015E, bufEmail
.buffer() );
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() )
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
);
313 #include "usersearchtask.moc"
315 //kate: indent-mode csands; tab-width 4; space-indent off; replace-tabs off;