http://bugs-archive.miranda-im.org/view.php?id=886
http://trac.adium.im/ticket/12311
http://developer.pidgin.im/ticket/9512
http://kraken.blathersource.org/node/155
Code:
procedure TfrmYMSG.GetYMToken;
var
http:THTTPSend;
begin
http := THTTPSend.Create;
try
if (http.HTTPMethod(
'GET','https://login.yahoo.com/config/pwtoken_get?src=ymsgr&ts=&login='+
YID+'&passwd='+YPWD+'&chal='+YSeed)
and (http.ResultCode=200)) then
ProcessYMToken(http.Document)
else
AuthError('GetYMToken failed!');
finally
http.Free;
end;
end;
Code:
procedure TYMSG.DoProcessNotify(ADataPacket: TYMsgPacket);
var
i,k:integer;
v,aFrom,aTo,aMsg,aInd:string;
stat: Boolean;
begin
with ADataPacket do begin
for i:=0 to DataCount-1 do begin
k := Datas[i].Key;
v := Datas[i].Value;
case k of
4: aFrom := v;
5: aTo := v;
49: aMsg := v;
13: stat := StrToBoolDef(v,True);
14: aInd := v; // TODO
16: ; // TODO
end;
end;
end;
// recheck
if (aMsg='') then Exit;
if Pos('TYPING',aMsg)>0 then begin
if Assigned(OnBuddyTyping) then
FOnTyping(Self, aFrom, stat);
end;// else GAME, WEBCAMINVITE
end;
var
i,k:integer;
v,aFrom,aTo,aMsg,aInd:string;
stat: Boolean;
begin
with ADataPacket do begin
for i:=0 to DataCount-1 do begin
k := Datas[i].Key;
v := Datas[i].Value;
case k of
4: aFrom := v;
5: aTo := v;
49: aMsg := v;
13: stat := StrToBoolDef(v,True);
14: aInd := v; // TODO
16: ; // TODO
end;
end;
end;
// recheck
if (aMsg='') then Exit;
if Pos('TYPING',aMsg)>0 then begin
if Assigned(OnBuddyTyping) then
FOnTyping(Self, aFrom, stat);
end;// else GAME, WEBCAMINVITE
end;
potongan kode dari libyahoo2.c
OnTerimaMessage:
Code:
static void yahoo_process_message(struct yahoo_input_data *yid, struct yahoo_packet *pkt)
{
struct yahoo_data *yd = yid->yd;
YList *l;
YList * messages = NULL;
struct m {
int i_31;
int i_32;
char *to;
char *from;
long tm;
char *msg;
int utf8;
int buddy_icon;
int protocol;
char *seqn;
int sendn;
} *message = y_new0(struct m, 1);
message->buddy_icon = -1; // no info
for (l = pkt->hash; l; l = l->next) {
struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
/* so it seems that key == 1 is not used when receiving messages and causes
problems for mobile IMs? This has been reported in the forum and this patch
was provided by Bryan Aldrich */
switch (pair->key) {
/*case 1: */
case 4:
if(!message->from)
message->from = pair->value;
break;
case 5:
message->to = pair->value;
break;
case 15:
message->tm = strtol(pair->value, NULL, 10);
break;
case 206:
message->buddy_icon = atoi(pair->value);
break;
case 97:
message->utf8 = atoi(pair->value);
break;
/* user message */ /* sys message */
case 14:
case 16:
message->msg = pair->value;
break;
case 31:
if(message->i_31) {
messages = y_list_append(messages, message);
message = y_new0(struct m, 1);
}
message->i_31 = atoi(pair->value);
break;
case 32:
message->i_32 = atoi(pair->value);
break;
case 241:
message->protocol = strtol(pair->value, NULL, 10);
break;
case 429: /* message sequence # */
message->seqn = pair->value;
break;
case 450: /* attempt # */
message->sendn = atoi(pair->value);
break;
/*default:
LOG(("yahoo_process_message: status: %d, key: %d, value: %s",
pkt->status, pair->key, pair->value));
*/
}
}
messages = y_list_append(messages, message);
for (l = messages; l; l=l->next) {
message = (struct m*) l->data;
if (pkt->service == YAHOO_SERVICE_SYSMESSAGE) {
YAHOO_CALLBACK(ext_yahoo_system_message)(yd->client_id, message->to,
message->from, message->msg);
} else if (pkt->status <= 2 || pkt->status == 5) {
YAHOO_CALLBACK(ext_yahoo_got_im)(yd->client_id, message->to, message->from,
message->protocol, message->msg, message->tm,
pkt->status, message->utf8, message->buddy_icon,
message->seqn, message->sendn);
} else if (pkt->status == YPACKET_STATUS_DISCONNECTED) {
YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, message->msg, 0, E_SYSTEM);
}
free(message);
}
y_list_free(messages);
}
{
struct yahoo_data *yd = yid->yd;
YList *l;
YList * messages = NULL;
struct m {
int i_31;
int i_32;
char *to;
char *from;
long tm;
char *msg;
int utf8;
int buddy_icon;
int protocol;
char *seqn;
int sendn;
} *message = y_new0(struct m, 1);
message->buddy_icon = -1; // no info
for (l = pkt->hash; l; l = l->next) {
struct yahoo_pair *pair = (struct yahoo_pair *) l->data;
/* so it seems that key == 1 is not used when receiving messages and causes
problems for mobile IMs? This has been reported in the forum and this patch
was provided by Bryan Aldrich */
switch (pair->key) {
/*case 1: */
case 4:
if(!message->from)
message->from = pair->value;
break;
case 5:
message->to = pair->value;
break;
case 15:
message->tm = strtol(pair->value, NULL, 10);
break;
case 206:
message->buddy_icon = atoi(pair->value);
break;
case 97:
message->utf8 = atoi(pair->value);
break;
/* user message */ /* sys message */
case 14:
case 16:
message->msg = pair->value;
break;
case 31:
if(message->i_31) {
messages = y_list_append(messages, message);
message = y_new0(struct m, 1);
}
message->i_31 = atoi(pair->value);
break;
case 32:
message->i_32 = atoi(pair->value);
break;
case 241:
message->protocol = strtol(pair->value, NULL, 10);
break;
case 429: /* message sequence # */
message->seqn = pair->value;
break;
case 450: /* attempt # */
message->sendn = atoi(pair->value);
break;
/*default:
LOG(("yahoo_process_message: status: %d, key: %d, value: %s",
pkt->status, pair->key, pair->value));
*/
}
}
messages = y_list_append(messages, message);
for (l = messages; l; l=l->next) {
message = (struct m*) l->data;
if (pkt->service == YAHOO_SERVICE_SYSMESSAGE) {
YAHOO_CALLBACK(ext_yahoo_system_message)(yd->client_id, message->to,
message->from, message->msg);
} else if (pkt->status <= 2 || pkt->status == 5) {
YAHOO_CALLBACK(ext_yahoo_got_im)(yd->client_id, message->to, message->from,
message->protocol, message->msg, message->tm,
pkt->status, message->utf8, message->buddy_icon,
message->seqn, message->sendn);
} else if (pkt->status == YPACKET_STATUS_DISCONNECTED) {
YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, message->msg, 0, E_SYSTEM);
}
free(message);
}
y_list_free(messages);
}
acknowledgment yang harus dikirim ke yahoo server:
Code:
void yahoo_send_im_ack(int id, const char *me, const char *buddy, const char *seqn, int sendn) {
struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER);
struct yahoo_data *yd;
struct yahoo_packet *pkt = NULL;
DEBUG_MSG(("[yahoo_send_im_ack] My Id: %s, Buddy: %s, Seq #: %s, Retry: %d", me, buddy, seqn, sendn));
if(!yid) {
DEBUG_MSG(("NO Yahoo Input Data???"));
return;
}
yd = yid->yd;
pkt = yahoo_packet_new(YAHOO_SERVICE_Y9_MESSAGE_ACK, YPACKET_STATUS_DEFAULT, yd->session_id);
yahoo_packet_hash(pkt, 1, (me != NULL) ? me : yd->user);
yahoo_packet_hash(pkt, 5, buddy);
yahoo_packet_hash(pkt, 302, "430");
yahoo_packet_hash(pkt, 430, seqn);
yahoo_packet_hash(pkt, 303, "430");
yahoo_packet_hash_int(pkt, 450, sendn);
//yahoo_packet_hash_int(pkt, 24, yd->session_timestamp);
yahoo_send_packet(yid, pkt, 0);
yahoo_packet_free(pkt);
}
Tidak ada komentar:
Posting Komentar