int uTaskMessageSendIsr( IN uTask_T *pTask, IN int Id, IN void *pData ) { /* The task and handler must be valid */ if (pTask && pTask->Handler) { if (!QUEUE_FULL(gCore.IsrQ)) { Tcb_T Tcb; Tcb.Flags = TCB_FLAGS_ISR; Tcb.pTask = pTask; Tcb.Id = Id; Tcb.pMsg = pData; Tcb.Expire = uTaskGetTick(); QUEUE_PUT(gCore.IsrQ, Tcb); return UTASK_S_OK; } } return UTASK_E_FAIL; }
/** Got a subscription request from Jabber */ void it_s10n(session s, jpacket jp) { UIN_t uin; contact c; if (jp->to->user == NULL) { /* ignore s10n to the transport */ xmlnode_free(jp->x); return; } uin = it_jid2uin(jp->to); if (uin == 0 || uin == s->uin) { jutil_error(jp->x,TERROR_BAD); it_deliver(s->ti,jp->x); return; } if (s->connected == 0) { queue_elem queue; /* add to circle queue */ queue = pmalloco(jp->p,sizeof(_queue_elem)); queue->elem = (void *)jp; /* next = NULL */ QUEUE_PUT(s->queue,s->queue_last,queue); return; } /* we're connected, go on */ log_debug(ZONE,"presence packet uin = %d",uin); /* check for SMS_CONTACT */ if (j_strcmp(jp->to->server,s->ti->sms_id)==0) { uin = SMS_CONTACT; } if (uin == SMS_CONTACT) c = it_sms_get(s,jp->to->user); else c = it_contact_get(s,uin); switch (jpacket_subtype(jp)) { case JPACKET__SUBSCRIBE: if (c == NULL) { /* if sms contact */ if (uin == SMS_CONTACT) { /* if not our sms id */ if (j_strcmp(jp->to->server,s->ti->sms_id)) { log_debug(ZONE,"not our sms %s",jp->to->server); xmlnode_free(jp->x); break; } c = it_sms_add(s,jp->to->user); log_debug(ZONE,"sms add"); } else c = it_contact_add(s,uin); } log_debug(ZONE,"subscribe"); it_contact_subscribe(c,NULL); xmlnode_free(jp->x); break; case JPACKET__SUBSCRIBED: /* after asking */ if (c) { it_contact_subscribed(c,jp); log_debug(ZONE,"subscribed"); } xmlnode_free(jp->x); break; case JPACKET__UNSUBSCRIBE: if (c) { /* will remove user from icq contacts inform main jabber roster unsubscribed */ it_contact_unsubscribe(c); log_debug(ZONE,"unsubscribe"); } xmlnode_free(jp->x); break; case JPACKET__UNSUBSCRIBED: /* when icq ask for subscribe we have that contacts in our roster remove contact if exist */ if (c) { it_contact_unsubscribed(c,jp); log_debug(ZONE,"unsubscribed"); } xmlnode_free(jp->x); break; default: xmlnode_free(jp->x); break; } }