int tsip_publish_event_signal(tsip_publish_event_type_t type, tsip_ssession_handle_t* ss, short status_code, const char *phrase, const tsip_message_t* sipmessage) { tsip_publish_event_t* sipevent = TSIP_PUBLISH_EVENT_CREATE(type); tsip_event_init(TSIP_EVENT(sipevent), ss, status_code, phrase, sipmessage, tsip_event_publish); TSK_RUNNABLE_ENQUEUE_OBJECT(TSK_RUNNABLE(TSIP_SSESSION(ss)->stack), sipevent); return 0; }
void __CFSocketCallBack(CFSocketRef s, CFSocketCallBackType callbackType, CFDataRef address, const void *data, void *info) { // Extract the context tnet_transport_t *transport = (tnet_transport_t *) info; transport_context_t *context = transport->context; // Extract the native socket int fd = CFSocketGetNative(s); transport_socket_t *sock = (transport_socket_t *) getSocket(context, fd); /* lock context */ tsk_safeobj_lock(context); switch (callbackType) { case kCFSocketReadCallBack: { int ret; tsk_size_t len = 0; void* buffer = 0; tnet_transport_event_t* e; if (tnet_ioctlt(sock->fd, FIONREAD, &len) < 0) { TNET_PRINT_LAST_ERROR("IOCTLT FAILED."); break; } if (!len) { TSK_DEBUG_WARN("IOCTLT returned zero."); TSK_RUNNABLE_ENQUEUE(transport, event_closed, transport->callback_data, sock->fd); removeSocket(sock, context); break; } if (!(buffer = tsk_calloc(len, sizeof(uint8_t)))) { TSK_DEBUG_ERROR("TSK_CALLOC FAILED."); break; } if ((ret = tnet_sockfd_recv(sock->fd, buffer, len, 0)) < 0) { TSK_FREE(buffer); removeSocket(sock, context); TNET_PRINT_LAST_ERROR("recv have failed."); break; } else if ((len != (tsk_size_t)ret) && len) { // useless test ? len = (tsk_size_t)ret; // buffer = tsk_realloc(buffer, len); } TSK_DEBUG_INFO("__CFSocketCallBack -> %u bytes read", len); e = tnet_transport_event_create(event_data, transport->callback_data, sock->fd); e->data = buffer; e->size = len; TSK_RUNNABLE_ENQUEUE_OBJECT(TSK_RUNNABLE(transport), e); break; } case kCFSocketAcceptCallBack: case kCFSocketConnectCallBack: case kCFSocketDataCallBack: case kCFSocketWriteCallBack: default: { // Not Implemented assert(42 == 0); break; } } /* unlock context */ tsk_safeobj_unlock(context); }
void __CFReadStreamClientCallBack(CFReadStreamRef stream, CFStreamEventType eventType, void *clientCallBackInfo) { // Extract the context tnet_transport_t *transport = (tnet_transport_t *) clientCallBackInfo; transport_context_t *context = transport->context; /* lock context */ tsk_safeobj_lock(context); // Extract the native socket CFDataRef data = CFReadStreamCopyProperty(stream, kCFStreamPropertySocketNativeHandle); CFSocketNativeHandle fd; CFDataGetBytes(data, CFRangeMake(0, sizeof(CFSocketNativeHandle)), (UInt8*) &fd); CFRelease(data); transport_socket_t *sock = (transport_socket_t *) getSocket(context, fd); switch(eventType) { case kCFStreamEventOpenCompleted: { TSK_DEBUG_INFO("__CFReadStreamClientCallBack --> kCFStreamEventOpenCompleted"); break; } case kCFStreamEventHasBytesAvailable: { tsk_size_t len = 0; void *buffer = 0; tnet_transport_event_t* e; // Allocate a standard buffer len = TNET_BUFFER_SIZE; if (!(buffer = tsk_calloc(len, sizeof(uint8_t)))) { TSK_DEBUG_ERROR("TSK_CALLOC FAILED."); break; } // Process to read data CFIndex index = CFReadStreamRead(stream, buffer, TNET_BUFFER_SIZE); len = index; TSK_DEBUG_INFO("__CFReadStreamClientCallBack --> %u bytes read", len); e = tnet_transport_event_create(event_data, transport->callback_data, sock->fd); e->data = buffer; e->size = len; TSK_RUNNABLE_ENQUEUE_OBJECT(TSK_RUNNABLE(transport), e); break; } case kCFStreamEventEndEncountered: case kCFStreamEventErrorOccurred: { // Get the error code CFErrorRef error = CFReadStreamCopyError(stream); CFIndex index = CFErrorGetCode(error); CFRelease(error); TSK_DEBUG_INFO("__CFReadStreamClientCallBack --> Error %lu", index); TSK_RUNNABLE_ENQUEUE(transport, event_error, transport->callback_data, sock->fd); removeSocket(sock, context); break; } default: { // Not Implemented assert(42 == 0); break; } } /* unlock context */ tsk_safeobj_unlock(context); }