diff options
author | maruel@google.com <maruel@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-08-05 17:27:16 +0000 |
---|---|---|
committer | maruel@google.com <maruel@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-08-05 17:27:16 +0000 |
commit | 83f614694645507a493c366a9f6319efd9a9c3db (patch) | |
tree | 3be109aae137e9e3dd994b950d10596c771e7e79 /chrome/common/ipc_message_utils.cc | |
parent | 44fbeda9a35f7175dbe07be8dc6cdceb12a47059 (diff) | |
download | chromium_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.cc | 239 |
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 |