Chat-O-Matic/protocols/yahoo/YahooConnection.cpp

293 lines
6.0 KiB
C++

/*
* This is a plugin ported from im_kit to Caya,
* the code was updated to support libyahoo2.
*
* Copyright (C) 2010-2011, Barrett
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include "YahooConnection.h"
#include <stdio.h>
#include <algorithm>
#include "CayaConstants.h"
#include <yahoo2.h>
#include "yahoo_util.h"
std::map<int, YahooConnection*> gYahooConnections;
YahooConnection::YahooConnection(YahooManager* mgr, const char* yahooID, const char* pass)
:
fManager(mgr),
fID(-1),
fYahooID(strdup(yahooID)),
fPassword(strdup(pass)),
fStatus(YAHOO_STATUS_OFFLINE),
fAlive(true),
fGotBuddyList(false)
{
fThread = spawn_thread(
yahoo_io_thread,
"Yahoo IO",
B_NORMAL_PRIORITY,
this
);
resume_thread( fThread );
}
YahooConnection::~YahooConnection()
{
LogOff();
fAlive = false;
int32 thread_res=0;
wait_for_thread(fThread, &thread_res);
free(fYahooID);
free(fPassword);
}
void
YahooConnection::SetAway(enum yahoo_status state, const char *msg)
{
if (fStatus == YAHOO_STATUS_OFFLINE) {
// fManager->Error("Calling SetAway() when offline", NULL);
return;
}
yahoo_set_away(fID, state, msg, 1);
//fManager->SetAway(state, msg);
}
void
YahooConnection::LogOff()
{
if (fID < 0)
return;
yahoo_logoff(fID);
fStatus = YAHOO_STATUS_OFFLINE;
fID = -1;
fManager->LoggedOut();
// owner should delete us now to stop the thread and clean up
}
void
YahooConnection::Message(const char* who, const char* msg)
{
if (fStatus == YAHOO_STATUS_OFFLINE) {
fManager->Error("Can't send message, not connected", who );
return;
}
yahoo_send_im(
fID,
NULL /* default identity */,
who,
msg,
1 /* it's utf-8 */,
0
);
fManager->MessageSent( who, msg );
}
void
YahooConnection::AddBuddy(const char* who)
{
if (!fGotBuddyList) {
fBuddiesToAdd.push_back( who );
return;
}
std::list<std::string>::iterator iter = find( fBuddies.begin(), fBuddies.end(), who );
if (iter == fBuddies.end()) { // not in list, adding
yahoo_add_buddy(fID, who, "Communicator", "");
fBuddies.push_back(who);
printf("Yahoo: Added buddy\n");
}
}
void
YahooConnection::RemoveBuddy( const char* who )
{
if (fStatus == YAHOO_STATUS_OFFLINE) {
fManager->Error("Not connected when calling YahooConnection::RemoveBuddy()", NULL);
return;
}
yahoo_remove_buddy( fID, who, "" );
}
void
YahooConnection::Typing(const char* who, int stat )
{
yahoo_send_typing(fID,NULL,who,stat);
}
void
YahooConnection::GetBuddyIcon(const char* who)
{
yahoo_buddyicon_request(fID, who);
}
void
YahooConnection::cbStatusChanged(const char* who, int stat, const char* msg, int away, int idle)
{
fManager->BuddyStatusChanged(who, stat, msg, away, idle);
}
void
YahooConnection::cbGotBuddies(YList* buds)
{
fGotBuddyList = true;
std::list<struct yahoo_buddy> yabs;
// copy from buds to buddies...
for(; buds; buds = buds->next) {
struct yahoo_buddy* bud = (struct yahoo_buddy* )buds->data;
if (bud->real_name)
yabs.push_back( *bud );
fBuddies.push_back( bud->id );
//yahoo_buddyicon_request(fID, bud->id);
}
printf("id %d\n", fID);
// add waiting buddies
for ( std::list<std::string>::iterator iter=fBuddiesToAdd.begin();
iter != fBuddiesToAdd.end(); iter++) {
AddBuddy( (*iter).c_str() );
}
fBuddiesToAdd.clear();
// Tell the manager!
fManager->GotBuddyList( fBuddies );
fManager->GotContactsInfo( yabs );
}
void
YahooConnection::cbGotIM(const char* who, const char* msg, long /*tm*/, int /*stat*/, int /*utf8*/)
{
//parse_html(msg);
fManager->GotMessage( who, msg );
}
void
YahooConnection::cbTypeNotify(const char* who, int stat)
{
fManager->TypeNotify( who, stat );
}
void
YahooConnection::cbGotBuddyIcon(const char* who, long size, const char* icon)
{
fManager->GotBuddyIcon(who,size,icon);
}
void
YahooConnection::cbLoginResponse(int succ, const char* url)
{
printf("YahooConnection::cbLoginResponse %s\n", url);
if(succ == YAHOO_LOGIN_OK) {
fStatus = yahoo_current_status(fID);
fManager->LoggedIn();
return;
} else if(succ == YAHOO_LOGIN_UNAME) {
fManager->Error("Could not log into Yahoo service - username not recognised. Please verify that your username is correctly typed.", NULL);
} else if(succ == YAHOO_LOGIN_PASSWD) {
fManager->Error("Could not log into Yahoo service - password incorrect. Please verify that your password is correctly typed.", NULL);
} else if(succ == YAHOO_LOGIN_LOCK) {
fManager->Error("Could not log into Yahoo service. Your account has been locked.\nVisit [url] to reactivate it.\n", NULL);
} else if(succ == YAHOO_LOGIN_DUPL) {
fManager->Error("You have been logged out of the yahoo service, possibly due to a duplicate login.", NULL);
} else if(succ == YAHOO_LOGIN_SOCK) {
fManager->Error("The server closed the socket.", NULL);
} else {
fManager->Error("Could not log in, unknown reason.", NULL);
}
fStatus = YAHOO_STATUS_OFFLINE;
LogOff();
}
void
YahooConnection::cbYahooError( const char* err, int fatal)
{
fManager->Error( err, NULL );
if (fatal) {
LogOff();
}
}
void
YahooConnection::AddConnection( conn_handler* c )
{
fConnections.AddItem(c);
}
void
YahooConnection::RemoveConnection( conn_handler* c )
{
fConnections.RemoveItem(c);
}
conn_handler*
YahooConnection::ConnectionAt( int i )
{
return (conn_handler*)fConnections.ItemAt(i);
}
int
YahooConnection::CountConnections()
{
return fConnections.CountItems();
}
bool
YahooConnection::IsAlive()
{
return fAlive;
}