int session_event_status(Session *s,int status,uin_t uin,char *desc, int more,uint32_t ip,uint16_t port,uint32_t version){ int oldstat; int available; char *ujid; char *show; Contact *c; c=user_get_contact(s->user,uin,FALSE); if (c==NULL) { /* debug(L_("%s got notification from unknown contact %i. Converting to subscription request."),s->user->jid,uin); ujid=jid_build(uin); presence_send_subscribe(s->s,ujid,s->user->jid); g_free(ujid); */ debug(L_("%s got notification from unknown contact %i."),s->user->jid,uin); return 0; } if (!c->got_probe && c->subscribe!=SUB_TO && c->subscribe!=SUB_BOTH) { debug(L_("%s got notification from contact %i, whose presence was not requested. Ignoring."),s->user->jid,uin); return 0; } available=status_gg_to_jabber(status,&show,&desc); oldstat=user_get_contact_status(s->user,uin); user_set_contact_status(s->user,status,uin,desc,more,ip,port,version); if (!available && oldstat==-1) ujid=jid_build(uin); else ujid=jid_build_full(uin); presence_send(s->s,ujid,s->user->jid,available,show,desc,0); g_free(ujid); return 0; }
Session *session_get_by_jid(const char *jid,Stream *stream,int delay_login){ Session *s; User *u; char *njid; GList *it; g_assert(sessions_jid!=NULL); debug(L_("Looking up session for '%s'"),jid); njid=jid_normalized(jid,0); if (njid==NULL){ g_message(L_("Bad JID: '%s'"),jid); return NULL; } debug(L_("Using '%s' as key"),njid); s=(Session *)g_hash_table_lookup(sessions_jid,(gpointer)njid); g_free(njid); if (s) return s; debug(L_("Session not found")); if (!stream) return NULL; u=user_get_by_jid(jid); if (!u) return NULL; debug(L_("User loaded, processing his subscriptions.")); for(it=g_list_first(u->contacts);it;it=g_list_next(it)){ Contact *c; char *c_jid; c=(Contact *)it->data; if (c->subscribe == SUB_UNDEFINED) { c_jid=jid_build(c->uin); presence_send_subscribe(stream,c_jid,u->jid); g_free(c_jid); } else if (c->subscribe == SUB_FROM || c->subscribe == SUB_BOTH){ c_jid=jid_build(c->uin); presence_send_probe(stream,c_jid,u->jid); g_free(c_jid); } } debug(L_("Creating new session")); return session_create(u,jid,NULL,NULL,stream,delay_login); }
void get_roster_done(Session *s,struct gg_event *e){ char **results; char *body=NULL; char *jid; xmlnode roster; xmlnode msg; xmlnode n; int i; if(!e->event.userlist.reply){ message_send(s->s,NULL,s->user->jid,1,_("Roster empty."),0); return; } message_send(s->s,NULL,s->user->jid,0,_("Roster received."),0); msg=xmlnode_new_tag("message"); jid=jid_my_registered(); xmlnode_put_attrib(msg,"from",jid); g_free(jid); xmlnode_put_attrib(msg,"to",s->user->jid); n=xmlnode_insert_tag(msg,"body"); roster=xmlnode_insert_tag(msg,"x"); xmlnode_put_attrib(roster,"xmlns","jabber:x:roster"); body=g_strdup(""); results=g_strsplit(e->event.userlist.reply,"\r\n",0); for(i=0;results[i];i++){ char **cinfo; char *t,*jid; char *name=NULL; int j,uin; xmlnode item,tag; cinfo=g_strsplit(results[i],";",0); for(j=0;cinfo[j];j++); if (j<7){ g_strfreev(cinfo); continue; } uin=atoi(cinfo[6]); item=xmlnode_insert_tag(roster,"item"); t=g_strconcat(body,"\n",NULL); g_free(body); body=t; t=g_strdup_printf("%sUin: %u\n",body,uin); g_free(body); body=t; if (cinfo[2] && cinfo[2][0]){ t=g_strdup_printf("%sNick: %s\n",body,cinfo[2]); g_free(body); body=t; if (name==NULL) name=g_strdup(cinfo[2]); } if (cinfo[0] && cinfo[0][0]){ t=g_strdup_printf("%sFirst name: %s\n",body,cinfo[0]); g_free(body); body=t; if (name==NULL) name=g_strdup(cinfo[0]); } if (cinfo[1] && cinfo[1][0]){ t=g_strdup_printf("%sLast name: %s\n",body,cinfo[1]); g_free(body); body=t; if (name==NULL) name=g_strdup(cinfo[1]); } if (cinfo[3] && cinfo[3][0]){ t=g_strdup_printf("%sDisplay: %s\n",body,cinfo[3]); g_free(body); body=t; if (name) g_free(name); name=g_strdup(cinfo[3]); } if (cinfo[4] && cinfo[4][0]){ t=g_strdup_printf("%sPhone: %s\n",body,cinfo[4]); g_free(body); body=t; } if (cinfo[5] && cinfo[5][0]){ t=g_strdup_printf("%sGroup: %s\n",body,cinfo[5]); g_free(body); body=t; tag=xmlnode_insert_tag(item,"group"); xmlnode_insert_cdata(n,string_from_gg(cinfo[5]),-1); } if (cinfo[7] && cinfo[7][0]){ t=g_strdup_printf("%sE-mail: %s\n",body,cinfo[7]); g_free(body); body=t; } jid=jid_build(uin); xmlnode_put_attrib(item,"jid",jid); g_free(jid); if (name==NULL) name=g_strdup_printf("%u",uin); xmlnode_put_attrib(item,"name",string_from_gg(name)); g_free(name); g_strfreev(cinfo); } g_strfreev(results); xmlnode_insert_cdata(n,string_from_gg(body),-1); stream_write(s->s,msg); xmlnode_free(msg); }
int presence_probe(struct stream_s *stream,const char *from,const char *to){ Session *s; User *u; Contact *c; uin_t uin; int status; int available; char *show,*stat,*jid; GList *it; GTime timestamp; s=session_get_by_jid(from,NULL,0); if (jid_is_me(to)){ if (s){ if (!s->connected){ presence_send(stream,to,from,0,NULL,"Disconnected",0); } else{ Resource *r=session_get_cur_resource(s); if (r) presence_send(stream,NULL,s->user->jid,s->user->invisible?-1:r->available, r->show,r->status,0); } return 0; } else if (user_get_by_jid(from)) { presence_send(stream, to, from, 0, NULL, "Not logged in", 0); } else { presence_send_unsubscribed(stream, NULL, from); } return 0; } if (!jid_is_my(to)){ presence_send_unsubscribed(stream,to,from); return -1; } if (s) u=s->user; else u=user_get_by_jid(from); if (!u){ presence_send_unsubscribed(stream,to,from); return -1; } uin=jid_get_uin(to); /* create the contact: if we got 'prope' the user has it on his * contact list, do not change that */ c = user_get_contact(u, uin, TRUE); if (!c) { return -1; } c->got_probe=TRUE; if (s) session_update_contact(s,c); status=0; stat=NULL; timestamp=0; for(it=u->contacts;it;it=it->next){ Contact *c=(Contact *)it->data; if (c && c->uin==uin){ status=c->status; timestamp=c->last_update; stat=c->status_desc; } } if (!status){ // user not found on userlist? presence_send_unsubscribed(stream,to,from); return -1; } if (status==-1) return 0; /* Not known yet */ available=status_gg_to_jabber(status,&show,&stat); if (available) jid=jid_build_full(uin); else jid=jid_build(uin); presence_send(stream,jid,u->jid,available,show,stat,timestamp); g_free(jid); return 0; }