message.c 86 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074
  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 <ext/date/php_date.h>
  32. #include <stdlib.h>
  33. #include "protobuf.h"
  34. #include "utf8.h"
  35. zend_class_entry* message_type;
  36. zend_object_handlers* message_handlers;
  37. static const char TYPE_URL_PREFIX[] = "type.googleapis.com/";
  38. static void hex_to_binary(const char* hex, char** binary, int* binary_len);
  39. static zend_function_entry message_methods[] = {
  40. PHP_ME(Message, clear, NULL, ZEND_ACC_PUBLIC)
  41. PHP_ME(Message, discardUnknownFields, NULL, ZEND_ACC_PUBLIC)
  42. PHP_ME(Message, serializeToString, NULL, ZEND_ACC_PUBLIC)
  43. PHP_ME(Message, mergeFromString, NULL, ZEND_ACC_PUBLIC)
  44. PHP_ME(Message, serializeToJsonString, NULL, ZEND_ACC_PUBLIC)
  45. PHP_ME(Message, mergeFromJsonString, NULL, ZEND_ACC_PUBLIC)
  46. PHP_ME(Message, mergeFrom, NULL, ZEND_ACC_PUBLIC)
  47. PHP_ME(Message, readOneof, NULL, ZEND_ACC_PROTECTED)
  48. PHP_ME(Message, writeOneof, NULL, ZEND_ACC_PROTECTED)
  49. PHP_ME(Message, whichOneof, NULL, ZEND_ACC_PROTECTED)
  50. PHP_ME(Message, __construct, NULL, ZEND_ACC_PROTECTED)
  51. {NULL, NULL, NULL}
  52. };
  53. // Forward declare static functions.
  54. #if PHP_MAJOR_VERSION < 7
  55. static void message_set_property(zval* object, zval* member, zval* value,
  56. php_proto_zend_literal key TSRMLS_DC);
  57. static zval* message_get_property(zval* object, zval* member, int type,
  58. const zend_literal* key TSRMLS_DC);
  59. static zval** message_get_property_ptr_ptr(zval* object, zval* member, int type,
  60. php_proto_zend_literal key TSRMLS_DC);
  61. static HashTable* message_get_gc(zval* object, zval*** table, int* n TSRMLS_DC);
  62. #else
  63. static void message_set_property(zval* object, zval* member, zval* value,
  64. void** cache_slot);
  65. static zval* message_get_property(zval* object, zval* member, int type,
  66. void** cache_slot, zval* rv);
  67. static zval* message_get_property_ptr_ptr(zval* object, zval* member, int type,
  68. void** cache_slot);
  69. static HashTable* message_get_gc(zval* object, zval** table, int* n);
  70. #endif
  71. static HashTable* message_get_properties(zval* object TSRMLS_DC);
  72. // -----------------------------------------------------------------------------
  73. // PHP Message Handlers
  74. // -----------------------------------------------------------------------------
  75. // Define object free method.
  76. PHP_PROTO_OBJECT_FREE_START(MessageHeader, message)
  77. if (*(void**)intern->data != NULL) {
  78. stringsink_uninit(*(void**)intern->data);
  79. FREE(*(void**)intern->data);
  80. }
  81. FREE(intern->data);
  82. PHP_PROTO_OBJECT_FREE_END
  83. PHP_PROTO_OBJECT_DTOR_START(MessageHeader, message)
  84. PHP_PROTO_OBJECT_DTOR_END
  85. // Define object create method.
  86. PHP_PROTO_OBJECT_CREATE_START(MessageHeader, message)
  87. // Because php call this create func before calling the sub-message's
  88. // constructor defined in PHP, it's possible that the decriptor of this class
  89. // hasn't been added to descritpor pool (when the class is first
  90. // instantiated). In that case, we will defer the initialization of the custom
  91. // data to the parent Message's constructor, which will be called by
  92. // sub-message's constructors after the descriptor has been added.
  93. PHP_PROTO_OBJECT_CREATE_END(MessageHeader, message)
  94. // Init class entry.
  95. PHP_PROTO_INIT_CLASS_START("Google\\Protobuf\\Internal\\Message",
  96. MessageHeader, message)
  97. message_handlers->write_property = message_set_property;
  98. message_handlers->read_property = message_get_property;
  99. message_handlers->get_property_ptr_ptr = message_get_property_ptr_ptr;
  100. message_handlers->get_properties = message_get_properties;
  101. message_handlers->get_gc = message_get_gc;
  102. PHP_PROTO_INIT_CLASS_END
  103. static void message_set_property_internal(zval* object, zval* member,
  104. zval* value TSRMLS_DC) {
  105. const upb_fielddef* field;
  106. MessageHeader* self = UNBOX(MessageHeader, object);
  107. field = upb_msgdef_ntofz(self->descriptor->msgdef, Z_STRVAL_P(member));
  108. if (field == NULL) {
  109. zend_error(E_USER_ERROR, "Unknown field: %s", Z_STRVAL_P(member));
  110. }
  111. layout_set(self->descriptor->layout, self, field, value TSRMLS_CC);
  112. }
  113. #if PHP_MAJOR_VERSION < 7
  114. static void message_set_property(zval* object, zval* member, zval* value,
  115. php_proto_zend_literal key TSRMLS_DC) {
  116. #else
  117. static void message_set_property(zval* object, zval* member, zval* value,
  118. void** cache_slot) {
  119. #endif
  120. if (Z_TYPE_P(member) != IS_STRING) {
  121. zend_error(E_USER_ERROR, "Unexpected type for field name");
  122. return;
  123. }
  124. #if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
  125. if (Z_OBJCE_P(object) != EG(scope)) {
  126. #else
  127. if (Z_OBJCE_P(object) != zend_get_executed_scope()) {
  128. #endif
  129. // User cannot set property directly (e.g., $m->a = 1)
  130. zend_error(E_USER_ERROR, "Cannot access private property.");
  131. return;
  132. }
  133. message_set_property_internal(object, member, value TSRMLS_CC);
  134. }
  135. static zval* message_get_property_internal(zval* object,
  136. zval* member TSRMLS_DC) {
  137. MessageHeader* self = UNBOX(MessageHeader, object);
  138. const upb_fielddef* field;
  139. field = upb_msgdef_ntofz(self->descriptor->msgdef, Z_STRVAL_P(member));
  140. if (field == NULL) {
  141. return PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL;
  142. }
  143. zend_property_info* property_info;
  144. #if PHP_MAJOR_VERSION < 7
  145. property_info =
  146. zend_get_property_info(Z_OBJCE_P(object), member, true TSRMLS_CC);
  147. #else
  148. property_info =
  149. zend_get_property_info(Z_OBJCE_P(object), Z_STR_P(member), true);
  150. #endif
  151. return layout_get(
  152. self->descriptor->layout, message_data(self), field,
  153. OBJ_PROP(Z_OBJ_P(object), property_info->offset) TSRMLS_CC);
  154. }
  155. static void message_get_oneof_property_internal(zval* object, zval* member,
  156. zval* return_value TSRMLS_DC) {
  157. MessageHeader* self = UNBOX(MessageHeader, object);
  158. const upb_fielddef* field;
  159. field = upb_msgdef_ntofz(self->descriptor->msgdef, Z_STRVAL_P(member));
  160. if (field == NULL) {
  161. return;
  162. }
  163. layout_get(self->descriptor->layout, message_data(self), field,
  164. ZVAL_PTR_TO_CACHED_PTR(return_value) TSRMLS_CC);
  165. }
  166. #if PHP_MAJOR_VERSION < 7
  167. static zval* message_get_property(zval* object, zval* member, int type,
  168. const zend_literal* key TSRMLS_DC) {
  169. #else
  170. static zval* message_get_property(zval* object, zval* member, int type,
  171. void** cache_slot, zval* rv) {
  172. #endif
  173. if (Z_TYPE_P(member) != IS_STRING) {
  174. zend_error(E_USER_ERROR, "Property name has to be a string.");
  175. return PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL;
  176. }
  177. #if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
  178. if (Z_OBJCE_P(object) != EG(scope)) {
  179. #else
  180. if (Z_OBJCE_P(object) != zend_get_executed_scope()) {
  181. #endif
  182. // User cannot get property directly (e.g., $a = $m->a)
  183. zend_error(E_USER_ERROR, "Cannot access private property.");
  184. return PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL;
  185. }
  186. return message_get_property_internal(object, member TSRMLS_CC);
  187. }
  188. #if PHP_MAJOR_VERSION < 7
  189. static zval** message_get_property_ptr_ptr(zval* object, zval* member, int type,
  190. php_proto_zend_literal key
  191. TSRMLS_DC) {
  192. #else
  193. static zval* message_get_property_ptr_ptr(zval* object, zval* member, int type,
  194. void** cache_slot) {
  195. #endif
  196. return NULL;
  197. }
  198. static HashTable* message_get_properties(zval* object TSRMLS_DC) {
  199. return NULL;
  200. }
  201. static HashTable* message_get_gc(zval* object, CACHED_VALUE** table,
  202. int* n TSRMLS_DC) {
  203. zend_object* zobj = Z_OBJ_P(object);
  204. *table = zobj->properties_table;
  205. *n = zobj->ce->default_properties_count;
  206. return NULL;
  207. }
  208. // -----------------------------------------------------------------------------
  209. // C Message Utilities
  210. // -----------------------------------------------------------------------------
  211. void* message_data(MessageHeader* msg) {
  212. return msg->data;
  213. }
  214. void custom_data_init(const zend_class_entry* ce,
  215. MessageHeader* intern PHP_PROTO_TSRMLS_DC) {
  216. Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(ce));
  217. intern->data = ALLOC_N(uint8_t, desc->layout->size);
  218. memset(message_data(intern), 0, desc->layout->size);
  219. // We wrap first so that everything in the message object is GC-rooted in
  220. // case a collection happens during object creation in layout_init().
  221. intern->descriptor = desc;
  222. layout_init(desc->layout, message_data(intern),
  223. &intern->std PHP_PROTO_TSRMLS_CC);
  224. }
  225. void build_class_from_descriptor(
  226. PHP_PROTO_HASHTABLE_VALUE php_descriptor TSRMLS_DC) {
  227. Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, php_descriptor);
  228. // Map entries don't have existing php class.
  229. if (upb_msgdef_mapentry(desc->msgdef)) {
  230. return;
  231. }
  232. zend_class_entry* registered_ce = desc->klass;
  233. if (desc->layout == NULL) {
  234. MessageLayout* layout = create_layout(desc->msgdef);
  235. desc->layout = layout;
  236. }
  237. registered_ce->create_object = message_create;
  238. }
  239. // -----------------------------------------------------------------------------
  240. // PHP Methods
  241. // -----------------------------------------------------------------------------
  242. // At the first time the message is created, the class entry hasn't been
  243. // modified. As a result, the first created instance will be a normal zend
  244. // object. Here, we manually modify it to our message in such a case.
  245. PHP_METHOD(Message, __construct) {
  246. zend_class_entry* ce = Z_OBJCE_P(getThis());
  247. if (EXPECTED(class_added(ce))) {
  248. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  249. custom_data_init(ce, intern PHP_PROTO_TSRMLS_CC);
  250. }
  251. }
  252. PHP_METHOD(Message, clear) {
  253. MessageHeader* msg = UNBOX(MessageHeader, getThis());
  254. Descriptor* desc = msg->descriptor;
  255. zend_class_entry* ce = desc->klass;
  256. object_properties_init(&msg->std, ce);
  257. layout_init(desc->layout, message_data(msg), &msg->std TSRMLS_CC);
  258. }
  259. PHP_METHOD(Message, mergeFrom) {
  260. zval* value;
  261. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &value,
  262. message_type) == FAILURE) {
  263. return;
  264. }
  265. MessageHeader* from = UNBOX(MessageHeader, value);
  266. MessageHeader* to = UNBOX(MessageHeader, getThis());
  267. if(from->descriptor != to->descriptor) {
  268. zend_error(E_USER_ERROR, "Cannot merge messages with different class.");
  269. return;
  270. }
  271. layout_merge(from->descriptor->layout, from, to TSRMLS_CC);
  272. }
  273. PHP_METHOD(Message, readOneof) {
  274. PHP_PROTO_LONG index;
  275. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) ==
  276. FAILURE) {
  277. return;
  278. }
  279. MessageHeader* msg = UNBOX(MessageHeader, getThis());
  280. const upb_fielddef* field = upb_msgdef_itof(msg->descriptor->msgdef, index);
  281. // Unlike singular fields, oneof fields share cached property. So we cannot
  282. // let lay_get modify the cached property. Instead, we pass in the return
  283. // value directly.
  284. layout_get(msg->descriptor->layout, message_data(msg), field,
  285. ZVAL_PTR_TO_CACHED_PTR(return_value) TSRMLS_CC);
  286. }
  287. PHP_METHOD(Message, writeOneof) {
  288. PHP_PROTO_LONG index;
  289. zval* value;
  290. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz", &index, &value) ==
  291. FAILURE) {
  292. return;
  293. }
  294. MessageHeader* msg = UNBOX(MessageHeader, getThis());
  295. const upb_fielddef* field = upb_msgdef_itof(msg->descriptor->msgdef, index);
  296. layout_set(msg->descriptor->layout, msg, field, value TSRMLS_CC);
  297. }
  298. PHP_METHOD(Message, whichOneof) {
  299. char* oneof_name;
  300. PHP_PROTO_SIZE length;
  301. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &oneof_name,
  302. &length) == FAILURE) {
  303. return;
  304. }
  305. MessageHeader* msg = UNBOX(MessageHeader, getThis());
  306. const upb_oneofdef* oneof =
  307. upb_msgdef_ntoo(msg->descriptor->msgdef, oneof_name, length);
  308. const char* oneof_case_name = layout_get_oneof_case(
  309. msg->descriptor->layout, message_data(msg), oneof TSRMLS_CC);
  310. PHP_PROTO_RETURN_STRING(oneof_case_name, 1);
  311. }
  312. // -----------------------------------------------------------------------------
  313. // Well Known Types Support
  314. // -----------------------------------------------------------------------------
  315. #define PHP_PROTO_FIELD_ACCESSORS(UPPER_CLASS, LOWER_CLASS, UPPER_FIELD, \
  316. LOWER_FIELD) \
  317. PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) { \
  318. zval member; \
  319. PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
  320. PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type); \
  321. zval* value = message_get_property_internal(getThis(), &member TSRMLS_CC); \
  322. PHP_PROTO_FAKE_SCOPE_END; \
  323. PHP_PROTO_RETVAL_ZVAL(value); \
  324. } \
  325. PHP_METHOD(UPPER_CLASS, set##UPPER_FIELD) { \
  326. zval* value = NULL; \
  327. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == \
  328. FAILURE) { \
  329. return; \
  330. } \
  331. zval member; \
  332. PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
  333. message_set_property_internal(getThis(), &member, value TSRMLS_CC); \
  334. PHP_PROTO_RETVAL_ZVAL(getThis()); \
  335. }
  336. #define PHP_PROTO_ONEOF_FIELD_ACCESSORS(UPPER_CLASS, LOWER_CLASS, UPPER_FIELD, \
  337. LOWER_FIELD) \
  338. PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) { \
  339. zval member; \
  340. PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
  341. PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type); \
  342. message_get_oneof_property_internal(getThis(), &member, \
  343. return_value TSRMLS_CC); \
  344. PHP_PROTO_FAKE_SCOPE_END; \
  345. } \
  346. PHP_METHOD(UPPER_CLASS, set##UPPER_FIELD) { \
  347. zval* value = NULL; \
  348. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == \
  349. FAILURE) { \
  350. return; \
  351. } \
  352. zval member; \
  353. PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
  354. message_set_property_internal(getThis(), &member, value TSRMLS_CC); \
  355. PHP_PROTO_RETVAL_ZVAL(getThis()); \
  356. }
  357. #define PHP_PROTO_ONEOF_ACCESSORS(UPPER_CLASS, LOWER_CLASS, UPPER_FIELD, \
  358. LOWER_FIELD) \
  359. PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) { \
  360. MessageHeader* msg = UNBOX(MessageHeader, getThis()); \
  361. PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type); \
  362. const upb_oneofdef* oneof = upb_msgdef_ntoo( \
  363. msg->descriptor->msgdef, LOWER_FIELD, strlen(LOWER_FIELD)); \
  364. const char* oneof_case_name = layout_get_oneof_case( \
  365. msg->descriptor->layout, message_data(msg), oneof TSRMLS_CC); \
  366. PHP_PROTO_FAKE_SCOPE_END; \
  367. PHP_PROTO_RETURN_STRING(oneof_case_name, 1); \
  368. }
  369. // Forward declare file init functions
  370. static void init_file_any(TSRMLS_D);
  371. static void init_file_api(TSRMLS_D);
  372. static void init_file_duration(TSRMLS_D);
  373. static void init_file_field_mask(TSRMLS_D);
  374. static void init_file_empty(TSRMLS_D);
  375. static void init_file_source_context(TSRMLS_D);
  376. static void init_file_struct(TSRMLS_D);
  377. static void init_file_timestamp(TSRMLS_D);
  378. static void init_file_type(TSRMLS_D);
  379. static void init_file_wrappers(TSRMLS_D);
  380. // Define file init functions
  381. static void init_file_any(TSRMLS_D) {
  382. static bool is_initialized = false;
  383. if (is_initialized) return;
  384. init_generated_pool_once(TSRMLS_C);
  385. const char* generated_file =
  386. "0acd010a19676f6f676c652f70726f746f6275662f616e792e70726f746f"
  387. "120f676f6f676c652e70726f746f62756622260a03416e7912100a087479"
  388. "70655f75726c180120012809120d0a0576616c756518022001280c426f0a"
  389. "13636f6d2e676f6f676c652e70726f746f6275664208416e7950726f746f"
  390. "50015a256769746875622e636f6d2f676f6c616e672f70726f746f627566"
  391. "2f7074797065732f616e79a20203475042aa021e476f6f676c652e50726f"
  392. "746f6275662e57656c6c4b6e6f776e5479706573620670726f746f33";
  393. char* binary;
  394. int binary_len;
  395. hex_to_binary(generated_file, &binary, &binary_len);
  396. internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
  397. FREE(binary);
  398. is_initialized = true;
  399. }
  400. static void init_file_api(TSRMLS_D) {
  401. static bool is_initialized = false;
  402. if (is_initialized) return;
  403. init_file_source_context(TSRMLS_C);
  404. init_file_type(TSRMLS_C);
  405. init_generated_pool_once(TSRMLS_C);
  406. const char* generated_file =
  407. "0aee050a19676f6f676c652f70726f746f6275662f6170692e70726f746f"
  408. "120f676f6f676c652e70726f746f6275661a24676f6f676c652f70726f74"
  409. "6f6275662f736f757263655f636f6e746578742e70726f746f1a1a676f6f"
  410. "676c652f70726f746f6275662f747970652e70726f746f2281020a034170"
  411. "69120c0a046e616d6518012001280912280a076d6574686f647318022003"
  412. "280b32172e676f6f676c652e70726f746f6275662e4d6574686f6412280a"
  413. "076f7074696f6e7318032003280b32172e676f6f676c652e70726f746f62"
  414. "75662e4f7074696f6e120f0a0776657273696f6e18042001280912360a0e"
  415. "736f757263655f636f6e7465787418052001280b321e2e676f6f676c652e"
  416. "70726f746f6275662e536f75726365436f6e7465787412260a066d697869"
  417. "6e7318062003280b32162e676f6f676c652e70726f746f6275662e4d6978"
  418. "696e12270a0673796e74617818072001280e32172e676f6f676c652e7072"
  419. "6f746f6275662e53796e74617822d5010a064d6574686f64120c0a046e61"
  420. "6d6518012001280912180a10726571756573745f747970655f75726c1802"
  421. "2001280912190a11726571756573745f73747265616d696e671803200128"
  422. "0812190a11726573706f6e73655f747970655f75726c180420012809121a"
  423. "0a12726573706f6e73655f73747265616d696e6718052001280812280a07"
  424. "6f7074696f6e7318062003280b32172e676f6f676c652e70726f746f6275"
  425. "662e4f7074696f6e12270a0673796e74617818072001280e32172e676f6f"
  426. "676c652e70726f746f6275662e53796e74617822230a054d6978696e120c"
  427. "0a046e616d65180120012809120c0a04726f6f7418022001280942750a13"
  428. "636f6d2e676f6f676c652e70726f746f627566420841706950726f746f50"
  429. "015a2b676f6f676c652e676f6c616e672e6f72672f67656e70726f746f2f"
  430. "70726f746f6275662f6170693b617069a20203475042aa021e476f6f676c"
  431. "652e50726f746f6275662e57656c6c4b6e6f776e5479706573620670726f"
  432. "746f33";
  433. char* binary;
  434. int binary_len;
  435. hex_to_binary(generated_file, &binary, &binary_len);
  436. internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
  437. FREE(binary);
  438. is_initialized = true;
  439. }
  440. static void init_file_duration(TSRMLS_D) {
  441. static bool is_initialized = false;
  442. if (is_initialized) return;
  443. init_generated_pool_once(TSRMLS_C);
  444. const char* generated_file =
  445. "0ae3010a1e676f6f676c652f70726f746f6275662f6475726174696f6e2e"
  446. "70726f746f120f676f6f676c652e70726f746f627566222a0a0844757261"
  447. "74696f6e120f0a077365636f6e6473180120012803120d0a056e616e6f73"
  448. "180220012805427c0a13636f6d2e676f6f676c652e70726f746f62756642"
  449. "0d4475726174696f6e50726f746f50015a2a6769746875622e636f6d2f67"
  450. "6f6c616e672f70726f746f6275662f7074797065732f6475726174696f6e"
  451. "f80101a20203475042aa021e476f6f676c652e50726f746f6275662e5765"
  452. "6c6c4b6e6f776e5479706573620670726f746f33";
  453. char* binary;
  454. int binary_len;
  455. hex_to_binary(generated_file, &binary, &binary_len);
  456. internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
  457. FREE(binary);
  458. is_initialized = true;
  459. }
  460. static void init_file_field_mask(TSRMLS_D) {
  461. static bool is_initialized = false;
  462. if (is_initialized) return;
  463. init_generated_pool_once(TSRMLS_C);
  464. const char* generated_file =
  465. "0ae3010a20676f6f676c652f70726f746f6275662f6669656c645f6d6173"
  466. "6b2e70726f746f120f676f6f676c652e70726f746f627566221a0a094669"
  467. "656c644d61736b120d0a0570617468731801200328094289010a13636f6d"
  468. "2e676f6f676c652e70726f746f627566420e4669656c644d61736b50726f"
  469. "746f50015a39676f6f676c652e676f6c616e672e6f72672f67656e70726f"
  470. "746f2f70726f746f6275662f6669656c645f6d61736b3b6669656c645f6d"
  471. "61736ba20203475042aa021e476f6f676c652e50726f746f6275662e5765"
  472. "6c6c4b6e6f776e5479706573620670726f746f33";
  473. char* binary;
  474. int binary_len;
  475. hex_to_binary(generated_file, &binary, &binary_len);
  476. internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
  477. FREE(binary);
  478. is_initialized = true;
  479. }
  480. static void init_file_empty(TSRMLS_D) {
  481. static bool is_initialized = false;
  482. if (is_initialized) return;
  483. init_generated_pool_once(TSRMLS_C);
  484. const char* generated_file =
  485. "0ab7010a1b676f6f676c652f70726f746f6275662f656d7074792e70726f"
  486. "746f120f676f6f676c652e70726f746f62756622070a05456d7074794276"
  487. "0a13636f6d2e676f6f676c652e70726f746f627566420a456d7074795072"
  488. "6f746f50015a276769746875622e636f6d2f676f6c616e672f70726f746f"
  489. "6275662f7074797065732f656d707479f80101a20203475042aa021e476f"
  490. "6f676c652e50726f746f6275662e57656c6c4b6e6f776e54797065736206"
  491. "70726f746f33";
  492. char* binary;
  493. int binary_len;
  494. hex_to_binary(generated_file, &binary, &binary_len);
  495. internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
  496. FREE(binary);
  497. is_initialized = true;
  498. }
  499. static void init_file_source_context(TSRMLS_D) {
  500. static bool is_initialized = false;
  501. if (is_initialized) return;
  502. init_generated_pool_once(TSRMLS_C);
  503. const char* generated_file =
  504. "0afb010a24676f6f676c652f70726f746f6275662f736f757263655f636f"
  505. "6e746578742e70726f746f120f676f6f676c652e70726f746f6275662222"
  506. "0a0d536f75726365436f6e7465787412110a0966696c655f6e616d651801"
  507. "200128094295010a13636f6d2e676f6f676c652e70726f746f6275664212"
  508. "536f75726365436f6e7465787450726f746f50015a41676f6f676c652e67"
  509. "6f6c616e672e6f72672f67656e70726f746f2f70726f746f6275662f736f"
  510. "757263655f636f6e746578743b736f757263655f636f6e74657874a20203"
  511. "475042aa021e476f6f676c652e50726f746f6275662e57656c6c4b6e6f77"
  512. "6e5479706573620670726f746f33";
  513. char* binary;
  514. int binary_len;
  515. hex_to_binary(generated_file, &binary, &binary_len);
  516. internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
  517. FREE(binary);
  518. is_initialized = true;
  519. }
  520. static void init_file_struct(TSRMLS_D) {
  521. static bool is_initialized = false;
  522. if (is_initialized) return;
  523. init_generated_pool_once(TSRMLS_C);
  524. const char* generated_file =
  525. "0a81050a1c676f6f676c652f70726f746f6275662f7374727563742e7072"
  526. "6f746f120f676f6f676c652e70726f746f6275662284010a065374727563"
  527. "7412330a066669656c647318012003280b32232e676f6f676c652e70726f"
  528. "746f6275662e5374727563742e4669656c6473456e7472791a450a0b4669"
  529. "656c6473456e747279120b0a036b657918012001280912250a0576616c75"
  530. "6518022001280b32162e676f6f676c652e70726f746f6275662e56616c75"
  531. "653a02380122ea010a0556616c756512300a0a6e756c6c5f76616c756518"
  532. "012001280e321a2e676f6f676c652e70726f746f6275662e4e756c6c5661"
  533. "6c7565480012160a0c6e756d6265725f76616c7565180220012801480012"
  534. "160a0c737472696e675f76616c7565180320012809480012140a0a626f6f"
  535. "6c5f76616c75651804200128084800122f0a0c7374727563745f76616c75"
  536. "6518052001280b32172e676f6f676c652e70726f746f6275662e53747275"
  537. "6374480012300a0a6c6973745f76616c756518062001280b321a2e676f6f"
  538. "676c652e70726f746f6275662e4c69737456616c7565480042060a046b69"
  539. "6e6422330a094c69737456616c756512260a0676616c7565731801200328"
  540. "0b32162e676f6f676c652e70726f746f6275662e56616c75652a1b0a094e"
  541. "756c6c56616c7565120e0a0a4e554c4c5f56414c554510004281010a1363"
  542. "6f6d2e676f6f676c652e70726f746f627566420b53747275637450726f74"
  543. "6f50015a316769746875622e636f6d2f676f6c616e672f70726f746f6275"
  544. "662f7074797065732f7374727563743b7374727563747062f80101a20203"
  545. "475042aa021e476f6f676c652e50726f746f6275662e57656c6c4b6e6f77"
  546. "6e5479706573620670726f746f33";
  547. char* binary;
  548. int binary_len;
  549. hex_to_binary(generated_file, &binary, &binary_len);
  550. internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
  551. FREE(binary);
  552. is_initialized = true;
  553. }
  554. static void init_file_timestamp(TSRMLS_D) {
  555. static bool is_initialized = false;
  556. if (is_initialized) return;
  557. init_generated_pool_once(TSRMLS_C);
  558. const char* generated_file =
  559. "0ae7010a1f676f6f676c652f70726f746f6275662f74696d657374616d70"
  560. "2e70726f746f120f676f6f676c652e70726f746f627566222b0a0954696d"
  561. "657374616d70120f0a077365636f6e6473180120012803120d0a056e616e"
  562. "6f73180220012805427e0a13636f6d2e676f6f676c652e70726f746f6275"
  563. "66420e54696d657374616d7050726f746f50015a2b6769746875622e636f"
  564. "6d2f676f6c616e672f70726f746f6275662f7074797065732f74696d6573"
  565. "74616d70f80101a20203475042aa021e476f6f676c652e50726f746f6275"
  566. "662e57656c6c4b6e6f776e5479706573620670726f746f33";
  567. char* binary;
  568. int binary_len;
  569. hex_to_binary(generated_file, &binary, &binary_len);
  570. internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
  571. FREE(binary);
  572. is_initialized = true;
  573. }
  574. static void init_file_type(TSRMLS_D) {
  575. static bool is_initialized = false;
  576. if (is_initialized) return;
  577. init_file_any(TSRMLS_C);
  578. init_file_source_context(TSRMLS_C);
  579. init_generated_pool_once(TSRMLS_C);
  580. const char* generated_file =
  581. "0aba0c0a1a676f6f676c652f70726f746f6275662f747970652e70726f74"
  582. "6f120f676f6f676c652e70726f746f6275661a19676f6f676c652f70726f"
  583. "746f6275662f616e792e70726f746f1a24676f6f676c652f70726f746f62"
  584. "75662f736f757263655f636f6e746578742e70726f746f22d7010a045479"
  585. "7065120c0a046e616d6518012001280912260a066669656c647318022003"
  586. "280b32162e676f6f676c652e70726f746f6275662e4669656c64120e0a06"
  587. "6f6e656f667318032003280912280a076f7074696f6e7318042003280b32"
  588. "172e676f6f676c652e70726f746f6275662e4f7074696f6e12360a0e736f"
  589. "757263655f636f6e7465787418052001280b321e2e676f6f676c652e7072"
  590. "6f746f6275662e536f75726365436f6e7465787412270a0673796e746178"
  591. "18062001280e32172e676f6f676c652e70726f746f6275662e53796e7461"
  592. "7822d5050a054669656c6412290a046b696e6418012001280e321b2e676f"
  593. "6f676c652e70726f746f6275662e4669656c642e4b696e6412370a0b6361"
  594. "7264696e616c69747918022001280e32222e676f6f676c652e70726f746f"
  595. "6275662e4669656c642e43617264696e616c697479120e0a066e756d6265"
  596. "72180320012805120c0a046e616d6518042001280912100a08747970655f"
  597. "75726c18062001280912130a0b6f6e656f665f696e646578180720012805"
  598. "120e0a067061636b656418082001280812280a076f7074696f6e73180920"
  599. "03280b32172e676f6f676c652e70726f746f6275662e4f7074696f6e1211"
  600. "0a096a736f6e5f6e616d65180a2001280912150a0d64656661756c745f76"
  601. "616c7565180b2001280922c8020a044b696e6412100a0c545950455f554e"
  602. "4b4e4f574e1000120f0a0b545950455f444f55424c451001120e0a0a5459"
  603. "50455f464c4f41541002120e0a0a545950455f494e5436341003120f0a0b"
  604. "545950455f55494e5436341004120e0a0a545950455f494e543332100512"
  605. "100a0c545950455f46495845443634100612100a0c545950455f46495845"
  606. "4433321007120d0a09545950455f424f4f4c1008120f0a0b545950455f53"
  607. "5452494e471009120e0a0a545950455f47524f5550100a12100a0c545950"
  608. "455f4d455353414745100b120e0a0a545950455f4259544553100c120f0a"
  609. "0b545950455f55494e543332100d120d0a09545950455f454e554d100e12"
  610. "110a0d545950455f5346495845443332100f12110a0d545950455f534649"
  611. "58454436341010120f0a0b545950455f53494e5433321011120f0a0b5459"
  612. "50455f53494e543634101222740a0b43617264696e616c69747912170a13"
  613. "43415244494e414c4954595f554e4b4e4f574e100012180a144341524449"
  614. "4e414c4954595f4f5054494f4e414c100112180a1443415244494e414c49"
  615. "54595f5245515549524544100212180a1443415244494e414c4954595f52"
  616. "45504541544544100322ce010a04456e756d120c0a046e616d6518012001"
  617. "2809122d0a09656e756d76616c756518022003280b321a2e676f6f676c65"
  618. "2e70726f746f6275662e456e756d56616c756512280a076f7074696f6e73"
  619. "18032003280b32172e676f6f676c652e70726f746f6275662e4f7074696f"
  620. "6e12360a0e736f757263655f636f6e7465787418042001280b321e2e676f"
  621. "6f676c652e70726f746f6275662e536f75726365436f6e7465787412270a"
  622. "0673796e74617818052001280e32172e676f6f676c652e70726f746f6275"
  623. "662e53796e74617822530a09456e756d56616c7565120c0a046e616d6518"
  624. "0120012809120e0a066e756d62657218022001280512280a076f7074696f"
  625. "6e7318032003280b32172e676f6f676c652e70726f746f6275662e4f7074"
  626. "696f6e223b0a064f7074696f6e120c0a046e616d6518012001280912230a"
  627. "0576616c756518022001280b32142e676f6f676c652e70726f746f627566"
  628. "2e416e792a2e0a0653796e74617812110a0d53594e5441585f50524f544f"
  629. "32100012110a0d53594e5441585f50524f544f331001427d0a13636f6d2e"
  630. "676f6f676c652e70726f746f62756642095479706550726f746f50015a2f"
  631. "676f6f676c652e676f6c616e672e6f72672f67656e70726f746f2f70726f"
  632. "746f6275662f70747970653b7074797065f80101a20203475042aa021e47"
  633. "6f6f676c652e50726f746f6275662e57656c6c4b6e6f776e547970657362"
  634. "0670726f746f33";
  635. char* binary;
  636. int binary_len;
  637. hex_to_binary(generated_file, &binary, &binary_len);
  638. internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
  639. FREE(binary);
  640. is_initialized = true;
  641. }
  642. static void init_file_wrappers(TSRMLS_D) {
  643. static bool is_initialized = false;
  644. if (is_initialized) return;
  645. init_generated_pool_once(TSRMLS_C);
  646. const char* generated_file =
  647. "0abf030a1e676f6f676c652f70726f746f6275662f77726170706572732e"
  648. "70726f746f120f676f6f676c652e70726f746f627566221c0a0b446f7562"
  649. "6c6556616c7565120d0a0576616c7565180120012801221b0a0a466c6f61"
  650. "7456616c7565120d0a0576616c7565180120012802221b0a0a496e743634"
  651. "56616c7565120d0a0576616c7565180120012803221c0a0b55496e743634"
  652. "56616c7565120d0a0576616c7565180120012804221b0a0a496e74333256"
  653. "616c7565120d0a0576616c7565180120012805221c0a0b55496e74333256"
  654. "616c7565120d0a0576616c756518012001280d221a0a09426f6f6c56616c"
  655. "7565120d0a0576616c7565180120012808221c0a0b537472696e6756616c"
  656. "7565120d0a0576616c7565180120012809221b0a0a427974657356616c75"
  657. "65120d0a0576616c756518012001280c427c0a13636f6d2e676f6f676c65"
  658. "2e70726f746f627566420d577261707065727350726f746f50015a2a6769"
  659. "746875622e636f6d2f676f6c616e672f70726f746f6275662f7074797065"
  660. "732f7772617070657273f80101a20203475042aa021e476f6f676c652e50"
  661. "726f746f6275662e57656c6c4b6e6f776e5479706573620670726f746f33";
  662. char* binary;
  663. int binary_len;
  664. hex_to_binary(generated_file, &binary, &binary_len);
  665. internal_add_generated_file(binary, binary_len, generated_pool TSRMLS_CC);
  666. FREE(binary);
  667. is_initialized = true;
  668. }
  669. // -----------------------------------------------------------------------------
  670. // Define enum
  671. // -----------------------------------------------------------------------------
  672. // -----------------------------------------------------------------------------
  673. // Field_Cardinality
  674. // -----------------------------------------------------------------------------
  675. static zend_function_entry field_cardinality_methods[] = {
  676. {NULL, NULL, NULL}
  677. };
  678. zend_class_entry* field_cardinality_type;
  679. // Init class entry.
  680. PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\Field_Cardinality",
  681. Field_Cardinality, field_cardinality)
  682. zend_declare_class_constant_long(field_cardinality_type,
  683. "CARDINALITY_UNKNOWN", 19, 0 TSRMLS_CC);
  684. zend_declare_class_constant_long(field_cardinality_type,
  685. "CARDINALITY_OPTIONAL", 20, 1 TSRMLS_CC);
  686. zend_declare_class_constant_long(field_cardinality_type,
  687. "CARDINALITY_REQUIRED", 20, 2 TSRMLS_CC);
  688. zend_declare_class_constant_long(field_cardinality_type,
  689. "CARDINALITY_REPEATED", 20, 3 TSRMLS_CC);
  690. PHP_PROTO_INIT_ENUMCLASS_END
  691. // -----------------------------------------------------------------------------
  692. // Field_Kind
  693. // -----------------------------------------------------------------------------
  694. static zend_function_entry field_kind_methods[] = {
  695. {NULL, NULL, NULL}
  696. };
  697. zend_class_entry* field_kind_type;
  698. // Init class entry.
  699. PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\Field_Kind",
  700. Field_Kind, field_kind)
  701. zend_declare_class_constant_long(field_kind_type,
  702. "TYPE_UNKNOWN", 12, 0 TSRMLS_CC);
  703. zend_declare_class_constant_long(field_kind_type,
  704. "TYPE_DOUBLE", 11, 1 TSRMLS_CC);
  705. zend_declare_class_constant_long(field_kind_type,
  706. "TYPE_FLOAT", 10, 2 TSRMLS_CC);
  707. zend_declare_class_constant_long(field_kind_type,
  708. "TYPE_INT64", 10, 3 TSRMLS_CC);
  709. zend_declare_class_constant_long(field_kind_type,
  710. "TYPE_UINT64", 11, 4 TSRMLS_CC);
  711. zend_declare_class_constant_long(field_kind_type,
  712. "TYPE_INT32", 10, 5 TSRMLS_CC);
  713. zend_declare_class_constant_long(field_kind_type,
  714. "TYPE_FIXED64", 12, 6 TSRMLS_CC);
  715. zend_declare_class_constant_long(field_kind_type,
  716. "TYPE_FIXED32", 12, 7 TSRMLS_CC);
  717. zend_declare_class_constant_long(field_kind_type,
  718. "TYPE_BOOL", 9, 8 TSRMLS_CC);
  719. zend_declare_class_constant_long(field_kind_type,
  720. "TYPE_STRING", 11, 9 TSRMLS_CC);
  721. zend_declare_class_constant_long(field_kind_type,
  722. "TYPE_GROUP", 10, 10 TSRMLS_CC);
  723. zend_declare_class_constant_long(field_kind_type,
  724. "TYPE_MESSAGE", 12, 11 TSRMLS_CC);
  725. zend_declare_class_constant_long(field_kind_type,
  726. "TYPE_BYTES", 10, 12 TSRMLS_CC);
  727. zend_declare_class_constant_long(field_kind_type,
  728. "TYPE_UINT32", 11, 13 TSRMLS_CC);
  729. zend_declare_class_constant_long(field_kind_type,
  730. "TYPE_ENUM", 9, 14 TSRMLS_CC);
  731. zend_declare_class_constant_long(field_kind_type,
  732. "TYPE_SFIXED32", 13, 15 TSRMLS_CC);
  733. zend_declare_class_constant_long(field_kind_type,
  734. "TYPE_SFIXED64", 13, 16 TSRMLS_CC);
  735. zend_declare_class_constant_long(field_kind_type,
  736. "TYPE_SINT32", 11, 17 TSRMLS_CC);
  737. zend_declare_class_constant_long(field_kind_type,
  738. "TYPE_SINT64", 11, 18 TSRMLS_CC);
  739. PHP_PROTO_INIT_ENUMCLASS_END
  740. // -----------------------------------------------------------------------------
  741. // NullValue
  742. // -----------------------------------------------------------------------------
  743. static zend_function_entry null_value_methods[] = {
  744. {NULL, NULL, NULL}
  745. };
  746. zend_class_entry* null_value_type;
  747. // Init class entry.
  748. PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\NullValue",
  749. NullValue, null_value)
  750. zend_declare_class_constant_long(null_value_type,
  751. "NULL_VALUE", 10, 0 TSRMLS_CC);
  752. PHP_PROTO_INIT_ENUMCLASS_END
  753. // -----------------------------------------------------------------------------
  754. // Syntax
  755. // -----------------------------------------------------------------------------
  756. static zend_function_entry syntax_methods[] = {
  757. {NULL, NULL, NULL}
  758. };
  759. zend_class_entry* syntax_type;
  760. // Init class entry.
  761. PHP_PROTO_INIT_ENUMCLASS_START("Google\\Protobuf\\Syntax",
  762. Syntax, syntax)
  763. zend_declare_class_constant_long(syntax_type,
  764. "SYNTAX_PROTO2", 13, 0 TSRMLS_CC);
  765. zend_declare_class_constant_long(syntax_type,
  766. "SYNTAX_PROTO3", 13, 1 TSRMLS_CC);
  767. PHP_PROTO_INIT_ENUMCLASS_END
  768. // -----------------------------------------------------------------------------
  769. // Define message
  770. // -----------------------------------------------------------------------------
  771. // -----------------------------------------------------------------------------
  772. // Any
  773. // -----------------------------------------------------------------------------
  774. static zend_function_entry any_methods[] = {
  775. PHP_ME(Any, __construct, NULL, ZEND_ACC_PUBLIC)
  776. PHP_ME(Any, getTypeUrl, NULL, ZEND_ACC_PUBLIC)
  777. PHP_ME(Any, setTypeUrl, NULL, ZEND_ACC_PUBLIC)
  778. PHP_ME(Any, getValue, NULL, ZEND_ACC_PUBLIC)
  779. PHP_ME(Any, setValue, NULL, ZEND_ACC_PUBLIC)
  780. PHP_ME(Any, pack, NULL, ZEND_ACC_PUBLIC)
  781. PHP_ME(Any, unpack, NULL, ZEND_ACC_PUBLIC)
  782. PHP_ME(Any, is, NULL, ZEND_ACC_PUBLIC)
  783. {NULL, NULL, NULL}
  784. };
  785. zend_class_entry* any_type;
  786. // Init class entry.
  787. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Any", Any, any)
  788. zend_class_implements(any_type TSRMLS_CC, 1, message_type);
  789. zend_declare_property_string(any_type, "type_url", strlen("type_url"),
  790. "" ,ZEND_ACC_PRIVATE TSRMLS_CC);
  791. zend_declare_property_string(any_type, "value", strlen("value"),
  792. "" ,ZEND_ACC_PRIVATE TSRMLS_CC);
  793. PHP_PROTO_INIT_SUBMSGCLASS_END
  794. static void hex_to_binary(const char* hex, char** binary, int* binary_len) {
  795. int i;
  796. int hex_len = strlen(hex);
  797. *binary_len = hex_len / 2;
  798. *binary = ALLOC_N(char, *binary_len);
  799. for (i = 0; i < *binary_len; i++) {
  800. char value = 0;
  801. if (hex[i * 2] >= '0' && hex[i * 2] <= '9') {
  802. value += (hex[i * 2] - '0') * 16;
  803. } else {
  804. value += (hex[i * 2] - 'a' + 10) * 16;
  805. }
  806. if (hex[i * 2 + 1] >= '0' && hex[i * 2 + 1] <= '9') {
  807. value += hex[i * 2 + 1] - '0';
  808. } else {
  809. value += hex[i * 2 + 1] - 'a' + 10;
  810. }
  811. (*binary)[i] = value;
  812. }
  813. }
  814. PHP_METHOD(Any, __construct) {
  815. init_file_any(TSRMLS_C);
  816. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  817. custom_data_init(any_type, intern PHP_PROTO_TSRMLS_CC);
  818. }
  819. PHP_PROTO_FIELD_ACCESSORS(Any, any, TypeUrl, "type_url")
  820. PHP_PROTO_FIELD_ACCESSORS(Any, any, Value, "value")
  821. PHP_METHOD(Any, unpack) {
  822. // Get type url.
  823. zval type_url_member;
  824. PHP_PROTO_ZVAL_STRING(&type_url_member, "type_url", 1);
  825. PHP_PROTO_FAKE_SCOPE_BEGIN(any_type);
  826. zval* type_url_php = php_proto_message_read_property(
  827. getThis(), &type_url_member PHP_PROTO_TSRMLS_CC);
  828. PHP_PROTO_FAKE_SCOPE_END;
  829. // Get fully-qualified name from type url.
  830. size_t url_prefix_len = strlen(TYPE_URL_PREFIX);
  831. const char* type_url = Z_STRVAL_P(type_url_php);
  832. size_t type_url_len = Z_STRLEN_P(type_url_php);
  833. if (url_prefix_len > type_url_len ||
  834. strncmp(TYPE_URL_PREFIX, type_url, url_prefix_len) != 0) {
  835. zend_throw_exception(
  836. NULL, "Type url needs to be type.googleapis.com/fully-qulified",
  837. 0 TSRMLS_CC);
  838. return;
  839. }
  840. const char* fully_qualified_name = type_url + url_prefix_len;
  841. PHP_PROTO_HASHTABLE_VALUE desc_php = get_proto_obj(fully_qualified_name);
  842. if (desc_php == NULL) {
  843. zend_throw_exception(
  844. NULL, "Specified message in any hasn't been added to descriptor pool",
  845. 0 TSRMLS_CC);
  846. return;
  847. }
  848. Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, desc_php);
  849. zend_class_entry* klass = desc->klass;
  850. ZVAL_OBJ(return_value, klass->create_object(klass TSRMLS_CC));
  851. MessageHeader* msg = UNBOX(MessageHeader, return_value);
  852. custom_data_init(klass, msg PHP_PROTO_TSRMLS_CC);
  853. // Get value.
  854. zval value_member;
  855. PHP_PROTO_ZVAL_STRING(&value_member, "value", 1);
  856. PHP_PROTO_FAKE_SCOPE_RESTART(any_type);
  857. zval* value = php_proto_message_read_property(
  858. getThis(), &value_member PHP_PROTO_TSRMLS_CC);
  859. PHP_PROTO_FAKE_SCOPE_END;
  860. merge_from_string(Z_STRVAL_P(value), Z_STRLEN_P(value), desc, msg);
  861. }
  862. PHP_METHOD(Any, pack) {
  863. zval* val;
  864. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &val) ==
  865. FAILURE) {
  866. return;
  867. }
  868. if (!instanceof_function(Z_OBJCE_P(val), message_type TSRMLS_CC)) {
  869. zend_error(E_USER_ERROR, "Given value is not an instance of Message.");
  870. return;
  871. }
  872. // Set value by serialized data.
  873. zval data;
  874. serialize_to_string(val, &data TSRMLS_CC);
  875. zval member;
  876. PHP_PROTO_ZVAL_STRING(&member, "value", 1);
  877. PHP_PROTO_FAKE_SCOPE_BEGIN(any_type);
  878. message_handlers->write_property(getThis(), &member, &data,
  879. NULL PHP_PROTO_TSRMLS_CC);
  880. PHP_PROTO_FAKE_SCOPE_END;
  881. // Set type url.
  882. Descriptor* desc =
  883. UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(Z_OBJCE_P(val)));
  884. const char* fully_qualified_name = upb_msgdef_fullname(desc->msgdef);
  885. size_t type_url_len =
  886. strlen(TYPE_URL_PREFIX) + strlen(fully_qualified_name) + 1;
  887. char* type_url = ALLOC_N(char, type_url_len);
  888. sprintf(type_url, "%s%s", TYPE_URL_PREFIX, fully_qualified_name);
  889. zval type_url_php;
  890. PHP_PROTO_ZVAL_STRING(&type_url_php, type_url, 1);
  891. PHP_PROTO_ZVAL_STRING(&member, "type_url", 1);
  892. PHP_PROTO_FAKE_SCOPE_RESTART(any_type);
  893. message_handlers->write_property(getThis(), &member, &type_url_php,
  894. NULL PHP_PROTO_TSRMLS_CC);
  895. PHP_PROTO_FAKE_SCOPE_END;
  896. FREE(type_url);
  897. }
  898. PHP_METHOD(Any, is) {
  899. zend_class_entry *klass = NULL;
  900. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "C", &klass) ==
  901. FAILURE) {
  902. return;
  903. }
  904. PHP_PROTO_HASHTABLE_VALUE desc_php = get_ce_obj(klass);
  905. if (desc_php == NULL) {
  906. RETURN_BOOL(false);
  907. }
  908. // Create corresponded type url.
  909. Descriptor* desc =
  910. UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(klass));
  911. const char* fully_qualified_name = upb_msgdef_fullname(desc->msgdef);
  912. size_t type_url_len =
  913. strlen(TYPE_URL_PREFIX) + strlen(fully_qualified_name) + 1;
  914. char* type_url = ALLOC_N(char, type_url_len);
  915. sprintf(type_url, "%s%s", TYPE_URL_PREFIX, fully_qualified_name);
  916. // Fetch stored type url.
  917. zval member;
  918. PHP_PROTO_ZVAL_STRING(&member, "type_url", 1);
  919. PHP_PROTO_FAKE_SCOPE_BEGIN(any_type);
  920. zval* value =
  921. php_proto_message_read_property(getThis(), &member PHP_PROTO_TSRMLS_CC);
  922. PHP_PROTO_FAKE_SCOPE_END;
  923. // Compare two type url.
  924. bool is = strcmp(type_url, Z_STRVAL_P(value)) == 0;
  925. FREE(type_url);
  926. RETURN_BOOL(is);
  927. }
  928. // -----------------------------------------------------------------------------
  929. // Duration
  930. // -----------------------------------------------------------------------------
  931. static zend_function_entry duration_methods[] = {
  932. PHP_ME(Duration, __construct, NULL, ZEND_ACC_PUBLIC)
  933. PHP_ME(Duration, getSeconds, NULL, ZEND_ACC_PUBLIC)
  934. PHP_ME(Duration, setSeconds, NULL, ZEND_ACC_PUBLIC)
  935. PHP_ME(Duration, getNanos, NULL, ZEND_ACC_PUBLIC)
  936. PHP_ME(Duration, setNanos, NULL, ZEND_ACC_PUBLIC)
  937. {NULL, NULL, NULL}
  938. };
  939. zend_class_entry* duration_type;
  940. // Init class entry.
  941. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Duration",
  942. Duration, duration)
  943. zend_class_implements(duration_type TSRMLS_CC, 1, message_type);
  944. zend_declare_property_long(duration_type, "seconds", strlen("seconds"),
  945. 0 ,ZEND_ACC_PRIVATE TSRMLS_CC);
  946. zend_declare_property_long(duration_type, "nanos", strlen("nanos"),
  947. 0 ,ZEND_ACC_PRIVATE TSRMLS_CC);
  948. PHP_PROTO_INIT_SUBMSGCLASS_END
  949. PHP_METHOD(Duration, __construct) {
  950. init_file_duration(TSRMLS_C);
  951. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  952. custom_data_init(duration_type, intern PHP_PROTO_TSRMLS_CC);
  953. }
  954. PHP_PROTO_FIELD_ACCESSORS(Duration, duration, Seconds, "seconds")
  955. PHP_PROTO_FIELD_ACCESSORS(Duration, duration, Nanos, "nanos")
  956. // -----------------------------------------------------------------------------
  957. // Timestamp
  958. // -----------------------------------------------------------------------------
  959. static zend_function_entry timestamp_methods[] = {
  960. PHP_ME(Timestamp, __construct, NULL, ZEND_ACC_PUBLIC)
  961. PHP_ME(Timestamp, fromDateTime, NULL, ZEND_ACC_PUBLIC)
  962. PHP_ME(Timestamp, toDateTime, NULL, ZEND_ACC_PUBLIC)
  963. PHP_ME(Timestamp, getSeconds, NULL, ZEND_ACC_PUBLIC)
  964. PHP_ME(Timestamp, setSeconds, NULL, ZEND_ACC_PUBLIC)
  965. PHP_ME(Timestamp, getNanos, NULL, ZEND_ACC_PUBLIC)
  966. PHP_ME(Timestamp, setNanos, NULL, ZEND_ACC_PUBLIC)
  967. {NULL, NULL, NULL}
  968. };
  969. zend_class_entry* timestamp_type;
  970. // Init class entry.
  971. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Timestamp",
  972. Timestamp, timestamp)
  973. zend_class_implements(timestamp_type TSRMLS_CC, 1, message_type);
  974. zend_declare_property_long(timestamp_type, "seconds", strlen("seconds"),
  975. 0 ,ZEND_ACC_PRIVATE TSRMLS_CC);
  976. zend_declare_property_long(timestamp_type, "nanos", strlen("nanos"),
  977. 0 ,ZEND_ACC_PRIVATE TSRMLS_CC);
  978. PHP_PROTO_INIT_SUBMSGCLASS_END
  979. PHP_METHOD(Timestamp, __construct) {
  980. init_file_timestamp(TSRMLS_C);
  981. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  982. custom_data_init(timestamp_type, intern PHP_PROTO_TSRMLS_CC);
  983. }
  984. PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Seconds, "seconds")
  985. PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Nanos, "nanos")
  986. PHP_METHOD(Timestamp, fromDateTime) {
  987. zval* datetime;
  988. zval member;
  989. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &datetime,
  990. php_date_get_date_ce()) == FAILURE) {
  991. return;
  992. }
  993. php_date_obj* dateobj = UNBOX(php_date_obj, datetime);
  994. if (!dateobj->time->sse_uptodate) {
  995. timelib_update_ts(dateobj->time, NULL);
  996. }
  997. int64_t timestamp = dateobj->time->sse;
  998. // Set seconds
  999. MessageHeader* self = UNBOX(MessageHeader, getThis());
  1000. const upb_fielddef* field =
  1001. upb_msgdef_ntofz(self->descriptor->msgdef, "seconds");
  1002. void* storage = message_data(self);
  1003. void* memory = slot_memory(self->descriptor->layout, storage, field);
  1004. *(int64_t*)memory = dateobj->time->sse;
  1005. // Set nanos
  1006. field = upb_msgdef_ntofz(self->descriptor->msgdef, "nanos");
  1007. storage = message_data(self);
  1008. memory = slot_memory(self->descriptor->layout, storage, field);
  1009. *(int32_t*)memory = 0;
  1010. }
  1011. PHP_METHOD(Timestamp, toDateTime) {
  1012. zval datetime;
  1013. php_date_instantiate(php_date_get_date_ce(), &datetime TSRMLS_CC);
  1014. php_date_obj* dateobj = UNBOX(php_date_obj, &datetime);
  1015. // Get seconds
  1016. MessageHeader* self = UNBOX(MessageHeader, getThis());
  1017. const upb_fielddef* field =
  1018. upb_msgdef_ntofz(self->descriptor->msgdef, "seconds");
  1019. void* storage = message_data(self);
  1020. void* memory = slot_memory(self->descriptor->layout, storage, field);
  1021. int64_t seconds = *(int64_t*)memory;
  1022. // Get nanos
  1023. field = upb_msgdef_ntofz(self->descriptor->msgdef, "nanos");
  1024. memory = slot_memory(self->descriptor->layout, storage, field);
  1025. int32_t nanos = *(int32_t*)memory;
  1026. // Get formated time string.
  1027. char formated_time[50];
  1028. time_t raw_time = seconds;
  1029. struct tm *utc_time = gmtime(&raw_time);
  1030. strftime(formated_time, sizeof(formated_time), "%Y-%m-%dT%H:%M:%SUTC",
  1031. utc_time);
  1032. if (!php_date_initialize(dateobj, formated_time, strlen(formated_time), NULL,
  1033. NULL, 0 TSRMLS_CC)) {
  1034. zval_dtor(&datetime);
  1035. RETURN_NULL();
  1036. }
  1037. zval* datetime_ptr = &datetime;
  1038. PHP_PROTO_RETVAL_ZVAL(datetime_ptr);
  1039. }
  1040. // -----------------------------------------------------------------------------
  1041. // Api
  1042. // -----------------------------------------------------------------------------
  1043. static zend_function_entry api_methods[] = {
  1044. PHP_ME(Api, __construct, NULL, ZEND_ACC_PUBLIC)
  1045. PHP_ME(Api, getName, NULL, ZEND_ACC_PUBLIC)
  1046. PHP_ME(Api, setName, NULL, ZEND_ACC_PUBLIC)
  1047. PHP_ME(Api, getMethods, NULL, ZEND_ACC_PUBLIC)
  1048. PHP_ME(Api, setMethods, NULL, ZEND_ACC_PUBLIC)
  1049. PHP_ME(Api, getOptions, NULL, ZEND_ACC_PUBLIC)
  1050. PHP_ME(Api, setOptions, NULL, ZEND_ACC_PUBLIC)
  1051. PHP_ME(Api, getVersion, NULL, ZEND_ACC_PUBLIC)
  1052. PHP_ME(Api, setVersion, NULL, ZEND_ACC_PUBLIC)
  1053. PHP_ME(Api, getSourceContext, NULL, ZEND_ACC_PUBLIC)
  1054. PHP_ME(Api, setSourceContext, NULL, ZEND_ACC_PUBLIC)
  1055. PHP_ME(Api, getMixins, NULL, ZEND_ACC_PUBLIC)
  1056. PHP_ME(Api, setMixins, NULL, ZEND_ACC_PUBLIC)
  1057. PHP_ME(Api, getSyntax, NULL, ZEND_ACC_PUBLIC)
  1058. PHP_ME(Api, setSyntax, NULL, ZEND_ACC_PUBLIC)
  1059. {NULL, NULL, NULL}
  1060. };
  1061. zend_class_entry* api_type;
  1062. // Init class entry.
  1063. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Api",
  1064. Api, api)
  1065. zend_class_implements(api_type TSRMLS_CC, 1, message_type);
  1066. zend_declare_property_null(api_type, "name", strlen("name"),
  1067. ZEND_ACC_PRIVATE TSRMLS_CC);
  1068. zend_declare_property_null(api_type, "methods", strlen("methods"),
  1069. ZEND_ACC_PRIVATE TSRMLS_CC);
  1070. zend_declare_property_null(api_type, "options", strlen("options"),
  1071. ZEND_ACC_PRIVATE TSRMLS_CC);
  1072. zend_declare_property_null(api_type, "version", strlen("version"),
  1073. ZEND_ACC_PRIVATE TSRMLS_CC);
  1074. zend_declare_property_null(api_type, "source_context", strlen("source_context"),
  1075. ZEND_ACC_PRIVATE TSRMLS_CC);
  1076. zend_declare_property_null(api_type, "mixins", strlen("mixins"),
  1077. ZEND_ACC_PRIVATE TSRMLS_CC);
  1078. zend_declare_property_null(api_type, "syntax", strlen("syntax"),
  1079. ZEND_ACC_PRIVATE TSRMLS_CC);
  1080. PHP_PROTO_INIT_SUBMSGCLASS_END
  1081. PHP_METHOD(Api, __construct) {
  1082. init_file_api(TSRMLS_C);
  1083. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1084. custom_data_init(api_type, intern PHP_PROTO_TSRMLS_CC);
  1085. }
  1086. PHP_PROTO_FIELD_ACCESSORS(Api, api, Name, "name")
  1087. PHP_PROTO_FIELD_ACCESSORS(Api, api, Methods, "methods")
  1088. PHP_PROTO_FIELD_ACCESSORS(Api, api, Options, "options")
  1089. PHP_PROTO_FIELD_ACCESSORS(Api, api, Version, "version")
  1090. PHP_PROTO_FIELD_ACCESSORS(Api, api, SourceContext, "source_context")
  1091. PHP_PROTO_FIELD_ACCESSORS(Api, api, Mixins, "mixins")
  1092. PHP_PROTO_FIELD_ACCESSORS(Api, api, Syntax, "syntax")
  1093. // -----------------------------------------------------------------------------
  1094. // BoolValue
  1095. // -----------------------------------------------------------------------------
  1096. static zend_function_entry bool_value_methods[] = {
  1097. PHP_ME(BoolValue, __construct, NULL, ZEND_ACC_PUBLIC)
  1098. PHP_ME(BoolValue, getValue, NULL, ZEND_ACC_PUBLIC)
  1099. PHP_ME(BoolValue, setValue, NULL, ZEND_ACC_PUBLIC)
  1100. {NULL, NULL, NULL}
  1101. };
  1102. zend_class_entry* bool_value_type;
  1103. // Init class entry.
  1104. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\BoolValue",
  1105. BoolValue, bool_value)
  1106. zend_class_implements(bool_value_type TSRMLS_CC, 1, message_type);
  1107. zend_declare_property_null(bool_value_type, "value", strlen("value"),
  1108. ZEND_ACC_PRIVATE TSRMLS_CC);
  1109. PHP_PROTO_INIT_SUBMSGCLASS_END
  1110. PHP_METHOD(BoolValue, __construct) {
  1111. init_file_wrappers(TSRMLS_C);
  1112. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1113. custom_data_init(bool_value_type, intern PHP_PROTO_TSRMLS_CC);
  1114. }
  1115. PHP_PROTO_FIELD_ACCESSORS(BoolValue, bool_value, Value, "value")
  1116. // -----------------------------------------------------------------------------
  1117. // BytesValue
  1118. // -----------------------------------------------------------------------------
  1119. static zend_function_entry bytes_value_methods[] = {
  1120. PHP_ME(BytesValue, __construct, NULL, ZEND_ACC_PUBLIC)
  1121. PHP_ME(BytesValue, getValue, NULL, ZEND_ACC_PUBLIC)
  1122. PHP_ME(BytesValue, setValue, NULL, ZEND_ACC_PUBLIC)
  1123. {NULL, NULL, NULL}
  1124. };
  1125. zend_class_entry* bytes_value_type;
  1126. // Init class entry.
  1127. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\BytesValue",
  1128. BytesValue, bytes_value)
  1129. zend_class_implements(bytes_value_type TSRMLS_CC, 1, message_type);
  1130. zend_declare_property_null(bytes_value_type, "value", strlen("value"),
  1131. ZEND_ACC_PRIVATE TSRMLS_CC);
  1132. PHP_PROTO_INIT_SUBMSGCLASS_END
  1133. PHP_METHOD(BytesValue, __construct) {
  1134. init_file_wrappers(TSRMLS_C);
  1135. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1136. custom_data_init(bytes_value_type, intern PHP_PROTO_TSRMLS_CC);
  1137. }
  1138. PHP_PROTO_FIELD_ACCESSORS(BytesValue, bytes_value, Value, "value")
  1139. // -----------------------------------------------------------------------------
  1140. // DoubleValue
  1141. // -----------------------------------------------------------------------------
  1142. static zend_function_entry double_value_methods[] = {
  1143. PHP_ME(DoubleValue, __construct, NULL, ZEND_ACC_PUBLIC)
  1144. PHP_ME(DoubleValue, getValue, NULL, ZEND_ACC_PUBLIC)
  1145. PHP_ME(DoubleValue, setValue, NULL, ZEND_ACC_PUBLIC)
  1146. {NULL, NULL, NULL}
  1147. };
  1148. zend_class_entry* double_value_type;
  1149. // Init class entry.
  1150. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\DoubleValue",
  1151. DoubleValue, double_value)
  1152. zend_class_implements(double_value_type TSRMLS_CC, 1, message_type);
  1153. zend_declare_property_null(double_value_type, "value", strlen("value"),
  1154. ZEND_ACC_PRIVATE TSRMLS_CC);
  1155. PHP_PROTO_INIT_SUBMSGCLASS_END
  1156. PHP_METHOD(DoubleValue, __construct) {
  1157. init_file_wrappers(TSRMLS_C);
  1158. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1159. custom_data_init(double_value_type, intern PHP_PROTO_TSRMLS_CC);
  1160. }
  1161. PHP_PROTO_FIELD_ACCESSORS(DoubleValue, double_value, Value, "value")
  1162. // -----------------------------------------------------------------------------
  1163. // Enum
  1164. // -----------------------------------------------------------------------------
  1165. static zend_function_entry enum_methods[] = {
  1166. PHP_ME(Enum, __construct, NULL, ZEND_ACC_PUBLIC)
  1167. PHP_ME(Enum, getName, NULL, ZEND_ACC_PUBLIC)
  1168. PHP_ME(Enum, setName, NULL, ZEND_ACC_PUBLIC)
  1169. PHP_ME(Enum, getEnumvalue, NULL, ZEND_ACC_PUBLIC)
  1170. PHP_ME(Enum, setEnumvalue, NULL, ZEND_ACC_PUBLIC)
  1171. PHP_ME(Enum, getOptions, NULL, ZEND_ACC_PUBLIC)
  1172. PHP_ME(Enum, setOptions, NULL, ZEND_ACC_PUBLIC)
  1173. PHP_ME(Enum, getSourceContext, NULL, ZEND_ACC_PUBLIC)
  1174. PHP_ME(Enum, setSourceContext, NULL, ZEND_ACC_PUBLIC)
  1175. PHP_ME(Enum, getSyntax, NULL, ZEND_ACC_PUBLIC)
  1176. PHP_ME(Enum, setSyntax, NULL, ZEND_ACC_PUBLIC)
  1177. {NULL, NULL, NULL}
  1178. };
  1179. zend_class_entry* enum_type;
  1180. // Init class entry.
  1181. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Enum",
  1182. Enum, enum)
  1183. zend_class_implements(enum_type TSRMLS_CC, 1, message_type);
  1184. zend_declare_property_null(enum_type, "name", strlen("name"),
  1185. ZEND_ACC_PRIVATE TSRMLS_CC);
  1186. zend_declare_property_null(enum_type, "enumvalue", strlen("enumvalue"),
  1187. ZEND_ACC_PRIVATE TSRMLS_CC);
  1188. zend_declare_property_null(enum_type, "options", strlen("options"),
  1189. ZEND_ACC_PRIVATE TSRMLS_CC);
  1190. zend_declare_property_null(enum_type, "source_context", strlen("source_context"),
  1191. ZEND_ACC_PRIVATE TSRMLS_CC);
  1192. zend_declare_property_null(enum_type, "syntax", strlen("syntax"),
  1193. ZEND_ACC_PRIVATE TSRMLS_CC);
  1194. PHP_PROTO_INIT_SUBMSGCLASS_END
  1195. PHP_METHOD(Enum, __construct) {
  1196. init_file_type(TSRMLS_C);
  1197. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1198. custom_data_init(enum_type, intern PHP_PROTO_TSRMLS_CC);
  1199. }
  1200. PHP_PROTO_FIELD_ACCESSORS(Enum, enum, Name, "name")
  1201. PHP_PROTO_FIELD_ACCESSORS(Enum, enum, Enumvalue, "enumvalue")
  1202. PHP_PROTO_FIELD_ACCESSORS(Enum, enum, Options, "options")
  1203. PHP_PROTO_FIELD_ACCESSORS(Enum, enum, SourceContext, "source_context")
  1204. PHP_PROTO_FIELD_ACCESSORS(Enum, enum, Syntax, "syntax")
  1205. // -----------------------------------------------------------------------------
  1206. // EnumValue
  1207. // -----------------------------------------------------------------------------
  1208. static zend_function_entry enum_value_methods[] = {
  1209. PHP_ME(EnumValue, __construct, NULL, ZEND_ACC_PUBLIC)
  1210. PHP_ME(EnumValue, getName, NULL, ZEND_ACC_PUBLIC)
  1211. PHP_ME(EnumValue, setName, NULL, ZEND_ACC_PUBLIC)
  1212. PHP_ME(EnumValue, getNumber, NULL, ZEND_ACC_PUBLIC)
  1213. PHP_ME(EnumValue, setNumber, NULL, ZEND_ACC_PUBLIC)
  1214. PHP_ME(EnumValue, getOptions, NULL, ZEND_ACC_PUBLIC)
  1215. PHP_ME(EnumValue, setOptions, NULL, ZEND_ACC_PUBLIC)
  1216. {NULL, NULL, NULL}
  1217. };
  1218. zend_class_entry* enum_value_type;
  1219. // Init class entry.
  1220. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\EnumValue",
  1221. EnumValue, enum_value)
  1222. zend_class_implements(enum_value_type TSRMLS_CC, 1, message_type);
  1223. zend_declare_property_null(enum_value_type, "name", strlen("name"),
  1224. ZEND_ACC_PRIVATE TSRMLS_CC);
  1225. zend_declare_property_null(enum_value_type, "number", strlen("number"),
  1226. ZEND_ACC_PRIVATE TSRMLS_CC);
  1227. zend_declare_property_null(enum_value_type, "options", strlen("options"),
  1228. ZEND_ACC_PRIVATE TSRMLS_CC);
  1229. PHP_PROTO_INIT_SUBMSGCLASS_END
  1230. PHP_METHOD(EnumValue, __construct) {
  1231. init_file_type(TSRMLS_C);
  1232. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1233. custom_data_init(enum_value_type, intern PHP_PROTO_TSRMLS_CC);
  1234. }
  1235. PHP_PROTO_FIELD_ACCESSORS(EnumValue, enum_value, Name, "name")
  1236. PHP_PROTO_FIELD_ACCESSORS(EnumValue, enum_value, Number, "number")
  1237. PHP_PROTO_FIELD_ACCESSORS(EnumValue, enum_value, Options, "options")
  1238. // -----------------------------------------------------------------------------
  1239. // FieldMask
  1240. // -----------------------------------------------------------------------------
  1241. static zend_function_entry field_mask_methods[] = {
  1242. PHP_ME(FieldMask, __construct, NULL, ZEND_ACC_PUBLIC)
  1243. PHP_ME(FieldMask, getPaths, NULL, ZEND_ACC_PUBLIC)
  1244. PHP_ME(FieldMask, setPaths, NULL, ZEND_ACC_PUBLIC)
  1245. {NULL, NULL, NULL}
  1246. };
  1247. zend_class_entry* field_mask_type;
  1248. // Init class entry.
  1249. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\FieldMask",
  1250. FieldMask, field_mask)
  1251. zend_class_implements(field_mask_type TSRMLS_CC, 1, message_type);
  1252. zend_declare_property_null(field_mask_type, "paths", strlen("paths"),
  1253. ZEND_ACC_PRIVATE TSRMLS_CC);
  1254. PHP_PROTO_INIT_SUBMSGCLASS_END
  1255. PHP_METHOD(FieldMask, __construct) {
  1256. init_file_field_mask(TSRMLS_C);
  1257. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1258. custom_data_init(field_mask_type, intern PHP_PROTO_TSRMLS_CC);
  1259. }
  1260. PHP_PROTO_FIELD_ACCESSORS(FieldMask, field_mask, Paths, "paths")
  1261. // -----------------------------------------------------------------------------
  1262. // Field
  1263. // -----------------------------------------------------------------------------
  1264. static zend_function_entry field_methods[] = {
  1265. PHP_ME(Field, __construct, NULL, ZEND_ACC_PUBLIC)
  1266. PHP_ME(Field, getKind, NULL, ZEND_ACC_PUBLIC)
  1267. PHP_ME(Field, setKind, NULL, ZEND_ACC_PUBLIC)
  1268. PHP_ME(Field, getCardinality, NULL, ZEND_ACC_PUBLIC)
  1269. PHP_ME(Field, setCardinality, NULL, ZEND_ACC_PUBLIC)
  1270. PHP_ME(Field, getNumber, NULL, ZEND_ACC_PUBLIC)
  1271. PHP_ME(Field, setNumber, NULL, ZEND_ACC_PUBLIC)
  1272. PHP_ME(Field, getName, NULL, ZEND_ACC_PUBLIC)
  1273. PHP_ME(Field, setName, NULL, ZEND_ACC_PUBLIC)
  1274. PHP_ME(Field, getTypeUrl, NULL, ZEND_ACC_PUBLIC)
  1275. PHP_ME(Field, setTypeUrl, NULL, ZEND_ACC_PUBLIC)
  1276. PHP_ME(Field, getOneofIndex, NULL, ZEND_ACC_PUBLIC)
  1277. PHP_ME(Field, setOneofIndex, NULL, ZEND_ACC_PUBLIC)
  1278. PHP_ME(Field, getPacked, NULL, ZEND_ACC_PUBLIC)
  1279. PHP_ME(Field, setPacked, NULL, ZEND_ACC_PUBLIC)
  1280. PHP_ME(Field, getOptions, NULL, ZEND_ACC_PUBLIC)
  1281. PHP_ME(Field, setOptions, NULL, ZEND_ACC_PUBLIC)
  1282. PHP_ME(Field, getJsonName, NULL, ZEND_ACC_PUBLIC)
  1283. PHP_ME(Field, setJsonName, NULL, ZEND_ACC_PUBLIC)
  1284. PHP_ME(Field, getDefaultValue, NULL, ZEND_ACC_PUBLIC)
  1285. PHP_ME(Field, setDefaultValue, NULL, ZEND_ACC_PUBLIC)
  1286. {NULL, NULL, NULL}
  1287. };
  1288. zend_class_entry* field_type;
  1289. // Init class entry.
  1290. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Field",
  1291. Field, field)
  1292. zend_class_implements(field_type TSRMLS_CC, 1, message_type);
  1293. zend_declare_property_null(field_type, "kind", strlen("kind"),
  1294. ZEND_ACC_PRIVATE TSRMLS_CC);
  1295. zend_declare_property_null(field_type, "cardinality", strlen("cardinality"),
  1296. ZEND_ACC_PRIVATE TSRMLS_CC);
  1297. zend_declare_property_null(field_type, "number", strlen("number"),
  1298. ZEND_ACC_PRIVATE TSRMLS_CC);
  1299. zend_declare_property_null(field_type, "name", strlen("name"),
  1300. ZEND_ACC_PRIVATE TSRMLS_CC);
  1301. zend_declare_property_null(field_type, "type_url", strlen("type_url"),
  1302. ZEND_ACC_PRIVATE TSRMLS_CC);
  1303. zend_declare_property_null(field_type, "oneof_index", strlen("oneof_index"),
  1304. ZEND_ACC_PRIVATE TSRMLS_CC);
  1305. zend_declare_property_null(field_type, "packed", strlen("packed"),
  1306. ZEND_ACC_PRIVATE TSRMLS_CC);
  1307. zend_declare_property_null(field_type, "options", strlen("options"),
  1308. ZEND_ACC_PRIVATE TSRMLS_CC);
  1309. zend_declare_property_null(field_type, "json_name", strlen("json_name"),
  1310. ZEND_ACC_PRIVATE TSRMLS_CC);
  1311. zend_declare_property_null(field_type, "default_value", strlen("default_value"),
  1312. ZEND_ACC_PRIVATE TSRMLS_CC);
  1313. PHP_PROTO_INIT_SUBMSGCLASS_END
  1314. PHP_METHOD(Field, __construct) {
  1315. init_file_type(TSRMLS_C);
  1316. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1317. custom_data_init(field_type, intern PHP_PROTO_TSRMLS_CC);
  1318. }
  1319. PHP_PROTO_FIELD_ACCESSORS(Field, field, Kind, "kind")
  1320. PHP_PROTO_FIELD_ACCESSORS(Field, field, Cardinality, "cardinality")
  1321. PHP_PROTO_FIELD_ACCESSORS(Field, field, Number, "number")
  1322. PHP_PROTO_FIELD_ACCESSORS(Field, field, Name, "name")
  1323. PHP_PROTO_FIELD_ACCESSORS(Field, field, TypeUrl, "type_url")
  1324. PHP_PROTO_FIELD_ACCESSORS(Field, field, OneofIndex, "oneof_index")
  1325. PHP_PROTO_FIELD_ACCESSORS(Field, field, Packed, "packed")
  1326. PHP_PROTO_FIELD_ACCESSORS(Field, field, Options, "options")
  1327. PHP_PROTO_FIELD_ACCESSORS(Field, field, JsonName, "json_name")
  1328. PHP_PROTO_FIELD_ACCESSORS(Field, field, DefaultValue, "default_value")
  1329. // -----------------------------------------------------------------------------
  1330. // FloatValue
  1331. // -----------------------------------------------------------------------------
  1332. static zend_function_entry float_value_methods[] = {
  1333. PHP_ME(FloatValue, __construct, NULL, ZEND_ACC_PUBLIC)
  1334. PHP_ME(FloatValue, getValue, NULL, ZEND_ACC_PUBLIC)
  1335. PHP_ME(FloatValue, setValue, NULL, ZEND_ACC_PUBLIC)
  1336. {NULL, NULL, NULL}
  1337. };
  1338. zend_class_entry* float_value_type;
  1339. // Init class entry.
  1340. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\FloatValue",
  1341. FloatValue, float_value)
  1342. zend_class_implements(float_value_type TSRMLS_CC, 1, message_type);
  1343. zend_declare_property_null(float_value_type, "value", strlen("value"),
  1344. ZEND_ACC_PRIVATE TSRMLS_CC);
  1345. PHP_PROTO_INIT_SUBMSGCLASS_END
  1346. PHP_METHOD(FloatValue, __construct) {
  1347. init_file_wrappers(TSRMLS_C);
  1348. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1349. custom_data_init(float_value_type, intern PHP_PROTO_TSRMLS_CC);
  1350. }
  1351. PHP_PROTO_FIELD_ACCESSORS(FloatValue, float_value, Value, "value")
  1352. // -----------------------------------------------------------------------------
  1353. // GPBEmpty
  1354. // -----------------------------------------------------------------------------
  1355. static zend_function_entry empty_methods[] = {
  1356. PHP_ME(GPBEmpty, __construct, NULL, ZEND_ACC_PUBLIC)
  1357. {NULL, NULL, NULL}
  1358. };
  1359. zend_class_entry* empty_type;
  1360. // Init class entry.
  1361. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\GPBEmpty",
  1362. GPBEmpty, empty)
  1363. zend_class_implements(empty_type TSRMLS_CC, 1, message_type);
  1364. PHP_PROTO_INIT_SUBMSGCLASS_END
  1365. PHP_METHOD(GPBEmpty, __construct) {
  1366. init_file_empty(TSRMLS_C);
  1367. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1368. custom_data_init(empty_type, intern PHP_PROTO_TSRMLS_CC);
  1369. }
  1370. // -----------------------------------------------------------------------------
  1371. // Int32Value
  1372. // -----------------------------------------------------------------------------
  1373. static zend_function_entry int32_value_methods[] = {
  1374. PHP_ME(Int32Value, __construct, NULL, ZEND_ACC_PUBLIC)
  1375. PHP_ME(Int32Value, getValue, NULL, ZEND_ACC_PUBLIC)
  1376. PHP_ME(Int32Value, setValue, NULL, ZEND_ACC_PUBLIC)
  1377. {NULL, NULL, NULL}
  1378. };
  1379. zend_class_entry* int32_value_type;
  1380. // Init class entry.
  1381. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Int32Value",
  1382. Int32Value, int32_value)
  1383. zend_class_implements(int32_value_type TSRMLS_CC, 1, message_type);
  1384. zend_declare_property_null(int32_value_type, "value", strlen("value"),
  1385. ZEND_ACC_PRIVATE TSRMLS_CC);
  1386. PHP_PROTO_INIT_SUBMSGCLASS_END
  1387. PHP_METHOD(Int32Value, __construct) {
  1388. init_file_wrappers(TSRMLS_C);
  1389. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1390. custom_data_init(int32_value_type, intern PHP_PROTO_TSRMLS_CC);
  1391. }
  1392. PHP_PROTO_FIELD_ACCESSORS(Int32Value, int32_value, Value, "value")
  1393. // -----------------------------------------------------------------------------
  1394. // Int64Value
  1395. // -----------------------------------------------------------------------------
  1396. static zend_function_entry int64_value_methods[] = {
  1397. PHP_ME(Int64Value, __construct, NULL, ZEND_ACC_PUBLIC)
  1398. PHP_ME(Int64Value, getValue, NULL, ZEND_ACC_PUBLIC)
  1399. PHP_ME(Int64Value, setValue, NULL, ZEND_ACC_PUBLIC)
  1400. {NULL, NULL, NULL}
  1401. };
  1402. zend_class_entry* int64_value_type;
  1403. // Init class entry.
  1404. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Int64Value",
  1405. Int64Value, int64_value)
  1406. zend_class_implements(int64_value_type TSRMLS_CC, 1, message_type);
  1407. zend_declare_property_null(int64_value_type, "value", strlen("value"),
  1408. ZEND_ACC_PRIVATE TSRMLS_CC);
  1409. PHP_PROTO_INIT_SUBMSGCLASS_END
  1410. PHP_METHOD(Int64Value, __construct) {
  1411. init_file_wrappers(TSRMLS_C);
  1412. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1413. custom_data_init(int64_value_type, intern PHP_PROTO_TSRMLS_CC);
  1414. }
  1415. PHP_PROTO_FIELD_ACCESSORS(Int64Value, int64_value, Value, "value")
  1416. // -----------------------------------------------------------------------------
  1417. // ListValue
  1418. // -----------------------------------------------------------------------------
  1419. static zend_function_entry list_value_methods[] = {
  1420. PHP_ME(ListValue, __construct, NULL, ZEND_ACC_PUBLIC)
  1421. PHP_ME(ListValue, getValues, NULL, ZEND_ACC_PUBLIC)
  1422. PHP_ME(ListValue, setValues, NULL, ZEND_ACC_PUBLIC)
  1423. {NULL, NULL, NULL}
  1424. };
  1425. zend_class_entry* list_value_type;
  1426. // Init class entry.
  1427. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\ListValue",
  1428. ListValue, list_value)
  1429. zend_class_implements(list_value_type TSRMLS_CC, 1, message_type);
  1430. zend_declare_property_null(list_value_type, "values", strlen("values"),
  1431. ZEND_ACC_PRIVATE TSRMLS_CC);
  1432. PHP_PROTO_INIT_SUBMSGCLASS_END
  1433. PHP_METHOD(ListValue, __construct) {
  1434. init_file_struct(TSRMLS_C);
  1435. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1436. custom_data_init(list_value_type, intern PHP_PROTO_TSRMLS_CC);
  1437. }
  1438. PHP_PROTO_FIELD_ACCESSORS(ListValue, list_value, Values, "values")
  1439. // -----------------------------------------------------------------------------
  1440. // Method
  1441. // -----------------------------------------------------------------------------
  1442. static zend_function_entry method_methods[] = {
  1443. PHP_ME(Method, __construct, NULL, ZEND_ACC_PUBLIC)
  1444. PHP_ME(Method, getName, NULL, ZEND_ACC_PUBLIC)
  1445. PHP_ME(Method, setName, NULL, ZEND_ACC_PUBLIC)
  1446. PHP_ME(Method, getRequestTypeUrl, NULL, ZEND_ACC_PUBLIC)
  1447. PHP_ME(Method, setRequestTypeUrl, NULL, ZEND_ACC_PUBLIC)
  1448. PHP_ME(Method, getRequestStreaming, NULL, ZEND_ACC_PUBLIC)
  1449. PHP_ME(Method, setRequestStreaming, NULL, ZEND_ACC_PUBLIC)
  1450. PHP_ME(Method, getResponseTypeUrl, NULL, ZEND_ACC_PUBLIC)
  1451. PHP_ME(Method, setResponseTypeUrl, NULL, ZEND_ACC_PUBLIC)
  1452. PHP_ME(Method, getResponseStreaming, NULL, ZEND_ACC_PUBLIC)
  1453. PHP_ME(Method, setResponseStreaming, NULL, ZEND_ACC_PUBLIC)
  1454. PHP_ME(Method, getOptions, NULL, ZEND_ACC_PUBLIC)
  1455. PHP_ME(Method, setOptions, NULL, ZEND_ACC_PUBLIC)
  1456. PHP_ME(Method, getSyntax, NULL, ZEND_ACC_PUBLIC)
  1457. PHP_ME(Method, setSyntax, NULL, ZEND_ACC_PUBLIC)
  1458. {NULL, NULL, NULL}
  1459. };
  1460. zend_class_entry* method_type;
  1461. // Init class entry.
  1462. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Method",
  1463. Method, method)
  1464. zend_class_implements(method_type TSRMLS_CC, 1, message_type);
  1465. zend_declare_property_null(method_type, "name", strlen("name"),
  1466. ZEND_ACC_PRIVATE TSRMLS_CC);
  1467. zend_declare_property_null(method_type, "request_type_url", strlen("request_type_url"),
  1468. ZEND_ACC_PRIVATE TSRMLS_CC);
  1469. zend_declare_property_null(method_type, "request_streaming", strlen("request_streaming"),
  1470. ZEND_ACC_PRIVATE TSRMLS_CC);
  1471. zend_declare_property_null(method_type, "response_type_url", strlen("response_type_url"),
  1472. ZEND_ACC_PRIVATE TSRMLS_CC);
  1473. zend_declare_property_null(method_type, "response_streaming", strlen("response_streaming"),
  1474. ZEND_ACC_PRIVATE TSRMLS_CC);
  1475. zend_declare_property_null(method_type, "options", strlen("options"),
  1476. ZEND_ACC_PRIVATE TSRMLS_CC);
  1477. zend_declare_property_null(method_type, "syntax", strlen("syntax"),
  1478. ZEND_ACC_PRIVATE TSRMLS_CC);
  1479. PHP_PROTO_INIT_SUBMSGCLASS_END
  1480. PHP_METHOD(Method, __construct) {
  1481. init_file_api(TSRMLS_C);
  1482. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1483. custom_data_init(method_type, intern PHP_PROTO_TSRMLS_CC);
  1484. }
  1485. PHP_PROTO_FIELD_ACCESSORS(Method, method, Name, "name")
  1486. PHP_PROTO_FIELD_ACCESSORS(Method, method, RequestTypeUrl, "request_type_url")
  1487. PHP_PROTO_FIELD_ACCESSORS(Method, method, RequestStreaming, "request_streaming")
  1488. PHP_PROTO_FIELD_ACCESSORS(Method, method, ResponseTypeUrl, "response_type_url")
  1489. PHP_PROTO_FIELD_ACCESSORS(Method, method, ResponseStreaming, "response_streaming")
  1490. PHP_PROTO_FIELD_ACCESSORS(Method, method, Options, "options")
  1491. PHP_PROTO_FIELD_ACCESSORS(Method, method, Syntax, "syntax")
  1492. // -----------------------------------------------------------------------------
  1493. // Mixin
  1494. // -----------------------------------------------------------------------------
  1495. static zend_function_entry mixin_methods[] = {
  1496. PHP_ME(Mixin, __construct, NULL, ZEND_ACC_PUBLIC)
  1497. PHP_ME(Mixin, getName, NULL, ZEND_ACC_PUBLIC)
  1498. PHP_ME(Mixin, setName, NULL, ZEND_ACC_PUBLIC)
  1499. PHP_ME(Mixin, getRoot, NULL, ZEND_ACC_PUBLIC)
  1500. PHP_ME(Mixin, setRoot, NULL, ZEND_ACC_PUBLIC)
  1501. {NULL, NULL, NULL}
  1502. };
  1503. zend_class_entry* mixin_type;
  1504. // Init class entry.
  1505. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Mixin",
  1506. Mixin, mixin)
  1507. zend_class_implements(mixin_type TSRMLS_CC, 1, message_type);
  1508. zend_declare_property_null(mixin_type, "name", strlen("name"),
  1509. ZEND_ACC_PRIVATE TSRMLS_CC);
  1510. zend_declare_property_null(mixin_type, "root", strlen("root"),
  1511. ZEND_ACC_PRIVATE TSRMLS_CC);
  1512. PHP_PROTO_INIT_SUBMSGCLASS_END
  1513. PHP_METHOD(Mixin, __construct) {
  1514. init_file_api(TSRMLS_C);
  1515. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1516. custom_data_init(mixin_type, intern PHP_PROTO_TSRMLS_CC);
  1517. }
  1518. PHP_PROTO_FIELD_ACCESSORS(Mixin, mixin, Name, "name")
  1519. PHP_PROTO_FIELD_ACCESSORS(Mixin, mixin, Root, "root")
  1520. // -----------------------------------------------------------------------------
  1521. // Option
  1522. // -----------------------------------------------------------------------------
  1523. static zend_function_entry option_methods[] = {
  1524. PHP_ME(Option, __construct, NULL, ZEND_ACC_PUBLIC)
  1525. PHP_ME(Option, getName, NULL, ZEND_ACC_PUBLIC)
  1526. PHP_ME(Option, setName, NULL, ZEND_ACC_PUBLIC)
  1527. PHP_ME(Option, getValue, NULL, ZEND_ACC_PUBLIC)
  1528. PHP_ME(Option, setValue, NULL, ZEND_ACC_PUBLIC)
  1529. {NULL, NULL, NULL}
  1530. };
  1531. zend_class_entry* option_type;
  1532. // Init class entry.
  1533. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Option",
  1534. Option, option)
  1535. zend_class_implements(option_type TSRMLS_CC, 1, message_type);
  1536. zend_declare_property_null(option_type, "name", strlen("name"),
  1537. ZEND_ACC_PRIVATE TSRMLS_CC);
  1538. zend_declare_property_null(option_type, "value", strlen("value"),
  1539. ZEND_ACC_PRIVATE TSRMLS_CC);
  1540. PHP_PROTO_INIT_SUBMSGCLASS_END
  1541. PHP_METHOD(Option, __construct) {
  1542. init_file_type(TSRMLS_C);
  1543. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1544. custom_data_init(option_type, intern PHP_PROTO_TSRMLS_CC);
  1545. }
  1546. PHP_PROTO_FIELD_ACCESSORS(Option, option, Name, "name")
  1547. PHP_PROTO_FIELD_ACCESSORS(Option, option, Value, "value")
  1548. // -----------------------------------------------------------------------------
  1549. // SourceContext
  1550. // -----------------------------------------------------------------------------
  1551. static zend_function_entry source_context_methods[] = {
  1552. PHP_ME(SourceContext, __construct, NULL, ZEND_ACC_PUBLIC)
  1553. PHP_ME(SourceContext, getFileName, NULL, ZEND_ACC_PUBLIC)
  1554. PHP_ME(SourceContext, setFileName, NULL, ZEND_ACC_PUBLIC)
  1555. {NULL, NULL, NULL}
  1556. };
  1557. zend_class_entry* source_context_type;
  1558. // Init class entry.
  1559. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\SourceContext",
  1560. SourceContext, source_context)
  1561. zend_class_implements(source_context_type TSRMLS_CC, 1, message_type);
  1562. zend_declare_property_null(source_context_type, "file_name", strlen("file_name"),
  1563. ZEND_ACC_PRIVATE TSRMLS_CC);
  1564. PHP_PROTO_INIT_SUBMSGCLASS_END
  1565. PHP_METHOD(SourceContext, __construct) {
  1566. init_file_source_context(TSRMLS_C);
  1567. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1568. custom_data_init(source_context_type, intern PHP_PROTO_TSRMLS_CC);
  1569. }
  1570. PHP_PROTO_FIELD_ACCESSORS(SourceContext, source_context, FileName, "file_name")
  1571. // -----------------------------------------------------------------------------
  1572. // StringValue
  1573. // -----------------------------------------------------------------------------
  1574. static zend_function_entry string_value_methods[] = {
  1575. PHP_ME(StringValue, __construct, NULL, ZEND_ACC_PUBLIC)
  1576. PHP_ME(StringValue, getValue, NULL, ZEND_ACC_PUBLIC)
  1577. PHP_ME(StringValue, setValue, NULL, ZEND_ACC_PUBLIC)
  1578. {NULL, NULL, NULL}
  1579. };
  1580. zend_class_entry* string_value_type;
  1581. // Init class entry.
  1582. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\StringValue",
  1583. StringValue, string_value)
  1584. zend_class_implements(string_value_type TSRMLS_CC, 1, message_type);
  1585. zend_declare_property_null(string_value_type, "value", strlen("value"),
  1586. ZEND_ACC_PRIVATE TSRMLS_CC);
  1587. PHP_PROTO_INIT_SUBMSGCLASS_END
  1588. PHP_METHOD(StringValue, __construct) {
  1589. init_file_wrappers(TSRMLS_C);
  1590. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1591. custom_data_init(string_value_type, intern PHP_PROTO_TSRMLS_CC);
  1592. }
  1593. PHP_PROTO_FIELD_ACCESSORS(StringValue, string_value, Value, "value")
  1594. // -----------------------------------------------------------------------------
  1595. // Struct
  1596. // -----------------------------------------------------------------------------
  1597. static zend_function_entry struct_methods[] = {
  1598. PHP_ME(Struct, __construct, NULL, ZEND_ACC_PUBLIC)
  1599. PHP_ME(Struct, getFields, NULL, ZEND_ACC_PUBLIC)
  1600. PHP_ME(Struct, setFields, NULL, ZEND_ACC_PUBLIC)
  1601. {NULL, NULL, NULL}
  1602. };
  1603. zend_class_entry* struct_type;
  1604. // Init class entry.
  1605. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Struct",
  1606. Struct, struct)
  1607. zend_class_implements(struct_type TSRMLS_CC, 1, message_type);
  1608. zend_declare_property_null(struct_type, "fields", strlen("fields"),
  1609. ZEND_ACC_PRIVATE TSRMLS_CC);
  1610. PHP_PROTO_INIT_SUBMSGCLASS_END
  1611. PHP_METHOD(Struct, __construct) {
  1612. init_file_struct(TSRMLS_C);
  1613. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1614. custom_data_init(struct_type, intern PHP_PROTO_TSRMLS_CC);
  1615. }
  1616. PHP_PROTO_FIELD_ACCESSORS(Struct, struct, Fields, "fields")
  1617. // -----------------------------------------------------------------------------
  1618. // Type
  1619. // -----------------------------------------------------------------------------
  1620. static zend_function_entry type_methods[] = {
  1621. PHP_ME(Type, __construct, NULL, ZEND_ACC_PUBLIC)
  1622. PHP_ME(Type, getName, NULL, ZEND_ACC_PUBLIC)
  1623. PHP_ME(Type, setName, NULL, ZEND_ACC_PUBLIC)
  1624. PHP_ME(Type, getFields, NULL, ZEND_ACC_PUBLIC)
  1625. PHP_ME(Type, setFields, NULL, ZEND_ACC_PUBLIC)
  1626. PHP_ME(Type, getOneofs, NULL, ZEND_ACC_PUBLIC)
  1627. PHP_ME(Type, setOneofs, NULL, ZEND_ACC_PUBLIC)
  1628. PHP_ME(Type, getOptions, NULL, ZEND_ACC_PUBLIC)
  1629. PHP_ME(Type, setOptions, NULL, ZEND_ACC_PUBLIC)
  1630. PHP_ME(Type, getSourceContext, NULL, ZEND_ACC_PUBLIC)
  1631. PHP_ME(Type, setSourceContext, NULL, ZEND_ACC_PUBLIC)
  1632. PHP_ME(Type, getSyntax, NULL, ZEND_ACC_PUBLIC)
  1633. PHP_ME(Type, setSyntax, NULL, ZEND_ACC_PUBLIC)
  1634. {NULL, NULL, NULL}
  1635. };
  1636. zend_class_entry* type_type;
  1637. // Init class entry.
  1638. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Type",
  1639. Type, type)
  1640. zend_class_implements(type_type TSRMLS_CC, 1, message_type);
  1641. zend_declare_property_null(type_type, "name", strlen("name"),
  1642. ZEND_ACC_PRIVATE TSRMLS_CC);
  1643. zend_declare_property_null(type_type, "fields", strlen("fields"),
  1644. ZEND_ACC_PRIVATE TSRMLS_CC);
  1645. zend_declare_property_null(type_type, "oneofs", strlen("oneofs"),
  1646. ZEND_ACC_PRIVATE TSRMLS_CC);
  1647. zend_declare_property_null(type_type, "options", strlen("options"),
  1648. ZEND_ACC_PRIVATE TSRMLS_CC);
  1649. zend_declare_property_null(type_type, "source_context", strlen("source_context"),
  1650. ZEND_ACC_PRIVATE TSRMLS_CC);
  1651. zend_declare_property_null(type_type, "syntax", strlen("syntax"),
  1652. ZEND_ACC_PRIVATE TSRMLS_CC);
  1653. PHP_PROTO_INIT_SUBMSGCLASS_END
  1654. PHP_METHOD(Type, __construct) {
  1655. init_file_type(TSRMLS_C);
  1656. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1657. custom_data_init(type_type, intern PHP_PROTO_TSRMLS_CC);
  1658. }
  1659. PHP_PROTO_FIELD_ACCESSORS(Type, type, Name, "name")
  1660. PHP_PROTO_FIELD_ACCESSORS(Type, type, Fields, "fields")
  1661. PHP_PROTO_FIELD_ACCESSORS(Type, type, Oneofs, "oneofs")
  1662. PHP_PROTO_FIELD_ACCESSORS(Type, type, Options, "options")
  1663. PHP_PROTO_FIELD_ACCESSORS(Type, type, SourceContext, "source_context")
  1664. PHP_PROTO_FIELD_ACCESSORS(Type, type, Syntax, "syntax")
  1665. // -----------------------------------------------------------------------------
  1666. // UInt32Value
  1667. // -----------------------------------------------------------------------------
  1668. static zend_function_entry u_int32_value_methods[] = {
  1669. PHP_ME(UInt32Value, __construct, NULL, ZEND_ACC_PUBLIC)
  1670. PHP_ME(UInt32Value, getValue, NULL, ZEND_ACC_PUBLIC)
  1671. PHP_ME(UInt32Value, setValue, NULL, ZEND_ACC_PUBLIC)
  1672. {NULL, NULL, NULL}
  1673. };
  1674. zend_class_entry* u_int32_value_type;
  1675. // Init class entry.
  1676. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\UInt32Value",
  1677. UInt32Value, u_int32_value)
  1678. zend_class_implements(u_int32_value_type TSRMLS_CC, 1, message_type);
  1679. zend_declare_property_null(u_int32_value_type, "value", strlen("value"),
  1680. ZEND_ACC_PRIVATE TSRMLS_CC);
  1681. PHP_PROTO_INIT_SUBMSGCLASS_END
  1682. PHP_METHOD(UInt32Value, __construct) {
  1683. init_file_wrappers(TSRMLS_C);
  1684. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1685. custom_data_init(u_int32_value_type, intern PHP_PROTO_TSRMLS_CC);
  1686. }
  1687. PHP_PROTO_FIELD_ACCESSORS(UInt32Value, u_int32_value, Value, "value")
  1688. // -----------------------------------------------------------------------------
  1689. // UInt64Value
  1690. // -----------------------------------------------------------------------------
  1691. static zend_function_entry u_int64_value_methods[] = {
  1692. PHP_ME(UInt64Value, __construct, NULL, ZEND_ACC_PUBLIC)
  1693. PHP_ME(UInt64Value, getValue, NULL, ZEND_ACC_PUBLIC)
  1694. PHP_ME(UInt64Value, setValue, NULL, ZEND_ACC_PUBLIC)
  1695. {NULL, NULL, NULL}
  1696. };
  1697. zend_class_entry* u_int64_value_type;
  1698. // Init class entry.
  1699. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\UInt64Value",
  1700. UInt64Value, u_int64_value)
  1701. zend_class_implements(u_int64_value_type TSRMLS_CC, 1, message_type);
  1702. zend_declare_property_null(u_int64_value_type, "value", strlen("value"),
  1703. ZEND_ACC_PRIVATE TSRMLS_CC);
  1704. PHP_PROTO_INIT_SUBMSGCLASS_END
  1705. PHP_METHOD(UInt64Value, __construct) {
  1706. init_file_wrappers(TSRMLS_C);
  1707. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1708. custom_data_init(u_int64_value_type, intern PHP_PROTO_TSRMLS_CC);
  1709. }
  1710. PHP_PROTO_FIELD_ACCESSORS(UInt64Value, u_int64_value, Value, "value")
  1711. // -----------------------------------------------------------------------------
  1712. // Value
  1713. // -----------------------------------------------------------------------------
  1714. static zend_function_entry value_methods[] = {
  1715. PHP_ME(Value, __construct, NULL, ZEND_ACC_PUBLIC)
  1716. PHP_ME(Value, getNullValue, NULL, ZEND_ACC_PUBLIC)
  1717. PHP_ME(Value, setNullValue, NULL, ZEND_ACC_PUBLIC)
  1718. PHP_ME(Value, getNumberValue, NULL, ZEND_ACC_PUBLIC)
  1719. PHP_ME(Value, setNumberValue, NULL, ZEND_ACC_PUBLIC)
  1720. PHP_ME(Value, getStringValue, NULL, ZEND_ACC_PUBLIC)
  1721. PHP_ME(Value, setStringValue, NULL, ZEND_ACC_PUBLIC)
  1722. PHP_ME(Value, getBoolValue, NULL, ZEND_ACC_PUBLIC)
  1723. PHP_ME(Value, setBoolValue, NULL, ZEND_ACC_PUBLIC)
  1724. PHP_ME(Value, getStructValue, NULL, ZEND_ACC_PUBLIC)
  1725. PHP_ME(Value, setStructValue, NULL, ZEND_ACC_PUBLIC)
  1726. PHP_ME(Value, getListValue, NULL, ZEND_ACC_PUBLIC)
  1727. PHP_ME(Value, setListValue, NULL, ZEND_ACC_PUBLIC)
  1728. PHP_ME(Value, getKind, NULL, ZEND_ACC_PUBLIC)
  1729. {NULL, NULL, NULL}
  1730. };
  1731. zend_class_entry* value_type;
  1732. // Init class entry.
  1733. PHP_PROTO_INIT_SUBMSGCLASS_START("Google\\Protobuf\\Value",
  1734. Value, value)
  1735. zend_class_implements(value_type TSRMLS_CC, 1, message_type);
  1736. zend_declare_property_null(value_type, "kind", strlen("kind"),
  1737. ZEND_ACC_PRIVATE TSRMLS_CC);
  1738. PHP_PROTO_INIT_SUBMSGCLASS_END
  1739. PHP_METHOD(Value, __construct) {
  1740. init_file_struct(TSRMLS_C);
  1741. MessageHeader* intern = UNBOX(MessageHeader, getThis());
  1742. custom_data_init(value_type, intern PHP_PROTO_TSRMLS_CC);
  1743. }
  1744. PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, NullValue, "null_value")
  1745. PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, NumberValue, "number_value")
  1746. PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, StringValue, "string_value")
  1747. PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, BoolValue, "bool_value")
  1748. PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, StructValue, "struct_value")
  1749. PHP_PROTO_ONEOF_FIELD_ACCESSORS(Value, value, ListValue, "list_value")
  1750. PHP_PROTO_ONEOF_ACCESSORS(Value, value, Kind, "kind")
  1751. // -----------------------------------------------------------------------------
  1752. // GPBMetadata files for well known types
  1753. // -----------------------------------------------------------------------------
  1754. #define DEFINE_GPBMETADATA_FILE(LOWERNAME, CAMELNAME, CLASSNAME) \
  1755. zend_class_entry* gpb_metadata_##LOWERNAME##_type; \
  1756. static zend_function_entry gpb_metadata_##LOWERNAME##_methods[] = { \
  1757. PHP_ME(GPBMetadata_##CAMELNAME, initOnce, NULL, \
  1758. ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) \
  1759. ZEND_FE_END \
  1760. }; \
  1761. void gpb_metadata_##LOWERNAME##_init(TSRMLS_D) { \
  1762. zend_class_entry class_type; \
  1763. INIT_CLASS_ENTRY(class_type, CLASSNAME, \
  1764. gpb_metadata_##LOWERNAME##_methods); \
  1765. gpb_metadata_##LOWERNAME##_type = \
  1766. zend_register_internal_class(&class_type TSRMLS_CC); \
  1767. } \
  1768. PHP_METHOD(GPBMetadata_##CAMELNAME, initOnce) { \
  1769. init_file_##LOWERNAME(TSRMLS_C); \
  1770. }
  1771. DEFINE_GPBMETADATA_FILE(any, Any, "GPBMetadata\\Google\\Protobuf\\Any");
  1772. DEFINE_GPBMETADATA_FILE(api, Api, "GPBMetadata\\Google\\Protobuf\\Api");
  1773. DEFINE_GPBMETADATA_FILE(duration, Duration,
  1774. "GPBMetadata\\Google\\Protobuf\\Duration");
  1775. DEFINE_GPBMETADATA_FILE(field_mask, FieldMask,
  1776. "GPBMetadata\\Google\\Protobuf\\FieldMask");
  1777. DEFINE_GPBMETADATA_FILE(empty, Empty,
  1778. "GPBMetadata\\Google\\Protobuf\\GPBEmpty");
  1779. DEFINE_GPBMETADATA_FILE(source_context, SourceContext,
  1780. "GPBMetadata\\Google\\Protobuf\\SourceContext");
  1781. DEFINE_GPBMETADATA_FILE(struct, Struct,
  1782. "GPBMetadata\\Google\\Protobuf\\Struct");
  1783. DEFINE_GPBMETADATA_FILE(timestamp, Timestamp,
  1784. "GPBMetadata\\Google\\Protobuf\\Timestamp");
  1785. DEFINE_GPBMETADATA_FILE(type, Type, "GPBMetadata\\Google\\Protobuf\\Type");
  1786. DEFINE_GPBMETADATA_FILE(wrappers, Wrappers,
  1787. "GPBMetadata\\Google\\Protobuf\\Wrappers");
  1788. #undef DEFINE_GPBMETADATA_FILE