Imported Upstream version 3.8.0
[platform/upstream/protobuf.git] / php / src / Google / Protobuf / Any.php
1 <?php
2 # Generated by the protocol buffer compiler.  DO NOT EDIT!
3 # source: google/protobuf/any.proto
4
5 namespace Google\Protobuf;
6
7 use Google\Protobuf\Internal\GPBType;
8 use Google\Protobuf\Internal\Message;
9 use Google\Protobuf\Internal\RepeatedField;
10 use Google\Protobuf\Internal\GPBUtil;
11
12 /**
13  * `Any` contains an arbitrary serialized protocol buffer message along with a
14  * URL that describes the type of the serialized message.
15  * Protobuf library provides support to pack/unpack Any values in the form
16  * of utility functions or additional generated methods of the Any type.
17  * Example 1: Pack and unpack a message in C++.
18  *     Foo foo = ...;
19  *     Any any;
20  *     any.PackFrom(foo);
21  *     ...
22  *     if (any.UnpackTo(&foo)) {
23  *       ...
24  *     }
25  * Example 2: Pack and unpack a message in Java.
26  *     Foo foo = ...;
27  *     Any any = Any.pack(foo);
28  *     ...
29  *     if (any.is(Foo.class)) {
30  *       foo = any.unpack(Foo.class);
31  *     }
32  *  Example 3: Pack and unpack a message in Python.
33  *     foo = Foo(...)
34  *     any = Any()
35  *     any.Pack(foo)
36  *     ...
37  *     if any.Is(Foo.DESCRIPTOR):
38  *       any.Unpack(foo)
39  *       ...
40  *  Example 4: Pack and unpack a message in Go
41  *      foo := &pb.Foo{...}
42  *      any, err := ptypes.MarshalAny(foo)
43  *      ...
44  *      foo := &pb.Foo{}
45  *      if err := ptypes.UnmarshalAny(any, foo); err != nil {
46  *        ...
47  *      }
48  * The pack methods provided by protobuf library will by default use
49  * 'type.googleapis.com/full.type.name' as the type URL and the unpack
50  * methods only use the fully qualified type name after the last '/'
51  * in the type URL, for example "foo.bar.com/x/y.z" will yield type
52  * name "y.z".
53  * JSON
54  * ====
55  * The JSON representation of an `Any` value uses the regular
56  * representation of the deserialized, embedded message, with an
57  * additional field `&#64;type` which contains the type URL. Example:
58  *     package google.profile;
59  *     message Person {
60  *       string first_name = 1;
61  *       string last_name = 2;
62  *     }
63  *     {
64  *       "&#64;type": "type.googleapis.com/google.profile.Person",
65  *       "firstName": <string>,
66  *       "lastName": <string>
67  *     }
68  * If the embedded message type is well-known and has a custom JSON
69  * representation, that representation will be embedded adding a field
70  * `value` which holds the custom JSON in addition to the `&#64;type`
71  * field. Example (for message [google.protobuf.Duration][]):
72  *     {
73  *       "&#64;type": "type.googleapis.com/google.protobuf.Duration",
74  *       "value": "1.212s"
75  *     }
76  *
77  * Generated from protobuf message <code>google.protobuf.Any</code>
78  */
79 class Any extends \Google\Protobuf\Internal\Message
80 {
81     /**
82      * A URL/resource name that uniquely identifies the type of the serialized
83      * protocol buffer message. The last segment of the URL's path must represent
84      * the fully qualified name of the type (as in
85      * `path/google.protobuf.Duration`). The name should be in a canonical form
86      * (e.g., leading "." is not accepted).
87      * In practice, teams usually precompile into the binary all types that they
88      * expect it to use in the context of Any. However, for URLs which use the
89      * scheme `http`, `https`, or no scheme, one can optionally set up a type
90      * server that maps type URLs to message definitions as follows:
91      * * If no scheme is provided, `https` is assumed.
92      * * An HTTP GET on the URL must yield a [google.protobuf.Type][]
93      *   value in binary format, or produce an error.
94      * * Applications are allowed to cache lookup results based on the
95      *   URL, or have them precompiled into a binary to avoid any
96      *   lookup. Therefore, binary compatibility needs to be preserved
97      *   on changes to types. (Use versioned type names to manage
98      *   breaking changes.)
99      * Note: this functionality is not currently available in the official
100      * protobuf release, and it is not used for type URLs beginning with
101      * type.googleapis.com.
102      * Schemes other than `http`, `https` (or the empty scheme) might be
103      * used with implementation specific semantics.
104      *
105      * Generated from protobuf field <code>string type_url = 1;</code>
106      */
107     private $type_url = '';
108     /**
109      * Must be a valid serialized protocol buffer of the above specified type.
110      *
111      * Generated from protobuf field <code>bytes value = 2;</code>
112      */
113     private $value = '';
114
115     const TYPE_URL_PREFIX = 'type.googleapis.com/';
116
117     /**
118      * Constructor.
119      *
120      * @param array $data {
121      *     Optional. Data for populating the Message object.
122      *
123      *     @type string $type_url
124      *           A URL/resource name that uniquely identifies the type of the serialized
125      *           protocol buffer message. The last segment of the URL's path must represent
126      *           the fully qualified name of the type (as in
127      *           `path/google.protobuf.Duration`). The name should be in a canonical form
128      *           (e.g., leading "." is not accepted).
129      *           In practice, teams usually precompile into the binary all types that they
130      *           expect it to use in the context of Any. However, for URLs which use the
131      *           scheme `http`, `https`, or no scheme, one can optionally set up a type
132      *           server that maps type URLs to message definitions as follows:
133      *           * If no scheme is provided, `https` is assumed.
134      *           * An HTTP GET on the URL must yield a [google.protobuf.Type][]
135      *             value in binary format, or produce an error.
136      *           * Applications are allowed to cache lookup results based on the
137      *             URL, or have them precompiled into a binary to avoid any
138      *             lookup. Therefore, binary compatibility needs to be preserved
139      *             on changes to types. (Use versioned type names to manage
140      *             breaking changes.)
141      *           Note: this functionality is not currently available in the official
142      *           protobuf release, and it is not used for type URLs beginning with
143      *           type.googleapis.com.
144      *           Schemes other than `http`, `https` (or the empty scheme) might be
145      *           used with implementation specific semantics.
146      *     @type string $value
147      *           Must be a valid serialized protocol buffer of the above specified type.
148      * }
149      */
150     public function __construct($data = NULL) {
151         \GPBMetadata\Google\Protobuf\Any::initOnce();
152         parent::__construct($data);
153     }
154
155     /**
156      * A URL/resource name that uniquely identifies the type of the serialized
157      * protocol buffer message. The last segment of the URL's path must represent
158      * the fully qualified name of the type (as in
159      * `path/google.protobuf.Duration`). The name should be in a canonical form
160      * (e.g., leading "." is not accepted).
161      * In practice, teams usually precompile into the binary all types that they
162      * expect it to use in the context of Any. However, for URLs which use the
163      * scheme `http`, `https`, or no scheme, one can optionally set up a type
164      * server that maps type URLs to message definitions as follows:
165      * * If no scheme is provided, `https` is assumed.
166      * * An HTTP GET on the URL must yield a [google.protobuf.Type][]
167      *   value in binary format, or produce an error.
168      * * Applications are allowed to cache lookup results based on the
169      *   URL, or have them precompiled into a binary to avoid any
170      *   lookup. Therefore, binary compatibility needs to be preserved
171      *   on changes to types. (Use versioned type names to manage
172      *   breaking changes.)
173      * Note: this functionality is not currently available in the official
174      * protobuf release, and it is not used for type URLs beginning with
175      * type.googleapis.com.
176      * Schemes other than `http`, `https` (or the empty scheme) might be
177      * used with implementation specific semantics.
178      *
179      * Generated from protobuf field <code>string type_url = 1;</code>
180      * @return string
181      */
182     public function getTypeUrl()
183     {
184         return $this->type_url;
185     }
186
187     /**
188      * A URL/resource name that uniquely identifies the type of the serialized
189      * protocol buffer message. The last segment of the URL's path must represent
190      * the fully qualified name of the type (as in
191      * `path/google.protobuf.Duration`). The name should be in a canonical form
192      * (e.g., leading "." is not accepted).
193      * In practice, teams usually precompile into the binary all types that they
194      * expect it to use in the context of Any. However, for URLs which use the
195      * scheme `http`, `https`, or no scheme, one can optionally set up a type
196      * server that maps type URLs to message definitions as follows:
197      * * If no scheme is provided, `https` is assumed.
198      * * An HTTP GET on the URL must yield a [google.protobuf.Type][]
199      *   value in binary format, or produce an error.
200      * * Applications are allowed to cache lookup results based on the
201      *   URL, or have them precompiled into a binary to avoid any
202      *   lookup. Therefore, binary compatibility needs to be preserved
203      *   on changes to types. (Use versioned type names to manage
204      *   breaking changes.)
205      * Note: this functionality is not currently available in the official
206      * protobuf release, and it is not used for type URLs beginning with
207      * type.googleapis.com.
208      * Schemes other than `http`, `https` (or the empty scheme) might be
209      * used with implementation specific semantics.
210      *
211      * Generated from protobuf field <code>string type_url = 1;</code>
212      * @param string $var
213      * @return $this
214      */
215     public function setTypeUrl($var)
216     {
217         GPBUtil::checkString($var, True);
218         $this->type_url = $var;
219
220         return $this;
221     }
222
223     /**
224      * Must be a valid serialized protocol buffer of the above specified type.
225      *
226      * Generated from protobuf field <code>bytes value = 2;</code>
227      * @return string
228      */
229     public function getValue()
230     {
231         return $this->value;
232     }
233
234     /**
235      * Must be a valid serialized protocol buffer of the above specified type.
236      *
237      * Generated from protobuf field <code>bytes value = 2;</code>
238      * @param string $var
239      * @return $this
240      */
241     public function setValue($var)
242     {
243         GPBUtil::checkString($var, False);
244         $this->value = $var;
245
246         return $this;
247     }
248
249     /**
250      * This method will try to resolve the type_url in Any message to get the
251      * targeted message type. If failed, an error will be thrown. Otherwise,
252      * the method will create a message of the targeted type and fill it with
253      * the decoded value in Any.
254      * @return unpacked message
255      * @throws \Exception Type url needs to be type.googleapis.com/fully-qulified.
256      * @throws \Exception Class hasn't been added to descriptor pool.
257      * @throws \Exception cannot decode data in value field.
258      */
259     public function unpack()
260     {
261         // Get fully qualifed name from type url.
262         $url_prifix_len = strlen(GPBUtil::TYPE_URL_PREFIX);
263         if (substr($this->type_url, 0, $url_prifix_len) !=
264                 GPBUtil::TYPE_URL_PREFIX) {
265             throw new \Exception(
266                 "Type url needs to be type.googleapis.com/fully-qulified");
267         }
268         $fully_qualifed_name =
269             substr($this->type_url, $url_prifix_len);
270
271         // Create message according to fully qualified name.
272         $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
273         $desc = $pool->getDescriptorByProtoName( ".".$fully_qualifed_name);
274         if (is_null($desc)) {
275             throw new \Exception("Class ".$fully_qualifed_name
276                                      ." hasn't been added to descriptor pool");
277         }
278         $klass = $desc->getClass();
279         $msg = new $klass();
280
281         // Merge data into message.
282         $msg->mergeFromString($this->value);
283         return $msg;
284     }
285
286     /**
287      * The type_url will be created according to the given message’s type and
288      * the value is encoded data from the given message..
289      * @param message: A proto message.
290      */
291     public function pack($msg)
292     {
293         if (!$msg instanceof Message) {
294             trigger_error("Given parameter is not a message instance.",
295                           E_USER_ERROR);
296             return;
297         }
298
299         // Set value using serialzed message.
300         $this->value = $msg->serializeToString();
301
302         // Set type url.
303         $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
304         $desc = $pool->getDescriptorByClassName(get_class($msg));
305         $fully_qualifed_name = $desc->getFullName();
306         $this->type_url = GPBUtil::TYPE_URL_PREFIX.substr(
307             $fully_qualifed_name, 1, strlen($fully_qualifed_name));
308     }
309
310     /**
311      * This method returns whether the type_url in any_message is corresponded
312      * to the given class.
313      * @param klass: The fully qualified PHP class name of a proto message type.
314      */
315     public function is($klass)
316     {
317         $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
318         $desc = $pool->getDescriptorByClassName($klass);
319         $fully_qualifed_name = $desc->getFullName();
320         $type_url = GPBUtil::TYPE_URL_PREFIX.substr(
321             $fully_qualifed_name, 1, strlen($fully_qualifed_name));
322         return $this->type_url === $type_url;
323     }
324 }
325