message.c 107 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726
  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2014 Google Inc. All rights reserved.
  3. // https://developers.google.com/protocol-buffers/
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are
  7. // met:
  8. //
  9. // * Redistributions of source code must retain the above copyright
  10. // notice, this list of conditions and the following disclaimer.
  11. // * Redistributions in binary form must reproduce the above
  12. // copyright notice, this list of conditions and the following disclaimer
  13. // in the documentation and/or other materials provided with the
  14. // distribution.
  15. // * Neither the name of Google Inc. nor the names of its
  16. // contributors may be used to endorse or promote products derived from
  17. // this software without specific prior written permission.
  18. //
  19. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  23. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. #include <php.h>
  31. #include <Zend/zend_exceptions.h>
  32. #include <stdlib.h>
  33. #include <inttypes.h>
  34. #if PHP_MAJOR_VERSION < 7
  35. #include <Zend/zend_compile.h>
  36. #else
  37. #include <Zend/zend_inheritance.h>
  38. #endif
  39. #include "protobuf.h"
  40. #include "utf8.h"
  41. zend_class_entry* message_type;
  42. zend_object_handlers* message_handlers;
  43. static const char TYPE_URL_PREFIX[] = "type.googleapis.com/";
  44. static void hex_to_binary(const char* hex, char** binary, int* binary_len);
  45. static zend_function_entry message_methods[] = {
  46. PHP_ME(Message, clear, NULL, ZEND_ACC_PUBLIC)
  47. PHP_ME(Message, discardUnknownFields, NULL, ZEND_ACC_PUBLIC)
  48. PHP_ME(Message, serializeToString, NULL, ZEND_ACC_PUBLIC)
  49. PHP_ME(Message, mergeFromString, NULL, ZEND_ACC_PUBLIC)
  50. PHP_ME(Message, serializeToJsonString, NULL, ZEND_ACC_PUBLIC)
  51. PHP_ME(Message, mergeFromJsonString, NULL, ZEND_ACC_PUBLIC)
  52. PHP_ME(Message, mergeFrom, NULL, ZEND_ACC_PUBLIC)
  53. PHP_ME(Message, readWrapperValue, NULL, ZEND_ACC_PROTECTED)
  54. PHP_ME(Message, writeWrapperValue, NULL, ZEND_ACC_PROTECTED)
  55. PHP_ME(Message, readOneof, NULL, ZEND_ACC_PROTECTED)
  56. PHP_ME(Message, writeOneof, NULL, ZEND_ACC_PROTECTED)
  57. PHP_ME(Message, whichOneof, NULL, ZEND_ACC_PROTECTED)
  58. PHP_ME(Message, __construct, NULL, ZEND_ACC_PROTECTED)
  59. {NULL, NULL, NULL}
  60. };
  61. // Forward declare static functions.
  62. #if PHP_MAJOR_VERSION < 7
  63. static void message_set_property(zval* object, zval* member, zval* value,
  64. php_proto_zend_literal key TSRMLS_DC);
  65. static zval* message_get_property(zval* object, zval* member, int type,
  66. const zend_literal* key TSRMLS_DC);
  67. static zval** message_get_property_ptr_ptr(zval* object, zval* member, int type,
  68. php_proto_zend_literal key TSRMLS_DC);
  69. static HashTable* message_get_gc(zval* object, zval*** table, int* n TSRMLS_DC);
  70. #else
  71. static void message_set_property(zval* object, zval* member, zval* value,
  72. void** cache_slot);
  73. static zval* message_get_property(zval* object, zval* member, int type,
  74. void** cache_slot, zval* rv);
  75. static zval* message_get_property_ptr_ptr(zval* object, zval* member, int type,
  76. void** cache_slot);
  77. static HashTable* message_get_gc(zval* object, zval** table, int* n);
  78. #endif
  79. static HashTable* message_get_properties(zval* object TSRMLS_DC);
  80. // -----------------------------------------------------------------------------
  81. // PHP Message Handlers
  82. // -----------------------------------------------------------------------------
  83. // Define object free method.
  84. PHP_PROTO_OBJECT_FREE_START(MessageHeader, message)
  85. if (intern->data) {
  86. if (*(void**)intern->data != NULL) {
  87. stringsink_uninit_opaque(*(void**)intern->data);
  88. FREE(*(void**)intern->data);
  89. }
  90. FREE(intern->data);
  91. }
  92. PHP_PROTO_OBJECT_FREE_END
  93. PHP_PROTO_OBJECT_DTOR_START(MessageHeader, message)
  94. PHP_PROTO_OBJECT_DTOR_END
  95. // Define object create method.
  96. PHP_PROTO_OBJECT_CREATE_START(MessageHeader, message)
  97. // Because php call this create func before calling the sub-message's
  98. // constructor defined in PHP, it's possible that the descriptor of this class
  99. // hasn't been added to descriptor pool (when the class is first
  100. // instantiated). In that case, we will defer the initialization of the custom
  101. // data to the parent Message's constructor, which will be called by
  102. // sub-message's constructors after the descriptor has been added.
  103. PHP_PROTO_OBJECT_CREATE_END(MessageHeader, message)
  104. // Init class entry.
  105. PHP_PROTO_INIT_CLASS_START("Google\\Protobuf\\Internal\\Message",
  106. MessageHeader, message)
  107. message_handlers->write_property = message_set_property;
  108. message_handlers->read_property = message_get_property;
  109. message_handlers->get_property_ptr_ptr = message_get_property_ptr_ptr;
  110. message_handlers->get_properties = message_get_properties;
  111. message_handlers->get_gc = message_get_gc;
  112. PHP_PROTO_INIT_CLASS_END
  113. static void message_set_property_internal(zval* object, zval* member,
  114. zval* value TSRMLS_DC) {
  115. const upb_fielddef* field;
  116. MessageHeader* self = UNBOX(MessageHeader, object);
  117. field = upb_msgdef_ntofz(self->descriptor->msgdef, Z_STRVAL_P(member));
  118. if (field == NULL) {
  119. zend_error(E_USER_ERROR, "Unknown field: %s", Z_STRVAL_P(member));
  120. }
  121. layout_set(self->descriptor->layout, self, field, value TSRMLS_CC);
  122. }
  123. #if PHP_MAJOR_VERSION < 7
  124. static void message_set_property(zval* object, zval* member, zval* value,
  125. php_proto_zend_literal key TSRMLS_DC) {
  126. #else
  127. static void message_set_property(zval* object, zval* member, zval* value,
  128. void** cache_slot) {
  129. #endif
  130. if (Z_TYPE_P(member) != IS_STRING) {
  131. zend_error(E_USER_ERROR, "Unexpected type for field name");
  132. return;
  133. }
  134. #if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
  135. if (Z_OBJCE_P(object) != EG(scope)) {
  136. #else
  137. if (Z_OBJCE_P(object) != zend_get_executed_scope()) {
  138. #endif
  139. // User cannot set property directly (e.g., $m->a = 1)
  140. zend_error(E_USER_ERROR, "Cannot access private property.");
  141. return;
  142. }
  143. message_set_property_internal(object, member, value TSRMLS_CC);
  144. }
  145. static zval* message_get_property_internal(zval* object,
  146. zval* member TSRMLS_DC) {
  147. MessageHeader* self = UNBOX(MessageHeader, object);
  148. const upb_fielddef* field;
  149. field = upb_msgdef_ntofz(self->descriptor->msgdef, Z_STRVAL_P(member));
  150. if (field == NULL) {
  151. return PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL;
  152. }
  153. zend_property_info* property_info;
  154. #if PHP_MAJOR_VERSION < 7
  155. property_info =
  156. zend_get_property_info(Z_OBJCE_P(object), member, true TSRMLS_CC);
  157. #else
  158. property_info =
  159. zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(member), true);
  160. #endif
  161. return layout_get(
  162. self->descriptor->layout, self, field,
  163. OBJ_PROP(Z_OBJ_P(object), property_info->offset) TSRMLS_CC);
  164. }
  165. static void message_get_oneof_property_internal(zval* object, zval* member,
  166. zval* return_value TSRMLS_DC) {
  167. MessageHeader* self = UNBOX(MessageHeader, object);
  168. const upb_fielddef* field;
  169. field = upb_msgdef_ntofz(self->descriptor->msgdef, Z_STRVAL_P(member));
  170. if (field == NULL) {
  171. return;
  172. }
  173. layout_get(self->descriptor->layout, self, field,
  174. ZVAL_PTR_TO_CACHED_PTR(return_value) TSRMLS_CC);
  175. }
  176. #if PHP_MAJOR_VERSION < 7
  177. static zval* message_get_property(zval* object, zval* member, int type,
  178. const zend_literal* key TSRMLS_DC) {
  179. #else
  180. static zval* message_get_property(zval* object, zval* member, int type,
  181. void** cache_slot, zval* rv) {
  182. #endif
  183. if (Z_TYPE_P(member) != IS_STRING) {
  184. zend_error(E_USER_ERROR, "Property name has to be a string.");
  185. return PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL;
  186. }
  187. #if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
  188. if (Z_OBJCE_P(object) != EG(scope)) {
  189. #else
  190. if (Z_OBJCE_P(object) != zend_get_executed_scope()) {
  191. #endif
  192. // User cannot get property directly (e.g., $a = $m->a)
  193. zend_error(E_USER_ERROR, "Cannot access private property.");
  194. return PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL;
  195. }
  196. return message_get_property_internal(object, member TSRMLS_CC);
  197. }
  198. #if PHP_MAJOR_VERSION < 7
  199. static zval** message_get_property_ptr_ptr(zval* object, zval* member, int type,
  200. php_proto_zend_literal key
  201. TSRMLS_DC) {
  202. #else
  203. static zval* message_get_property_ptr_ptr(zval* object, zval* member, int type,
  204. void** cache_slot) {
  205. #endif
  206. return NULL;
  207. }
  208. static HashTable* message_get_properties(zval* object TSRMLS_DC) {
  209. return NULL;
  210. }
  211. static HashTable* message_get_gc(zval* object, CACHED_VALUE** table,
  212. int* n TSRMLS_DC) {
  213. zend_object* zobj = Z_OBJ_P(object);
  214. *table = zobj->properties_table;
  215. *n = zobj->ce->default_properties_count;
  216. return NULL;
  217. }
  218. // -----------------------------------------------------------------------------
  219. // C Message Utilities
  220. // -----------------------------------------------------------------------------
  221. void* message_data(MessageHeader* msg) {
  222. return msg->data;
  223. }
  224. void custom_data_init(const zend_class_entry* ce,
  225. MessageHeader* intern PHP_PROTO_TSRMLS_DC) {
  226. DescriptorInternal* desc = get_ce_desc(ce);
  227. intern->data = ALLOC_N(uint8_t, desc->layout->size);
  228. // We wrap first so that everything in the message object is GC-rooted in
  229. // case a collection happens during object creation in layout_init().
  230. intern->descriptor = desc;
  231. layout_init(desc->layout, message_data(intern),
  232. &intern->std PHP_PROTO_TSRMLS_CC);
  233. }
  234. #define INIT_MESSAGE_WITH_ARRAY \
  235. { \
  236. zval* array_wrapper = NULL; \
  237. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, \
  238. "|a!", &array_wrapper) == FAILURE) { \
  239. return; \
  240. } \
  241. Message_construct(getThis(), array_wrapper); \
  242. }
  243. // -----------------------------------------------------------------------------
  244. // PHP Methods
  245. // -----------------------------------------------------------------------------
  246. static void append_wrapper_message(
  247. zend_class_entry* subklass, RepeatedField* intern, zval* value TSRMLS_DC) {
  248. MessageHeader* submsg;
  249. const upb_fielddef* field;
  250. #if PHP_MAJOR_VERSION < 7
  251. zval* val = NULL;
  252. MAKE_STD_ZVAL(val);
  253. ZVAL_OBJ(val, subklass->create_object(subklass TSRMLS_CC));
  254. repeated_field_push_native(intern, &val);
  255. submsg = UNBOX(MessageHeader, val);
  256. #else
  257. zend_object* obj = subklass->create_object(subklass TSRMLS_CC);
  258. repeated_field_push_native(intern, &obj);
  259. submsg = (MessageHeader*)((char*)obj - XtOffsetOf(MessageHeader, std));
  260. #endif
  261. custom_data_init(subklass, submsg PHP_PROTO_TSRMLS_CC);
  262. field = upb_msgdef_itof(submsg->descriptor->msgdef, 1);
  263. layout_set(submsg->descriptor->layout, submsg, field, value TSRMLS_CC);
  264. }
  265. static void set_wrapper_message_as_map_value(
  266. zend_class_entry* subklass, zval* map, zval* key, zval* value TSRMLS_DC) {
  267. MessageHeader* submsg;
  268. const upb_fielddef* field;
  269. #if PHP_MAJOR_VERSION < 7
  270. zval* val = NULL;
  271. MAKE_STD_ZVAL(val);
  272. ZVAL_OBJ(val, subklass->create_object(subklass TSRMLS_CC));
  273. map_field_handlers->write_dimension(
  274. map, key, val TSRMLS_CC);
  275. submsg = UNBOX(MessageHeader, val);
  276. #else
  277. zval val;
  278. zend_object* obj = subklass->create_object(subklass TSRMLS_CC);
  279. ZVAL_OBJ(&val, obj);
  280. map_field_handlers->write_dimension(map, key, &val TSRMLS_CC);
  281. submsg = (MessageHeader*)((char*)obj - XtOffsetOf(MessageHeader, std));
  282. #endif
  283. custom_data_init(subklass, submsg PHP_PROTO_TSRMLS_CC);
  284. field = upb_msgdef_itof(submsg->descriptor->msgdef, 1);
  285. layout_set(submsg->descriptor->layout, submsg, field, value TSRMLS_CC);
  286. }
  287. void Message_construct(zval* msg, zval* array_wrapper) {
  288. TSRMLS_FETCH();
  289. zend_class_entry* ce = Z_OBJCE_P(msg);
  290. MessageHeader* intern = NULL;
  291. if (!class_added(ce)) {
  292. #if PHP_MAJOR_VERSION < 7
  293. DescriptorInternal* desc = get_class_desc(ce->name);
  294. #else
  295. DescriptorInternal* desc = get_class_desc(ZSTR_VAL(ce->name));
  296. #endif
  297. register_class(desc, false TSRMLS_CC);
  298. }
  299. intern = UNBOX(MessageHeader, msg);
  300. custom_data_init(ce, intern PHP_PROTO_TSRMLS_CC);
  301. if (array_wrapper == NULL) {
  302. return;
  303. }
  304. HashTable* array = Z_ARRVAL_P(array_wrapper);
  305. HashPosition pointer;
  306. zval key;
  307. void* value;
  308. const upb_fielddef* field;
  309. for (zend_hash_internal_pointer_reset_ex(array, &pointer);
  310. php_proto_zend_hash_get_current_data_ex(array, (void**)&value,
  311. &pointer) == SUCCESS;
  312. zend_hash_move_forward_ex(array, &pointer)) {
  313. zend_hash_get_current_key_zval_ex(array, &key, &pointer);
  314. field = upb_msgdef_ntofz(intern->descriptor->msgdef, Z_STRVAL_P(&key));
  315. #if PHP_MAJOR_VERSION >= 7
  316. if (Z_ISREF_P((CACHED_VALUE*)value)) {
  317. value = Z_REFVAL_P((CACHED_VALUE*)value);
  318. }
  319. #endif
  320. if (field == NULL) {
  321. zend_error(E_USER_ERROR, "Unknown field: %s", Z_STRVAL_P(&key));
  322. }
  323. if (upb_fielddef_ismap(field)) {
  324. PHP_PROTO_FAKE_SCOPE_BEGIN(Z_OBJCE_P(msg));
  325. zval* submap = message_get_property_internal(msg, &key TSRMLS_CC);
  326. PHP_PROTO_FAKE_SCOPE_END;
  327. HashTable* subtable = HASH_OF(
  328. CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)value));
  329. HashPosition subpointer;
  330. zval subkey;
  331. void* memory;
  332. bool is_wrapper = false;
  333. zend_class_entry* subklass = NULL;
  334. const upb_msgdef* mapentry = upb_fielddef_msgsubdef(field);
  335. const upb_fielddef *value_field = upb_msgdef_itof(mapentry, 2);
  336. if (upb_fielddef_issubmsg(value_field)) {
  337. const upb_msgdef* submsgdef = upb_fielddef_msgsubdef(value_field);
  338. upb_wellknowntype_t type = upb_msgdef_wellknowntype(submsgdef);
  339. is_wrapper = is_wrapper_msg(submsgdef);
  340. if (is_wrapper) {
  341. DescriptorInternal* subdesc = get_msgdef_desc(submsgdef);
  342. register_class(subdesc, false TSRMLS_CC);
  343. subklass = subdesc->klass;
  344. }
  345. }
  346. for (zend_hash_internal_pointer_reset_ex(subtable, &subpointer);
  347. php_proto_zend_hash_get_current_data_ex(subtable, (void**)&memory,
  348. &subpointer) == SUCCESS;
  349. zend_hash_move_forward_ex(subtable, &subpointer)) {
  350. zend_hash_get_current_key_zval_ex(subtable, &subkey, &subpointer);
  351. if (is_wrapper &&
  352. Z_TYPE_P(CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory)) != IS_OBJECT) {
  353. set_wrapper_message_as_map_value(
  354. subklass, submap, &subkey,
  355. CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory) TSRMLS_CC);
  356. } else {
  357. map_field_handlers->write_dimension(
  358. submap, &subkey,
  359. CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory) TSRMLS_CC);
  360. }
  361. zval_dtor(&subkey);
  362. }
  363. } else if (upb_fielddef_isseq(field)) {
  364. PHP_PROTO_FAKE_SCOPE_BEGIN(Z_OBJCE_P(msg));
  365. zval* subarray = message_get_property_internal(msg, &key TSRMLS_CC);
  366. PHP_PROTO_FAKE_SCOPE_END;
  367. HashTable* subtable = HASH_OF(
  368. CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)value));
  369. HashPosition subpointer;
  370. void* memory;
  371. bool is_wrapper = false;
  372. zend_class_entry* subklass = NULL;
  373. if (upb_fielddef_issubmsg(field)) {
  374. const upb_msgdef* submsgdef = upb_fielddef_msgsubdef(field);
  375. upb_wellknowntype_t type = upb_msgdef_wellknowntype(submsgdef);
  376. is_wrapper = is_wrapper_msg(submsgdef);
  377. if (is_wrapper) {
  378. DescriptorInternal* subdesc = get_msgdef_desc(submsgdef);
  379. register_class(subdesc, false TSRMLS_CC);
  380. subklass = subdesc->klass;
  381. }
  382. }
  383. for (zend_hash_internal_pointer_reset_ex(subtable, &subpointer);
  384. php_proto_zend_hash_get_current_data_ex(subtable, (void**)&memory,
  385. &subpointer) == SUCCESS;
  386. zend_hash_move_forward_ex(subtable, &subpointer)) {
  387. if (is_wrapper &&
  388. Z_TYPE_P(CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory)) != IS_OBJECT) {
  389. RepeatedField* intern = UNBOX(RepeatedField, subarray);
  390. append_wrapper_message(
  391. subklass, intern,
  392. CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory) TSRMLS_CC);
  393. } else {
  394. repeated_field_handlers->write_dimension(
  395. subarray, NULL,
  396. CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)memory) TSRMLS_CC);
  397. }
  398. }
  399. } else if (upb_fielddef_issubmsg(field)) {
  400. const upb_msgdef* submsgdef = upb_fielddef_msgsubdef(field);
  401. DescriptorInternal* desc = get_msgdef_desc(submsgdef);
  402. register_class(desc, false TSRMLS_CC);
  403. CACHED_VALUE* cached = NULL;
  404. if (upb_fielddef_containingoneof(field)) {
  405. void* memory = slot_memory(intern->descriptor->layout,
  406. message_data(intern), field);
  407. uint32_t* oneof_case = slot_oneof_case(intern->descriptor->layout,
  408. message_data(intern), field);
  409. int property_cache_index =
  410. intern->descriptor->layout->fields[upb_fielddef_index(field)]
  411. .cache_index;
  412. cached = OBJ_PROP(Z_OBJ_P(msg), property_cache_index);
  413. *(CACHED_VALUE**)(memory) = cached;
  414. *oneof_case = upb_fielddef_number(field);
  415. } else {
  416. zend_property_info* property_info;
  417. PHP_PROTO_FAKE_SCOPE_BEGIN(Z_OBJCE_P(msg));
  418. #if PHP_MAJOR_VERSION < 7
  419. property_info =
  420. zend_get_property_info(Z_OBJCE_P(msg), &key, true TSRMLS_CC);
  421. #else
  422. property_info =
  423. zend_get_property_info(Z_OBJCE_P(msg), Z_STR_P(&key), true);
  424. #endif
  425. PHP_PROTO_FAKE_SCOPE_END;
  426. cached = OBJ_PROP(Z_OBJ_P(msg), property_info->offset);
  427. }
  428. #if PHP_MAJOR_VERSION < 7
  429. SEPARATE_ZVAL_IF_NOT_REF(cached);
  430. #endif
  431. zval* submsg = CACHED_PTR_TO_ZVAL_PTR(cached);
  432. ZVAL_OBJ(submsg, desc->klass->create_object(desc->klass TSRMLS_CC));
  433. Message_construct(submsg, NULL);
  434. MessageHeader* to = UNBOX(MessageHeader, submsg);
  435. const upb_filedef *file = upb_msgdef_file(submsgdef);
  436. if (!strcmp(upb_filedef_name(file), "google/protobuf/wrappers.proto") &&
  437. Z_TYPE_P(CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)value)) != IS_OBJECT) {
  438. const upb_fielddef *value_field = upb_msgdef_itof(submsgdef, 1);
  439. layout_set(to->descriptor->layout, to,
  440. value_field, CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)value)
  441. TSRMLS_CC);
  442. } else {
  443. MessageHeader* from =
  444. UNBOX(MessageHeader,
  445. CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)value));
  446. if(from->descriptor != to->descriptor) {
  447. zend_error(E_USER_ERROR,
  448. "Cannot merge messages with different class.");
  449. return;
  450. }
  451. layout_merge(from->descriptor->layout, from, to TSRMLS_CC);
  452. }
  453. } else {
  454. message_set_property_internal(msg, &key,
  455. CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)value) TSRMLS_CC);
  456. }
  457. zval_dtor(&key);
  458. }
  459. }
  460. // At the first time the message is created, the class entry hasn't been
  461. // modified. As a result, the first created instance will be a normal zend
  462. // object. Here, we manually modify it to our message in such a case.
  463. PHP_METHOD(Message, __construct) {
  464. INIT_MESSAGE_WITH_ARRAY;
  465. }
  466. PHP_METHOD(Message, clear) {
  467. MessageHeader* msg = UNBOX(MessageHeader, getThis());
  468. DescriptorInternal* desc = msg->descriptor;
  469. register_class(desc, false TSRMLS_CC);
  470. zend_class_entry* ce = desc->klass;
  471. zend_object_std_dtor(&msg->std TSRMLS_CC);
  472. object_properties_init(&msg->std, ce);
  473. layout_init(desc->layout, message_data(msg), &msg->std TSRMLS_CC);
  474. }
  475. PHP_METHOD(Message, mergeFrom) {
  476. zval* value;
  477. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &value,
  478. message_type) == FAILURE) {
  479. return;
  480. }
  481. MessageHeader* from = UNBOX(MessageHeader, value);
  482. MessageHeader* to = UNBOX(MessageHeader, getThis());
  483. if(from->descriptor != to->descriptor) {
  484. zend_error(E_USER_ERROR, "Cannot merge messages with different class.");
  485. return;
  486. }
  487. layout_merge(from->descriptor->layout, from, to TSRMLS_CC);
  488. }
  489. PHP_METHOD(Message, readWrapperValue) {
  490. char* member;
  491. PHP_PROTO_SIZE length;
  492. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &member,
  493. &length) == FAILURE) {
  494. return;
  495. }
  496. MessageHeader* msg = UNBOX(MessageHeader, getThis());
  497. const upb_fielddef* field =
  498. upb_msgdef_ntofz(msg->descriptor->msgdef, member);
  499. if (upb_fielddef_containingoneof(field)) {
  500. uint32_t* oneof_case =
  501. slot_oneof_case(msg->descriptor->layout, message_data(msg), field);
  502. if (*oneof_case != upb_fielddef_number(field)) {
  503. RETURN_NULL();
  504. }
  505. }
  506. zval* cached_zval =
  507. CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, field));
  508. if (Z_TYPE_P(cached_zval) == IS_NULL) {
  509. RETURN_NULL();
  510. }
  511. if (Z_TYPE_P(cached_zval) == IS_OBJECT) {
  512. const upb_msgdef* submsgdef = upb_fielddef_msgsubdef(field);
  513. const upb_fielddef* value_field = upb_msgdef_itof(submsgdef, 1);
  514. MessageHeader* submsg = UNBOX(MessageHeader, cached_zval);
  515. CACHED_VALUE* cached_value = find_zval_property(submsg, value_field);
  516. layout_get(submsg->descriptor->layout, submsg, value_field,
  517. cached_value TSRMLS_CC);
  518. RETURN_ZVAL(CACHED_PTR_TO_ZVAL_PTR(cached_value), 1, 0);
  519. } else {
  520. RETURN_ZVAL(cached_zval, 1, 0);
  521. }
  522. }
  523. PHP_METHOD(Message, writeWrapperValue) {
  524. char* member;
  525. PHP_PROTO_SIZE length;
  526. zval* value;
  527. if (zend_parse_parameters(
  528. ZEND_NUM_ARGS() TSRMLS_CC, "sz", &member, &length, &value) ==
  529. FAILURE) {
  530. return;
  531. }
  532. MessageHeader* msg = UNBOX(MessageHeader, getThis());
  533. const upb_fielddef* field = upb_msgdef_ntofz(msg->descriptor->msgdef, member);
  534. zval* cached_zval =
  535. CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, field));
  536. if (Z_TYPE_P(value) == IS_NULL) {
  537. MessageHeader* msg = UNBOX(MessageHeader, getThis());
  538. layout_set(msg->descriptor->layout, msg,
  539. field, value TSRMLS_CC);
  540. return;
  541. }
  542. {
  543. // Type Checking
  544. const upb_msgdef* submsgdef = upb_fielddef_msgsubdef(field);
  545. const upb_fielddef* value_field = upb_msgdef_itof(submsgdef, 1);
  546. upb_fieldtype_t type = upb_fielddef_type(value_field);
  547. switch(type) {
  548. case UPB_TYPE_STRING:
  549. case UPB_TYPE_BYTES: {
  550. if (!protobuf_convert_to_string(value)) {
  551. return;
  552. }
  553. if (type == UPB_TYPE_STRING &&
  554. !is_structurally_valid_utf8(Z_STRVAL_P(value), Z_STRLEN_P(value))) {
  555. zend_error(E_USER_ERROR, "Given string is not UTF8 encoded.");
  556. return;
  557. }
  558. }
  559. break;
  560. #define CASE_TYPE(upb_type, type, c_type) \
  561. case UPB_TYPE_##upb_type: { \
  562. c_type type##_value; \
  563. if (!protobuf_convert_to_##type(value, &type##_value)) { \
  564. return; \
  565. } \
  566. break; \
  567. }
  568. CASE_TYPE(INT32, int32, int32_t)
  569. CASE_TYPE(UINT32, uint32, uint32_t)
  570. CASE_TYPE(ENUM, int32, int32_t)
  571. CASE_TYPE(INT64, int64, int64_t)
  572. CASE_TYPE(UINT64, uint64, uint64_t)
  573. CASE_TYPE(FLOAT, float, float)
  574. CASE_TYPE(DOUBLE, double, double)
  575. CASE_TYPE(BOOL, bool, int8_t)
  576. #undef CASE_TYPE
  577. }
  578. }
  579. if (upb_fielddef_containingoneof(field)) {
  580. uint32_t* oneof_case =
  581. slot_oneof_case(msg->descriptor->layout, message_data(msg), field);
  582. if (*oneof_case != upb_fielddef_number(field)) {
  583. zval null_value;
  584. ZVAL_NULL(&null_value);
  585. layout_set(msg->descriptor->layout, msg, field, &null_value TSRMLS_CC);
  586. cached_zval = CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, field));
  587. ZVAL_ZVAL(cached_zval, value, 1, 0);
  588. return;
  589. }
  590. }
  591. if (Z_TYPE_P(cached_zval) == IS_OBJECT) {
  592. const upb_msgdef* submsgdef = upb_fielddef_msgsubdef(field);
  593. const upb_fielddef* value_field = upb_msgdef_itof(submsgdef, 1);
  594. MessageHeader* submsg = UNBOX(MessageHeader, cached_zval);
  595. CACHED_VALUE* cached_value = find_zval_property(submsg, value_field);
  596. layout_set(submsg->descriptor->layout, submsg,
  597. value_field, value TSRMLS_CC);
  598. } else {
  599. ZVAL_ZVAL(cached_zval, value, 1, 0);
  600. }
  601. }
  602. PHP_METHOD(Message, readOneof) {
  603. PHP_PROTO_LONG index;
  604. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) ==
  605. FAILURE) {
  606. return;
  607. }
  608. MessageHeader* msg = UNBOX(MessageHeader, getThis());
  609. const upb_fielddef* field = upb_msgdef_itof(msg->descriptor->msgdef, index);
  610. // Unlike singular fields, oneof fields share cached property. So we cannot
  611. // let layout_get modify the cached property. Instead, we pass in the return
  612. // value directly.
  613. layout_get(msg->descriptor->layout, msg, field,
  614. ZVAL_PTR_TO_CACHED_PTR(return_value) TSRMLS_CC);
  615. }
  616. PHP_METHOD(Message, writeOneof) {
  617. PHP_PROTO_LONG index;
  618. zval* value;
  619. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz", &index, &value) ==
  620. FAILURE) {
  621. return;
  622. }
  623. MessageHeader* msg = UNBOX(MessageHeader, getThis());
  624. const upb_fielddef* field = upb_msgdef_itof(msg->descriptor->msgdef, index);
  625. layout_set(msg->descriptor->layout, msg, field, value TSRMLS_CC);
  626. }
  627. PHP_METHOD(Message, whichOneof) {
  628. char* oneof_name;
  629. PHP_PROTO_SIZE length;
  630. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &oneof_name,
  631. &length) == FAILURE) {
  632. return;
  633. }
  634. MessageHeader* msg = UNBOX(MessageHeader, getThis());
  635. const upb_oneofdef* oneof =
  636. upb_msgdef_ntoo(msg->descriptor->msgdef, oneof_name, length);
  637. const char* oneof_case_name = layout_get_oneof_case(
  638. msg->descriptor->layout, message_data(msg), oneof TSRMLS_CC);
  639. PHP_PROTO_RETURN_STRING(oneof_case_name, 1);
  640. }
  641. // -----------------------------------------------------------------------------
  642. // Well Known Types Support
  643. // -----------------------------------------------------------------------------
  644. #define PHP_PROTO_FIELD_ACCESSORS(UPPER_CLASS, LOWER_CLASS, UPPER_FIELD, \
  645. LOWER_FIELD) \
  646. PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) { \
  647. zval member; \
  648. PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
  649. PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type); \
  650. zval* value = message_get_property_internal(getThis(), &member TSRMLS_CC); \
  651. PHP_PROTO_FAKE_SCOPE_END; \
  652. zval_dtor(&member); \
  653. PHP_PROTO_RETVAL_ZVAL(value); \
  654. } \
  655. PHP_METHOD(UPPER_CLASS, set##UPPER_FIELD) { \
  656. zval* value = NULL; \
  657. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == \
  658. FAILURE) { \
  659. return; \
  660. } \
  661. zval member; \
  662. PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
  663. message_set_property_internal(getThis(), &member, value TSRMLS_CC); \
  664. zval_dtor(&member); \
  665. PHP_PROTO_RETVAL_ZVAL(getThis()); \
  666. }
  667. #define PHP_PROTO_ONEOF_FIELD_ACCESSORS(UPPER_CLASS, LOWER_CLASS, UPPER_FIELD, \
  668. LOWER_FIELD) \
  669. PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) { \
  670. zval member; \
  671. PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
  672. PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type); \
  673. message_get_oneof_property_internal(getThis(), &member, \
  674. return_value TSRMLS_CC); \
  675. PHP_PROTO_FAKE_SCOPE_END; \
  676. zval_dtor(&member); \
  677. } \
  678. PHP_METHOD(UPPER_CLASS, set##UPPER_FIELD) { \
  679. zval* value = NULL; \
  680. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == \
  681. FAILURE) { \
  682. return; \
  683. } \
  684. zval member; \
  685. PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
  686. message_set_property_internal(getThis(), &member, value TSRMLS_CC); \
  687. zval_dtor(&member); \
  688. PHP_PROTO_RETVAL_ZVAL(getThis()); \
  689. }
  690. #define PHP_PROTO_ONEOF_ACCESSORS(UPPER_CLASS, LOWER_CLASS, UPPER_FIELD, \
  691. LOWER_FIELD) \
  692. PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) { \
  693. MessageHeader* msg = UNBOX(MessageHeader, getThis()); \
  694. PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type); \
  695. const upb_oneofdef* oneof = upb_msgdef_ntoo( \
  696. msg->descriptor->msgdef, LOWER_FIELD, strlen(LOWER_FIELD)); \
  697. const char* oneof_case_name = layout_get_oneof_case( \
  698. msg->descriptor->layout, message_data(msg), oneof TSRMLS_CC); \
  699. PHP_PROTO_FAKE_SCOPE_END; \
  700. PHP_PROTO_RETURN_STRING(oneof_case_name, 1); \
  701. }
  702. // Forward declare file init functions
  703. static void init_file_any(TSRMLS_D);
  704. static void init_file_api(TSRMLS_D);
  705. static void init_file_duration(TSRMLS_D);
  706. static void init_file_field_mask(TSRMLS_D);
  707. static void init_file_empty(TSRMLS_D);
  708. static void init_file_source_context(TSRMLS_D);
  709. static void init_file_struct(TSRMLS_D);
  710. static void init_file_timestamp(TSRMLS_D);
  711. static void init_file_type(TSRMLS_D);
  712. static void init_file_wrappers(TSRMLS_D);
  713. // Define file init functions
  714. static void init_file_any(TSRMLS_D) {
  715. if (is_inited_file_any) return;
  716. init_generated_pool_once(TSRMLS_C);
  717. const char* generated_file =
  718. "0acd010a19676f6f676c652f70726f746f6275662f616e792e70726f746f"
  719. "120f676f6f676c652e70726f746f62756622260a03416e7912100a087479"
  720. "70655f75726c180120012809120d0a0576616c756518022001280c426f0a"
  721. "13636f6d2e676f6f676c652e70726f746f6275664208416e7950726f746f"
  722. "50015a256769746875622e636f6d2f676f6c616e672f70726f746f627566"
  723. "2f7074797065732f616e79a20203475042aa021e476f6f676c652e50726f"
  724. "746f6275662e57656c6c4b6e6f776e5479706573620670726f746f33";
  725. char* binary;
  726. int binary_len;
  727. hex_to_binary(generated_file, &binary, &binary_len);
  728. internal_add_generated_file(binary, binary_len,
  729. generated_pool, true TSRMLS_CC);
  730. FREE(binary);
  731. is_inited_file_any = true;
  732. }
  733. static void init_file_api(TSRMLS_D) {
  734. if (is_inited_file_api) return;
  735. init_file_source_context(TSRMLS_C);
  736. init_file_type(TSRMLS_C);
  737. init_generated_pool_once(TSRMLS_C);
  738. const char* generated_file =
  739. "0aee050a19676f6f676c652f70726f746f6275662f6170692e70726f746f"
  740. "120f676f6f676c652e70726f746f6275661a24676f6f676c652f70726f74"
  741. "6f6275662f736f757263655f636f6e746578742e70726f746f1a1a676f6f"
  742. "676c652f70726f746f6275662f747970652e70726f746f2281020a034170"
  743. "69120c0a046e616d6518012001280912280a076d6574686f647318022003"
  744. "280b32172e676f6f676c652e70726f746f6275662e4d6574686f6412280a"
  745. "076f7074696f6e7318032003280b32172e676f6f676c652e70726f746f62"
  746. "75662e4f7074696f6e120f0a0776657273696f6e18042001280912360a0e"
  747. "736f757263655f636f6e7465787418052001280b321e2e676f6f676c652e"
  748. "70726f746f6275662e536f75726365436f6e7465787412260a066d697869"
  749. "6e7318062003280b32162e676f6f676c652e70726f746f6275662e4d6978"
  750. "696e12270a0673796e74617818072001280e32172e676f6f676c652e7072"
  751. "6f746f6275662e53796e74617822d5010a064d6574686f64120c0a046e61"
  752. "6d6518012001280912180a10726571756573745f747970655f75726c1802"
  753. "2001280912190a11726571756573745f73747265616d696e671803200128"
  754. "0812190a11726573706f6e73655f747970655f75726c180420012809121a"
  755. "0a12726573706f6e73655f73747265616d696e6718052001280812280a07"
  756. "6f7074696f6e7318062003280b32172e676f6f676c652e70726f746f6275"
  757. "662e4f7074696f6e12270a0673796e74617818072001280e32172e676f6f"
  758. "676c652e70726f746f6275662e53796e74617822230a054d6978696e120c"
  759. "0a046e616d65180120012809120c0a04726f6f7418022001280942750a13"
  760. "636f6d2e676f6f676c652e70726f746f627566420841706950726f746f50"
  761. "015a2b676f6f676c652e676f6c616e672e6f72672f67656e70726f746f2f"
  762. "70726f746f6275662f6170693b617069a20203475042aa021e476f6f676c"
  763. "652e50726f746f6275662e57656c6c4b6e6f776e5479706573620670726f"
  764. "746f33";
  765. char* binary;
  766. int binary_len;
  767. hex_to_binary(generated_file, &binary, &binary_len);
  768. internal_add_generated_file(binary, binary_len,
  769. generated_pool, true TSRMLS_CC);
  770. FREE(binary);
  771. is_inited_file_api = true;
  772. }
  773. static void init_file_duration(TSRMLS_D) {
  774. if (is_inited_file_duration) return;
  775. init_generated_pool_once(TSRMLS_C);
  776. const char* generated_file =
  777. "0ae3010a1e676f6f676c652f70726f746f6275662f6475726174696f6e2e"
  778. "70726f746f120f676f6f676c652e70726f746f627566222a0a0844757261"
  779. "74696f6e120f0a077365636f6e6473180120012803120d0a056e616e6f73"
  780. "180220012805427c0a13636f6d2e676f6f676c652e70726f746f62756642"
  781. "0d4475726174696f6e50726f746f50015a2a6769746875622e636f6d2f67"
  782. "6f6c616e672f70726f746f6275662f7074797065732f6475726174696f6e"
  783. "f80101a20203475042aa021e476f6f676c652e50726f746f6275662e5765"
  784. "6c6c4b6e6f776e5479706573620670726f746f33";
  785. char* binary;
  786. int binary_len;
  787. hex_to_binary(generated_file, &binary, &binary_len);
  788. internal_add_generated_file(binary, binary_len,
  789. generated_pool, true TSRMLS_CC);
  790. FREE(binary);
  791. is_inited_file_duration = true;
  792. }
  793. static void init_file_field_mask(TSRMLS_D) {
  794. if (is_inited_file_field_mask) return;
  795. init_generated_pool_once(TSRMLS_C);
  796. const char* generated_file =
  797. "0ae3010a20676f6f676c652f70726f746f6275662f6669656c645f6d6173"
  798. "6b2e70726f746f120f676f6f676c652e70726f746f627566221a0a094669"
  799. "656c644d61736b120d0a0570617468731801200328094289010a13636f6d"
  800. "2e676f6f676c652e70726f746f627566420e4669656c644d61736b50726f"
  801. "746f50015a39676f6f676c652e676f6c616e672e6f72672f67656e70726f"
  802. "746f2f70726f746f6275662f6669656c645f6d61736b3b6669656c645f6d"
  803. "61736ba20203475042aa021e476f6f676c652e50726f746f6275662e5765"
  804. "6c6c4b6e6f776e5479706573620670726f746f33";
  805. char* binary;
  806. int binary_len;
  807. hex_to_binary(generated_file, &binary, &binary_len);
  808. internal_add_generated_file(binary, binary_len,
  809. generated_pool, true TSRMLS_CC);
  810. FREE(binary);
  811. is_inited_file_field_mask = true;
  812. }
  813. static void init_file_empty(TSRMLS_D) {
  814. if (is_inited_file_empty) return;
  815. init_generated_pool_once(TSRMLS_C);
  816. const char* generated_file =
  817. "0ab7010a1b676f6f676c652f70726f746f6275662f656d7074792e70726f"
  818. "746f120f676f6f676c652e70726f746f62756622070a05456d7074794276"
  819. "0a13636f6d2e676f6f676c652e70726f746f627566420a456d7074795072"
  820. "6f746f50015a276769746875622e636f6d2f676f6c616e672f70726f746f"
  821. "6275662f7074797065732f656d707479f80101a20203475042aa021e476f"
  822. "6f676c652e50726f746f6275662e57656c6c4b6e6f776e54797065736206"
  823. "70726f746f33";
  824. char* binary;
  825. int binary_len;
  826. hex_to_binary(generated_file, &binary, &binary_len);
  827. internal_add_generated_file(binary, binary_len,
  828. generated_pool, true TSRMLS_CC);
  829. FREE(binary);
  830. is_inited_file_empty = true;
  831. }
  832. static void init_file_source_context(TSRMLS_D) {
  833. if (is_inited_file_source_context) return;
  834. init_generated_pool_once(TSRMLS_C);
  835. const char* generated_file =
  836. "0afb010a24676f6f676c652f70726f746f6275662f736f757263655f636f"
  837. "6e746578742e70726f746f120f676f6f676c652e70726f746f6275662222"
  838. "0a0d536f75726365436f6e7465787412110a0966696c655f6e616d651801"
  839. "200128094295010a13636f6d2e676f6f676c652e70726f746f6275664212"
  840. "536f75726365436f6e7465787450726f746f50015a41676f6f676c652e67"
  841. "6f6c616e672e6f72672f67656e70726f746f2f70726f746f6275662f736f"
  842. "757263655f636f6e746578743b736f757263655f636f6e74657874a20203"
  843. "475042aa021e476f6f676c652e50726f746f6275662e57656c6c4b6e6f77"
  844. "6e5479706573620670726f746f33";
  845. char* binary;
  846. int binary_len;
  847. hex_to_binary(generated_file, &binary, &binary_len);
  848. internal_add_generated_file(binary, binary_len,
  849. generated_pool, true TSRMLS_CC);
  850. FREE(binary);
  851. is_inited_file_source_context = true;
  852. }
  853. static void init_file_struct(TSRMLS_D) {
  854. if (is_inited_file_struct) return;
  855. init_generated_pool_once(TSRMLS_C);
  856. const char* generated_file =
  857. "0a81050a1c676f6f676c652f70726f746f6275662f7374727563742e7072"
  858. "6f746f120f676f6f676c652e70726f746f6275662284010a065374727563"
  859. "7412330a066669656c647318012003280b32232e676f6f676c652e70726f"
  860. "746f6275662e5374727563742e4669656c6473456e7472791a450a0b4669"
  861. "656c6473456e747279120b0a036b657918012001280912250a0576616c75"
  862. "6518022001280b32162e676f6f676c652e70726f746f6275662e56616c75"
  863. "653a02380122ea010a0556616c756512300a0a6e756c6c5f76616c756518"
  864. "012001280e321a2e676f6f676c652e70726f746f6275662e4e756c6c5661"
  865. "6c7565480012160a0c6e756d6265725f76616c7565180220012801480012"
  866. "160a0c737472696e675f76616c7565180320012809480012140a0a626f6f"
  867. "6c5f76616c75651804200128084800122f0a0c7374727563745f76616c75"
  868. "6518052001280b32172e676f6f676c652e70726f746f6275662e53747275"
  869. "6374480012300a0a6c6973745f76616c756518062001280b321a2e676f6f"
  870. "676c652e70726f746f6275662e4c69737456616c7565480042060a046b69"
  871. "6e6422330a094c69737456616c756512260a0676616c7565731801200328"
  872. "0b32162e676f6f676c652e70726f746f6275662e56616c75652a1b0a094e"
  873. "756c6c56616c7565120e0a0a4e554c4c5f56414c554510004281010a1363"
  874. "6f6d2e676f6f676c652e70726f746f627566420b53747275637450726f74"
  875. "6f50015a316769746875622e636f6d2f676f6c616e672f70726f746f6275"
  876. "662f7074797065732f7374727563743b7374727563747062f80101a20203"
  877. "475042aa021e476f6f676c652e50726f746f6275662e57656c6c4b6e6f77"
  878. "6e5479706573620670726f746f33";
  879. char* binary;
  880. int binary_len;
  881. hex_to_binary(generated_file, &binary, &binary_len);
  882. internal_add_generated_file(binary, binary_len,
  883. generated_pool, true TSRMLS_CC);
  884. FREE(binary);
  885. is_inited_file_struct = true;
  886. }
  887. static void init_file_timestamp(TSRMLS_D) {
  888. if (is_inited_file_timestamp) return;
  889. init_generated_pool_once(TSRMLS_C);
  890. const char* generated_file =
  891. "0ae7010a1f676f6f676c652f70726f746f6275662f74696d657374616d70"
  892. "2e70726f746f120f676f6f676c652e70726f746f627566222b0a0954696d"
  893. "657374616d70120f0a077365636f6e6473180120012803120d0a056e616e"
  894. "6f73180220012805427e0a13636f6d2e676f6f676c652e70726f746f6275"
  895. "66420e54696d657374616d7050726f746f50015a2b6769746875622e636f"
  896. "6d2f676f6c616e672f70726f746f6275662f7074797065732f74696d6573"
  897. "74616d70f80101a20203475042aa021e476f6f676c652e50726f746f6275"
  898. "662e57656c6c4b6e6f776e5479706573620670726f746f33";
  899. char* binary;
  900. int binary_len;
  901. hex_to_binary(generated_file, &binary, &binary_len);
  902. internal_add_generated_file(binary, binary_len,
  903. generated_pool, true TSRMLS_CC);
  904. FREE(binary);
  905. is_inited_file_timestamp = true;
  906. }
  907. static void init_file_type(TSRMLS_D) {
  908. if (is_inited_file_type) return;
  909. init_file_any(TSRMLS_C);
  910. init_file_source_context(TSRMLS_C);
  911. init_generated_pool_once(TSRMLS_C);
  912. const char* generated_file =
  913. "0aba0c0a1a676f6f676c652f70726f746f6275662f747970652e70726f74"
  914. "6f120f676f6f676c652e70726f746f6275661a19676f6f676c652f70726f"
  915. "746f6275662f616e792e70726f746f1a24676f6f676c652f70726f746f62"
  916. "75662f736f757263655f636f6e746578742e70726f746f22d7010a045479"
  917. "7065120c0a046e616d6518012001280912260a066669656c647318022003"
  918. "280b32162e676f6f676c652e70726f746f6275662e4669656c64120e0a06"
  919. "6f6e656f667318032003280912280a076f7074696f6e7318042003280b32"
  920. "172e676f6f676c652e70726f746f6275662e4f7074696f6e12360a0e736f"
  921. "757263655f636f6e7465787418052001280b321e2e676f6f676c652e7072"
  922. "6f746f6275662e536f75726365436f6e7465787412270a0673796e746178"
  923. "18062001280e32172e676f6f676c652e70726f746f6275662e53796e7461"
  924. "7822d5050a054669656c6412290a046b696e6418012001280e321b2e676f"
  925. "6f676c652e70726f746f6275662e4669656c642e4b696e6412370a0b6361"
  926. "7264696e616c69747918022001280e32222e676f6f676c652e70726f746f"
  927. "6275662e4669656c642e43617264696e616c697479120e0a066e756d6265"
  928. "72180320012805120c0a046e616d6518042001280912100a08747970655f"
  929. "75726c18062001280912130a0b6f6e656f665f696e646578180720012805"
  930. "120e0a067061636b656418082001280812280a076f7074696f6e73180920"
  931. "03280b32172e676f6f676c652e70726f746f6275662e4f7074696f6e1211"
  932. "0a096a736f6e5f6e616d65180a2001280912150a0d64656661756c745f76"
  933. "616c7565180b2001280922c8020a044b696e6412100a0c545950455f554e"
  934. "4b4e4f574e1000120f0a0b545950455f444f55424c451001120e0a0a5459"
  935. "50455f464c4f41541002120e0a0a545950455f494e5436341003120f0a0b"
  936. "545950455f55494e5436341004120e0a0a545950455f494e543332100512"
  937. "100a0c545950455f46495845443634100612100a0c545950455f46495845"
  938. "4433321007120d0a09545950455f424f4f4c1008120f0a0b545950455f53"
  939. "5452494e471009120e0a0a545950455f47524f5550100a12100a0c545950"
  940. "455f4d455353414745100b120e0a0a545950455f4259544553100c120f0a"
  941. "0b545950455f55494e543332100d120d0a09545950455f454e554d100e12"
  942. "110a0d545950455f5346495845443332100f12110a0d545950455f534649"
  943. "58454436341010120f0a0b545950455f53494e5433321011120f0a0b5459"
  944. "50455f53494e543634101222740a0b43617264696e616c69747912170a13"
  945. "43415244494e414c4954595f554e4b4e4f574e100012180a144341524449"
  946. "4e414c4954595f4f5054494f4e414c100112180a1443415244494e414c49"
  947. "54595f5245515549524544100212180a1443415244494e414c4954595f52"
  948. "45504541544544100322ce010a04456e756d120c0a046e616d6518012001"
  949. "2809122d0a09656e756d76616c756518022003280b321a2e676f6f676c65"
  950. "2e70726f746f6275662e456e756d56616c756512280a076f7074696f6e73"
  951. "18032003280b32172e676f6f676c652e70726f746f6275662e4f7074696f"
  952. "6e12360a0e736f757263655f636f6e7465787418042001280b321e2e676f"
  953. "6f676c652e70726f746f6275662e536f75726365436f6e7465787412270a"
  954. "0673796e74617818052001280e32172e676f6f676c652e70726f746f6275"
  955. "662e53796e74617822530a09456e756d56616c7565120c0a046e616d6518"
  956. "0120012809120e0a066e756d62657218022001280512280a076f7074696f"
  957. "6e7318032003280b32172e676f6f676c652e70726f746f6275662e4f7074"
  958. "696f6e223b0a064f7074696f6e120c0a046e616d6518012001280912230a"
  959. "0576616c756518022001280b32142e676f6f676c652e70726f746f627566"
  960. "2e416e792a2e0a0653796e74617812110a0d53594e5441585f50524f544f"
  961. "32100012110a0d53594e5441585f50524f544f331001427d0a13636f6d2e"
  962. "676f6f676c652e70726f746f62756642095479706550726f746f50015a2f"
  963. "676f6f676c652e676f6c616e672e6f72672f67656e70726f746f2f70726f"
  964. "746f6275662f70747970653b7074797065f80101a20203475042aa021e47"
  965. "6f6f676c652e50726f746f6275662e57656c6c4b6e6f776e547970657362"
  966. "0670726f746f33";
  967. char* binary;
  968. int binary_len;
  969. hex_to_binary(generated_file, &binary, &binary_len);
  970. internal_add_generated_file(binary, binary_len,
  971. generated_pool, true TSRMLS_CC);
  972. FREE(binary);
  973. is_inited_file_type = true;
  974. }
  975. static void init_file_wrappers(TSRMLS_D) {
  976. if (is_inited_file_wrappers) return;
  977. init_generated_pool_once(TSRMLS_C);
  978. const char* generated_file =
  979. "0abf030a1e676f6f676c652f70726f746f6275662f77726170706572732e"
  980. "70726f746f120f676f6f676c652e70726f746f627566221c0a0b446f7562"
  981. "6c6556616c7565120d0a0576616c7565180120012801221b0a0a466c6f61"
  982. "7456616c7565120d0a0576616c7565180120012802221b0a0a496e743634"
  983. "56616c7565120d0a0576616c7565180120012803221c0a0b55496e743634"
  984. "56616c7565120d0a0576616c7565180120012804221b0a0a496e74333256"
  985. "616c7565120d0a0576616c7565180120012805221c0a0b55496e74333256"
  986. "616c7565120d0a0576616c756518012001280d221a0a09426f6f6c56616c"
  987. "7565120d0a0576616c7565180120012808221c0a0b537472696e6756616c"
  988. "7565120d0a0576616c7565180120012809221b0a0a427974657356616c75"
  989. "65120d0a0576616c756518012001280c427c0a13636f6d2e676f6f676c65"
  990. "2e70726f746f627566420d577261707065727350726f746f50015a2a6769"
  991. "746875622e636f6d2f676f6c616e672f70726f746f6275662f7074797065"
  992. "732f7772617070657273f80101a20203475042aa021e476f6f676c652e50"
  993. "726f746f6275662e57656c6c4b6e6f776e5479706573620670726f746f33";
  994. char* binary;
  995. int binary_len;
  996. hex_to_binary(generated_file, &binary, &binary_len);
  997. internal_add_generated_file(binary, binary_len,
  998. generated_pool, true TSRMLS_CC);
  999. FREE(binary);
  1000. is_inited_file_wrappers = true;
  1001. }
  1002. // -----------------------------------------------------------------------------
  1003. // Define enum
  1004. // -----------------------------------------------------------------------------
  1005. // -----------------------------------------------------------------------------
  1006. // Field_Cardinality
  1007. // -----------------------------------------------------------------------------
  1008. static zend_function_entry field_cardinality_methods[] = {
  1009. PHP_ME(Field_Cardinality, name, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
  1010. PHP_ME(Field_Cardinality, value, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
  1011. {NULL, NULL, NULL}
  1012. };
  1013. zend_class_entry* field_cardinality_type;
  1014. // Init class entry.
  1015. PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\Field\\Cardinality",
  1016. Field_Cardinality, field_cardinality)
  1017. zend_declare_class_constant_long(field_cardinality_type,
  1018. "CARDINALITY_UNKNOWN", 19, 0 TSRMLS_CC);
  1019. zend_declare_class_constant_long(field_cardinality_type,
  1020. "CARDINALITY_OPTIONAL", 20, 1 TSRMLS_CC);
  1021. zend_declare_class_constant_long(field_cardinality_type,
  1022. "CARDINALITY_REQUIRED", 20, 2 TSRMLS_CC);
  1023. zend_declare_class_constant_long(field_cardinality_type,
  1024. "CARDINALITY_REPEATED", 20, 3 TSRMLS_CC);
  1025. const char *alias = "Google\\Protobuf\\Field_Cardinality";
  1026. #if PHP_VERSION_ID < 70300
  1027. zend_register_class_alias_ex(alias, strlen(alias), field_cardinality_type TSRMLS_CC);
  1028. #else
  1029. zend_register_class_alias_ex(alias, strlen(alias), field_cardinality_type, 1);
  1030. #endif
  1031. PHP_PROTO_INIT_ENUMCLASS_END
  1032. PHP_METHOD(Field_Cardinality, name) {
  1033. PHP_PROTO_LONG value;
  1034. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &value) ==
  1035. FAILURE) {
  1036. return;
  1037. }
  1038. switch (value) {
  1039. case 0:
  1040. PHP_PROTO_RETURN_STRING("CARDINALITY_UNKNOWN", 1);
  1041. case 1:
  1042. PHP_PROTO_RETURN_STRING("CARDINALITY_OPTIONAL", 1);
  1043. case 2:
  1044. PHP_PROTO_RETURN_STRING("CARDINALITY_REQUIRED", 1);
  1045. case 3:
  1046. PHP_PROTO_RETURN_STRING("CARDINALITY_REPEATED", 1);
  1047. default:
  1048. zend_throw_exception_ex(
  1049. NULL, 0 TSRMLS_CC,
  1050. "Enum Google\\Protobuf\\Field_Cardinality has no name "
  1051. "defined for value %d.",
  1052. value);
  1053. }
  1054. }
  1055. PHP_METHOD(Field_Cardinality, value) {
  1056. char *name = NULL;
  1057. PHP_PROTO_SIZE name_len;
  1058. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) ==
  1059. FAILURE) {
  1060. return;
  1061. }
  1062. if (strncmp(name, "CARDINALITY_UNKNOWN", name_len) == 0) RETURN_LONG(0);
  1063. if (strncmp(name, "CARDINALITY_OPTIONAL", name_len) == 0) RETURN_LONG(1);
  1064. if (strncmp(name, "CARDINALITY_REQUIRED", name_len) == 0) RETURN_LONG(2);
  1065. if (strncmp(name, "CARDINALITY_REPEATED", name_len) == 0) RETURN_LONG(3);
  1066. zend_throw_exception_ex(
  1067. NULL, 0 TSRMLS_CC,
  1068. "Enum Google\\Protobuf\\Field_Cardinality has no value "
  1069. "defined for name %s.",
  1070. name);
  1071. }
  1072. // -----------------------------------------------------------------------------
  1073. // Field_Kind
  1074. // -----------------------------------------------------------------------------
  1075. static zend_function_entry field_kind_methods[] = {
  1076. PHP_ME(Field_Kind, name, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
  1077. PHP_ME(Field_Kind, value, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
  1078. {NULL, NULL, NULL}
  1079. };
  1080. zend_class_entry* field_kind_type;
  1081. // Init class entry.
  1082. PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\Field\\Kind",
  1083. Field_Kind, field_kind)
  1084. zend_declare_class_constant_long(field_kind_type,
  1085. "TYPE_UNKNOWN", 12, 0 TSRMLS_CC);
  1086. zend_declare_class_constant_long(field_kind_type,
  1087. "TYPE_DOUBLE", 11, 1 TSRMLS_CC);
  1088. zend_declare_class_constant_long(field_kind_type,
  1089. "TYPE_FLOAT", 10, 2 TSRMLS_CC);
  1090. zend_declare_class_constant_long(field_kind_type,
  1091. "TYPE_INT64", 10, 3 TSRMLS_CC);
  1092. zend_declare_class_constant_long(field_kind_type,
  1093. "TYPE_UINT64", 11, 4 TSRMLS_CC);
  1094. zend_declare_class_constant_long(field_kind_type,
  1095. "TYPE_INT32", 10, 5 TSRMLS_CC);
  1096. zend_declare_class_constant_long(field_kind_type,
  1097. "TYPE_FIXED64", 12, 6 TSRMLS_CC);
  1098. zend_declare_class_constant_long(field_kind_type,
  1099. "TYPE_FIXED32", 12, 7 TSRMLS_CC);
  1100. zend_declare_class_constant_long(field_kind_type,
  1101. "TYPE_BOOL", 9, 8 TSRMLS_CC);
  1102. zend_declare_class_constant_long(field_kind_type,
  1103. "TYPE_STRING", 11, 9 TSRMLS_CC);
  1104. zend_declare_class_constant_long(field_kind_type,
  1105. "TYPE_GROUP", 10, 10 TSRMLS_CC);
  1106. zend_declare_class_constant_long(field_kind_type,
  1107. "TYPE_MESSAGE", 12, 11 TSRMLS_CC);
  1108. zend_declare_class_constant_long(field_kind_type,
  1109. "TYPE_BYTES", 10, 12 TSRMLS_CC);
  1110. zend_declare_class_constant_long(field_kind_type,
  1111. "TYPE_UINT32", 11, 13 TSRMLS_CC);
  1112. zend_declare_class_constant_long(field_kind_type,
  1113. "TYPE_ENUM", 9, 14 TSRMLS_CC);
  1114. zend_declare_class_constant_long(field_kind_type,
  1115. "TYPE_SFIXED32", 13, 15 TSRMLS_CC);
  1116. zend_declare_class_constant_long(field_kind_type,
  1117. "TYPE_SFIXED64", 13, 16 TSRMLS_CC);
  1118. zend_declare_class_constant_long(field_kind_type,
  1119. "TYPE_SINT32", 11, 17 TSRMLS_CC);
  1120. zend_declare_class_constant_long(field_kind_type,
  1121. "TYPE_SINT64", 11, 18 TSRMLS_CC);
  1122. const char *alias = "Google\\Protobuf\\Field_Kind";
  1123. #if PHP_VERSION_ID < 70300
  1124. zend_register_class_alias_ex(alias, strlen(alias), field_kind_type TSRMLS_CC);
  1125. #else
  1126. zend_register_class_alias_ex(alias, strlen(alias), field_kind_type, 1);
  1127. #endif
  1128. PHP_PROTO_INIT_ENUMCLASS_END
  1129. PHP_METHOD(Field_Kind, name) {
  1130. PHP_PROTO_LONG value;
  1131. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &value) ==
  1132. FAILURE) {
  1133. return;
  1134. }
  1135. switch (value) {
  1136. case 0:
  1137. PHP_PROTO_RETURN_STRING("TYPE_UNKNOWN", 1);
  1138. case 1:
  1139. PHP_PROTO_RETURN_STRING("TYPE_DOUBLE", 1);
  1140. case 2:
  1141. PHP_PROTO_RETURN_STRING("TYPE_FLOAT", 1);
  1142. case 3:
  1143. PHP_PROTO_RETURN_STRING("TYPE_INT64", 1);
  1144. case 4:
  1145. PHP_PROTO_RETURN_STRING("TYPE_UINT64", 1);
  1146. case 5:
  1147. PHP_PROTO_RETURN_STRING("TYPE_INT32", 1);
  1148. case 6:
  1149. PHP_PROTO_RETURN_STRING("TYPE_FIXED64", 1);
  1150. case 7:
  1151. PHP_PROTO_RETURN_STRING("TYPE_FIXED32", 1);
  1152. case 8:
  1153. PHP_PROTO_RETURN_STRING("TYPE_BOOL", 1);
  1154. case 9:
  1155. PHP_PROTO_RETURN_STRING("TYPE_STRING", 1);
  1156. case 10:
  1157. PHP_PROTO_RETURN_STRING("TYPE_GROUP", 1);
  1158. case 11:
  1159. PHP_PROTO_RETURN_STRING("TYPE_MESSAGE", 1);
  1160. case 12:
  1161. PHP_PROTO_RETURN_STRING("TYPE_BYTES", 1);
  1162. case 13:
  1163. PHP_PROTO_RETURN_STRING("TYPE_UINT32", 1);
  1164. case 14:
  1165. PHP_PROTO_RETURN_STRING("TYPE_ENUM", 1);
  1166. case 15:
  1167. PHP_PROTO_RETURN_STRING("TYPE_SFIXED32", 1);
  1168. case 16:
  1169. PHP_PROTO_RETURN_STRING("TYPE_SFIXED64", 1);
  1170. case 17:
  1171. PHP_PROTO_RETURN_STRING("TYPE_SINT32", 1);
  1172. case 18:
  1173. PHP_PROTO_RETURN_STRING("TYPE_SINT64", 1);
  1174. default:
  1175. zend_throw_exception_ex(NULL, 0 TSRMLS_CC,
  1176. "Enum Google\\Protobuf\\Field_Kind has no name "
  1177. "defined for value %d.",
  1178. value);
  1179. }
  1180. }
  1181. PHP_METHOD(Field_Kind, value) {
  1182. char *name = NULL;
  1183. PHP_PROTO_SIZE name_len;
  1184. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) ==
  1185. FAILURE) {
  1186. return;
  1187. }
  1188. if (strncmp(name, "TYPE_UNKNOWN", name_len) == 0) RETURN_LONG(0);
  1189. if (strncmp(name, "TYPE_DOUBLE", name_len) == 0) RETURN_LONG(1);
  1190. if (strncmp(name, "TYPE_FLOAT", name_len) == 0) RETURN_LONG(2);
  1191. if (strncmp(name, "TYPE_INT64", name_len) == 0) RETURN_LONG(3);
  1192. if (strncmp(name, "TYPE_UINT64", name_len) == 0) RETURN_LONG(4);
  1193. if (strncmp(name, "TYPE_INT32", name_len) == 0) RETURN_LONG(5);
  1194. if (strncmp(name, "TYPE_FIXED64", name_len) == 0) RETURN_LONG(6);
  1195. if (strncmp(name, "TYPE_FIXED32", name_len) == 0) RETURN_LONG(7);
  1196. if (strncmp(name, "TYPE_BOOL", name_len) == 0) RETURN_LONG(8);
  1197. if (strncmp(name, "TYPE_STRING", name_len) == 0) RETURN_LONG(9);
  1198. if (strncmp(name, "TYPE_GROUP", name_len) == 0) RETURN_LONG(10);
  1199. if (strncmp(name, "TYPE_MESSAGE", name_len) == 0) RETURN_LONG(11);
  1200. if (strncmp(name, "TYPE_BYTES", name_len) == 0) RETURN_LONG(12);
  1201. if (strncmp(name, "TYPE_UINT32", name_len) == 0) RETURN_LONG(13);
  1202. if (strncmp(name, "TYPE_ENUM", name_len) == 0) RETURN_LONG(14);
  1203. if (strncmp(name, "TYPE_SFIXED32", name_len) == 0) RETURN_LONG(15);
  1204. if (strncmp(name, "TYPE_SFIXED64", name_len) == 0) RETURN_LONG(16);
  1205. if (strncmp(name, "TYPE_SINT32", name_len) == 0) RETURN_LONG(17);
  1206. if (strncmp(name, "TYPE_SINT64", name_len) == 0) RETURN_LONG(18);
  1207. zend_throw_exception_ex(NULL, 0 TSRMLS_CC,
  1208. "Enum Google\\Protobuf\\Field_Kind has no value "
  1209. "defined for name %s.",
  1210. name);
  1211. }
  1212. // -----------------------------------------------------------------------------
  1213. // NullValue
  1214. // -----------------------------------------------------------------------------
  1215. static zend_function_entry null_value_methods[] = {
  1216. PHP_ME(NullValue, name, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
  1217. PHP_ME(NullValue, value, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
  1218. {NULL, NULL, NULL}
  1219. };
  1220. zend_class_entry* null_value_type;
  1221. // Init class entry.
  1222. PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\NullValue",
  1223. NullValue, null_value)
  1224. zend_declare_class_constant_long(null_value_type,
  1225. "NULL_VALUE", 10, 0 TSRMLS_CC);
  1226. PHP_PROTO_INIT_ENUMCLASS_END
  1227. PHP_METHOD(NullValue, name) {
  1228. PHP_PROTO_LONG value;
  1229. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &value) ==
  1230. FAILURE) {
  1231. return;
  1232. }
  1233. switch (value) {
  1234. case 0:
  1235. PHP_PROTO_RETURN_STRING("NULL_VALUE", 1);
  1236. default:
  1237. zend_throw_exception_ex(NULL, 0 TSRMLS_CC,
  1238. "Enum Google\\Protobuf\\NullValue has no name "
  1239. "defined for value %d.",
  1240. value);
  1241. }
  1242. }
  1243. PHP_METHOD(NullValue, value) {
  1244. char *name = NULL;
  1245. PHP_PROTO_SIZE name_len;
  1246. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) ==
  1247. FAILURE) {
  1248. return;
  1249. }
  1250. if (strncmp(name, "NULL_VALUE", name_len) == 0) RETURN_LONG(0);
  1251. zend_throw_exception_ex(NULL, 0 TSRMLS_CC,
  1252. "Enum Google\\Protobuf\\NullValue has no value "
  1253. "defined for name %s.",
  1254. name);
  1255. }
  1256. // -----------------------------------------------------------------------------
  1257. // Syntax
  1258. // -----------------------------------------------------------------------------
  1259. static zend_function_entry syntax_methods[] = {
  1260. PHP_ME(Syntax, name, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
  1261. PHP_ME(Syntax, value, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
  1262. {NULL, NULL, NULL}
  1263. };
  1264. zend_class_entry* syntax_type;
  1265. // Init class entry.
  1266. PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\Syntax",
  1267. Syntax, syntax)
  1268. zend_declare_class_constant_long(syntax_type,
  1269. "SYNTAX_PROTO2", 13, 0 TSRMLS_CC);
  1270. zend_declare_class_constant_long(syntax_type,
  1271. "SYNTAX_PROTO3", 13, 1 TSRMLS_CC);
  1272. PHP_PROTO_INIT_ENUMCLASS_END
  1273. PHP_METHOD(Syntax, name) {
  1274. PHP_PROTO_LONG value;
  1275. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &value) ==
  1276. FAILURE) {
  1277. return;
  1278. }
  1279. switch (value) {
  1280. case 0:
  1281. PHP_PROTO_RETURN_STRING("SYNTAX_PROTO2", 1);
  1282. case 1:
  1283. PHP_PROTO_RETURN_STRING("SYNTAX_PROTO3", 1);
  1284. default:
  1285. zend_throw_exception_ex(NULL, 0 TSRMLS_CC,
  1286. "Enum Google\\Protobuf\\Syntax has no name "
  1287. "defined for value %d.",
  1288. value);
  1289. }
  1290. }
  1291. PHP_METHOD(Syntax, value) {
  1292. char *name = NULL;
  1293. PHP_PROTO_SIZE name_len;
  1294. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) ==
  1295. FAILURE) {
  1296. return;
  1297. }
  1298. if (strncmp(name, "SYNTAX_PROTO2", name_len) == 0) RETURN_LONG(0);
  1299. if (strncmp(name, "SYNTAX_PROTO3", name_len) == 0) RETURN_LONG(1);
  1300. zend_throw_exception_ex(NULL, 0 TSRMLS_CC,
  1301. "Enum Google\\Protobuf\\Syntax has no value "
  1302. "defined for name %s.",
  1303. name);
  1304. }
  1305. // -----------------------------------------------------------------------------
  1306. // Define message
  1307. // -----------------------------------------------------------------------------
  1308. // -----------------------------------------------------------------------------
  1309. // Any
  1310. // -----------------------------------------------------------------------------
  1311. static zend_function_entry any_methods[] = {
  1312. PHP_ME(Any, __construct, NULL, ZEND_ACC_PUBLIC)
  1313. PHP_ME(Any, getTypeUrl, NULL, ZEND_ACC_PUBLIC)
  1314. PHP_ME(Any, setTypeUrl, NULL, ZEND_ACC_PUBLIC)
  1315. PHP_ME(Any, getValue, NULL, ZEND_ACC_PUBLIC)
  1316. PHP_ME(Any, setValue, NULL, ZEND_ACC_PUBLIC)
  1317. PHP_ME(Any, pack, NULL, ZEND_ACC_PUBLIC)
  1318. PHP_ME(Any, unpack, NULL, ZEND_ACC_PUBLIC)
  1319. PHP_ME(Any, is, NULL, ZEND_ACC_PUBLIC)
  1320. {NULL, NULL, NULL}
  1321. };
  1322. zend_class_entry* any_type;
  1323. // Init class entry.
  1324. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Any", Any, any)
  1325. zend_declare_property_string(any_type, "type_url", strlen("type_url"),
  1326. "" ,ZEND_ACC_PRIVATE TSRMLS_CC);
  1327. zend_declare_property_string(any_type, "value", strlen("value"),
  1328. "" ,ZEND_ACC_PRIVATE TSRMLS_CC);
  1329. PHP_PROTO_INIT_SUBMSGCLASS_END
  1330. static void hex_to_binary(const char* hex, char** binary, int* binary_len) {
  1331. int i;
  1332. int hex_len = strlen(hex);
  1333. *binary_len = hex_len / 2;
  1334. *binary = ALLOC_N(char, *binary_len);
  1335. for (i = 0; i < *binary_len; i++) {
  1336. char value = 0;
  1337. if (hex[i * 2] >= '0' && hex[i * 2] <= '9') {
  1338. value += (hex[i * 2] - '0') * 16;
  1339. } else {
  1340. value += (hex[i * 2] - 'a' + 10) * 16;
  1341. }
  1342. if (hex[i * 2 + 1] >= '0' && hex[i * 2 + 1] <= '9') {
  1343. value += hex[i * 2 + 1] - '0';
  1344. } else {
  1345. value += hex[i * 2 + 1] - 'a' + 10;
  1346. }
  1347. (*binary)[i] = value;
  1348. }
  1349. }
  1350. PHP_METHOD(Any, __construct) {
  1351. init_file_any(TSRMLS_C);
  1352. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1353. INIT_MESSAGE_WITH_ARRAY;
  1354. }
  1355. PHP_PROTO_FIELD_ACCESSORS(Any, any, TypeUrl, "type_url")
  1356. PHP_PROTO_FIELD_ACCESSORS(Any, any, Value, "value")
  1357. PHP_METHOD(Any, unpack) {
  1358. // Get type url.
  1359. zval type_url_member;
  1360. PHP_PROTO_ZVAL_STRING(&type_url_member, "type_url", 1);
  1361. PHP_PROTO_FAKE_SCOPE_BEGIN(any_type);
  1362. zval* type_url_php = php_proto_message_read_property(
  1363. getThis(), &type_url_member PHP_PROTO_TSRMLS_CC);
  1364. zval_dtor(&type_url_member);
  1365. PHP_PROTO_FAKE_SCOPE_END;
  1366. // Get fully-qualified name from type url.
  1367. size_t url_prefix_len = strlen(TYPE_URL_PREFIX);
  1368. const char* type_url = Z_STRVAL_P(type_url_php);
  1369. size_t type_url_len = Z_STRLEN_P(type_url_php);
  1370. if (url_prefix_len > type_url_len ||
  1371. strncmp(TYPE_URL_PREFIX, type_url, url_prefix_len) != 0) {
  1372. zend_throw_exception(
  1373. NULL, "Type url needs to be type.googleapis.com/fully-qualified",
  1374. 0 TSRMLS_CC);
  1375. return;
  1376. }
  1377. const char* fully_qualified_name = type_url + url_prefix_len;
  1378. DescriptorInternal* desc = get_proto_desc(fully_qualified_name);
  1379. if (desc == NULL) {
  1380. zend_throw_exception(
  1381. NULL, "Specified message in any hasn't been added to descriptor pool",
  1382. 0 TSRMLS_CC);
  1383. return;
  1384. }
  1385. register_class(desc, false TSRMLS_CC);
  1386. zend_class_entry* klass = desc->klass;
  1387. ZVAL_OBJ(return_value, klass->create_object(klass TSRMLS_CC));
  1388. MessageHeader* msg = UNBOX(MessageHeader, return_value);
  1389. custom_data_init(klass, msg PHP_PROTO_TSRMLS_CC);
  1390. // Get value.
  1391. zval value_member;
  1392. PHP_PROTO_ZVAL_STRING(&value_member, "value", 1);
  1393. PHP_PROTO_FAKE_SCOPE_RESTART(any_type);
  1394. zval* value = php_proto_message_read_property(
  1395. getThis(), &value_member PHP_PROTO_TSRMLS_CC);
  1396. zval_dtor(&value_member);
  1397. PHP_PROTO_FAKE_SCOPE_END;
  1398. merge_from_string(Z_STRVAL_P(value), Z_STRLEN_P(value), desc, msg);
  1399. }
  1400. PHP_METHOD(Any, pack) {
  1401. zval* val;
  1402. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &val) ==
  1403. FAILURE) {
  1404. return;
  1405. }
  1406. if (!instanceof_function(Z_OBJCE_P(val), message_type TSRMLS_CC)) {
  1407. zend_error(E_USER_ERROR, "Given value is not an instance of Message.");
  1408. return;
  1409. }
  1410. // Set value by serialized data.
  1411. zval data;
  1412. serialize_to_string(val, &data TSRMLS_CC);
  1413. zval member;
  1414. PHP_PROTO_ZVAL_STRING(&member, "value", 1);
  1415. PHP_PROTO_FAKE_SCOPE_BEGIN(any_type);
  1416. message_handlers->write_property(getThis(), &member, &data,
  1417. NULL PHP_PROTO_TSRMLS_CC);
  1418. zval_dtor(&data);
  1419. zval_dtor(&member);
  1420. PHP_PROTO_FAKE_SCOPE_END;
  1421. // Set type url.
  1422. DescriptorInternal* desc = get_ce_desc(Z_OBJCE_P(val));
  1423. const char* fully_qualified_name = upb_msgdef_fullname(desc->msgdef);
  1424. size_t type_url_len =
  1425. strlen(TYPE_URL_PREFIX) + strlen(fully_qualified_name) + 1;
  1426. char* type_url = ALLOC_N(char, type_url_len);
  1427. sprintf(type_url, "%s%s", TYPE_URL_PREFIX, fully_qualified_name);
  1428. zval type_url_php;
  1429. PHP_PROTO_ZVAL_STRING(&type_url_php, type_url, 1);
  1430. PHP_PROTO_ZVAL_STRING(&member, "type_url", 1);
  1431. PHP_PROTO_FAKE_SCOPE_RESTART(any_type);
  1432. message_handlers->write_property(getThis(), &member, &type_url_php,
  1433. NULL PHP_PROTO_TSRMLS_CC);
  1434. zval_dtor(&type_url_php);
  1435. zval_dtor(&member);
  1436. PHP_PROTO_FAKE_SCOPE_END;
  1437. FREE(type_url);
  1438. }
  1439. PHP_METHOD(Any, is) {
  1440. zend_class_entry *klass = NULL;
  1441. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "C", &klass) ==
  1442. FAILURE) {
  1443. return;
  1444. }
  1445. DescriptorInternal* desc = get_ce_desc(klass);
  1446. if (desc == NULL) {
  1447. RETURN_BOOL(false);
  1448. }
  1449. // Create corresponded type url.
  1450. const char* fully_qualified_name = upb_msgdef_fullname(desc->msgdef);
  1451. size_t type_url_len =
  1452. strlen(TYPE_URL_PREFIX) + strlen(fully_qualified_name) + 1;
  1453. char* type_url = ALLOC_N(char, type_url_len);
  1454. sprintf(type_url, "%s%s", TYPE_URL_PREFIX, fully_qualified_name);
  1455. // Fetch stored type url.
  1456. zval member;
  1457. PHP_PROTO_ZVAL_STRING(&member, "type_url", 1);
  1458. PHP_PROTO_FAKE_SCOPE_BEGIN(any_type);
  1459. zval* value =
  1460. php_proto_message_read_property(getThis(), &member PHP_PROTO_TSRMLS_CC);
  1461. zval_dtor(&member);
  1462. PHP_PROTO_FAKE_SCOPE_END;
  1463. // Compare two type url.
  1464. bool is = strcmp(type_url, Z_STRVAL_P(value)) == 0;
  1465. FREE(type_url);
  1466. RETURN_BOOL(is);
  1467. }
  1468. // -----------------------------------------------------------------------------
  1469. // Duration
  1470. // -----------------------------------------------------------------------------
  1471. static zend_function_entry duration_methods[] = {
  1472. PHP_ME(Duration, __construct, NULL, ZEND_ACC_PUBLIC)
  1473. PHP_ME(Duration, getSeconds, NULL, ZEND_ACC_PUBLIC)
  1474. PHP_ME(Duration, setSeconds, NULL, ZEND_ACC_PUBLIC)
  1475. PHP_ME(Duration, getNanos, NULL, ZEND_ACC_PUBLIC)
  1476. PHP_ME(Duration, setNanos, NULL, ZEND_ACC_PUBLIC)
  1477. {NULL, NULL, NULL}
  1478. };
  1479. zend_class_entry* duration_type;
  1480. // Init class entry.
  1481. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Duration",
  1482. Duration, duration)
  1483. zend_declare_property_long(duration_type, "seconds", strlen("seconds"),
  1484. 0 ,ZEND_ACC_PRIVATE TSRMLS_CC);
  1485. zend_declare_property_long(duration_type, "nanos", strlen("nanos"),
  1486. 0 ,ZEND_ACC_PRIVATE TSRMLS_CC);
  1487. PHP_PROTO_INIT_SUBMSGCLASS_END
  1488. PHP_METHOD(Duration, __construct) {
  1489. init_file_duration(TSRMLS_C);
  1490. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1491. INIT_MESSAGE_WITH_ARRAY;
  1492. }
  1493. PHP_PROTO_FIELD_ACCESSORS(Duration, duration, Seconds, "seconds")
  1494. PHP_PROTO_FIELD_ACCESSORS(Duration, duration, Nanos, "nanos")
  1495. // -----------------------------------------------------------------------------
  1496. // Timestamp
  1497. // -----------------------------------------------------------------------------
  1498. static zend_function_entry timestamp_methods[] = {
  1499. PHP_ME(Timestamp, __construct, NULL, ZEND_ACC_PUBLIC)
  1500. PHP_ME(Timestamp, fromDateTime, NULL, ZEND_ACC_PUBLIC)
  1501. PHP_ME(Timestamp, toDateTime, NULL, ZEND_ACC_PUBLIC)
  1502. PHP_ME(Timestamp, getSeconds, NULL, ZEND_ACC_PUBLIC)
  1503. PHP_ME(Timestamp, setSeconds, NULL, ZEND_ACC_PUBLIC)
  1504. PHP_ME(Timestamp, getNanos, NULL, ZEND_ACC_PUBLIC)
  1505. PHP_ME(Timestamp, setNanos, NULL, ZEND_ACC_PUBLIC)
  1506. {NULL, NULL, NULL}
  1507. };
  1508. zend_class_entry* timestamp_type;
  1509. // Init class entry.
  1510. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Timestamp",
  1511. Timestamp, timestamp)
  1512. zend_declare_property_long(timestamp_type, "seconds", strlen("seconds"),
  1513. 0 ,ZEND_ACC_PRIVATE TSRMLS_CC);
  1514. zend_declare_property_long(timestamp_type, "nanos", strlen("nanos"),
  1515. 0 ,ZEND_ACC_PRIVATE TSRMLS_CC);
  1516. PHP_PROTO_INIT_SUBMSGCLASS_END
  1517. PHP_METHOD(Timestamp, __construct) {
  1518. init_file_timestamp(TSRMLS_C);
  1519. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1520. INIT_MESSAGE_WITH_ARRAY;
  1521. }
  1522. PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Seconds, "seconds")
  1523. PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Nanos, "nanos")
  1524. PHP_METHOD(Timestamp, fromDateTime) {
  1525. zval* datetime;
  1526. zval member;
  1527. PHP_PROTO_CE_DECLARE date_interface_ce;
  1528. if (php_proto_zend_lookup_class("\\DatetimeInterface", 18,
  1529. &date_interface_ce) == FAILURE) {
  1530. zend_error(E_ERROR, "Make sure date extension is enabled.");
  1531. return;
  1532. }
  1533. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &datetime,
  1534. PHP_PROTO_CE_UNREF(date_interface_ce)) == FAILURE) {
  1535. zend_error(E_USER_ERROR, "Expect DatetimeInterface.");
  1536. return;
  1537. }
  1538. int64_t timestamp_seconds;
  1539. {
  1540. zval retval;
  1541. zval function_name;
  1542. #if PHP_MAJOR_VERSION < 7
  1543. INIT_ZVAL(retval);
  1544. INIT_ZVAL(function_name);
  1545. #endif
  1546. PHP_PROTO_ZVAL_STRING(&function_name, "date_timestamp_get", 1);
  1547. if (call_user_function(EG(function_table), NULL, &function_name, &retval, 1,
  1548. ZVAL_PTR_TO_CACHED_PTR(datetime) TSRMLS_CC) == FAILURE) {
  1549. zend_error(E_ERROR, "Cannot get timestamp from DateTime.");
  1550. return;
  1551. }
  1552. protobuf_convert_to_int64(&retval, &timestamp_seconds);
  1553. zval_dtor(&retval);
  1554. zval_dtor(&function_name);
  1555. }
  1556. int64_t timestamp_micros;
  1557. {
  1558. zval retval;
  1559. zval function_name;
  1560. zval format_string;
  1561. #if PHP_MAJOR_VERSION < 7
  1562. INIT_ZVAL(retval);
  1563. INIT_ZVAL(function_name);
  1564. INIT_ZVAL(format_string);
  1565. #endif
  1566. PHP_PROTO_ZVAL_STRING(&function_name, "date_format", 1);
  1567. PHP_PROTO_ZVAL_STRING(&format_string, "u", 1);
  1568. CACHED_VALUE params[2] = {
  1569. ZVAL_PTR_TO_CACHED_VALUE(datetime),
  1570. ZVAL_TO_CACHED_VALUE(format_string),
  1571. };
  1572. if (call_user_function(EG(function_table), NULL, &function_name, &retval,
  1573. ARRAY_SIZE(params), params TSRMLS_CC) == FAILURE) {
  1574. zend_error(E_ERROR, "Cannot format DateTime.");
  1575. return;
  1576. }
  1577. protobuf_convert_to_int64(&retval, &timestamp_micros);
  1578. zval_dtor(&retval);
  1579. zval_dtor(&function_name);
  1580. zval_dtor(&format_string);
  1581. }
  1582. // Set seconds
  1583. MessageHeader* self = UNBOX(MessageHeader, getThis());
  1584. const upb_fielddef* field =
  1585. upb_msgdef_ntofz(self->descriptor->msgdef, "seconds");
  1586. void* storage = message_data(self);
  1587. void* memory = slot_memory(self->descriptor->layout, storage, field);
  1588. *(int64_t*)memory = timestamp_seconds;
  1589. // Set nanos
  1590. field = upb_msgdef_ntofz(self->descriptor->msgdef, "nanos");
  1591. storage = message_data(self);
  1592. memory = slot_memory(self->descriptor->layout, storage, field);
  1593. *(int32_t*)memory = timestamp_micros * 1000;
  1594. RETURN_NULL();
  1595. }
  1596. PHP_METHOD(Timestamp, toDateTime) {
  1597. // Get seconds
  1598. MessageHeader* self = UNBOX(MessageHeader, getThis());
  1599. const upb_fielddef* field =
  1600. upb_msgdef_ntofz(self->descriptor->msgdef, "seconds");
  1601. void* storage = message_data(self);
  1602. void* memory = slot_memory(self->descriptor->layout, storage, field);
  1603. int64_t seconds = *(int64_t*)memory;
  1604. // Get nanos
  1605. field = upb_msgdef_ntofz(self->descriptor->msgdef, "nanos");
  1606. memory = slot_memory(self->descriptor->layout, storage, field);
  1607. int32_t nanos = *(int32_t*)memory;
  1608. // Get formatted time string.
  1609. char formatted_time[32];
  1610. snprintf(formatted_time, sizeof(formatted_time), "%" PRId64 ".%06" PRId32,
  1611. seconds, nanos / 1000);
  1612. // Create Datetime object.
  1613. zval datetime;
  1614. zval function_name;
  1615. zval format_string;
  1616. zval formatted_time_php;
  1617. #if PHP_MAJOR_VERSION < 7
  1618. INIT_ZVAL(function_name);
  1619. INIT_ZVAL(format_string);
  1620. INIT_ZVAL(formatted_time_php);
  1621. #endif
  1622. PHP_PROTO_ZVAL_STRING(&function_name, "date_create_from_format", 1);
  1623. PHP_PROTO_ZVAL_STRING(&format_string, "U.u", 1);
  1624. PHP_PROTO_ZVAL_STRING(&formatted_time_php, formatted_time, 1);
  1625. CACHED_VALUE params[2] = {
  1626. ZVAL_TO_CACHED_VALUE(format_string),
  1627. ZVAL_TO_CACHED_VALUE(formatted_time_php),
  1628. };
  1629. if (call_user_function(EG(function_table), NULL, &function_name, &datetime,
  1630. ARRAY_SIZE(params), params TSRMLS_CC) == FAILURE) {
  1631. zend_error(E_ERROR, "Cannot create DateTime.");
  1632. return;
  1633. }
  1634. zval_dtor(&function_name);
  1635. zval_dtor(&format_string);
  1636. zval_dtor(&formatted_time_php);
  1637. #if PHP_MAJOR_VERSION < 7
  1638. zval* datetime_ptr = &datetime;
  1639. PHP_PROTO_RETVAL_ZVAL(datetime_ptr);
  1640. #else
  1641. ZVAL_OBJ(return_value, Z_OBJ(datetime));
  1642. #endif
  1643. }
  1644. // -----------------------------------------------------------------------------
  1645. // Api
  1646. // -----------------------------------------------------------------------------
  1647. static zend_function_entry api_methods[] = {
  1648. PHP_ME(Api, __construct, NULL, ZEND_ACC_PUBLIC)
  1649. PHP_ME(Api, getName, NULL, ZEND_ACC_PUBLIC)
  1650. PHP_ME(Api, setName, NULL, ZEND_ACC_PUBLIC)
  1651. PHP_ME(Api, getMethods, NULL, ZEND_ACC_PUBLIC)
  1652. PHP_ME(Api, setMethods, NULL, ZEND_ACC_PUBLIC)
  1653. PHP_ME(Api, getOptions, NULL, ZEND_ACC_PUBLIC)
  1654. PHP_ME(Api, setOptions, NULL, ZEND_ACC_PUBLIC)
  1655. PHP_ME(Api, getVersion, NULL, ZEND_ACC_PUBLIC)
  1656. PHP_ME(Api, setVersion, NULL, ZEND_ACC_PUBLIC)
  1657. PHP_ME(Api, getSourceContext, NULL, ZEND_ACC_PUBLIC)
  1658. PHP_ME(Api, setSourceContext, NULL, ZEND_ACC_PUBLIC)
  1659. PHP_ME(Api, getMixins, NULL, ZEND_ACC_PUBLIC)
  1660. PHP_ME(Api, setMixins, NULL, ZEND_ACC_PUBLIC)
  1661. PHP_ME(Api, getSyntax, NULL, ZEND_ACC_PUBLIC)
  1662. PHP_ME(Api, setSyntax, NULL, ZEND_ACC_PUBLIC)
  1663. {NULL, NULL, NULL}
  1664. };
  1665. zend_class_entry* api_type;
  1666. // Init class entry.
  1667. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Api",
  1668. Api, api)
  1669. zend_declare_property_string(api_type, "name", strlen("name"), "",
  1670. ZEND_ACC_PRIVATE TSRMLS_CC);
  1671. zend_declare_property_null(api_type, "methods", strlen("methods"),
  1672. ZEND_ACC_PRIVATE TSRMLS_CC);
  1673. zend_declare_property_null(api_type, "options", strlen("options"),
  1674. ZEND_ACC_PRIVATE TSRMLS_CC);
  1675. zend_declare_property_string(api_type, "version", strlen("version"), "",
  1676. ZEND_ACC_PRIVATE TSRMLS_CC);
  1677. zend_declare_property_null(api_type, "source_context", strlen("source_context"),
  1678. ZEND_ACC_PRIVATE TSRMLS_CC);
  1679. zend_declare_property_null(api_type, "mixins", strlen("mixins"),
  1680. ZEND_ACC_PRIVATE TSRMLS_CC);
  1681. zend_declare_property_long(api_type, "syntax", strlen("syntax"), 0,
  1682. ZEND_ACC_PRIVATE TSRMLS_CC);
  1683. PHP_PROTO_INIT_SUBMSGCLASS_END
  1684. PHP_METHOD(Api, __construct) {
  1685. init_file_api(TSRMLS_C);
  1686. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1687. INIT_MESSAGE_WITH_ARRAY;
  1688. }
  1689. PHP_PROTO_FIELD_ACCESSORS(Api, api, Name, "name")
  1690. PHP_PROTO_FIELD_ACCESSORS(Api, api, Methods, "methods")
  1691. PHP_PROTO_FIELD_ACCESSORS(Api, api, Options, "options")
  1692. PHP_PROTO_FIELD_ACCESSORS(Api, api, Version, "version")
  1693. PHP_PROTO_FIELD_ACCESSORS(Api, api, SourceContext, "source_context")
  1694. PHP_PROTO_FIELD_ACCESSORS(Api, api, Mixins, "mixins")
  1695. PHP_PROTO_FIELD_ACCESSORS(Api, api, Syntax, "syntax")
  1696. // -----------------------------------------------------------------------------
  1697. // BoolValue
  1698. // -----------------------------------------------------------------------------
  1699. static zend_function_entry bool_value_methods[] = {
  1700. PHP_ME(BoolValue, __construct, NULL, ZEND_ACC_PUBLIC)
  1701. PHP_ME(BoolValue, getValue, NULL, ZEND_ACC_PUBLIC)
  1702. PHP_ME(BoolValue, setValue, NULL, ZEND_ACC_PUBLIC)
  1703. {NULL, NULL, NULL}
  1704. };
  1705. zend_class_entry* bool_value_type;
  1706. // Init class entry.
  1707. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\BoolValue",
  1708. BoolValue, bool_value)
  1709. zend_declare_property_bool(bool_value_type, "value", strlen("value"), 0,
  1710. ZEND_ACC_PRIVATE TSRMLS_CC);
  1711. PHP_PROTO_INIT_SUBMSGCLASS_END
  1712. PHP_METHOD(BoolValue, __construct) {
  1713. init_file_wrappers(TSRMLS_C);
  1714. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1715. INIT_MESSAGE_WITH_ARRAY;
  1716. }
  1717. PHP_PROTO_FIELD_ACCESSORS(BoolValue, bool_value, Value, "value")
  1718. // -----------------------------------------------------------------------------
  1719. // BytesValue
  1720. // -----------------------------------------------------------------------------
  1721. static zend_function_entry bytes_value_methods[] = {
  1722. PHP_ME(BytesValue, __construct, NULL, ZEND_ACC_PUBLIC)
  1723. PHP_ME(BytesValue, getValue, NULL, ZEND_ACC_PUBLIC)
  1724. PHP_ME(BytesValue, setValue, NULL, ZEND_ACC_PUBLIC)
  1725. {NULL, NULL, NULL}
  1726. };
  1727. zend_class_entry* bytes_value_type;
  1728. // Init class entry.
  1729. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\BytesValue",
  1730. BytesValue, bytes_value)
  1731. zend_declare_property_string(bytes_value_type, "value", strlen("value"), "",
  1732. ZEND_ACC_PRIVATE TSRMLS_CC);
  1733. PHP_PROTO_INIT_SUBMSGCLASS_END
  1734. PHP_METHOD(BytesValue, __construct) {
  1735. init_file_wrappers(TSRMLS_C);
  1736. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1737. INIT_MESSAGE_WITH_ARRAY;
  1738. }
  1739. PHP_PROTO_FIELD_ACCESSORS(BytesValue, bytes_value, Value, "value")
  1740. // -----------------------------------------------------------------------------
  1741. // DoubleValue
  1742. // -----------------------------------------------------------------------------
  1743. static zend_function_entry double_value_methods[] = {
  1744. PHP_ME(DoubleValue, __construct, NULL, ZEND_ACC_PUBLIC)
  1745. PHP_ME(DoubleValue, getValue, NULL, ZEND_ACC_PUBLIC)
  1746. PHP_ME(DoubleValue, setValue, NULL, ZEND_ACC_PUBLIC)
  1747. {NULL, NULL, NULL}
  1748. };
  1749. zend_class_entry* double_value_type;
  1750. // Init class entry.
  1751. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\DoubleValue",
  1752. DoubleValue, double_value)
  1753. zend_declare_property_double(double_value_type, "value", strlen("value"), 0,
  1754. ZEND_ACC_PRIVATE TSRMLS_CC);
  1755. PHP_PROTO_INIT_SUBMSGCLASS_END
  1756. PHP_METHOD(DoubleValue, __construct) {
  1757. init_file_wrappers(TSRMLS_C);
  1758. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1759. INIT_MESSAGE_WITH_ARRAY;
  1760. }
  1761. PHP_PROTO_FIELD_ACCESSORS(DoubleValue, double_value, Value, "value")
  1762. // -----------------------------------------------------------------------------
  1763. // Enum
  1764. // -----------------------------------------------------------------------------
  1765. static zend_function_entry enum_methods[] = {
  1766. PHP_ME(Enum, __construct, NULL, ZEND_ACC_PUBLIC)
  1767. PHP_ME(Enum, getName, NULL, ZEND_ACC_PUBLIC)
  1768. PHP_ME(Enum, setName, NULL, ZEND_ACC_PUBLIC)
  1769. PHP_ME(Enum, getEnumvalue, NULL, ZEND_ACC_PUBLIC)
  1770. PHP_ME(Enum, setEnumvalue, NULL, ZEND_ACC_PUBLIC)
  1771. PHP_ME(Enum, getOptions, NULL, ZEND_ACC_PUBLIC)
  1772. PHP_ME(Enum, setOptions, NULL, ZEND_ACC_PUBLIC)
  1773. PHP_ME(Enum, getSourceContext, NULL, ZEND_ACC_PUBLIC)
  1774. PHP_ME(Enum, setSourceContext, NULL, ZEND_ACC_PUBLIC)
  1775. PHP_ME(Enum, getSyntax, NULL, ZEND_ACC_PUBLIC)
  1776. PHP_ME(Enum, setSyntax, NULL, ZEND_ACC_PUBLIC)
  1777. {NULL, NULL, NULL}
  1778. };
  1779. zend_class_entry* enum_type;
  1780. // Init class entry.
  1781. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Enum",
  1782. Enum, enum)
  1783. zend_declare_property_string(enum_type, "name", strlen("name"), "",
  1784. ZEND_ACC_PRIVATE TSRMLS_CC);
  1785. zend_declare_property_null(enum_type, "enumvalue", strlen("enumvalue"),
  1786. ZEND_ACC_PRIVATE TSRMLS_CC);
  1787. zend_declare_property_null(enum_type, "options", strlen("options"),
  1788. ZEND_ACC_PRIVATE TSRMLS_CC);
  1789. zend_declare_property_null(enum_type, "source_context", strlen("source_context"),
  1790. ZEND_ACC_PRIVATE TSRMLS_CC);
  1791. zend_declare_property_long(enum_type, "syntax", strlen("syntax"), 0,
  1792. ZEND_ACC_PRIVATE TSRMLS_CC);
  1793. PHP_PROTO_INIT_SUBMSGCLASS_END
  1794. PHP_METHOD(Enum, __construct) {
  1795. init_file_type(TSRMLS_C);
  1796. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1797. INIT_MESSAGE_WITH_ARRAY;
  1798. }
  1799. PHP_PROTO_FIELD_ACCESSORS(Enum, enum, Name, "name")
  1800. PHP_PROTO_FIELD_ACCESSORS(Enum, enum, Enumvalue, "enumvalue")
  1801. PHP_PROTO_FIELD_ACCESSORS(Enum, enum, Options, "options")
  1802. PHP_PROTO_FIELD_ACCESSORS(Enum, enum, SourceContext, "source_context")
  1803. PHP_PROTO_FIELD_ACCESSORS(Enum, enum, Syntax, "syntax")
  1804. // -----------------------------------------------------------------------------
  1805. // EnumValue
  1806. // -----------------------------------------------------------------------------
  1807. static zend_function_entry enum_value_methods[] = {
  1808. PHP_ME(EnumValue, __construct, NULL, ZEND_ACC_PUBLIC)
  1809. PHP_ME(EnumValue, getName, NULL, ZEND_ACC_PUBLIC)
  1810. PHP_ME(EnumValue, setName, NULL, ZEND_ACC_PUBLIC)
  1811. PHP_ME(EnumValue, getNumber, NULL, ZEND_ACC_PUBLIC)
  1812. PHP_ME(EnumValue, setNumber, NULL, ZEND_ACC_PUBLIC)
  1813. PHP_ME(EnumValue, getOptions, NULL, ZEND_ACC_PUBLIC)
  1814. PHP_ME(EnumValue, setOptions, NULL, ZEND_ACC_PUBLIC)
  1815. {NULL, NULL, NULL}
  1816. };
  1817. zend_class_entry* enum_value_type;
  1818. // Init class entry.
  1819. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\EnumValue",
  1820. EnumValue, enum_value)
  1821. zend_declare_property_string(enum_value_type, "name", strlen("name"), "",
  1822. ZEND_ACC_PRIVATE TSRMLS_CC);
  1823. zend_declare_property_long(enum_value_type, "number", strlen("number"), 0,
  1824. ZEND_ACC_PRIVATE TSRMLS_CC);
  1825. zend_declare_property_null(enum_value_type, "options", strlen("options"),
  1826. ZEND_ACC_PRIVATE TSRMLS_CC);
  1827. PHP_PROTO_INIT_SUBMSGCLASS_END
  1828. PHP_METHOD(EnumValue, __construct) {
  1829. init_file_type(TSRMLS_C);
  1830. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1831. INIT_MESSAGE_WITH_ARRAY;
  1832. }
  1833. PHP_PROTO_FIELD_ACCESSORS(EnumValue, enum_value, Name, "name")
  1834. PHP_PROTO_FIELD_ACCESSORS(EnumValue, enum_value, Number, "number")
  1835. PHP_PROTO_FIELD_ACCESSORS(EnumValue, enum_value, Options, "options")
  1836. // -----------------------------------------------------------------------------
  1837. // FieldMask
  1838. // -----------------------------------------------------------------------------
  1839. static zend_function_entry field_mask_methods[] = {
  1840. PHP_ME(FieldMask, __construct, NULL, ZEND_ACC_PUBLIC)
  1841. PHP_ME(FieldMask, getPaths, NULL, ZEND_ACC_PUBLIC)
  1842. PHP_ME(FieldMask, setPaths, NULL, ZEND_ACC_PUBLIC)
  1843. {NULL, NULL, NULL}
  1844. };
  1845. zend_class_entry* field_mask_type;
  1846. // Init class entry.
  1847. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\FieldMask",
  1848. FieldMask, field_mask)
  1849. zend_declare_property_null(field_mask_type, "paths", strlen("paths"),
  1850. ZEND_ACC_PRIVATE TSRMLS_CC);
  1851. PHP_PROTO_INIT_SUBMSGCLASS_END
  1852. PHP_METHOD(FieldMask, __construct) {
  1853. init_file_field_mask(TSRMLS_C);
  1854. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1855. INIT_MESSAGE_WITH_ARRAY;
  1856. }
  1857. PHP_PROTO_FIELD_ACCESSORS(FieldMask, field_mask, Paths, "paths")
  1858. // -----------------------------------------------------------------------------
  1859. // Field
  1860. // -----------------------------------------------------------------------------
  1861. static zend_function_entry field_methods[] = {
  1862. PHP_ME(Field, __construct, NULL, ZEND_ACC_PUBLIC)
  1863. PHP_ME(Field, getKind, NULL, ZEND_ACC_PUBLIC)
  1864. PHP_ME(Field, setKind, NULL, ZEND_ACC_PUBLIC)
  1865. PHP_ME(Field, getCardinality, NULL, ZEND_ACC_PUBLIC)
  1866. PHP_ME(Field, setCardinality, NULL, ZEND_ACC_PUBLIC)
  1867. PHP_ME(Field, getNumber, NULL, ZEND_ACC_PUBLIC)
  1868. PHP_ME(Field, setNumber, NULL, ZEND_ACC_PUBLIC)
  1869. PHP_ME(Field, getName, NULL, ZEND_ACC_PUBLIC)
  1870. PHP_ME(Field, setName, NULL, ZEND_ACC_PUBLIC)
  1871. PHP_ME(Field, getTypeUrl, NULL, ZEND_ACC_PUBLIC)
  1872. PHP_ME(Field, setTypeUrl, NULL, ZEND_ACC_PUBLIC)
  1873. PHP_ME(Field, getOneofIndex, NULL, ZEND_ACC_PUBLIC)
  1874. PHP_ME(Field, setOneofIndex, NULL, ZEND_ACC_PUBLIC)
  1875. PHP_ME(Field, getPacked, NULL, ZEND_ACC_PUBLIC)
  1876. PHP_ME(Field, setPacked, NULL, ZEND_ACC_PUBLIC)
  1877. PHP_ME(Field, getOptions, NULL, ZEND_ACC_PUBLIC)
  1878. PHP_ME(Field, setOptions, NULL, ZEND_ACC_PUBLIC)
  1879. PHP_ME(Field, getJsonName, NULL, ZEND_ACC_PUBLIC)
  1880. PHP_ME(Field, setJsonName, NULL, ZEND_ACC_PUBLIC)
  1881. PHP_ME(Field, getDefaultValue, NULL, ZEND_ACC_PUBLIC)
  1882. PHP_ME(Field, setDefaultValue, NULL, ZEND_ACC_PUBLIC)
  1883. {NULL, NULL, NULL}
  1884. };
  1885. zend_class_entry* field_type;
  1886. // Init class entry.
  1887. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Field",
  1888. Field, field)
  1889. zend_declare_property_long(field_type, "kind", strlen("kind"), 0,
  1890. ZEND_ACC_PRIVATE TSRMLS_CC);
  1891. zend_declare_property_long(field_type, "cardinality", strlen("cardinality"),
  1892. 0, ZEND_ACC_PRIVATE TSRMLS_CC);
  1893. zend_declare_property_long(field_type, "number", strlen("number"), 0,
  1894. ZEND_ACC_PRIVATE TSRMLS_CC);
  1895. zend_declare_property_string(field_type, "name", strlen("name"), "",
  1896. ZEND_ACC_PRIVATE TSRMLS_CC);
  1897. zend_declare_property_string(field_type, "type_url", strlen("type_url"), "",
  1898. ZEND_ACC_PRIVATE TSRMLS_CC);
  1899. zend_declare_property_long(field_type, "oneof_index", strlen("oneof_index"),
  1900. 0, ZEND_ACC_PRIVATE TSRMLS_CC);
  1901. zend_declare_property_bool(field_type, "packed", strlen("packed"), false,
  1902. ZEND_ACC_PRIVATE TSRMLS_CC);
  1903. zend_declare_property_null(field_type, "options", strlen("options"),
  1904. ZEND_ACC_PRIVATE TSRMLS_CC);
  1905. zend_declare_property_string(field_type, "json_name", strlen("json_name"),
  1906. "", ZEND_ACC_PRIVATE TSRMLS_CC);
  1907. zend_declare_property_string(field_type, "default_value",
  1908. strlen("default_value"), "",
  1909. ZEND_ACC_PRIVATE TSRMLS_CC);
  1910. PHP_PROTO_INIT_SUBMSGCLASS_END
  1911. PHP_METHOD(Field, __construct) {
  1912. init_file_type(TSRMLS_C);
  1913. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1914. INIT_MESSAGE_WITH_ARRAY;
  1915. }
  1916. PHP_PROTO_FIELD_ACCESSORS(Field, field, Kind, "kind")
  1917. PHP_PROTO_FIELD_ACCESSORS(Field, field, Cardinality, "cardinality")
  1918. PHP_PROTO_FIELD_ACCESSORS(Field, field, Number, "number")
  1919. PHP_PROTO_FIELD_ACCESSORS(Field, field, Name, "name")
  1920. PHP_PROTO_FIELD_ACCESSORS(Field, field, TypeUrl, "type_url")
  1921. PHP_PROTO_FIELD_ACCESSORS(Field, field, OneofIndex, "oneof_index")
  1922. PHP_PROTO_FIELD_ACCESSORS(Field, field, Packed, "packed")
  1923. PHP_PROTO_FIELD_ACCESSORS(Field, field, Options, "options")
  1924. PHP_PROTO_FIELD_ACCESSORS(Field, field, JsonName, "json_name")
  1925. PHP_PROTO_FIELD_ACCESSORS(Field, field, DefaultValue, "default_value")
  1926. // -----------------------------------------------------------------------------
  1927. // FloatValue
  1928. // -----------------------------------------------------------------------------
  1929. static zend_function_entry float_value_methods[] = {
  1930. PHP_ME(FloatValue, __construct, NULL, ZEND_ACC_PUBLIC)
  1931. PHP_ME(FloatValue, getValue, NULL, ZEND_ACC_PUBLIC)
  1932. PHP_ME(FloatValue, setValue, NULL, ZEND_ACC_PUBLIC)
  1933. {NULL, NULL, NULL}
  1934. };
  1935. zend_class_entry* float_value_type;
  1936. // Init class entry.
  1937. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\FloatValue",
  1938. FloatValue, float_value)
  1939. zend_declare_property_double(float_value_type, "value", strlen("value"), 0,
  1940. ZEND_ACC_PRIVATE TSRMLS_CC);
  1941. PHP_PROTO_INIT_SUBMSGCLASS_END
  1942. PHP_METHOD(FloatValue, __construct) {
  1943. init_file_wrappers(TSRMLS_C);
  1944. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1945. INIT_MESSAGE_WITH_ARRAY;
  1946. }
  1947. PHP_PROTO_FIELD_ACCESSORS(FloatValue, float_value, Value, "value")
  1948. // -----------------------------------------------------------------------------
  1949. // GPBEmpty
  1950. // -----------------------------------------------------------------------------
  1951. static zend_function_entry empty_methods[] = {
  1952. PHP_ME(GPBEmpty, __construct, NULL, ZEND_ACC_PUBLIC)
  1953. {NULL, NULL, NULL}
  1954. };
  1955. zend_class_entry* empty_type;
  1956. // Init class entry.
  1957. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\GPBEmpty",
  1958. GPBEmpty, empty)
  1959. PHP_PROTO_INIT_SUBMSGCLASS_END
  1960. PHP_METHOD(GPBEmpty, __construct) {
  1961. init_file_empty(TSRMLS_C);
  1962. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1963. INIT_MESSAGE_WITH_ARRAY;
  1964. }
  1965. // -----------------------------------------------------------------------------
  1966. // Int32Value
  1967. // -----------------------------------------------------------------------------
  1968. static zend_function_entry int32_value_methods[] = {
  1969. PHP_ME(Int32Value, __construct, NULL, ZEND_ACC_PUBLIC)
  1970. PHP_ME(Int32Value, getValue, NULL, ZEND_ACC_PUBLIC)
  1971. PHP_ME(Int32Value, setValue, NULL, ZEND_ACC_PUBLIC)
  1972. {NULL, NULL, NULL}
  1973. };
  1974. zend_class_entry* int32_value_type;
  1975. // Init class entry.
  1976. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Int32Value",
  1977. Int32Value, int32_value)
  1978. zend_declare_property_long(int32_value_type, "value", strlen("value"), 0,
  1979. ZEND_ACC_PRIVATE TSRMLS_CC);
  1980. PHP_PROTO_INIT_SUBMSGCLASS_END
  1981. PHP_METHOD(Int32Value, __construct) {
  1982. init_file_wrappers(TSRMLS_C);
  1983. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1984. INIT_MESSAGE_WITH_ARRAY;
  1985. }
  1986. PHP_PROTO_FIELD_ACCESSORS(Int32Value, int32_value, Value, "value")
  1987. // -----------------------------------------------------------------------------
  1988. // Int64Value
  1989. // -----------------------------------------------------------------------------
  1990. static zend_function_entry int64_value_methods[] = {
  1991. PHP_ME(Int64Value, __construct, NULL, ZEND_ACC_PUBLIC)
  1992. PHP_ME(Int64Value, getValue, NULL, ZEND_ACC_PUBLIC)
  1993. PHP_ME(Int64Value, setValue, NULL, ZEND_ACC_PUBLIC)
  1994. {NULL, NULL, NULL}
  1995. };
  1996. zend_class_entry* int64_value_type;
  1997. // Init class entry.
  1998. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Int64Value",
  1999. Int64Value, int64_value)
  2000. zend_declare_property_long(int64_value_type, "value", strlen("value"), 0,
  2001. ZEND_ACC_PRIVATE TSRMLS_CC);
  2002. PHP_PROTO_INIT_SUBMSGCLASS_END
  2003. PHP_METHOD(Int64Value, __construct) {
  2004. init_file_wrappers(TSRMLS_C);
  2005. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  2006. INIT_MESSAGE_WITH_ARRAY;
  2007. }
  2008. PHP_PROTO_FIELD_ACCESSORS(Int64Value, int64_value, Value, "value")
  2009. // -----------------------------------------------------------------------------
  2010. // ListValue
  2011. // -----------------------------------------------------------------------------
  2012. static zend_function_entry list_value_methods[] = {
  2013. PHP_ME(ListValue, __construct, NULL, ZEND_ACC_PUBLIC)
  2014. PHP_ME(ListValue, getValues, NULL, ZEND_ACC_PUBLIC)
  2015. PHP_ME(ListValue, setValues, NULL, ZEND_ACC_PUBLIC)
  2016. {NULL, NULL, NULL}
  2017. };
  2018. zend_class_entry* list_value_type;
  2019. // Init class entry.
  2020. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\ListValue",
  2021. ListValue, list_value)
  2022. zend_declare_property_null(list_value_type, "values", strlen("values"),
  2023. ZEND_ACC_PRIVATE TSRMLS_CC);
  2024. PHP_PROTO_INIT_SUBMSGCLASS_END
  2025. PHP_METHOD(ListValue, __construct) {
  2026. init_file_struct(TSRMLS_C);
  2027. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  2028. INIT_MESSAGE_WITH_ARRAY;
  2029. }
  2030. PHP_PROTO_FIELD_ACCESSORS(ListValue, list_value, Values, "values")
  2031. // -----------------------------------------------------------------------------
  2032. // Method
  2033. // -----------------------------------------------------------------------------
  2034. static zend_function_entry method_methods[] = {
  2035. PHP_ME(Method, __construct, NULL, ZEND_ACC_PUBLIC)
  2036. PHP_ME(Method, getName, NULL, ZEND_ACC_PUBLIC)
  2037. PHP_ME(Method, setName, NULL, ZEND_ACC_PUBLIC)
  2038. PHP_ME(Method, getRequestTypeUrl, NULL, ZEND_ACC_PUBLIC)
  2039. PHP_ME(Method, setRequestTypeUrl, NULL, ZEND_ACC_PUBLIC)
  2040. PHP_ME(Method, getRequestStreaming, NULL, ZEND_ACC_PUBLIC)
  2041. PHP_ME(Method, setRequestStreaming, NULL, ZEND_ACC_PUBLIC)
  2042. PHP_ME(Method, getResponseTypeUrl, NULL, ZEND_ACC_PUBLIC)
  2043. PHP_ME(Method, setResponseTypeUrl, NULL, ZEND_ACC_PUBLIC)
  2044. PHP_ME(Method, getResponseStreaming, NULL, ZEND_ACC_PUBLIC)
  2045. PHP_ME(Method, setResponseStreaming, NULL, ZEND_ACC_PUBLIC)
  2046. PHP_ME(Method, getOptions, NULL, ZEND_ACC_PUBLIC)
  2047. PHP_ME(Method, setOptions, NULL, ZEND_ACC_PUBLIC)
  2048. PHP_ME(Method, getSyntax, NULL, ZEND_ACC_PUBLIC)
  2049. PHP_ME(Method, setSyntax, NULL, ZEND_ACC_PUBLIC)
  2050. {NULL, NULL, NULL}
  2051. };
  2052. zend_class_entry* method_type;
  2053. // Init class entry.
  2054. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Method",
  2055. Method, method)
  2056. zend_declare_property_string(method_type, "name", strlen("name"), "",
  2057. ZEND_ACC_PRIVATE TSRMLS_CC);
  2058. zend_declare_property_string(method_type, "request_type_url",
  2059. strlen("request_type_url"), "",
  2060. ZEND_ACC_PRIVATE TSRMLS_CC);
  2061. zend_declare_property_bool(method_type, "request_streaming",
  2062. strlen("request_streaming"), 0,
  2063. ZEND_ACC_PRIVATE TSRMLS_CC);
  2064. zend_declare_property_string(method_type, "response_type_url",
  2065. strlen("response_type_url"), "",
  2066. ZEND_ACC_PRIVATE TSRMLS_CC);
  2067. zend_declare_property_bool(method_type, "response_streaming",
  2068. strlen("response_streaming"), 0,
  2069. ZEND_ACC_PRIVATE TSRMLS_CC);
  2070. zend_declare_property_null(method_type, "options", strlen("options"),
  2071. ZEND_ACC_PRIVATE TSRMLS_CC);
  2072. zend_declare_property_long(method_type, "syntax", strlen("syntax"), 0,
  2073. ZEND_ACC_PRIVATE TSRMLS_CC);
  2074. PHP_PROTO_INIT_SUBMSGCLASS_END
  2075. PHP_METHOD(Method, __construct) {
  2076. init_file_api(TSRMLS_C);
  2077. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  2078. INIT_MESSAGE_WITH_ARRAY;
  2079. }
  2080. PHP_PROTO_FIELD_ACCESSORS(Method, method, Name, "name")
  2081. PHP_PROTO_FIELD_ACCESSORS(Method, method, RequestTypeUrl, "request_type_url")
  2082. PHP_PROTO_FIELD_ACCESSORS(Method, method, RequestStreaming, "request_streaming")
  2083. PHP_PROTO_FIELD_ACCESSORS(Method, method, ResponseTypeUrl, "response_type_url")
  2084. PHP_PROTO_FIELD_ACCESSORS(Method, method, ResponseStreaming, "response_streaming")
  2085. PHP_PROTO_FIELD_ACCESSORS(Method, method, Options, "options")
  2086. PHP_PROTO_FIELD_ACCESSORS(Method, method, Syntax, "syntax")
  2087. // -----------------------------------------------------------------------------
  2088. // Mixin
  2089. // -----------------------------------------------------------------------------
  2090. static zend_function_entry mixin_methods[] = {
  2091. PHP_ME(Mixin, __construct, NULL, ZEND_ACC_PUBLIC)
  2092. PHP_ME(Mixin, getName, NULL, ZEND_ACC_PUBLIC)
  2093. PHP_ME(Mixin, setName, NULL, ZEND_ACC_PUBLIC)
  2094. PHP_ME(Mixin, getRoot, NULL, ZEND_ACC_PUBLIC)
  2095. PHP_ME(Mixin, setRoot, NULL, ZEND_ACC_PUBLIC)
  2096. {NULL, NULL, NULL}
  2097. };
  2098. zend_class_entry* mixin_type;
  2099. // Init class entry.
  2100. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Mixin",
  2101. Mixin, mixin)
  2102. zend_declare_property_string(mixin_type, "name", strlen("name"), "",
  2103. ZEND_ACC_PRIVATE TSRMLS_CC);
  2104. zend_declare_property_string(mixin_type, "root", strlen("root"), "",
  2105. ZEND_ACC_PRIVATE TSRMLS_CC);
  2106. PHP_PROTO_INIT_SUBMSGCLASS_END
  2107. PHP_METHOD(Mixin, __construct) {
  2108. init_file_api(TSRMLS_C);
  2109. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  2110. INIT_MESSAGE_WITH_ARRAY;
  2111. }
  2112. PHP_PROTO_FIELD_ACCESSORS(Mixin, mixin, Name, "name")
  2113. PHP_PROTO_FIELD_ACCESSORS(Mixin, mixin, Root, "root")
  2114. // -----------------------------------------------------------------------------
  2115. // Option
  2116. // -----------------------------------------------------------------------------
  2117. static zend_function_entry option_methods[] = {
  2118. PHP_ME(Option, __construct, NULL, ZEND_ACC_PUBLIC)
  2119. PHP_ME(Option, getName, NULL, ZEND_ACC_PUBLIC)
  2120. PHP_ME(Option, setName, NULL, ZEND_ACC_PUBLIC)
  2121. PHP_ME(Option, getValue, NULL, ZEND_ACC_PUBLIC)
  2122. PHP_ME(Option, setValue, NULL, ZEND_ACC_PUBLIC)
  2123. {NULL, NULL, NULL}
  2124. };
  2125. zend_class_entry* option_type;
  2126. // Init class entry.
  2127. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Option",
  2128. Option, option)
  2129. zend_declare_property_string(option_type, "name", strlen("name"), "",
  2130. ZEND_ACC_PRIVATE TSRMLS_CC);
  2131. zend_declare_property_null(option_type, "value", strlen("value"),
  2132. ZEND_ACC_PRIVATE TSRMLS_CC);
  2133. PHP_PROTO_INIT_SUBMSGCLASS_END
  2134. PHP_METHOD(Option, __construct) {
  2135. init_file_type(TSRMLS_C);
  2136. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  2137. INIT_MESSAGE_WITH_ARRAY;
  2138. }
  2139. PHP_PROTO_FIELD_ACCESSORS(Option, option, Name, "name")
  2140. PHP_PROTO_FIELD_ACCESSORS(Option, option, Value, "value")
  2141. // -----------------------------------------------------------------------------
  2142. // SourceContext
  2143. // -----------------------------------------------------------------------------
  2144. static zend_function_entry source_context_methods[] = {
  2145. PHP_ME(SourceContext, __construct, NULL, ZEND_ACC_PUBLIC)
  2146. PHP_ME(SourceContext, getFileName, NULL, ZEND_ACC_PUBLIC)
  2147. PHP_ME(SourceContext, setFileName, NULL, ZEND_ACC_PUBLIC)
  2148. {NULL, NULL, NULL}
  2149. };
  2150. zend_class_entry* source_context_type;
  2151. // Init class entry.
  2152. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\SourceContext",
  2153. SourceContext, source_context)
  2154. zend_declare_property_string(source_context_type, "file_name",
  2155. strlen("file_name"), "",
  2156. ZEND_ACC_PRIVATE TSRMLS_CC);
  2157. PHP_PROTO_INIT_SUBMSGCLASS_END
  2158. PHP_METHOD(SourceContext, __construct) {
  2159. init_file_source_context(TSRMLS_C);
  2160. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  2161. INIT_MESSAGE_WITH_ARRAY;
  2162. }
  2163. PHP_PROTO_FIELD_ACCESSORS(SourceContext, source_context, FileName, "file_name")
  2164. // -----------------------------------------------------------------------------
  2165. // StringValue
  2166. // -----------------------------------------------------------------------------
  2167. static zend_function_entry string_value_methods[] = {
  2168. PHP_ME(StringValue, __construct, NULL, ZEND_ACC_PUBLIC)
  2169. PHP_ME(StringValue, getValue, NULL, ZEND_ACC_PUBLIC)
  2170. PHP_ME(StringValue, setValue, NULL, ZEND_ACC_PUBLIC)
  2171. {NULL, NULL, NULL}
  2172. };
  2173. zend_class_entry* string_value_type;
  2174. // Init class entry.
  2175. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\StringValue",
  2176. StringValue, string_value)
  2177. zend_declare_property_string(string_value_type, "value", strlen("value"), "",
  2178. ZEND_ACC_PRIVATE TSRMLS_CC);
  2179. PHP_PROTO_INIT_SUBMSGCLASS_END
  2180. PHP_METHOD(StringValue, __construct) {
  2181. init_file_wrappers(TSRMLS_C);
  2182. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  2183. INIT_MESSAGE_WITH_ARRAY;
  2184. }
  2185. PHP_PROTO_FIELD_ACCESSORS(StringValue, string_value, Value, "value")
  2186. // -----------------------------------------------------------------------------
  2187. // Struct
  2188. // -----------------------------------------------------------------------------
  2189. static zend_function_entry struct_methods[] = {
  2190. PHP_ME(Struct, __construct, NULL, ZEND_ACC_PUBLIC)
  2191. PHP_ME(Struct, getFields, NULL, ZEND_ACC_PUBLIC)
  2192. PHP_ME(Struct, setFields, NULL, ZEND_ACC_PUBLIC)
  2193. {NULL, NULL, NULL}
  2194. };
  2195. zend_class_entry* struct_type;
  2196. // Init class entry.
  2197. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Struct",
  2198. Struct, struct)
  2199. zend_declare_property_null(struct_type, "fields", strlen("fields"),
  2200. ZEND_ACC_PRIVATE TSRMLS_CC);
  2201. PHP_PROTO_INIT_SUBMSGCLASS_END
  2202. PHP_METHOD(Struct, __construct) {
  2203. init_file_struct(TSRMLS_C);
  2204. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  2205. INIT_MESSAGE_WITH_ARRAY;
  2206. }
  2207. PHP_PROTO_FIELD_ACCESSORS(Struct, struct, Fields, "fields")
  2208. // -----------------------------------------------------------------------------
  2209. // Type
  2210. // -----------------------------------------------------------------------------
  2211. static zend_function_entry type_methods[] = {
  2212. PHP_ME(Type, __construct, NULL, ZEND_ACC_PUBLIC)
  2213. PHP_ME(Type, getName, NULL, ZEND_ACC_PUBLIC)
  2214. PHP_ME(Type, setName, NULL, ZEND_ACC_PUBLIC)
  2215. PHP_ME(Type, getFields, NULL, ZEND_ACC_PUBLIC)
  2216. PHP_ME(Type, setFields, NULL, ZEND_ACC_PUBLIC)
  2217. PHP_ME(Type, getOneofs, NULL, ZEND_ACC_PUBLIC)
  2218. PHP_ME(Type, setOneofs, NULL, ZEND_ACC_PUBLIC)
  2219. PHP_ME(Type, getOptions, NULL, ZEND_ACC_PUBLIC)
  2220. PHP_ME(Type, setOptions, NULL, ZEND_ACC_PUBLIC)
  2221. PHP_ME(Type, getSourceContext, NULL, ZEND_ACC_PUBLIC)
  2222. PHP_ME(Type, setSourceContext, NULL, ZEND_ACC_PUBLIC)
  2223. PHP_ME(Type, getSyntax, NULL, ZEND_ACC_PUBLIC)
  2224. PHP_ME(Type, setSyntax, NULL, ZEND_ACC_PUBLIC)
  2225. {NULL, NULL, NULL}
  2226. };
  2227. zend_class_entry* type_type;
  2228. // Init class entry.
  2229. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Type",
  2230. Type, type)
  2231. zend_declare_property_string(type_type, "name", strlen("name"), "",
  2232. ZEND_ACC_PRIVATE TSRMLS_CC);
  2233. zend_declare_property_null(type_type, "fields", strlen("fields"),
  2234. ZEND_ACC_PRIVATE TSRMLS_CC);
  2235. zend_declare_property_string(type_type, "oneofs", strlen("oneofs"), "",
  2236. ZEND_ACC_PRIVATE TSRMLS_CC);
  2237. zend_declare_property_null(type_type, "options", strlen("options"),
  2238. ZEND_ACC_PRIVATE TSRMLS_CC);
  2239. zend_declare_property_null(type_type, "source_context", strlen("source_context"),
  2240. ZEND_ACC_PRIVATE TSRMLS_CC);
  2241. zend_declare_property_long(type_type, "syntax", strlen("syntax"), 0,
  2242. ZEND_ACC_PRIVATE TSRMLS_CC);
  2243. PHP_PROTO_INIT_SUBMSGCLASS_END
  2244. PHP_METHOD(Type, __construct) {
  2245. init_file_type(TSRMLS_C);
  2246. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  2247. INIT_MESSAGE_WITH_ARRAY;
  2248. }
  2249. PHP_PROTO_FIELD_ACCESSORS(Type, type, Name, "name")
  2250. PHP_PROTO_FIELD_ACCESSORS(Type, type, Fields, "fields")
  2251. PHP_PROTO_FIELD_ACCESSORS(Type, type, Oneofs, "oneofs")
  2252. PHP_PROTO_FIELD_ACCESSORS(Type, type, Options, "options")
  2253. PHP_PROTO_FIELD_ACCESSORS(Type, type, SourceContext, "source_context")
  2254. PHP_PROTO_FIELD_ACCESSORS(Type, type, Syntax, "syntax")
  2255. // -----------------------------------------------------------------------------
  2256. // UInt32Value
  2257. // -----------------------------------------------------------------------------
  2258. static zend_function_entry u_int32_value_methods[] = {
  2259. PHP_ME(UInt32Value, __construct, NULL, ZEND_ACC_PUBLIC)
  2260. PHP_ME(UInt32Value, getValue, NULL, ZEND_ACC_PUBLIC)
  2261. PHP_ME(UInt32Value, setValue, NULL, ZEND_ACC_PUBLIC)
  2262. {NULL, NULL, NULL}
  2263. };
  2264. zend_class_entry* u_int32_value_type;
  2265. // Init class entry.
  2266. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\UInt32Value",
  2267. UInt32Value, u_int32_value)
  2268. zend_declare_property_long(u_int32_value_type, "value", strlen("value"), 0,
  2269. ZEND_ACC_PRIVATE TSRMLS_CC);
  2270. PHP_PROTO_INIT_SUBMSGCLASS_END
  2271. PHP_METHOD(UInt32Value, __construct) {
  2272. init_file_wrappers(TSRMLS_C);
  2273. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  2274. INIT_MESSAGE_WITH_ARRAY;
  2275. }
  2276. PHP_PROTO_FIELD_ACCESSORS(UInt32Value, u_int32_value, Value, "value")
  2277. // -----------------------------------------------------------------------------
  2278. // UInt64Value
  2279. // -----------------------------------------------------------------------------
  2280. static zend_function_entry u_int64_value_methods[] = {
  2281. PHP_ME(UInt64Value, __construct, NULL, ZEND_ACC_PUBLIC)
  2282. PHP_ME(UInt64Value, getValue, NULL, ZEND_ACC_PUBLIC)
  2283. PHP_ME(UInt64Value, setValue, NULL, ZEND_ACC_PUBLIC)
  2284. {NULL, NULL, NULL}
  2285. };
  2286. zend_class_entry* u_int64_value_type;
  2287. // Init class entry.
  2288. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\UInt64Value",
  2289. UInt64Value, u_int64_value)
  2290. zend_declare_property_long(u_int64_value_type, "value", strlen("value"), 0,
  2291. ZEND_ACC_PRIVATE TSRMLS_CC);
  2292. PHP_PROTO_INIT_SUBMSGCLASS_END
  2293. PHP_METHOD(UInt64Value, __construct) {
  2294. init_file_wrappers(TSRMLS_C);
  2295. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  2296. INIT_MESSAGE_WITH_ARRAY;
  2297. }
  2298. PHP_PROTO_FIELD_ACCESSORS(UInt64Value, u_int64_value, Value, "value")
  2299. // -----------------------------------------------------------------------------
  2300. // Value
  2301. // -----------------------------------------------------------------------------
  2302. static zend_function_entry value_methods[] = {
  2303. PHP_ME(Value, __construct, NULL, ZEND_ACC_PUBLIC)
  2304. PHP_ME(Value, getNullValue, NULL, ZEND_ACC_PUBLIC)
  2305. PHP_ME(Value, setNullValue, NULL, ZEND_ACC_PUBLIC)
  2306. PHP_ME(Value, getNumberValue, NULL, ZEND_ACC_PUBLIC)
  2307. PHP_ME(Value, setNumberValue, NULL, ZEND_ACC_PUBLIC)
  2308. PHP_ME(Value, getStringValue, NULL, ZEND_ACC_PUBLIC)
  2309. PHP_ME(Value, setStringValue, NULL, ZEND_ACC_PUBLIC)
  2310. PHP_ME(Value, getBoolValue, NULL, ZEND_ACC_PUBLIC)
  2311. PHP_ME(Value, setBoolValue, NULL, ZEND_ACC_PUBLIC)
  2312. PHP_ME(Value, getStructValue, NULL, ZEND_ACC_PUBLIC)
  2313. PHP_ME(Value, setStructValue, NULL, ZEND_ACC_PUBLIC)
  2314. PHP_ME(Value, getListValue, NULL, ZEND_ACC_PUBLIC)
  2315. PHP_ME(Value, setListValue, NULL, ZEND_ACC_PUBLIC)
  2316. PHP_ME(Value, getKind, NULL, ZEND_ACC_PUBLIC)
  2317. {NULL, NULL, NULL}
  2318. };
  2319. zend_class_entry* value_type;
  2320. // Init class entry.
  2321. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Value",
  2322. Value, value)
  2323. zend_declare_property_null(value_type, "kind", strlen("kind"),
  2324. ZEND_ACC_PRIVATE TSRMLS_CC);
  2325. PHP_PROTO_INIT_SUBMSGCLASS_END
  2326. PHP_METHOD(Value, __construct) {
  2327. init_file_struct(TSRMLS_C);
  2328. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  2329. INIT_MESSAGE_WITH_ARRAY;
  2330. }
  2331. PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, NullValue, "null_value")
  2332. PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, NumberValue, "number_value")
  2333. PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, StringValue, "string_value")
  2334. PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, BoolValue, "bool_value")
  2335. PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, StructValue, "struct_value")
  2336. PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, ListValue, "list_value")
  2337. PHP_PROTO_ONEOF_ACCESSORS(Value, value, Kind, "kind")
  2338. // -----------------------------------------------------------------------------
  2339. // GPBMetadata files for well known types
  2340. // -----------------------------------------------------------------------------
  2341. #define DEFINE_GPBMETADATA_FILE(LOWERNAME, CAMELNAME, CLASSNAME) \
  2342. zend_class_entry* gpb_metadata_##LOWERNAME##_type; \
  2343. static zend_function_entry gpb_metadata_##LOWERNAME##_methods[] = { \
  2344. PHP_ME(GPBMetadata_##CAMELNAME, initOnce, NULL, \
  2345. ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) \
  2346. ZEND_FE_END \
  2347. }; \
  2348. void gpb_metadata_##LOWERNAME##_init(TSRMLS_D) { \
  2349. zend_class_entry class_type; \
  2350. INIT_CLASS_ENTRY(class_type, CLASSNAME, \
  2351. gpb_metadata_##LOWERNAME##_methods); \
  2352. gpb_metadata_##LOWERNAME##_type = \
  2353. zend_register_internal_class(&class_type TSRMLS_CC); \
  2354. } \
  2355. PHP_METHOD(GPBMetadata_##CAMELNAME, initOnce) { \
  2356. init_file_##LOWERNAME(TSRMLS_C); \
  2357. }
  2358. DEFINE_GPBMETADATA_FILE(any, Any, "GPBMetadata\\Google\\Protobuf\\Any");
  2359. DEFINE_GPBMETADATA_FILE(api, Api, "GPBMetadata\\Google\\Protobuf\\Api");
  2360. DEFINE_GPBMETADATA_FILE(duration, Duration,
  2361. "GPBMetadata\\Google\\Protobuf\\Duration");
  2362. DEFINE_GPBMETADATA_FILE(field_mask, FieldMask,
  2363. "GPBMetadata\\Google\\Protobuf\\FieldMask");
  2364. DEFINE_GPBMETADATA_FILE(empty, Empty,
  2365. "GPBMetadata\\Google\\Protobuf\\GPBEmpty");
  2366. DEFINE_GPBMETADATA_FILE(source_context, SourceContext,
  2367. "GPBMetadata\\Google\\Protobuf\\SourceContext");
  2368. DEFINE_GPBMETADATA_FILE(struct, Struct,
  2369. "GPBMetadata\\Google\\Protobuf\\Struct");
  2370. DEFINE_GPBMETADATA_FILE(timestamp, Timestamp,
  2371. "GPBMetadata\\Google\\Protobuf\\Timestamp");
  2372. DEFINE_GPBMETADATA_FILE(type, Type, "GPBMetadata\\Google\\Protobuf\\Type");
  2373. DEFINE_GPBMETADATA_FILE(wrappers, Wrappers,
  2374. "GPBMetadata\\Google\\Protobuf\\Wrappers");
  2375. #undef DEFINE_GPBMETADATA_FILE