From fe3f0332f71258354b70e5db685b56934f0df703 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 30 Jan 2013 09:18:52 +0100 Subject: page: convert to C++ --- src/output/HttpdClient.cxx | 49 ++++++++++++++++++++-------------------- src/output/HttpdClient.hxx | 16 ++++++------- src/output/HttpdInternal.hxx | 8 +++---- src/output/HttpdOutputPlugin.cxx | 22 +++++++++--------- 4 files changed, 47 insertions(+), 48 deletions(-) (limited to 'src/output') diff --git a/src/output/HttpdClient.cxx b/src/output/HttpdClient.cxx index 5ac3bf7c..dd2f44fa 100644 --- a/src/output/HttpdClient.cxx +++ b/src/output/HttpdClient.cxx @@ -21,7 +21,7 @@ #include "HttpdClient.hxx" #include "HttpdInternal.hxx" #include "util/fifo_buffer.h" -#include "page.h" +#include "Page.hxx" #include "IcyMetaDataServer.hxx" #include "glib_socket.h" @@ -38,15 +38,15 @@ HttpdClient::~HttpdClient() g_source_remove(write_source_id); if (current_page != nullptr) - page_unref(current_page); + current_page->Unref(); for (auto page : pages) - page_unref(page); + page->Unref(); } else fifo_buffer_free(input); if (metadata) - page_unref(metadata); + metadata->Unref(); g_source_remove(read_source_id); g_io_channel_unref(channel); @@ -379,7 +379,7 @@ HttpdClient::CancelQueue() return; for (auto page : pages) - page_unref(page); + page->Unref(); pages.clear(); if (write_source_id != 0 && current_page == nullptr) { @@ -390,36 +390,34 @@ HttpdClient::CancelQueue() static GIOStatus write_page_to_channel(GIOChannel *channel, - const struct page *page, size_t position, + const Page &page, size_t position, gsize *bytes_written_r, GError **error) { assert(channel != nullptr); - assert(page != nullptr); - assert(position < page->size); + assert(position < page.size); return g_io_channel_write_chars(channel, - (const gchar*)page->data + position, - page->size - position, + (const gchar*)page.data + position, + page.size - position, bytes_written_r, error); } static GIOStatus -write_n_bytes_to_channel(GIOChannel *channel, const struct page *page, +write_n_bytes_to_channel(GIOChannel *channel, const Page &page, size_t position, gint n, gsize *bytes_written_r, GError **error) { GIOStatus status; assert(channel != nullptr); - assert(page != nullptr); - assert(position < page->size); + assert(position < page.size); if (n == -1) { status = write_page_to_channel (channel, page, position, bytes_written_r, error); } else { status = g_io_channel_write_chars(channel, - (const gchar*)page->data + position, + (const gchar*)page.data + position, n, bytes_written_r, error); } @@ -466,7 +464,7 @@ HttpdClient::Write() if (!metadata_sent) { status = write_page_to_channel(channel, - metadata, + *metadata, metadata_to_write, &bytes_written, &error); @@ -478,13 +476,12 @@ HttpdClient::Write() metadata_sent = true; } } else { - struct page *empty_meta; guchar empty_data = 0; - empty_meta = page_new_copy(&empty_data, 1); + Page *empty_meta = Page::Copy(&empty_data, 1); status = write_page_to_channel(channel, - empty_meta, + *empty_meta, metadata_to_write, &bytes_written, &error); @@ -494,11 +491,13 @@ HttpdClient::Write() metadata_fill = 0; metadata_current_position = 0; } + + empty_meta->Unref(); } bytes_written = 0; } else { - status = write_n_bytes_to_channel(channel, current_page, + status = write_n_bytes_to_channel(channel, *current_page, current_position, bytes_to_write, &bytes_written, &error); } @@ -512,7 +511,7 @@ HttpdClient::Write() metadata_fill += bytes_written; if (current_position >= current_page->size) { - page_unref(current_page); + current_page->Unref(); current_page = nullptr; if (pages.empty()) { @@ -561,13 +560,13 @@ httpd_client_out_event(gcc_unused GIOChannel *source, } void -HttpdClient::PushPage(struct page *page) +HttpdClient::PushPage(Page *page) { if (state != RESPONSE) /* the client is still writing the HTTP request */ return; - page_ref(page); + page->Ref(); pages.push_back(page); if (write_source_id == 0) @@ -577,16 +576,16 @@ HttpdClient::PushPage(struct page *page) } void -HttpdClient::PushMetaData(struct page *page) +HttpdClient::PushMetaData(Page *page) { if (metadata) { - page_unref(metadata); + metadata->Unref(); metadata = nullptr; } g_return_if_fail (page); - page_ref(page); + page->Ref(); metadata = page; metadata_sent = false; } diff --git a/src/output/HttpdClient.hxx b/src/output/HttpdClient.hxx index 8fb7c8b2..1dd4eead 100644 --- a/src/output/HttpdClient.hxx +++ b/src/output/HttpdClient.hxx @@ -29,7 +29,7 @@ #include struct HttpdOutput; -struct page; +class Page; class HttpdClient final { /** @@ -76,14 +76,14 @@ class HttpdClient final { } state; /** - * A queue of #page objects to be sent to the client. + * A queue of #Page objects to be sent to the client. */ - std::list pages; + std::list pages; /** * The #page which is currently being sent to the client. */ - page *current_page; + Page *current_page; /** * The amount of bytes which were already sent from @@ -120,9 +120,9 @@ class HttpdClient final { guint metaint; /** - * The metadata as #page which is currently being sent to the client. + * The metadata as #Page which is currently being sent to the client. */ - page *metadata; + Page *metadata; /* * The amount of bytes which were already sent from the metadata. @@ -204,12 +204,12 @@ public: /** * Appends a page to the client's queue. */ - void PushPage(page *page); + void PushPage(Page *page); /** * Sends the passed metadata. */ - void PushMetaData(page *page); +void PushMetaData(Page *page); }; #endif diff --git a/src/output/HttpdInternal.hxx b/src/output/HttpdInternal.hxx index 1c2fdfb1..702f4ad3 100644 --- a/src/output/HttpdInternal.hxx +++ b/src/output/HttpdInternal.hxx @@ -85,12 +85,12 @@ struct HttpdOutput { /** * The header page, which is sent to every client on connect. */ - struct page *header; + Page *header; /** * The metadata, which is sent to every client. */ - struct page *metadata; + Page *metadata; /** * The configured name. @@ -178,14 +178,14 @@ struct HttpdOutput { * Reads data from the encoder (as much as available) and * returns it as a new #page object. */ - page *ReadPage(); + Page *ReadPage(); /** * Broadcasts a page struct to all clients. * * Mutext must not be locked. */ - void BroadcastPage(struct page *page); + void BroadcastPage(Page *page); /** * Broadcasts data from the encoder to all clients. diff --git a/src/output/HttpdOutputPlugin.cxx b/src/output/HttpdOutputPlugin.cxx index 52b2e0e8..a9b27c48 100644 --- a/src/output/HttpdOutputPlugin.cxx +++ b/src/output/HttpdOutputPlugin.cxx @@ -25,7 +25,7 @@ #include "encoder_plugin.h" #include "encoder_list.h" #include "resolver.h" -#include "page.h" +#include "Page.hxx" #include "IcyMetaDataServer.hxx" #include "fd_util.h" #include "ServerSocket.hxx" @@ -156,7 +156,7 @@ httpd_output_finish(struct audio_output *ao) HttpdOutput *httpd = (HttpdOutput *)ao; if (httpd->metadata) - page_unref(httpd->metadata); + httpd->metadata->Unref(); encoder_finish(httpd->encoder); server_socket_free(httpd->server_socket); @@ -230,7 +230,7 @@ httpd_listen_in_event(int fd, const struct sockaddr *address, } } -struct page * +Page * HttpdOutput::ReadPage() { if (unflushed_input >= 65536) { @@ -257,7 +257,7 @@ HttpdOutput::ReadPage() if (size == 0) return NULL; - return page_new_copy(buffer, size); + return Page::Copy(buffer, size); } static bool @@ -337,7 +337,7 @@ HttpdOutput::Close() clients.clear(); if (header != NULL) - page_unref(header); + header->Unref(); encoder_close(encoder); } @@ -398,7 +398,7 @@ httpd_output_delay(struct audio_output *ao) } void -HttpdOutput::BroadcastPage(struct page *page) +HttpdOutput::BroadcastPage(Page *page) { assert(page != NULL); @@ -419,10 +419,10 @@ HttpdOutput::BroadcastFromEncoder() } mutex.unlock(); - struct page *page; + Page *page; while ((page = ReadPage()) != nullptr) { BroadcastPage(page); - page_unref(page); + page->Unref(); } } @@ -492,10 +492,10 @@ HttpdOutput::SendTag(const struct tag *tag) used as the new "header" page, which is sent to all new clients */ - struct page *page = ReadPage(); + Page *page = ReadPage(); if (page != NULL) { if (header != NULL) - page_unref(header); + header->Unref(); header = page; BroadcastPage(page); } @@ -503,7 +503,7 @@ HttpdOutput::SendTag(const struct tag *tag) /* use Icy-Metadata */ if (metadata != NULL) - page_unref(metadata); + metadata->Unref(); static constexpr tag_type types[] = { TAG_ALBUM, TAG_ARTIST, TAG_TITLE, -- cgit v1.2.3