static gboolean refill_input_buffer (MateVFSSocketBuffer *socket_buffer, MateVFSCancellation *cancellation) { Buffer *input_buffer; MateVFSResult result; MateVFSFileSize bytes_read; char *data_pos; input_buffer = &socket_buffer->input_buffer; if (input_buffer->last_error != MATE_VFS_OK) { return FALSE; } /* If there is data left in the buffer move it to the front */ if (input_buffer->offset > 0) { data_pos = &(input_buffer->data[input_buffer->offset]); memmove (input_buffer->data, data_pos, input_buffer->byte_count); input_buffer->offset = 0; } result = mate_vfs_socket_read (socket_buffer->socket, input_buffer->data + input_buffer->byte_count, BUFFER_SIZE - input_buffer->byte_count, &bytes_read, cancellation); if (result != MATE_VFS_OK) { input_buffer->last_error = result; return FALSE; } input_buffer->byte_count += bytes_read; return TRUE; }
int main (int argc, char **argv) { MateVFSResult result = MATE_VFS_OK; gchar buffer[1024]; gchar *host; gint port; MateVFSFileSize bytes_read; MateVFSSSL *ssl = NULL; MateVFSSocket *socket = NULL; MateVFSSocketBuffer *socketbuffer = NULL; if (argc != 3) { printf ("Usage: %s <host> <port>\n", argv[0]); return 1; } host = argv[1]; port = atoi (argv[2]); if (port <= 0) { printf ("Invalid port\n"); return 1; } if (! mate_vfs_init ()) { fprintf (stderr, "Cannot initialize mate-vfs.\n"); return 1; } switch (abstraction) { case SOCKETBUFFER: g_print ("Testing MateVFSSocketBuffer"); case SOCKET: g_print (" and MateVFSSocket"); case SSL: g_print (" and MateVFSSSL"); } g_print (".\n"); result = mate_vfs_ssl_create (&ssl, host, port, NULL); show_result (result, "ssl_create", host, port); if (ssl == NULL) { fprintf (stderr, "couln't connect\n"); return -1; } if (abstraction >= SOCKET) { socket = mate_vfs_ssl_to_socket (ssl); if (socket == NULL) { fprintf (stderr, "couldn't create socket object\n"); return -1; } if (abstraction == SOCKETBUFFER) { socketbuffer = mate_vfs_socket_buffer_new (socket); if (socketbuffer == NULL) { fprintf (stderr, "couldn't create socketbuffer object\n"); return -1; } } } switch (abstraction) { case SSL: result = mate_vfs_ssl_write (ssl, HTTP_REQUEST, strlen(HTTP_REQUEST), &bytes_read, NULL); break; case SOCKET: result = mate_vfs_socket_write (socket, HTTP_REQUEST, strlen(HTTP_REQUEST), &bytes_read, NULL); break; case SOCKETBUFFER: result = mate_vfs_socket_buffer_write (socketbuffer, HTTP_REQUEST, strlen(HTTP_REQUEST), &bytes_read, NULL); mate_vfs_socket_buffer_flush (socketbuffer, NULL); break; } show_result (result, "write", host, port); while( result==MATE_VFS_OK ) { switch (abstraction) { case SSL: result = mate_vfs_ssl_read (ssl, buffer, sizeof buffer - 1, &bytes_read, NULL); break; case SOCKET: result = mate_vfs_socket_read (socket, buffer, sizeof buffer - 1, &bytes_read, NULL); break; case SOCKETBUFFER: result = mate_vfs_socket_buffer_read ( socketbuffer, buffer, sizeof buffer - 1, &bytes_read, NULL); break; } show_result (result, "read", host, port); buffer[bytes_read] = 0; write (1,buffer,bytes_read); if(!bytes_read) break; } switch (abstraction) { case SSL: mate_vfs_ssl_destroy (ssl, NULL); break; case SOCKET: mate_vfs_socket_close (socket, NULL); break; case SOCKETBUFFER: mate_vfs_socket_buffer_destroy (socketbuffer, TRUE, NULL); break; } return 0; }