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; }
/* 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; }
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; }