1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/* 2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Jan Michael Alonzo 3643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Gustavo Noronha Silva 4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * This library is free software; you can redistribute it and/or 6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modify it under the terms of the GNU Library General Public 7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * License as published by the Free Software Foundation; either 8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * version 2 of the License, or (at your option) any later version. 9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * This library is distributed in the hope that it will be useful, 11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * but WITHOUT ANY WARRANTY; without even the implied warranty of 12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Library General Public License for more details. 14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * You should have received a copy of the GNU Library General Public License 16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * along with this library; see the file COPYING.LIB. If not, write to 17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Boston, MA 02110-1301, USA. 19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */ 20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "test_utils.h" 22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <glib.h> 24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <glib/gstdio.h> 25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <libsoup/soup.h> 26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <string.h> 27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <webkit/webkit.h> 28d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <unistd.h> 29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 30f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if GTK_CHECK_VERSION(2, 14, 0) 31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 32643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockGMainLoop* loop; 33643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockSoupSession *session; 34643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockchar* base_uri; 35643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/* For real request testing */ 37643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void 38643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockserver_callback(SoupServer *server, SoupMessage *msg, 39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const char *path, GHashTable *query, 40643ca7872b450ea4efacab6188849e5aac2ba161Steve Block SoupClientContext *context, gpointer data) 41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (msg->method != SOUP_METHOD_GET) { 43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_set_status(msg, SOUP_STATUS_NOT_IMPLEMENTED); 44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_set_status(msg, SOUP_STATUS_OK); 48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block /* PDF */ 50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (g_str_equal(path, "/pdf")) { 51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block char* contents; 52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gsize length; 53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block GError* error = NULL; 54643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_file_get_contents("test.pdf", &contents, &length, &error); 56643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert(!error); 57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_body_append(msg->response_body, SOUP_MEMORY_TAKE, contents, length); 59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else if (g_str_equal(path, "/html")) { 60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block char* contents; 61643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gsize length; 62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block GError* error = NULL; 63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_file_get_contents("test.html", &contents, &length, &error); 65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert(!error); 66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_body_append(msg->response_body, SOUP_MEMORY_TAKE, contents, length); 68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else if (g_str_equal(path, "/text")) { 69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block char* contents; 70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gsize length; 71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block GError* error = NULL; 72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 73643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_headers_append(msg->response_headers, "Content-Disposition", "attachment; filename=test.txt"); 74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_file_get_contents("test.txt", &contents, &length, &error); 76643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert(!error); 77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 78643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_body_append(msg->response_body, SOUP_MEMORY_TAKE, contents, length); 79643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else if (g_str_equal(path, "/ogg")) { 80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block char* contents; 81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gsize length; 82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block GError* error = NULL; 83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_file_get_contents("test.ogg", &contents, &length, &error); 85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert(!error); 86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_body_append(msg->response_body, SOUP_MEMORY_TAKE, contents, length); 88643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_body_complete(msg->response_body); 91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 93d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic void idle_quit_loop_cb(WebKitWebView* web_view, GParamSpec* pspec, gpointer data) 94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 95d0825bca7fe65beaee391d30da42e937db621564Steve Block if (webkit_web_view_get_load_status(web_view) == WEBKIT_LOAD_FINISHED || 96d0825bca7fe65beaee391d30da42e937db621564Steve Block webkit_web_view_get_load_status(web_view) == WEBKIT_LOAD_FAILED) 97d0825bca7fe65beaee391d30da42e937db621564Steve Block g_main_loop_quit(loop); 98643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 100643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic gboolean mime_type_policy_decision_requested_cb(WebKitWebView* view, WebKitWebFrame* frame, 101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebKitNetworkRequest* request, const char* mime_type, 102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebKitWebPolicyDecision* decision, gpointer data) 103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block char* type = (char*)data; 105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (g_str_equal(type, "pdf")) { 107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert_cmpstr(mime_type, ==, "application/pdf"); 108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert(!webkit_web_view_can_show_mime_type(view, mime_type)); 109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else if (g_str_equal(type, "html")) { 110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert_cmpstr(mime_type, ==, "text/html"); 111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert(webkit_web_view_can_show_mime_type(view, mime_type)); 112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else if (g_str_equal(type, "text")) { 113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebKitNetworkResponse* response = webkit_web_frame_get_network_response(frame); 114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block SoupMessage* message = webkit_network_response_get_message(response); 115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block char* disposition; 116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert(message); 118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_message_headers_get_content_disposition(message->response_headers, 119643ca7872b450ea4efacab6188849e5aac2ba161Steve Block &disposition, NULL); 120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_object_unref(response); 121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert_cmpstr(disposition, ==, "attachment"); 123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_free(disposition); 124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert_cmpstr(mime_type, ==, "text/plain"); 126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert(webkit_web_view_can_show_mime_type(view, mime_type)); 127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else if (g_str_equal(type, "ogg")) { 1285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick g_assert_cmpstr(mime_type, ==, "audio/x-vorbis+ogg"); 129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_assert(webkit_web_view_can_show_mime_type(view, mime_type)); 130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_free(type); 133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 134643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return FALSE; 135643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 136643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 137bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic void testRemoteMimeType(const void* data) 138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 139bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen const char* name = (const char*) data; 140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebKitWebView* view = WEBKIT_WEB_VIEW(webkit_web_view_new()); 141643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_object_ref_sink(G_OBJECT(view)); 142643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block loop = g_main_loop_new(NULL, TRUE); 144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_object_connect(G_OBJECT(view), 146d0825bca7fe65beaee391d30da42e937db621564Steve Block "signal::notify::load-status", idle_quit_loop_cb, NULL, 147643ca7872b450ea4efacab6188849e5aac2ba161Steve Block "signal::mime-type-policy-decision-requested", mime_type_policy_decision_requested_cb, g_strdup(name), 148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block NULL); 149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 150643ca7872b450ea4efacab6188849e5aac2ba161Steve Block char* effective_uri = g_strdup_printf("%s%s", base_uri, name); 151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block webkit_web_view_load_uri(view, effective_uri); 152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_free(effective_uri); 153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_main_loop_run(loop); 155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_object_unref(view); 157643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 159bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic void testLocalMimeType(const void* data) 160643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 161bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen const char* typeName = (const char*) data; 162bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen WebKitWebView* view = WEBKIT_WEB_VIEW(webkit_web_view_new()); 163bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_object_ref_sink(G_OBJECT(view)); 164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 165bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen loop = g_main_loop_new(NULL, TRUE); 166643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 167bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_object_connect(G_OBJECT(view), 168bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen "signal::notify::load-status", idle_quit_loop_cb, NULL, 169bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen "signal::mime-type-policy-decision-requested", mime_type_policy_decision_requested_cb, g_strdup(typeName), 170bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen NULL); 171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 172bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen gchar* filename = g_strdup_printf("test.%s", typeName); 173bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen GFile* file = g_file_new_for_path(filename); 174bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_free(filename); 175bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 176bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen gchar* fileURI = g_file_get_uri(file); 177bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_object_unref(file); 178bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 179bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen webkit_web_view_load_uri(view, fileURI); 180bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_free(fileURI); 181bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 182bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_main_loop_run(loop); 183bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_object_unref(view); 184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 185643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 186643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockint main(int argc, char** argv) 187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block SoupServer* server; 189643ca7872b450ea4efacab6188849e5aac2ba161Steve Block SoupURI* soup_uri; 190643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 191643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_thread_init(NULL); 192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block gtk_test_init(&argc, &argv, NULL); 193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 194643ca7872b450ea4efacab6188849e5aac2ba161Steve Block /* Hopefully make test independent of the path it's called from. */ 19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch testutils_relative_chdir("Source/WebKit/gtk/tests/resources/test.html", argv[0]); 196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block server = soup_server_new(SOUP_SERVER_PORT, 0, NULL); 198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_server_run_async(server); 199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 200643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_server_add_handler(server, NULL, server_callback, NULL, NULL); 201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_uri = soup_uri_new("http://127.0.0.1/"); 203643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_uri_set_port(soup_uri, soup_server_get_port(server)); 204643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block base_uri = soup_uri_to_string(soup_uri, FALSE); 206643ca7872b450ea4efacab6188849e5aac2ba161Steve Block soup_uri_free(soup_uri); 207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 208643ca7872b450ea4efacab6188849e5aac2ba161Steve Block g_test_bug_base("https://bugs.webkit.org/"); 209bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_test_add_data_func("/webkit/mime/remote-PDF", "pdf", testRemoteMimeType); 210bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_test_add_data_func("/webkit/mime/remote-HTML", "html", testRemoteMimeType); 211bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_test_add_data_func("/webkit/mime/remote-TEXT", "text", testRemoteMimeType); 212bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_test_add_data_func("/webkit/mime/remote-OGG", "ogg", testRemoteMimeType); 213bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_test_add_data_func("/webkit/mime/local-PDF", "pdf", testLocalMimeType); 214bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_test_add_data_func("/webkit/mime/local-HTML", "html", testLocalMimeType); 215bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_test_add_data_func("/webkit/mime/local-TEXT", "text", testLocalMimeType); 216bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen g_test_add_data_func("/webkit/mime/local-OGG", "ogg", testLocalMimeType); 217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 218643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return g_test_run(); 219643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 221643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else 222643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockint main(int argc, char** argv) 223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 224f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch g_critical("You will need gtk-2.14.0 to run the unit tests. Doing nothing now."); 225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 229