1: <?php
2: /*
3: *
4: * Copyright 2015, Google Inc.
5: * All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions are
9: * met:
10: *
11: * * Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * * Redistributions in binary form must reproduce the above
14: * copyright notice, this list of conditions and the following disclaimer
15: * in the documentation and/or other materials provided with the
16: * distribution.
17: * * Neither the name of Google Inc. nor the names of its
18: * contributors may be used to endorse or promote products derived from
19: * this software without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32: *
33: */
34:
35: namespace Grpc;
36:
37: /**
38: * Class AbstractCall.
39: * @package Grpc
40: */
41: abstract class AbstractCall
42: {
43: /**
44: * @var Call
45: */
46: protected $call;
47: protected $deserialize;
48: protected $metadata;
49: protected $trailing_metadata;
50:
51: /**
52: * Create a new Call wrapper object.
53: *
54: * @param Channel $channel The channel to communicate on
55: * @param string $method The method to call on the
56: * remote server
57: * @param callback $deserialize A callback function to deserialize
58: * the response
59: * @param array $options Call options (optional)
60: */
61: public function __construct(Channel $channel,
62: $method,
63: $deserialize,
64: array $options = [])
65: {
66: if (array_key_exists('timeout', $options) &&
67: is_numeric($timeout = $options['timeout'])
68: ) {
69: $now = Timeval::now();
70: $delta = new Timeval($timeout);
71: $deadline = $now->add($delta);
72: } else {
73: $deadline = Timeval::infFuture();
74: }
75: $this->call = new Call($channel, $method, $deadline);
76: $this->deserialize = $deserialize;
77: $this->metadata = null;
78: $this->trailing_metadata = null;
79: if (array_key_exists('call_credentials_callback', $options) &&
80: is_callable($call_credentials_callback =
81: $options['call_credentials_callback'])
82: ) {
83: $call_credentials = CallCredentials::createFromPlugin(
84: $call_credentials_callback
85: );
86: $this->call->setCredentials($call_credentials);
87: }
88: }
89:
90: /**
91: * @return mixed The metadata sent by the server
92: */
93: public function getMetadata()
94: {
95: return $this->metadata;
96: }
97:
98: /**
99: * @return mixed The trailing metadata sent by the server
100: */
101: public function getTrailingMetadata()
102: {
103: return $this->trailing_metadata;
104: }
105:
106: /**
107: * @return string The URI of the endpoint
108: */
109: public function getPeer()
110: {
111: return $this->call->getPeer();
112: }
113:
114: /**
115: * Cancels the call.
116: */
117: public function cancel()
118: {
119: $this->call->cancel();
120: }
121:
122: /**
123: * Serialize a message to the protobuf binary format.
124: *
125: * @param mixed $data The Protobuf message
126: *
127: * @return string The protobuf binary format
128: */
129: protected function _serializeMessage($data)
130: {
131: // Proto3 implementation
132: if (method_exists($data, 'encode')) {
133: return $data->encode();
134: }
135:
136: // Protobuf-PHP implementation
137: return $data->serialize();
138: }
139:
140: /**
141: * Deserialize a response value to an object.
142: *
143: * @param string $value The binary value to deserialize
144: *
145: * @return mixed The deserialized value
146: */
147: protected function _deserializeResponse($value)
148: {
149: if ($value === null) {
150: return;
151: }
152:
153: // Proto3 implementation
154: if (is_array($this->deserialize)) {
155: list($className, $deserializeFunc) = $this->deserialize;
156: $obj = new $className();
157: $obj->$deserializeFunc($value);
158:
159: return $obj;
160: }
161:
162: // Protobuf-PHP implementation
163: return call_user_func($this->deserialize, $value);
164: }
165:
166: /**
167: * Set the CallCredentials for the underlying Call.
168: *
169: * @param CallCredentials $call_credentials The CallCredentials object
170: */
171: public function setCallCredentials($call_credentials)
172: {
173: $this->call->setCredentials($call_credentials);
174: }
175: }
176: