tsk_size_t tnet_transport_send(const tnet_transport_handle_t *handle, tnet_fd_t from, const void* buf, tsk_size_t size)
{
    tnet_transport_t *transport = (tnet_transport_t*)handle;
    int numberOfBytesSent = 0;

    if(!transport) {
        TSK_DEBUG_ERROR("Invalid transport handle.");
        goto bail;
    }

    if(transport->tls.enabled) {
        const transport_socket_xt* socket = getSocket(transport->context, from);
        if(socket && socket->tlshandle) {
            if(!tnet_tls_socket_send(socket->tlshandle, buf, size)) {
                numberOfBytesSent = size;
            }
            else {
                numberOfBytesSent = 0;
            }
            goto bail;
        }
    }
    else if((numberOfBytesSent = tnet_sockfd_send(from, buf, size, 0)) <= 0) {
        TNET_PRINT_LAST_ERROR("send have failed.");

        //tnet_sockfd_close(&from);
        goto bail;
    }

bail:
    transport->bytes_out += numberOfBytesSent;
    return numberOfBytesSent;
}
Exemple #2
0
/**@ingroup tnet_socket_group
* Returns the number of bytes sent (or negative value on error)
*/
int tnet_socket_send_stream(tnet_socket_t* self, const void* data, tsk_size_t size)
{
	if (!self || self->fd == TNET_INVALID_FD || !data || !size || !TNET_SOCKET_TYPE_IS_STREAM(self->type)) {
		TSK_DEBUG_ERROR("Invalid parameter");
		return -1;
	}
	if (self->tlshandle && (TNET_SOCKET_TYPE_IS_TLS(self->type) || TNET_SOCKET_TYPE_IS_WSS(self->type))) {
		return tnet_tls_socket_send(self->tlshandle, data, size) == 0 ? (int)size : -1; // returns zero on success
	}

	return (int)tnet_sockfd_send(self->fd, data, size, 0);
}
static void send_bodiless(tdav_session_msrp_t *msrp){
	tmsrp_request_t* BODILESS;
	if(msrp->config->To_Path && msrp->config->From_Path){
		if((BODILESS = tmsrp_create_bodiless(msrp->config->To_Path->uri, msrp->config->From_Path->uri))){
			char* str;
			if((str = tmsrp_message_tostring(BODILESS))){
				if(!tnet_sockfd_send(msrp->connectedFD, str, tsk_strlen(str), 0)){
					TSK_DEBUG_WARN("Failed to send bodiless request.");
				}
				TSK_FREE(str);
			}

			TSK_OBJECT_SAFE_FREE(BODILESS);
		}
	}
}
Exemple #4
0
int tmsrp_receiver_recv(tmsrp_receiver_t* self, const void* data, tsk_size_t size)
{
	tmsrp_message_t* message;

	if(!self || !data || !size){
		TSK_DEBUG_ERROR("Invalid parameter");
		return -1;
	}
	
	// put the data
	tmsrp_data_in_put(self->data_in, data, size);
	// get msrp messages
	while((message = tmsrp_data_in_get(self->data_in))){
		
		/* alert that we have received a message (Request or Response) */
		_tmsrp_receiver_alert_user(self, tsk_false, message);
		
		//
		//	REQUEST
		//
		if(TMSRP_MESSAGE_IS_REQUEST(message)){
			/* ============= SEND =============== */
			if(TMSRP_REQUEST_IS_SEND(message)){
				tmsrp_response_t* r2xx;
				tmsrp_request_t* REPORT;				

				// send 200 OK
				if((r2xx = tmsrp_create_response(message, 200, "OK"))){
					if(tmsrp_message_serialize(r2xx, self->buffer) == 0 && self->buffer->data){
						tnet_sockfd_send(self->fd, self->buffer->data, self->buffer->size, 0);
					}
					
					tsk_buffer_cleanup(self->buffer);
					TSK_OBJECT_SAFE_FREE(r2xx);
				}
				// send REPORT
				if(tmsrp_isReportRequired(message, tsk_false)){
					if((REPORT = tmsrp_create_report(message, 200, "OK"))){
						if(tmsrp_message_serialize(REPORT, self->buffer) == 0 && self->buffer->data){
							tnet_sockfd_send(self->fd, self->buffer->data, self->buffer->size, 0);
						}
						tsk_buffer_cleanup(self->buffer);
						TSK_OBJECT_SAFE_FREE(REPORT);
					}
				}
			}
			/* ============= REPORT =============== */
			if(TMSRP_REQUEST_IS_REPORT(message)){
				tmsrp_response_t* r2xx;

				// send 200 OK
				if((r2xx = tmsrp_create_response(message, 200, "Report received"))){
					if(tmsrp_message_serialize(r2xx, self->buffer) == 0 && self->buffer->data){
						tnet_sockfd_send(self->fd, self->buffer->data, self->buffer->size, 0);
					}
					
					tsk_buffer_cleanup(self->buffer);
					TSK_OBJECT_SAFE_FREE(r2xx);
				}
			}

			/* ============= AUTH =============== */
			/* ============= METHOD =============== */
		}
		//
		//	RESPONSE
		//
		else{
			//short code = TMSRP_RESPONSE_CODE(message);
			//TSK_DEBUG_INFO("code=%u, tid=%s, phrase=%s", code, message->tid, TMSRP_RESPONSE_PHRASE(message));
		}		
		

		// alert user layer

		TSK_OBJECT_SAFE_FREE(message);
	}

	return 0;
}