message.c 106 KB

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