You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
316 lines
8.0 KiB
316 lines
8.0 KiB
15 years ago
|
/*
|
||
|
Kopete Oscar Protocol
|
||
|
usersearchtask.cpp - Search for contacts
|
||
|
|
||
|
Copyright (c) 2004 Gustavo Pichorim Boiko <gustavo.boiko@kdemail.net>
|
||
|
|
||
|
Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.org>
|
||
|
|
||
|
*************************************************************************
|
||
|
* *
|
||
|
* This library is free software; you can redistribute it and/or *
|
||
|
* modify it under the terms of the GNU Lesser General Public *
|
||
|
* License as published by the Free Software Foundation; either *
|
||
|
* version 2 of the License, or (at your option) any later version. *
|
||
|
* *
|
||
|
*************************************************************************
|
||
|
*/
|
||
|
|
||
|
#include "usersearchtask.h"
|
||
|
|
||
|
#include "transfer.h"
|
||
|
#include "buffer.h"
|
||
|
#include "connection.h"
|
||
|
|
||
|
UserSearchTask::UserSearchTask( Task* parent )
|
||
|
: ICQTask( parent )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
UserSearchTask::~UserSearchTask()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void UserSearchTask::onGo()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
bool UserSearchTask::forMe( const Transfer* t ) const
|
||
|
{
|
||
|
const SnacTransfer* st = dynamic_cast<const SnacTransfer*>( t );
|
||
|
|
||
|
if ( !st )
|
||
|
return false;
|
||
|
|
||
|
if ( st->snacService() != 0x0015 || st->snacSubtype() != 0x0003 )
|
||
|
return false;
|
||
|
|
||
|
Buffer buf( st->buffer()->buffer(), st->buffer()->length() );
|
||
|
const_cast<UserSearchTask*>(this)->parseInitialData( buf );
|
||
|
|
||
|
if ( requestType() == 0x07da && ( requestSubType() == 0x01a4 || requestSubType() == 0x01ae ) )
|
||
|
return true;
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
bool UserSearchTask::take( Transfer* t )
|
||
|
{
|
||
|
if ( forMe( t ) )
|
||
|
{
|
||
|
setTransfer( t );
|
||
|
|
||
|
Q_UINT16 seq = 0;
|
||
|
SnacTransfer* st = dynamic_cast<SnacTransfer*>( t );
|
||
|
if ( st )
|
||
|
seq = st->snacRequest();
|
||
|
|
||
|
TLV tlv1 = transfer()->buffer()->getTLV();
|
||
|
|
||
|
if ( seq == 0 )
|
||
|
{
|
||
|
setTransfer( 0 );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
Buffer* buffer = new Buffer( tlv1.data, tlv1.length );
|
||
|
ICQSearchResult result;
|
||
|
buffer->getLEWord(); // data chunk size
|
||
|
/*DWORD receiverUin =*/ buffer->getLEDWord(); // target uin
|
||
|
buffer->getLEWord(); // request type
|
||
|
buffer->getLEWord(); // request sequence number: 0x0002
|
||
|
buffer->getLEWord(); // request subtype
|
||
|
|
||
|
BYTE success = buffer->getByte(); // Success byte: always 0x0a
|
||
|
|
||
|
if ( ( success == 0x32 ) || ( success == 0x14 ) || ( success == 0x1E ) )
|
||
|
result.uin = 1;
|
||
|
else
|
||
|
result.fill( buffer );
|
||
|
|
||
|
m_results.append( result );
|
||
|
|
||
|
emit foundUser( result );
|
||
|
|
||
|
// Last user found reply
|
||
|
if ( requestSubType() == 0x01ae )
|
||
|
{
|
||
|
int moreUsersCount = buffer->getLEDWord();
|
||
|
emit searchFinished( moreUsersCount );
|
||
|
setSuccess( 0, QString::null );
|
||
|
}
|
||
|
setTransfer( 0 );
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void UserSearchTask::searchUserByUIN( const QString& uin )
|
||
|
{
|
||
|
//create a new result list
|
||
|
m_type = UINSearch;
|
||
|
|
||
|
FLAP f = { 0x02, 0, 0 };
|
||
|
SNAC s = { 0x0015, 0x0002, 0x0000, client()->snacSequence() };
|
||
|
|
||
|
setRequestType( 0x07D0 ); //meta-information request
|
||
|
setRequestSubType( 0x0569 ); //subtype: META_SEARCH_BY_UIN
|
||
|
setSequence( f.sequence );
|
||
|
Buffer* tlvdata = new Buffer();
|
||
|
tlvdata->addLEWord( 0x0136 ); //tlv of type 0x0136 with length 4. all little endian
|
||
|
tlvdata->addLEWord( 0x0004 );
|
||
|
tlvdata->addLEDWord( uin.toULong() );
|
||
|
Buffer* buf = addInitialData( tlvdata );
|
||
|
delete tlvdata;
|
||
|
|
||
|
Transfer* t = createTransfer( f, s, buf );
|
||
|
send( t );
|
||
|
}
|
||
|
|
||
|
void UserSearchTask::searchWhitePages( const ICQWPSearchInfo& info )
|
||
|
{
|
||
|
m_type = WhitepageSearch;
|
||
|
|
||
|
FLAP f = { 0x02, 0, 0 };
|
||
|
SNAC s = { 0x0015, 0x0002, 0x0000, client()->snacSequence() };
|
||
|
|
||
|
setRequestType( 0x07D0 );
|
||
|
setRequestSubType( 0x055F );
|
||
|
setSequence( f.sequence );
|
||
|
Buffer* tlvData = new Buffer();
|
||
|
/*
|
||
|
search.addLEWord(0x0533); // subtype: 1331
|
||
|
|
||
|
//LNTS FIRST
|
||
|
search.addLEWord(first.length());
|
||
|
if(first.length()>0)
|
||
|
search.addLEString(first.latin1(), first.length());
|
||
|
|
||
|
// LNTS LAST
|
||
|
search.addLEWord(last.length());
|
||
|
if(last.length()>0)
|
||
|
search.addLEString(last.latin1(), last.length());
|
||
|
|
||
|
// LNTS NICK
|
||
|
search.addLEWord(nick.length());
|
||
|
if(nick.length()>0)
|
||
|
search.addLEString(nick.latin1(), nick.length());
|
||
|
|
||
|
// LNTS EMAIL
|
||
|
search.addLEWord(mail.length());
|
||
|
if(mail.length()>0)
|
||
|
search.addLEString(mail.latin1(), mail.length());
|
||
|
|
||
|
// WORD.L MINAGE
|
||
|
search.addLEWord(minage);
|
||
|
|
||
|
// WORD.L MAXAGE
|
||
|
search.addLEWord(maxage);
|
||
|
|
||
|
// BYTE xx SEX 1=fem, 2=mal, 0=dontcare
|
||
|
if (sex==1)
|
||
|
search.addLEByte(0x01);
|
||
|
else if(sex==2)
|
||
|
search.addLEByte(0x02);
|
||
|
else
|
||
|
search.addLEByte(0x00);
|
||
|
|
||
|
// BYTE xx LANGUAGE
|
||
|
search.addLEByte(lang);
|
||
|
|
||
|
// LNTS CITY
|
||
|
search.addLEWord(city.length());
|
||
|
if(city.length()>0)
|
||
|
search.addLEString(city.latin1(), city.length());
|
||
|
|
||
|
// LNTS STATE
|
||
|
search.addLEWord(state.length());
|
||
|
if(state.length()>0)
|
||
|
search.addLEString(state.latin1(), state.length());
|
||
|
|
||
|
// WORD.L xx xx COUNTRY
|
||
|
search.addLEWord(country);
|
||
|
|
||
|
// LNTS COMPANY
|
||
|
search.addLEWord(company.length());
|
||
|
if(company.length()>0)
|
||
|
search.addLEString(company.latin1(), company.length());
|
||
|
|
||
|
// LNTS DEPARTMENT
|
||
|
search.addLEWord(department.length());
|
||
|
if(department.length()>0)
|
||
|
search.addLEString(department.latin1(), department.length());
|
||
|
|
||
|
// LNTS POSITION
|
||
|
search.addLEWord(position.length());
|
||
|
if(position.length()>0)
|
||
|
search.addLEString(position.latin1(), position.length());
|
||
|
|
||
|
// BYTE xx OCCUPATION
|
||
|
search.addLEByte(occupation);
|
||
|
|
||
|
//WORD.L xx xx PAST
|
||
|
search.addLEWord(0x0000);
|
||
|
|
||
|
//LNTS PASTDESC - The past description to search for.
|
||
|
search.addLEWord(0x0000);
|
||
|
|
||
|
// WORD.L xx xx INTERESTS - The interests category to search for.
|
||
|
search.addLEWord(0x0000);
|
||
|
|
||
|
// LNTS INTERDESC - The interests description to search for.
|
||
|
search.addLEWord(0x0000);
|
||
|
|
||
|
// WORD.L xx xx AFFILIATION - The affiliation to search for.
|
||
|
search.addLEWord(0x0000);
|
||
|
|
||
|
// LNTS AFFIDESC - The affiliation description to search for.
|
||
|
search.addLEWord(0x0000);
|
||
|
|
||
|
// WORD.L xx xx HOMEPAGE - The home page category to search for.
|
||
|
search.addLEWord(0x0000);
|
||
|
|
||
|
// LNTS HOMEDESC - The home page description to search for.
|
||
|
search.addLEWord(0x0000);
|
||
|
|
||
|
// BYTE xx ONLINE 1=online onliners, 0=dontcare
|
||
|
if(onlineOnly)
|
||
|
search.addLEByte(0x01);
|
||
|
else
|
||
|
search.addLEByte(0x00);
|
||
|
*/
|
||
|
if ( !info.firstName.isEmpty() )
|
||
|
{
|
||
|
Buffer bufFileName;
|
||
|
bufFileName.addLEWord( info.firstName.length() );
|
||
|
bufFileName.addLEString( info.firstName, info.firstName.length() );
|
||
|
tlvData->addLETLV( 0x0140, bufFileName.length(), bufFileName.buffer() );
|
||
|
}
|
||
|
|
||
|
if ( !info.lastName.isEmpty() )
|
||
|
{
|
||
|
Buffer bufLastName;
|
||
|
bufLastName.addLEWord( info.lastName.length() );
|
||
|
bufLastName.addLEString( info.lastName, info.lastName.length() );
|
||
|
tlvData->addLETLV( 0x014A, bufLastName.length(), bufLastName.buffer() );
|
||
|
}
|
||
|
|
||
|
if ( !info.nickName.isEmpty() )
|
||
|
{
|
||
|
Buffer bufNickName;
|
||
|
bufNickName.addLEWord( info.nickName.length() );
|
||
|
bufNickName.addLEString( info.nickName, info.nickName.length() );
|
||
|
tlvData->addLETLV( 0x0154, bufNickName.length(), bufNickName.buffer() );
|
||
|
}
|
||
|
|
||
|
if ( !info.email.isEmpty() )
|
||
|
{
|
||
|
Buffer bufEmail;
|
||
|
bufEmail.addLEWord( info.email.length() );
|
||
|
bufEmail.addLEString( info.email, info.email.length() );
|
||
|
tlvData->addLETLV( 0x015E, bufEmail.length(), bufEmail.buffer() );
|
||
|
}
|
||
|
|
||
|
if ( info.age > 0 )
|
||
|
{
|
||
|
Buffer bufAge;
|
||
|
bufAge.addWord( info.age );
|
||
|
bufAge.addWord( info.age );
|
||
|
tlvData->addLETLV( 0x0168, bufAge.length(), bufAge.buffer() );
|
||
|
}
|
||
|
|
||
|
if ( info.gender > 0 )
|
||
|
tlvData->addLETLV8( 0x017C, info.gender );
|
||
|
|
||
|
if ( info.language > 0 )
|
||
|
tlvData->addLETLV16( 0x0186, info.language );
|
||
|
|
||
|
if ( info.country > 0 )
|
||
|
tlvData->addLETLV16( 0x01A4, info.country );
|
||
|
|
||
|
if ( !info.city.isEmpty() )
|
||
|
{
|
||
|
Buffer bufCity;
|
||
|
bufCity.addLEWord( info.city.length() );
|
||
|
bufCity.addLEString( info.city, info.city.length() );
|
||
|
tlvData->addLETLV( 0x0190, bufCity.length(), bufCity.buffer() );
|
||
|
}
|
||
|
|
||
|
if ( info.occupation > 0 )
|
||
|
tlvData->addLETLV16( 0x01CC, info.occupation );
|
||
|
|
||
|
if ( info.onlineOnly )
|
||
|
tlvData->addLETLV8( 0x0230, 0x01 );
|
||
|
|
||
|
Buffer* buf = addInitialData( tlvData );
|
||
|
delete tlvData; //we're done with it
|
||
|
|
||
|
Transfer* t = createTransfer( f, s, buf );
|
||
|
send( t );
|
||
|
}
|
||
|
|
||
|
|
||
|
#include "usersearchtask.moc"
|
||
|
|
||
|
//kate: indent-mode csands; tab-width 4; space-indent off; replace-tabs off;
|