summaryrefslogtreecommitdiffstats
path: root/chrome/common/ipc_message_utils.cc
diff options
context:
space:
mode:
authormaruel@google.com <maruel@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-08-05 17:27:16 +0000
committermaruel@google.com <maruel@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-08-05 17:27:16 +0000
commit83f614694645507a493c366a9f6319efd9a9c3db (patch)
tree3be109aae137e9e3dd994b950d10596c771e7e79 /chrome/common/ipc_message_utils.cc
parent44fbeda9a35f7175dbe07be8dc6cdceb12a47059 (diff)
downloadchromium_src-83f614694645507a493c366a9f6319efd9a9c3db.zip
chromium_src-83f614694645507a493c366a9f6319efd9a9c3db.tar.gz
chromium_src-83f614694645507a493c366a9f6319efd9a9c3db.tar.bz2
Reduce the quantity of includes and template specialization in ipc_message_utils.h.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@379 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/common/ipc_message_utils.cc')
-rw-r--r--chrome/common/ipc_message_utils.cc239
1 files changed, 239 insertions, 0 deletions
diff --git a/chrome/common/ipc_message_utils.cc b/chrome/common/ipc_message_utils.cc
new file mode 100644
index 0000000..ad5050c
--- /dev/null
+++ b/chrome/common/ipc_message_utils.cc
@@ -0,0 +1,239 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "chrome/common/ipc_message_utils.h"
+
+#include "base/gfx/rect.h"
+#include "googleurl/src/gurl.h"
+#include "webkit/glue/dom_operations.h"
+#include "webkit/glue/webcursor.h"
+
+namespace IPC {
+
+void ParamTraits<GURL>::Write(Message* m, const GURL& p) {
+ m->WriteString(p.possibly_invalid_spec());
+ // TODO(brettw) bug 684583: Add encoding for query params.
+}
+
+bool ParamTraits<GURL>::Read(const Message* m, void** iter, GURL* p) {
+ std::string s;
+ if (!m->ReadString(iter, &s)) {
+ *p = GURL();
+ return false;
+ }
+ *p = GURL(s);
+ return true;
+}
+
+void ParamTraits<GURL>::Log(const GURL& p, std::wstring* l) {
+ l->append(UTF8ToWide(p.spec()));
+}
+
+
+void ParamTraits<gfx::Point>::Write(Message* m, const gfx::Point& p) {
+ m->WriteInt(p.x());
+ m->WriteInt(p.y());
+}
+
+bool ParamTraits<gfx::Point>::Read(const Message* m, void** iter,
+ gfx::Point* r) {
+ int x, y;
+ if (!m->ReadInt(iter, &x) ||
+ !m->ReadInt(iter, &y))
+ return false;
+ r->set_x(x);
+ r->set_y(y);
+ return true;
+}
+
+void ParamTraits<gfx::Point>::Log(const gfx::Point& p, std::wstring* l) {
+ l->append(StringPrintf(L"(%d, %d)", p.x(), p.y()));
+}
+
+
+
+void ParamTraits<gfx::Rect>::Write(Message* m, const gfx::Rect& p) {
+ m->WriteInt(p.x());
+ m->WriteInt(p.y());
+ m->WriteInt(p.width());
+ m->WriteInt(p.height());
+}
+
+bool ParamTraits<gfx::Rect>::Read(const Message* m, void** iter, gfx::Rect* r) {
+ int x, y, w, h;
+ if (!m->ReadInt(iter, &x) ||
+ !m->ReadInt(iter, &y) ||
+ !m->ReadInt(iter, &w) ||
+ !m->ReadInt(iter, &h))
+ return false;
+ r->set_x(x);
+ r->set_y(y);
+ r->set_width(w);
+ r->set_height(h);
+ return true;
+}
+
+void ParamTraits<gfx::Rect>::Log(const gfx::Rect& p, std::wstring* l) {
+ l->append(StringPrintf(L"(%d, %d, %d, %d)", p.x(), p.y(), p.width(), p.height()));
+}
+
+
+void ParamTraits<gfx::Size>::Write(Message* m, const gfx::Size& p) {
+ m->WriteInt(p.width());
+ m->WriteInt(p.height());
+}
+
+bool ParamTraits<gfx::Size>::Read(const Message* m, void** iter, gfx::Size* r) {
+ int w, h;
+ if (!m->ReadInt(iter, &w) ||
+ !m->ReadInt(iter, &h))
+ return false;
+ r->set_width(w);
+ r->set_height(h);
+ return true;
+}
+
+void ParamTraits<gfx::Size>::Log(const gfx::Size& p, std::wstring* l) {
+ l->append(StringPrintf(L"(%d, %d)", p.width(), p.height()));
+}
+
+
+struct WebCursor_Data {
+ WebCursor::Type cursor_type;
+ int hotspot_x;
+ int hotspot_y;
+ SkBitmap_Data bitmap_info;
+};
+
+void ParamTraits<WebCursor>::Write(Message* m, const WebCursor& p) {
+ const SkBitmap& src_bitmap = p.bitmap();
+ WebCursor_Data web_cursor_info;
+ web_cursor_info.cursor_type = p.type();
+ web_cursor_info.hotspot_x = p.hotspot_x();
+ web_cursor_info.hotspot_y = p.hotspot_y();
+ web_cursor_info.bitmap_info.InitSkBitmapDataForTransfer(src_bitmap);
+
+ size_t fixed_data = sizeof(web_cursor_info);
+ m->WriteData(reinterpret_cast<const char*>(&web_cursor_info),
+ static_cast<int>(fixed_data));
+ size_t pixel_size = src_bitmap.getSize();
+ m->WriteBool(pixel_size != 0);
+ if (pixel_size) {
+ SkAutoLockPixels src_bitmap_lock(src_bitmap);
+ m->WriteData(reinterpret_cast<const char*>(src_bitmap.getPixels()),
+ static_cast<int>(pixel_size));
+ }
+}
+
+bool ParamTraits<WebCursor>::Read(const Message* m, void** iter, WebCursor* r) {
+ const char* fixed_data = NULL;
+ int fixed_data_size = 0;
+ if (!m->ReadData(iter, &fixed_data, &fixed_data_size) ||
+ (fixed_data_size <= 0)) {
+ NOTREACHED();
+ return false;
+ }
+ DCHECK(fixed_data_size == sizeof(WebCursor_Data));
+
+ const WebCursor_Data* web_cursor_info =
+ reinterpret_cast<const WebCursor_Data*>(fixed_data);
+
+ bool variable_data_avail;
+ if (!m->ReadBool(iter, &variable_data_avail)) {
+ NOTREACHED();
+ return false;
+ }
+
+ // No variable data indicates that this is not a custom cursor.
+ if (variable_data_avail) {
+ const char* variable_data = NULL;
+ int variable_data_size = 0;
+ if (!m->ReadData(iter, &variable_data, &variable_data_size) ||
+ variable_data_size <= 0) {
+ NOTREACHED();
+ return false;
+ }
+
+ SkBitmap dest_bitmap;
+ web_cursor_info->bitmap_info.InitSkBitmapFromData(&dest_bitmap,
+ variable_data,
+ variable_data_size);
+ r->set_bitmap(dest_bitmap);
+ r->set_hotspot(web_cursor_info->hotspot_x, web_cursor_info->hotspot_y);
+ }
+
+ r->set_type(web_cursor_info->cursor_type);
+ return true;
+}
+
+void ParamTraits<WebCursor>::Log(const WebCursor& p, std::wstring* l) {
+ l->append(L"<WebCursor>");
+}
+
+
+void ParamTraits<webkit_glue::WebApplicationInfo>::Write(
+ Message* m, const webkit_glue::WebApplicationInfo& p) {
+ WriteParam(m, p.title);
+ WriteParam(m, p.description);
+ WriteParam(m, p.app_url);
+ WriteParam(m, p.icons.size());
+ for (size_t i = 0; i < p.icons.size(); ++i) {
+ WriteParam(m, p.icons[i].url);
+ WriteParam(m, p.icons[i].width);
+ WriteParam(m, p.icons[i].height);
+ }
+}
+
+bool ParamTraits<webkit_glue::WebApplicationInfo>::Read(
+ const Message* m, void** iter, webkit_glue::WebApplicationInfo* r) {
+ size_t icon_count;
+ bool result =
+ ReadParam(m, iter, &r->title) &&
+ ReadParam(m, iter, &r->description) &&
+ ReadParam(m, iter, &r->app_url) &&
+ ReadParam(m, iter, &icon_count);
+ if (!result)
+ return false;
+ for (size_t i = 0; i < icon_count && result; ++i) {
+ param_type::IconInfo icon_info;
+ result =
+ ReadParam(m, iter, &icon_info.url) &&
+ ReadParam(m, iter, &icon_info.width) &&
+ ReadParam(m, iter, &icon_info.height);
+ r->icons.push_back(icon_info);
+ }
+ return result;
+}
+
+void ParamTraits<webkit_glue::WebApplicationInfo>::Log(
+ const webkit_glue::WebApplicationInfo& p, std::wstring* l) {
+ l->append(L"<WebApplicationInfo>");
+}
+
+} // namespace IPC