Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Side by Side Diff: mojo/public/bindings/sample_test.cc

Issue 23913008: C++ bindings (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <assert.h>
6 #include <stddef.h>
7 #include <stdint.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11
12 #include <new>
13 #include <vector>
14
15 #include "mojo/public/bindings/generated/sample_service.h"
16 #include "mojo/public/bindings/generated/sample_service_proxy.h"
17 #include "mojo/public/bindings/generated/sample_service_stub.h"
18
19 static void PrintSpacer(int depth) {
20 for (int i = 0; i < depth; ++i)
21 printf(" ");
22 }
23
24 static void Print(int depth, const char* name, bool value) {
25 PrintSpacer(depth);
26 printf("%s: %s\n", name, value ? "true" : "false");
27 }
28
29 static void Print(int depth, const char* name, int32_t value) {
30 PrintSpacer(depth);
31 printf("%s: %d\n", name, value);
32 }
33
34 static void Print(int depth, const char* name, uint8_t value) {
35 PrintSpacer(depth);
36 printf("%s: %u\n", name, value);
37 }
38
39 static void Print(int depth, const char* name, const sample::Bar* bar) {
40 PrintSpacer(depth);
41 printf("%s: %p\n", name, bar);
42 if (bar) {
43 ++depth;
44 Print(depth, "alpha", bar->alpha());
45 Print(depth, "beta", bar->beta());
46 Print(depth, "gamma", bar->gamma());
47 --depth;
48 }
49 }
50
51 template <typename T>
52 static void Print(int depth, const char* name, const mojo::Array<T>* array) {
53 PrintSpacer(depth);
54 printf("%s: %p\n", name, array);
55 if (array) {
56 ++depth;
57 for (size_t i = 0; i < array->size(); ++i) {
58 char buf[32];
59 sprintf(buf, "%lu", i);
60 Print(depth, buf, array->at(i));
61 }
62 --depth;
63 }
64 }
65
66 static void Print(int depth, const char* name, const sample::Foo* foo) {
67 PrintSpacer(depth);
68 printf("%s: %p\n", name, foo);
69 if (foo) {
70 ++depth;
71 Print(depth, "x", foo->x());
72 Print(depth, "y", foo->y());
73 Print(depth, "a", foo->a());
74 Print(depth, "b", foo->b());
75 Print(depth, "c", foo->c());
76 Print(depth, "bar", foo->bar());
77 Print(depth, "data", foo->data());
78 Print(depth, "extra_bars", foo->extra_bars());
79 --depth;
80 }
81 }
82
83 class ServiceImpl : public sample::ServiceStub {
84 public:
85 virtual void Frobinate(const sample::Foo* foo, bool baz) {
86 // Users code goes here to handle the incoming Frobinate message.
87 // We'll just dump the Foo structure and all of its members.
88
89 printf("Frobinate:\n");
90
91 int depth = 1;
92 Print(depth, "foo", foo);
93 Print(depth, "baz", baz);
94 }
95 };
96
97 //----
98
99 class SimpleMessageSender : public mojo::MessageSender {
100 public:
101 virtual void Send(const mojo::Message& message) {
102 // Imagine some IPC happened here.
103
104 // In the receiving process, an implementation of ServiceStub is known to
105 // the system. It receives the incoming message.
106 ServiceImpl impl;
107
108 sample::ServiceStub* stub = &impl;
109 stub->OnMessageReceived(message);
110 }
111 };
112
113 int main() {
114 SimpleMessageSender sender;
115
116 // User has a proxy to a Service somehow.
117 sample::Service* service = new sample::ServiceProxy(&sender);
118
119 // User constructs a message to send.
120
121 // Notice that it doesn't matter in what order the structs / arrays are
122 // allocated. Here, the various members of Foo are allocated before Foo is
123 // allocated.
124
125 mojo::MessageBuffer buf;
126
127 sample::Bar* bar = buf.Alloc<sample::Bar>();
128 bar->set_alpha(20);
129 bar->set_beta(40);
130 bar->set_gamma(60);
131
132 const size_t kNumDataElements = 10;
133 mojo::Array<uint8_t>* data = buf.AllocArray<uint8_t>(kNumDataElements);
134 for (size_t i = 0; i < kNumDataElements; ++i)
135 (*data)[i] = static_cast<uint8_t>(kNumDataElements - i);
136
137 const size_t kNumExtraBarsElements = 3;
138 mojo::Array<sample::Bar*>* extra_bars =
139 buf.AllocArray<sample::Bar*>(kNumExtraBarsElements);
140 for (size_t i = 0; i < kNumExtraBarsElements; ++i) {
141 sample::Bar* bar = buf.Alloc<sample::Bar>();
142 bar->set_alpha(i * 100);
143 bar->set_beta(i * 100 + 20);
144 bar->set_gamma(i * 100 + 40);
145 (*extra_bars)[i] = bar;
146 }
147
148 sample::Foo* foo = buf.Alloc<sample::Foo>();
149 foo->set_x(1);
150 foo->set_y(2);
151 foo->set_a(false);
152 foo->set_b(true);
153 foo->set_c(false);
154 foo->set_bar(bar);
viettrungluu 2013/10/01 00:51:04 I'm a little concerned that this and (even more so
155 foo->set_data(data);
156 foo->set_extra_bars(extra_bars);
157
158 service->Frobinate(foo, true);
159
160 return 0;
161 }
OLDNEW
« mojo/public/bindings/sample_service.idl ('K') | « mojo/public/bindings/sample_service.idl ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698