static void run_test (gconstpointer data) { GFileInputStream *stream; gchar contents[1024]; gsize bytes; gchar *curi, *newline; gchar **uriv; GFile *file = G_FILE (data); YelpUri *uri; GOutputStream *outstream; gchar *out; stream = g_file_read (file, NULL, NULL); g_assert (g_input_stream_read_all (G_INPUT_STREAM (stream), contents, 1024, &bytes, NULL, NULL)); newline = strchr (contents, '\n'); curi = g_strndup (contents, newline - contents); uriv = g_strsplit (curi, " ", 2); uri = yelp_uri_new (uriv[0]); if (uriv[1] != NULL) uri = yelp_uri_new_relative (uri, uriv[1]); g_strfreev (uriv); yelp_uri_resolve (uri); while (!yelp_uri_is_resolved (uri)) while (g_main_context_pending (NULL)) g_main_context_iteration (NULL, FALSE); outstream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); print_uri (curi, uri, outstream); out = (gchar *) g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (outstream)); g_free (curi); g_assert (!strncmp (out, contents, bytes)); }
YelpDocument * yelp_document_get_for_uri (YelpUri *uri) { static GHashTable *documents = NULL; gchar *docuri = NULL; gchar *page_id, *tmp; YelpDocument *document = NULL; if (documents == NULL) documents = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); g_return_val_if_fail (yelp_uri_is_resolved (uri), NULL); switch (yelp_uri_get_document_type (uri)) { case YELP_URI_DOCUMENT_TYPE_TEXT: case YELP_URI_DOCUMENT_TYPE_HTML: case YELP_URI_DOCUMENT_TYPE_XHTML: /* We use YelpSimpleDocument for these, which is a single-file * responder. But the document URI may be set to the directory * holding the file, to allow a directory of HTML files to act * as a single document. So we cache these by a fuller URI. */ docuri = yelp_uri_get_document_uri (uri); page_id = yelp_uri_get_page_id (uri); tmp = g_strconcat (docuri, "/", page_id, NULL); g_free (docuri); g_free (page_id); docuri = tmp; break; case YELP_URI_DOCUMENT_TYPE_MAN: /* The document URI for man pages is just man:, so we use the * full canonical URI to look these up. */ docuri = yelp_uri_get_canonical_uri (uri); break; default: docuri = yelp_uri_get_document_uri (uri); break; } if (docuri == NULL) return NULL; document = g_hash_table_lookup (documents, docuri); if (document != NULL) { g_free (docuri); return g_object_ref (document); } switch (yelp_uri_get_document_type (uri)) { case YELP_URI_DOCUMENT_TYPE_TEXT: case YELP_URI_DOCUMENT_TYPE_HTML: case YELP_URI_DOCUMENT_TYPE_XHTML: document = yelp_simple_document_new (uri); break; case YELP_URI_DOCUMENT_TYPE_DOCBOOK: document = yelp_docbook_document_new (uri); break; case YELP_URI_DOCUMENT_TYPE_MALLARD: document = yelp_mallard_document_new (uri); break; case YELP_URI_DOCUMENT_TYPE_MAN: document = yelp_man_document_new (uri); break; case YELP_URI_DOCUMENT_TYPE_INFO: document = yelp_info_document_new (uri); break; case YELP_URI_DOCUMENT_TYPE_HELP_LIST: document = yelp_help_list_new (uri); break; case YELP_URI_DOCUMENT_TYPE_NOT_FOUND: case YELP_URI_DOCUMENT_TYPE_EXTERNAL: case YELP_URI_DOCUMENT_TYPE_ERROR: break; } if (document != NULL) { g_hash_table_insert (documents, docuri, document); return g_object_ref (document); } g_free (docuri); return NULL; }