Index: mojo/public/bindings/sample/generated/sample_service.cc |
diff --git a/mojo/public/bindings/sample/generated/sample_service.cc b/mojo/public/bindings/sample/generated/sample_service.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..42f3445f1233dcd8ec9faccc3fbb203b86875587 |
--- /dev/null |
+++ b/mojo/public/bindings/sample/generated/sample_service.cc |
@@ -0,0 +1,266 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "mojo/public/bindings/sample/generated/sample_service.h" |
+ |
+#include "mojo/public/bindings/lib/message_builder.h" |
+#include "mojo/public/bindings/sample/generated/sample_service_internal.h" |
+ |
+namespace sample { |
+namespace internal { |
+ |
+const uint32_t kService_Frobinate_Name = 1; |
+ |
+#pragma pack(push, 1) |
+ |
+class Service_Frobinate_Params { |
+ public: |
+ static Service_Frobinate_Params* New(mojo::Buffer* buf); |
+ |
+ void set_foo(Foo* foo) { foo_.ptr = foo; } |
+ void set_baz(bool baz) { baz_ = baz; } |
+ void set_port(mojo::Handle port) { port_ = port; } |
+ |
+ const Foo* foo() const { return foo_.ptr; } |
+ bool baz() const { return baz_; } |
+ mojo::Handle port() const { |
+ // NOTE: port is an optional field! |
+ return _header_.num_fields >= 3 ? port_ : mojo::kInvalidHandle; |
+ } |
+ |
+ private: |
+ friend class mojo::internal::ObjectTraits<Service_Frobinate_Params>; |
+ |
+ Service_Frobinate_Params(); |
+ ~Service_Frobinate_Params(); // NOT IMPLEMENTED |
+ |
+ mojo::internal::StructHeader _header_; |
+ mojo::internal::StructPointer<Foo> foo_; |
+ uint8_t baz_ : 1; |
+ uint8_t _pad0_[3]; |
+ mojo::Handle port_; |
+}; |
+MOJO_COMPILE_ASSERT(sizeof(Service_Frobinate_Params) == 24, |
+ bad_sizeof_Service_Frobinate_Params); |
+ |
+#pragma pack(pop) |
+ |
+// static |
+Service_Frobinate_Params* Service_Frobinate_Params::New(mojo::Buffer* buf) { |
+ return new (buf->Allocate(sizeof(Service_Frobinate_Params))) |
+ Service_Frobinate_Params(); |
+} |
+ |
+Service_Frobinate_Params::Service_Frobinate_Params() { |
+ _header_.num_bytes = sizeof(*this); |
+ _header_.num_fields = 3; |
+} |
+ |
+} // namespace internal |
+ |
+// static |
+Bar* Bar::New(mojo::Buffer* buf) { |
+ return new (buf->Allocate(sizeof(Bar))) Bar(); |
+} |
+ |
+Bar::Bar() { |
+ _header_.num_bytes = sizeof(*this); |
+ _header_.num_fields = 3; |
+} |
+ |
+// static |
+Foo* Foo::New(mojo::Buffer* buf) { |
+ return new (buf->Allocate(sizeof(Foo))) Foo(); |
+} |
+ |
+Foo::Foo() { |
+ _header_.num_bytes = sizeof(*this); |
+ _header_.num_fields = 10; |
+} |
+ |
+ServiceProxy::ServiceProxy(mojo::MessageReceiver* receiver) |
+ : receiver_(receiver) { |
+} |
+ |
+void ServiceProxy::Frobinate(const Foo* foo, bool baz, mojo::Handle port) { |
+ size_t payload_size = |
+ mojo::internal::Align(sizeof(internal::Service_Frobinate_Params)); |
+ payload_size += mojo::internal::ComputeSizeOf(foo); |
+ |
+ mojo::MessageBuilder builder(internal::kService_Frobinate_Name, payload_size); |
+ |
+ // We now go about allocating the anonymous Frobinate_Params struct. It |
+ // holds the parameters to the Frobinate message. |
+ // |
+ // Notice how foo is cloned. This causes a copy of foo to be generated |
+ // within the same buffer as the Frobinate_Params struct. That's what we |
+ // need in order to generate a contiguous blob of message data. |
+ |
+ internal::Service_Frobinate_Params* params = |
+ internal::Service_Frobinate_Params::New(builder.buffer()); |
+ params->set_foo(mojo::internal::Clone(foo, builder.buffer())); |
+ params->set_baz(baz); |
+ params->set_port(port); |
+ |
+ // NOTE: If foo happened to be a graph with cycles, then Clone would not |
+ // have returned. |
+ |
+ // Next step is to encode pointers and handles so that messages become |
+ // hermetic. Pointers become offsets and handles becomes indices into the |
+ // handles array. |
+ mojo::Message message; |
+ mojo::internal::EncodePointersAndHandles(params, &message.handles); |
+ |
+ // Finally, we get the generated message data, and forward it to the |
+ // receiver. |
+ message.data = builder.Finish(); |
+ |
+ receiver_->Accept(&message); |
+} |
+ |
+bool ServiceStub::Accept(mojo::Message* message) { |
+ switch (message->data->header.name) { |
+ case internal::kService_Frobinate_Name: { |
+ internal::Service_Frobinate_Params* params = |
+ reinterpret_cast<internal::Service_Frobinate_Params*>( |
+ message->data->payload); |
+ |
+ if (!mojo::internal::DecodePointersAndHandles(params, *message)) |
+ return false; |
+ |
+ Frobinate(params->foo(), params->baz(), params->port()); |
+ break; |
+ } |
+ } |
+ return true; |
+} |
+ |
+} // namespace sample |
+ |
+namespace mojo { |
+namespace internal { |
+ |
+// static |
+size_t ObjectTraits<sample::Bar>::ComputeSizeOf( |
+ const sample::Bar* bar) { |
+ return sizeof(*bar); |
+} |
+ |
+// static |
+sample::Bar* ObjectTraits<sample::Bar>::Clone( |
+ const sample::Bar* bar, Buffer* buf) { |
+ sample::Bar* clone = sample::Bar::New(buf); |
+ memcpy(clone, bar, sizeof(*bar)); |
+ return clone; |
+} |
+ |
+// static |
+void ObjectTraits<sample::Bar>::EncodePointersAndHandles( |
+ sample::Bar* bar, std::vector<mojo::Handle>* handles) { |
+} |
+ |
+// static |
+bool ObjectTraits<sample::Bar>::DecodePointersAndHandles( |
+ sample::Bar* bar, const mojo::Message& message) { |
+ return true; |
+} |
+ |
+// static |
+size_t ObjectTraits<sample::Foo>::ComputeSizeOf( |
+ const sample::Foo* foo) { |
+ return sizeof(*foo) + |
+ mojo::internal::ComputeSizeOf(foo->bar()) + |
+ mojo::internal::ComputeSizeOf(foo->data()) + |
+ mojo::internal::ComputeSizeOf(foo->extra_bars()) + |
+ mojo::internal::ComputeSizeOf(foo->name()) + |
+ mojo::internal::ComputeSizeOf(foo->files()); |
+} |
+ |
+// static |
+sample::Foo* ObjectTraits<sample::Foo>::Clone( |
+ const sample::Foo* foo, Buffer* buf) { |
+ sample::Foo* clone = sample::Foo::New(buf); |
+ memcpy(clone, foo, sizeof(*foo)); |
+ |
+ clone->set_bar(mojo::internal::Clone(foo->bar(), buf)); |
+ clone->set_data(mojo::internal::Clone(foo->data(), buf)); |
+ clone->set_extra_bars(mojo::internal::Clone(foo->extra_bars(), buf)); |
+ clone->set_name(mojo::internal::Clone(foo->name(), buf)); |
+ clone->set_files(mojo::internal::Clone(foo->files(), buf)); |
+ |
+ return clone; |
+} |
+ |
+// static |
+void ObjectTraits<sample::Foo>::EncodePointersAndHandles( |
+ sample::Foo* foo, std::vector<mojo::Handle>* handles) { |
+ Encode(&foo->bar_, handles); |
+ Encode(&foo->data_, handles); |
+ Encode(&foo->extra_bars_, handles); |
+ Encode(&foo->name_, handles); |
+ Encode(&foo->files_, handles); |
+} |
+ |
+// static |
+bool ObjectTraits<sample::Foo>::DecodePointersAndHandles( |
+ sample::Foo* foo, const mojo::Message& message) { |
+ if (!Decode(&foo->bar_, message)) |
+ return false; |
+ if (!Decode(&foo->data_, message)) |
+ return false; |
+ if (foo->_header_.num_fields >= 8) { |
+ if (!Decode(&foo->extra_bars_, message)) |
+ return false; |
+ } |
+ if (foo->_header_.num_fields >= 9) { |
+ if (!Decode(&foo->name_, message)) |
+ return false; |
+ } |
+ if (foo->_header_.num_fields >= 10) { |
+ if (!Decode(&foo->files_, message)) |
+ return false; |
+ } |
+ |
+ // TODO: validate |
+ return true; |
+} |
+ |
+template <> |
+class ObjectTraits<sample::internal::Service_Frobinate_Params> { |
+ public: |
+ static void EncodePointersAndHandles( |
+ sample::internal::Service_Frobinate_Params* params, |
+ std::vector<mojo::Handle>* handles); |
+ static bool DecodePointersAndHandles( |
+ sample::internal::Service_Frobinate_Params* params, |
+ const mojo::Message& message); |
+}; |
+ |
+// static |
+void ObjectTraits<sample::internal::Service_Frobinate_Params>:: |
+ EncodePointersAndHandles( |
+ sample::internal::Service_Frobinate_Params* params, |
+ std::vector<mojo::Handle>* handles) { |
+ Encode(¶ms->foo_, handles); |
+ EncodeHandle(¶ms->port_, handles); |
+} |
+ |
+// static |
+bool ObjectTraits<sample::internal::Service_Frobinate_Params>:: |
+ DecodePointersAndHandles( |
+ sample::internal::Service_Frobinate_Params* params, |
+ const mojo::Message& message) { |
+ if (!Decode(¶ms->foo_, message)) |
+ return false; |
+ if (params->_header_.num_fields >= 3) { |
+ if (!DecodeHandle(¶ms->port_, message.handles)) |
+ return false; |
+ } |
+ |
+ // TODO: validate |
+ return true; |
+} |
+ |
+} // namespace internal |
+} // namespace mojo |