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

Side by Side Diff: ppapi/shared_impl/private/ppb_flash_x509_certificate_shared.cc

Issue 9405038: Add PPAPI interface for secure sockets in flash (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 9 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 (c) 2012 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 "ppapi/shared_impl/private/ppb_flash_x509_certificate_shared.h"
6
7 #include "ppapi/cpp/var.h"
8 #include "ppapi/cpp/var_array_buffer.h"
9 #include "ppapi/proxy/dispatcher.h"
10 #include "ppapi/proxy/ppapi_param_traits.h"
11 #include "ppapi/proxy/serialized_var.h"
12
13 namespace ppapi {
14
15 PPB_X509Certificate_Fields::PPB_X509Certificate_Fields() :
16 data_(PP_FLASH_X509CERTIFICATE_FIELD_COUNT, pp::Var())
17 {
18 }
19
20 PPB_X509Certificate_Fields::~PPB_X509Certificate_Fields() {
21 }
22
23 pp::Var& PPB_X509Certificate_Fields::operator[](
24 const PP_Flash_X509Certificate_Field field) {
25 uint32_t index = static_cast<uint32_t>(field);
26 CHECK(index < data_.size());
27 return data_[index];
28 }
29
30 enum VarType {
31 ARRAY_BUFFER,
32 STRING,
33 UNDEFINED
34 };
35
36 void PPB_X509Certificate_Fields::WriteToMessage(IPC::Message* m) const {
37 // TODO(raymes): AFAICT there is no mechanism for serializing Vars for
38 // transfer between the browser process and the plugin process, so we do
39 // serialization of the fields here manually. This isn't ideal but it still
40 // saves a ton of boilerplate for handling each field separately.
41 for (size_t i = 0; i < data_.size(); ++i) {
42 if (data_[i].is_array_buffer()) {
43 IPC::ParamTraits<uint16_t>::Write(m, static_cast<uint16_t>(ARRAY_BUFFER));
44 pp::VarArrayBuffer array_buffer(data_[i]);
45 char* bytes = static_cast<char*>(array_buffer.Map());
46 std::vector<char> bytes_vector(bytes, bytes + array_buffer.ByteLength());
47 array_buffer.Unmap();
48 IPC::ParamTraits<std::vector<char> >::Write(m, bytes_vector);
49 } else if(data_[i].is_string()) {
50 IPC::ParamTraits<uint16_t>::Write(m, static_cast<uint16_t>(STRING));
51 IPC::ParamTraits<std::string>::Write(m, data_[i].AsString());
52 }
53 else if(data_[i].is_undefined()) {
54 IPC::ParamTraits<uint16_t>::Write(m, static_cast<uint16_t>(UNDEFINED));
55 }
56 else {
57 // Not expecting any other variable types to be fields.
58 CHECK(false);
59 }
60 }
61 }
62
63 bool PPB_X509Certificate_Fields::ReadFromMessage(
64 const IPC::Message* m, void** iter) {
65 bool result;
66 for (size_t i = 0; i < data_.size(); ++i) {
67 uint16_t type;
68 result = IPC::ParamTraits<uint16_t>::Read(m, iter, &type);
69 if (!result)
70 return false;
71
72 if (static_cast<VarType>(type) == ARRAY_BUFFER) {
73 std::vector<char> bytes_vector;
74 result = IPC::ParamTraits<std::vector<char> >::Read(m, iter,
75 &bytes_vector);
76 if (!result)
77 return false;
78 pp::VarArrayBuffer array_buffer(bytes_vector.size());
79 if (!bytes_vector.empty()) {
80 char* bytes = static_cast<char*>(array_buffer.Map());
81 memcpy(bytes, &bytes_vector[0], bytes_vector.size());
82 }
83 array_buffer.Unmap();
84 data_[i] = array_buffer;
85 } else if (type == STRING) {
86 std::string string;
87 result = IPC::ParamTraits<std::string>::Read(m, iter, &string);
88 if (!result)
89 return false;
90 data_[i] = pp::Var(string);
91 }
92 else if (type == UNDEFINED) {
93 data_[i] = pp::Var();
94 }
95 else {
96 // Not expecting any other variable types to be fields.
97 CHECK(false);
98 }
99 }
100 return true;
101 }
102
103 //------------------------------------------------------------------------------
104
105 PPB_Flash_X509Certificate_Shared::PPB_Flash_X509Certificate_Shared(
106 ResourceObjectType type,
107 PP_Instance instance) :
108 Resource(type, instance),
109 fields_(NULL) {
110 }
111
112 PPB_Flash_X509Certificate_Shared::PPB_Flash_X509Certificate_Shared(
113 ResourceObjectType type,
114 PP_Instance instance,
115 const PPB_X509Certificate_Fields& fields) :
116 Resource(type, instance),
117 fields_(new PPB_X509Certificate_Fields(fields))
118 {
119 }
120
121 PPB_Flash_X509Certificate_Shared::~PPB_Flash_X509Certificate_Shared() {
122 }
123
124 thunk::PPB_Flash_X509Certificate_API*
125 PPB_Flash_X509Certificate_Shared::AsPPB_Flash_X509Certificate_API() {
126 return this;
127 }
128
129 PP_Bool PPB_Flash_X509Certificate_Shared::Init(const char* bytes,
130 uint32_t length) {
131 if (fields_.get())
132 return PP_FALSE;
133
134 if (!bytes || length == 0)
135 return PP_FALSE;
136
137 std::vector<char> der(bytes, bytes + length);
138 fields_.reset(new PPB_X509Certificate_Fields());
139 return PP_FromBool(ParseDER(der, fields_.get()));
140 }
141
142 PP_Var PPB_Flash_X509Certificate_Shared::GetField(
143 PP_Flash_X509Certificate_Field field) {
144 if (!fields_.get())
145 return PP_MakeUndefined();
146
147 return (*fields_)[field].pp_var();
148 }
149
150 bool PPB_Flash_X509Certificate_Shared::ParseDER(
151 const std::vector<char>& der,
152 PPB_X509Certificate_Fields* result) {
153 // A concrete PPB_Flash_X509Certificate_Shared should only ever be constructed
154 // by passing in PPB_X509Certificate_Fields, in which case it is already
155 // initialized.
156 CHECK(false);
157 return false;
158 }
159
160 } // namespace ppapi
OLDNEW
« no previous file with comments | « ppapi/shared_impl/private/ppb_flash_x509_certificate_shared.h ('k') | ppapi/shared_impl/resource.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698