Beispiel #1
0
static DBusMessage *get_properties(DBusConnection *conn, DBusMessage *msg,
					void *data)
{
	struct media_transport *transport = data;
	DBusMessage *reply;
	DBusMessageIter iter;

	reply = dbus_message_new_method_return(msg);
	if (!reply)
		return NULL;

	dbus_message_iter_init_append(reply, &iter);

	transport_get_properties(transport, &iter);

	return reply;
}
Beispiel #2
0
/*
	Send queue to socket
*/
int send_raws(subuser *user, acetables *g_ape)
{
	int finish = 1, state = 0;
	struct _raw_pool *pool;
	struct _transport_properties *properties;

	if (user->raw_pools.nraw == 0) {
		return 1;
	}

	PACK_TCP(user->client->fd); /* Activate TCP_CORK */
	
	properties = transport_get_properties(user->user->transport, g_ape);
	
	if (!user->headers.sent) {
		user->headers.sent = 1;
		
		switch(user->user->transport) {
			case TRANSPORT_XHRSTREAMING:
				finish &= http_send_headers(user->headers.content, HEADER_XHR, HEADER_XHR_LEN, user->client, g_ape);
				break;
			case TRANSPORT_SSE_LONGPOLLING:
				finish &= http_send_headers(user->headers.content, HEADER_SSE, HEADER_SSE_LEN, user->client, g_ape);
				break;
			case TRANSPORT_WEBSOCKET:
			case TRANSPORT_WEBSOCKET_IETF:
				break;
			default:
				finish &= http_send_headers(user->headers.content, HEADER_DEFAULT, HEADER_DEFAULT_LEN, user->client, g_ape);
				break;
		}
		
	}
	
	if (properties != NULL && properties->padding.left.val != NULL) {
		finish &= sendbin(user->client->fd, properties->padding.left.val, properties->padding.left.len, 0, g_ape);
	}

	if (user->raw_pools.high.nraw) {
		pool = user->raw_pools.high.rawfoot->prev;
	} else {
		pool = user->raw_pools.low.rawhead;
		state = 1;
	}
	
	if (user->user->transport == TRANSPORT_WEBSOCKET_IETF) {
	    char payload_head[32] = { 0x84 };
	    int payload_size = raws_size(user); /* TODO: fragmentation? */
	    int payload_length = 0;
	    
	    if (payload_size <= 125) {
	        payload_head[1] = (unsigned char)payload_size & 0x7F;
	        payload_length = 2;
	    } else if (payload_size <= 65535) {
	        unsigned short int s = htons(payload_size);
	        payload_head[1] = 126;
	        
	        memcpy(&payload_head[2], &s, 2);
	        
	        payload_length = 4;
	    } else if (payload_size <= 0xFFFFFFFF) {
	        unsigned int s = htonl(payload_size);
	        
	        payload_head[1] = 127;
	        payload_head[2] = 0;
	        payload_head[3] = 0;
	        payload_head[4] = 0;
	        payload_head[5] = 0;
	        
            memcpy(&payload_head[6], &s, 4);

	        payload_length = 10;
	    }
        
        finish &= sendbin(user->client->fd, payload_head, payload_length, 0, g_ape);

	}
	finish &= sendbin(user->client->fd, "[", 1, 0, g_ape);
		
	while (pool->raw != NULL) {
		struct _raw_pool *pool_next = (state ? pool->next : pool->prev);

		finish &= sendbin(user->client->fd, pool->raw->data, pool->raw->len, 0, g_ape);

		if ((pool_next != NULL && pool_next->raw != NULL) || (!state && user->raw_pools.low.nraw)) {
			finish &= sendbin(user->client->fd, ",", 1, 0, g_ape);
		} else {
			finish &= sendbin(user->client->fd, "]", 1, 0, g_ape);
			
			if (properties != NULL && properties->padding.right.val != NULL) {
				finish &= sendbin(user->client->fd, properties->padding.right.val, properties->padding.right.len, 0, g_ape);
			}
		}
		
		free_raw(pool->raw);
		pool->raw = NULL;
		
		pool = pool_next;
		
		if ((pool == NULL || pool->raw == NULL) && !state) {
			pool = user->raw_pools.low.rawhead;
			state = 1;
		}
	}
	
	user->raw_pools.high.nraw = 0;
	user->raw_pools.low.nraw = 0;
	user->raw_pools.nraw = 0;
	
	user->raw_pools.high.rawfoot = user->raw_pools.high.rawhead;
	user->raw_pools.low.rawfoot = user->raw_pools.low.rawhead;
	
	FLUSH_TCP(user->client->fd);
	
	return finish;
}
Beispiel #3
0
int send_raw_inline(ape_socket *client, transport_t transport, RAW *raw, acetables *g_ape)
{
	struct _transport_properties *properties;
	int finish = 1;

	properties = transport_get_properties(transport, g_ape);

	switch(transport) {
		case TRANSPORT_XHRSTREAMING:
			finish &= http_send_headers(NULL, HEADER_XHR, HEADER_XHR_LEN, client, g_ape);
			break;
		case TRANSPORT_SSE_LONGPOLLING:
			finish &= http_send_headers(NULL, HEADER_SSE, HEADER_SSE_LEN, client, g_ape);
			break;
		case TRANSPORT_WEBSOCKET:
		case TRANSPORT_WEBSOCKET_IETF:
			break;
		default:
			finish &= http_send_headers(NULL, HEADER_DEFAULT, HEADER_DEFAULT_LEN, client, g_ape);
			break;
	}
	
	if (properties != NULL && properties->padding.left.val != NULL) {
		finish &= sendbin(client->fd, properties->padding.left.val, properties->padding.left.len, 0, g_ape);
	}	


	if (transport == TRANSPORT_WEBSOCKET_IETF) {
	    char payload_head[32] = { 0x84 };
	    int payload_size = raw->len+2; /* TODO: fragmentation? */
	    int payload_length = 0;
	    
	    if (payload_size <= 125) {
	        payload_head[1] = (unsigned char)payload_size & 0x7F;
	        payload_length = 2;
	    } else if (payload_size <= 65535) {
	        unsigned short int s = htons(payload_size);
	        payload_head[1] = 126;
	        
	        memcpy(&payload_head[2], &s, 2);
	        
	        payload_length = 4;
	    } else if (payload_size <= 0xFFFFFFFF) {
	        unsigned int s = htonl(payload_size);
	        
	        payload_head[1] = 127;
	        payload_head[2] = 0;
	        payload_head[3] = 0;
	        payload_head[4] = 0;
	        payload_head[5] = 0;
	        
            memcpy(&payload_head[6], &s, 4);

	        payload_length = 10;
	    }
        
        finish &= sendbin(client->fd, payload_head, payload_length, 0, g_ape);        
	}
	
	finish &= sendbin(client->fd, "[", 1, 0, g_ape);
	
	finish &= sendbin(client->fd, raw->data, raw->len, 0, g_ape);
	
	finish &= sendbin(client->fd, "]", 1, 0, g_ape);
	
	if (properties != NULL && properties->padding.right.val != NULL) {
		finish &= sendbin(client->fd, properties->padding.right.val, properties->padding.right.len, 0, g_ape);
	}
	
	free_raw(raw);
	
	return finish;
}