tars2cpp.cpp 110 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391
  1. /**
  2. * Tencent is pleased to support the open source community by making Tars available.
  3. *
  4. * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
  5. *
  6. * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
  7. * in compliance with the License. You may obtain a copy of the License at
  8. *
  9. * https://opensource.org/licenses/BSD-3-Clause
  10. *
  11. * Unless required by applicable law or agreed to in writing, software distributed
  12. * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  13. * CONDITIONS OF ANY KIND, either express or implied. See the License for the
  14. * specific language governing permissions and limitations under the License.
  15. */
  16. #include "tars2cpp.h"
  17. #include "util/tc_md5.h"
  18. #include "util/tc_file.h"
  19. #include "util/tc_common.h"
  20. #include <string>
  21. #define TAB g_parse->getTab()
  22. #define INC_TAB g_parse->incTab()
  23. #define DEL_TAB g_parse->delTab()
  24. //////////////////////////////////////////////////////////////////////////////////
  25. //
  26. Tars2Cpp::Tars2Cpp()
  27. : _checkDefault(false)
  28. , _onlyStruct(false)
  29. , _bSqlSupport(false)
  30. , _bXmlSupport(false)
  31. , _bJsonSupport(true)
  32. , _namespace("tars")
  33. // , _unknownField(false)
  34. , _tarsMaster(false)
  35. {
  36. }
  37. string Tars2Cpp::writeToXml(const TypeIdPtr &pPtr) const
  38. {
  39. ostringstream s;
  40. if(EnumPtr::dynamicCast(pPtr->getTypePtr()))
  41. {
  42. s << TAB << "p->value[\"" << pPtr->getId() << "\"] = " + _namespace+ "::XmlOutput::writeXml((" + _namespace+ "::Int32)" << pPtr->getId() << ", _cdata_format);" << endl;
  43. }
  44. else if(pPtr->getTypePtr()->isArray())
  45. {
  46. s << TAB << "p->value[\"" << pPtr->getId() << "\"] = " + _namespace+ "::XmlOutput::writeXml((const "
  47. << tostr(pPtr->getTypePtr()) << " *)" << pPtr->getId() << "Len" << ");" << endl;
  48. }
  49. else if(pPtr->getTypePtr()->isPointer())
  50. {
  51. s << TAB << "p->value[\"" << pPtr->getId() << "\"] = " + _namespace+ "::XmlOutput::writeXml((const "
  52. << tostr(pPtr->getTypePtr()) << " )" << pPtr->getId() << "Len" << ");" << endl;
  53. }
  54. else
  55. {
  56. MapPtr mPtr = MapPtr::dynamicCast(pPtr->getTypePtr());
  57. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr->getTypePtr());
  58. if (!_checkDefault || pPtr->isRequire() || (!pPtr->hasDefault() && !mPtr && !vPtr))
  59. {
  60. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  61. if (pPtr->getTypePtr()->isSimple() || (bPtr && bPtr->kind() == Builtin::KindString))
  62. {
  63. s << TAB << "p->value[\"" << pPtr->getId() << "\"] = " + _namespace + "::XmlOutput::writeXml(" << pPtr->getId() << ", _cdata_format);" << endl;
  64. }
  65. else
  66. {
  67. s << TAB << "p->value[\"" << pPtr->getId() << "\"] = " + _namespace + "::XmlOutput::writeXml(" << pPtr->getId() << ");" << endl;
  68. }
  69. }
  70. else
  71. {
  72. string sDefault = pPtr->def();
  73. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  74. if (bPtr && bPtr->kind() == Builtin::KindString)
  75. {
  76. sDefault = "\"" + TC_Common::replace(pPtr->def(), "\"", "\\\"") + "\"";
  77. }
  78. if (mPtr || vPtr)
  79. {
  80. s << TAB << "if (" << pPtr->getId() << ".size() > 0)" << endl;
  81. }
  82. else
  83. {
  84. s << TAB << "if (" << pPtr->getId() << " != " << sDefault << ")" << endl;
  85. }
  86. s << TAB << "{" << endl;
  87. INC_TAB;
  88. s << TAB << "p->value[\"" << pPtr->getId() << "\"] = " + _namespace+ "::XmlOutput::writeXml(" << pPtr->getId() << ");" << endl;
  89. DEL_TAB;
  90. s << TAB << "}" << endl;
  91. }
  92. }
  93. return s.str();
  94. }
  95. string Tars2Cpp::readFromXml(const TypeIdPtr &pPtr, bool bIsRequire) const
  96. {
  97. ostringstream s;
  98. if(EnumPtr::dynamicCast(pPtr->getTypePtr()))
  99. {
  100. s << TAB << "tars::XmlInput::readXml((tars::Int32&)" << pPtr->getId() <<", pObj->value[\"" << pPtr->getId() << "\"]";
  101. }
  102. else if(pPtr->getTypePtr()->isArray())
  103. {
  104. s << TAB << "tars::XmlInput::readXml(" << pPtr->getId() << "Len" <<", pObj->value[\"" << pPtr->getId() << "\"]" << getSuffix(pPtr);
  105. }
  106. else if(pPtr->getTypePtr()->isPointer())
  107. {
  108. // "not support";
  109. }
  110. else
  111. {
  112. s << TAB << "tars::XmlInput::readXml(" << pPtr->getId() << ",pObj->value[\"" << pPtr->getId() << "\"]";
  113. }
  114. s << ", " << ((pPtr->isRequire() && bIsRequire)?"true":"false") << ");" << endl;
  115. return s.str();
  116. }
  117. string Tars2Cpp::writeToSql(const TypeIdPtr &pPtr) const
  118. {
  119. ostringstream s;
  120. if(EnumPtr::dynamicCast(pPtr->getTypePtr()))
  121. {
  122. s << TAB << "_mycols[\"" << pPtr->getId() << "\"] = make_pair(tars::TC_Mysql::DB_INT, tars::TC_Common::tostr(" << pPtr->getId() << "));" << endl;
  123. }
  124. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  125. if (bPtr)
  126. {
  127. switch(bPtr->kind())
  128. {
  129. case Builtin::KindBool:
  130. case Builtin::KindByte:
  131. case Builtin::KindShort:
  132. case Builtin::KindInt:
  133. case Builtin::KindLong:
  134. s << TAB << "_mycols[\"" << pPtr->getId() << "\"] = make_pair(tars::TC_Mysql::DB_INT, tars::TC_Common::tostr(" << pPtr->getId() << "));" << endl;
  135. break;
  136. case Builtin::KindFloat:
  137. case Builtin::KindDouble:
  138. s << TAB << "_mycols[\"" << pPtr->getId() << "\"] = make_pair(tars::TC_Mysql::DB_STR, tars::TC_Common::tostr(" << pPtr->getId() << "));" << endl;
  139. break;
  140. case Builtin::KindString:
  141. s << TAB << "_mycols[\"" << pPtr->getId() << "\"] = make_pair(tars::TC_Mysql::DB_STR, tars::TC_Common::trim(" << pPtr->getId() << "));" << endl;
  142. break;
  143. default:
  144. break;
  145. }
  146. }
  147. else if (!pPtr->getTypePtr()->isSimple())
  148. {
  149. s << TAB << "_mycols[\"" << pPtr->getId() << "\"] = make_pair(tars::TC_Mysql::DB_STR, tars::TC_Json::writeValue(tars::JsonOutput::writeJson(" << pPtr->getId() << ")));" << endl;
  150. }
  151. return s.str();
  152. }
  153. string Tars2Cpp::readFromSql(const TypeIdPtr &pPtr, bool bIsRequire) const
  154. {
  155. ostringstream s;
  156. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr->getTypePtr());
  157. if(ePtr)
  158. {
  159. s << TAB << pPtr->getId() << " = (" << ePtr->getSid() <<")TC_Common::strto<tars::Int32>(_mysrd[\"" << pPtr->getId() << "\"]);" << endl;
  160. }
  161. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  162. if (bPtr)
  163. {
  164. switch(bPtr->kind())
  165. {
  166. case Builtin::KindBool:
  167. s << TAB << pPtr->getId() << " = TC_Common::strto<tars::Bool>(_mysrd[\"" << pPtr->getId() << "\"]);" << endl;
  168. break;
  169. case Builtin::KindByte:
  170. s << TAB << pPtr->getId() << " = TC_Common::strto<tars::" << (bPtr->isUnsigned() ? "UInt8" : "Char") << ">(_mysrd[\"" << pPtr->getId() << "\"]);" << endl;
  171. break;
  172. case Builtin::KindShort:
  173. s << TAB << pPtr->getId() << " = TC_Common::strto<tars::" << (bPtr->isUnsigned() ? "UInt16" : "Short") << ">(_mysrd[\"" << pPtr->getId() << "\"]);" << endl;
  174. break;
  175. case Builtin::KindInt:
  176. s << TAB << pPtr->getId() << " = TC_Common::strto<tars::" << (bPtr->isUnsigned() ? "UInt32" : "Int32") << ">(_mysrd[\"" << pPtr->getId() << "\"]);" << endl;
  177. break;
  178. case Builtin::KindLong:
  179. s << TAB << pPtr->getId() << " = TC_Common::strto<tars::" << (bPtr->isUnsigned() ? "UInt64" : "Int64") << ">(_mysrd[\"" << pPtr->getId() << "\"]);" << endl;
  180. break;
  181. case Builtin::KindFloat:
  182. s << TAB << pPtr->getId() << " = TC_Common::strto<tars::Float>(_mysrd[\"" << pPtr->getId() << "\"]);" << endl;
  183. break;
  184. case Builtin::KindDouble:
  185. s << TAB << pPtr->getId() << " = TC_Common::strto<tars::Double>(_mysrd[\"" << pPtr->getId() << "\"]);" << endl;
  186. break;
  187. case Builtin::KindString:
  188. s << TAB << pPtr->getId() << " = TC_Common::trim(_mysrd[\"" << pPtr->getId() << "\"]);" << endl;
  189. break;
  190. default:
  191. break;
  192. }
  193. }
  194. else if (!pPtr->getTypePtr()->isSimple() )
  195. {
  196. s << TAB << "tars::JsonInput::readJson(" << pPtr->getId() << ", tars::TC_Json::getValue(_mysrd[\"" << pPtr->getId() << "\"]), false);" << endl;
  197. }
  198. return s.str();
  199. }
  200. string Tars2Cpp::writeToJson(const TypeIdPtr& pPtr) const
  201. {
  202. ostringstream s;
  203. if (EnumPtr::dynamicCast(pPtr->getTypePtr()))
  204. {
  205. s << TAB << "p->value[\"" << pPtr->getId() << "\"] = " + _namespace + "::JsonOutput::writeJson((" + _namespace + "::Int32)"
  206. << pPtr->getId() << ");" << endl;
  207. }
  208. else if (pPtr->getTypePtr()->isArray())
  209. {
  210. /*
  211. s << TAB << "p->value[\"" << pPtr->getId() << "\"] = " + _namespace + "::JsonOutput::writeJson((const "
  212. << tostr(pPtr->getTypePtr()) << " *)" << pPtr->getId() << "Len" << ");" << endl;
  213. */
  214. s << TAB << "p->value[\"" << pPtr->getId() << "\"] = " + _namespace + "::JsonOutput::writeJson((const "
  215. << tostr(pPtr->getTypePtr()) << " *)" << pPtr->getId() << ", "<< pPtr->getId() << "Len" << ");" << endl;
  216. }
  217. else if (pPtr->getTypePtr()->isPointer())
  218. {
  219. /*
  220. s << TAB << "p->value[\"" << pPtr->getId() << "\"] = " + _namespace + "::JsonOutput::writeJson((const "
  221. << tostr(pPtr->getTypePtr()) << " )" << pPtr->getId() << "Len" << ");" << endl;
  222. */
  223. s << TAB << "p->value[\"" << pPtr->getId() << "\"] = " + _namespace + "::JsonOutput::writeJson((const "
  224. << tostr(pPtr->getTypePtr()) << " )" << pPtr->getId() << ", "<< pPtr->getId() << "Len" << ");" << endl;
  225. }
  226. else
  227. {
  228. MapPtr mPtr = MapPtr::dynamicCast(pPtr->getTypePtr());
  229. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr->getTypePtr());
  230. // 对于json, 不检测默认值
  231. if (true || !_checkDefault || pPtr->isRequire() || (!pPtr->hasDefault() && !mPtr && !vPtr))
  232. {
  233. s << TAB << "p->value[\"" << pPtr->getId() << "\"] = " + _namespace + "::JsonOutput::writeJson("
  234. << pPtr->getId() << ");" << endl;
  235. }
  236. else
  237. {
  238. string sDefault = pPtr->def();
  239. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  240. if (bPtr && bPtr->kind() == Builtin::KindString)
  241. {
  242. sDefault = "\"" + tars::TC_Common::replace(pPtr->def(), "\"", "\\\"") + "\"";
  243. }
  244. if (mPtr || vPtr)
  245. {
  246. s << TAB << "if (" << pPtr->getId() << ".size() > 0)" << endl;
  247. }
  248. else if (bPtr && (bPtr->kind() == Builtin::KindFloat || bPtr->kind() == Builtin::KindDouble))
  249. {
  250. s << TAB << "if (!tars::TC_Common::equal(" << pPtr->getId() << "," << sDefault << "))" << endl;
  251. }
  252. else
  253. {
  254. s << TAB << "if (" << pPtr->getId() << " != " << sDefault << ")" << endl;
  255. }
  256. s << TAB << "{" << endl;
  257. INC_TAB;
  258. s << TAB << "p->value[\"" << pPtr->getId() << "\"] = " + _namespace + "::JsonOutput::writeJson("
  259. << pPtr->getId() << ");" << endl;
  260. DEL_TAB;
  261. s << TAB << "}" << endl;
  262. }
  263. }
  264. return s.str();
  265. }
  266. string Tars2Cpp::readFromJson(const TypeIdPtr& pPtr, bool bIsRequire) const
  267. {
  268. ostringstream s;
  269. // if (EnumPtr::dynamicCast(pPtr->getTypePtr()))
  270. // {
  271. // s << TAB << _namespace + "::JsonInput::readJson((" + _namespace + "::Int32&)" << pPtr->getId() << ",pObj->value[\"" << pPtr->getId() << "\"]";
  272. // }
  273. // else
  274. if (pPtr->getTypePtr()->isArray())
  275. {
  276. //s << TAB << _namespace + "::JsonInput::readJson(" << pPtr->getId() << "Len" << ",pObj->value[\"" << pPtr->getId() << "\"]" << getSuffix(pPtr);
  277. s << TAB << _namespace + "::JsonInput::readJson(" << pPtr->getId() << ", " << "sizeof("+pPtr->getId()+")" << ", " << pPtr->getId() << "Len" << ", pObj->value[\"" << pPtr->getId() << "\"]";
  278. }
  279. else if (pPtr->getTypePtr()->isPointer())
  280. {
  281. #if 0
  282. s << TAB << pPtr->getId() <<" = ("<<tostr(pPtr->getTypePtr())<<")_is.cur();"<<endl;
  283. s << TAB << "_is.read("<< pPtr->getId()<<", _is.left(), "<< pPtr->getId() << "Len";
  284. #endif
  285. s << TAB << "not support";
  286. }
  287. else
  288. {
  289. s << TAB << _namespace + "::JsonInput::readJson(" << pPtr->getId() << ",pObj->value[\"" << pPtr->getId() << "\"]";
  290. }
  291. s << ", " << ((pPtr->isRequire() && bIsRequire) ? "true" : "false") << ");" << endl;
  292. #if 0
  293. if(pPtr->getTypePtr()->isPointer())
  294. s << TAB <<"_is.mapBufferSkip("<<pPtr->getId() << "Len);"<<endl;
  295. #endif
  296. return s.str();
  297. }
  298. string Tars2Cpp::writeTo(const TypeIdPtr& pPtr) const
  299. {
  300. ostringstream s;
  301. if (EnumPtr::dynamicCast(pPtr->getTypePtr()))
  302. {
  303. s << TAB << "_os.write((" + _namespace + "::Int32)" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl;
  304. }
  305. else if (pPtr->getTypePtr()->isArray())
  306. {
  307. s << TAB << "_os.write((const " << tostr(pPtr->getTypePtr()) << " *)" << pPtr->getId() << ", " << pPtr->getId() << "Len" << ", " << pPtr->getTag() << ");" << endl;
  308. }
  309. else if (pPtr->getTypePtr()->isPointer())
  310. {
  311. s << TAB << "_os.write((const " << tostr(pPtr->getTypePtr()) << ")" << pPtr->getId() << ", " << pPtr->getId() << "Len" << ", " << pPtr->getTag() << ");" << endl;
  312. }
  313. else
  314. {
  315. MapPtr mPtr = MapPtr::dynamicCast(pPtr->getTypePtr());
  316. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr->getTypePtr());
  317. if (!_checkDefault || pPtr->isRequire() || (!pPtr->hasDefault() && !mPtr && !vPtr))
  318. {
  319. s << TAB << "_os.write(" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl;
  320. }
  321. else
  322. {
  323. string sDefault = pPtr->def();
  324. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  325. if (bPtr && bPtr->kind() == Builtin::KindString)
  326. {
  327. sDefault = "\"" + tars::TC_Common::replace(pPtr->def(), "\"", "\\\"") + "\"";
  328. }
  329. if (mPtr || vPtr)
  330. {
  331. s << TAB << "if (" << pPtr->getId() << ".size() > 0)" << endl;
  332. }
  333. else
  334. {
  335. s << TAB << "if (" << pPtr->getId() << " != " << sDefault << ")" << endl;
  336. }
  337. s << TAB << "{" << endl;
  338. INC_TAB;
  339. s << TAB << "_os.write(" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl;
  340. DEL_TAB;
  341. s << TAB << "}" << endl;
  342. }
  343. }
  344. return s.str();
  345. }
  346. string Tars2Cpp::readFrom(const TypeIdPtr& pPtr, bool bIsRequire) const
  347. {
  348. ostringstream s;
  349. if (EnumPtr::dynamicCast(pPtr->getTypePtr()))
  350. {
  351. //枚举强制类型转换在O2编译选项情况下会告警
  352. string tmp = _namespace + "::Int32 eTemp" + TC_Common::tostr(pPtr->getTag()) + generateInitValue(pPtr);
  353. s << TAB << tmp << endl;
  354. s << TAB << "_is.read(eTemp" << TC_Common::tostr(pPtr->getTag());
  355. }
  356. else if (pPtr->getTypePtr()->isArray())
  357. {
  358. //s << TAB << "_is.read(" << pPtr->getId() << ", " << getSuffix(pPtr) << ", " << pPtr->getId() << "Len";
  359. s << TAB << "_is.read(" << pPtr->getId() << ", " << "sizeof("+pPtr->getId()+")" << ", " << pPtr->getId() << "Len";
  360. }
  361. else if (pPtr->getTypePtr()->isPointer())
  362. {
  363. s << TAB << pPtr->getId() << " = (" << tostr(pPtr->getTypePtr()) << ")_is.cur();" << endl;
  364. s << TAB << "_is.read(" << pPtr->getId() << ", _is.left(), " << pPtr->getId() << "Len";
  365. }
  366. else
  367. {
  368. s << TAB << "_is.read(" << pPtr->getId();
  369. }
  370. s << ", " << pPtr->getTag() << ", " << ((pPtr->isRequire() && bIsRequire) ? "true" : "false") << ");" << endl;
  371. if (EnumPtr::dynamicCast(pPtr->getTypePtr()))
  372. {
  373. s << TAB << pPtr->getId() << " = (" << tostr(pPtr->getTypePtr()) << ")eTemp" << TC_Common::tostr(pPtr->getTag()) << ";" << endl;
  374. }
  375. if(pPtr->getTypePtr()->isPointer())
  376. s << TAB <<"_is.mapBufferSkip("<<pPtr->getId() << "Len);"<<endl;
  377. return s.str();
  378. }
  379. // string Tars2Cpp::readUnknown(const TypeIdPtr& pPtr) const
  380. // {
  381. // ostringstream s;
  382. // s << TAB << "_is.readUnknown(sUnknownField, " << pPtr->getTag() << ");" << endl;
  383. // return s.str();
  384. // }
  385. // string Tars2Cpp::writeUnknown() const
  386. // {
  387. // ostringstream s;
  388. // s << TAB << "_os.writeUnknown(sUnknownField);" << endl;
  389. // return s.str();
  390. // }
  391. string Tars2Cpp::display(const TypeIdPtr& pPtr) const
  392. {
  393. ostringstream s;
  394. if (EnumPtr::dynamicCast(pPtr->getTypePtr()))
  395. {
  396. s << TAB << "_ds.display((" + _namespace + "::Int32)" << pPtr->getId() << ",\"" << pPtr->getId() << "\");" << endl;;
  397. }
  398. else if (pPtr->getTypePtr()->isArray() || pPtr->getTypePtr()->isPointer())
  399. {
  400. s << TAB << "_ds.display(" << pPtr->getId() << ", " << pPtr->getId() << "Len" << ",\"" << pPtr->getId() << "\");" << endl;
  401. }
  402. else
  403. {
  404. s << TAB << "_ds.display(" << pPtr->getId() << ",\"" << pPtr->getId() << "\");" << endl;;
  405. }
  406. return s.str();
  407. }
  408. string Tars2Cpp::displaySimple(const TypeIdPtr& pPtr, bool bSep) const
  409. {
  410. ostringstream s;
  411. if (EnumPtr::dynamicCast(pPtr->getTypePtr()))
  412. {
  413. s << TAB << "_ds.displaySimple((" + _namespace + "::Int32)" << pPtr->getId() << ", "
  414. << (bSep ? "true" : "false") << ");" << endl;
  415. }
  416. else if (pPtr->getTypePtr()->isArray())
  417. {
  418. s << TAB << "_ds.displaySimple(" << pPtr->getId() << ", " << pPtr->getId() << "Len" << ","
  419. << (bSep ? "true" : "false") << ");" << endl;
  420. }
  421. else if (pPtr->getTypePtr()->isPointer())
  422. {
  423. s << TAB << "_ds.displaySimple(";
  424. s << (bSep ? "" : ("(const " + tostr(pPtr->getTypePtr()) + ")"));
  425. s << pPtr->getId() << ", " << pPtr->getId() << "Len" << "," << (bSep ? "true" : "false") << ");" << endl;
  426. }
  427. else
  428. {
  429. s << TAB << "_ds.displaySimple(" << pPtr->getId() << ", "
  430. << (bSep ? "true" : "false") << ");" << endl;
  431. }
  432. return s.str();
  433. }
  434. string Tars2Cpp::generateCollection(const TypeIdPtr& pPtr, bool bSep) const
  435. {
  436. ostringstream s;
  437. if (pPtr->getTypePtr()->isArray())
  438. {
  439. s << TAB << "_jj.generateCollection(" << "\"" << pPtr->getId() << "\"" << ", " << pPtr->getId() << ", " << pPtr->getId() << "Len"
  440. << ");" << "\n" << (bSep ? TAB + "_jj.append(\",\", false);" : "") << endl;
  441. }
  442. else
  443. {
  444. s << TAB << "_jj.generateCollection(" << "\"" << pPtr->getId() << "\"" << ", " << pPtr->getId()
  445. << ");" << "\n" << (bSep ? TAB + "_jj.append(\",\", false);" : "") << endl;
  446. }
  447. return s.str();
  448. }
  449. /*******************************获取定长数组坐标********************************/
  450. int Tars2Cpp::getSuffix(const TypeIdPtr& pPtr) const
  451. {
  452. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  453. if (bPtr && bPtr->kind() == Builtin::KindString && bPtr->isArray())
  454. {
  455. return bPtr->getSize();
  456. }
  457. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr->getTypePtr());
  458. if (vPtr && vPtr->isArray())
  459. {
  460. return vPtr->getSize();
  461. }
  462. return -1;
  463. }
  464. /*******************************定长数组坐标********************************/
  465. string Tars2Cpp::toStrSuffix(const TypeIdPtr& pPtr) const
  466. {
  467. ostringstream s;
  468. int i = getSuffix(pPtr);
  469. if (i >= 0)
  470. {
  471. s << "[" << i << "]";
  472. }
  473. return s.str();
  474. }
  475. /*******************************BuiltinPtr********************************/
  476. string Tars2Cpp::tostr(const TypePtr& pPtr) const
  477. {
  478. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  479. if (bPtr) return tostrBuiltin(bPtr);
  480. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  481. if (vPtr) return tostrVector(vPtr);
  482. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  483. if (mPtr) return tostrMap(mPtr);
  484. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  485. if (sPtr) return tostrStruct(sPtr);
  486. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  487. if (ePtr) return tostrEnum(ePtr);
  488. if (!pPtr) return "void";
  489. assert(false);
  490. return "";
  491. }
  492. string Tars2Cpp::tostrBuiltin(const BuiltinPtr& pPtr) const
  493. {
  494. string s;
  495. switch (pPtr->kind())
  496. {
  497. case Builtin::KindBool:
  498. s = _namespace + "::Bool";
  499. break;
  500. case Builtin::KindByte:
  501. s = _namespace + "::Char";
  502. break;
  503. case Builtin::KindShort:
  504. //为了兼容java无unsigned, 编解码时把tars文件中 unsigned char 对应到short
  505. //c++中需要还原回来
  506. s = (pPtr->isUnsigned() ? _namespace + "::UInt8" : _namespace + "::Short");
  507. break;
  508. case Builtin::KindInt:
  509. s = (pPtr->isUnsigned() ? _namespace + "::UInt16" : _namespace + "::Int32");
  510. break;
  511. case Builtin::KindLong:
  512. s = (pPtr->isUnsigned() ? _namespace + "::" + "UInt32" : _namespace + "::Int64");
  513. break;
  514. case Builtin::KindFloat:
  515. s = _namespace + "::Float";
  516. break;
  517. case Builtin::KindDouble:
  518. s = _namespace + "::Double";
  519. break;
  520. case Builtin::KindString:
  521. if(pPtr->isArray())
  522. s = _namespace+ "::Char"; //char a [8];
  523. else
  524. s = "std::string";//string a;
  525. break;
  526. case Builtin::KindVector:
  527. s = "std::vector";
  528. break;
  529. case Builtin::KindMap:
  530. s = "std::map";
  531. break;
  532. default:
  533. assert(false);
  534. break;
  535. }
  536. return s;
  537. }
  538. /*******************************VectorPtr********************************/
  539. string Tars2Cpp::tostrVector(const VectorPtr& pPtr) const
  540. {
  541. //数组类型
  542. if (pPtr->isArray())
  543. {
  544. return tostr(pPtr->getTypePtr());
  545. }
  546. //指针类型
  547. if (pPtr->isPointer())
  548. {
  549. return tostr(pPtr->getTypePtr()) + " *";
  550. }
  551. string s = Builtin::builtinTable[Builtin::KindVector] + string("<") + tostr(pPtr->getTypePtr());
  552. if (MapPtr::dynamicCast(pPtr->getTypePtr()) || VectorPtr::dynamicCast(pPtr->getTypePtr()))
  553. {
  554. s += " >";
  555. }
  556. else
  557. {
  558. s += ">";
  559. }
  560. return s;
  561. }
  562. /*******************************MapPtr********************************/
  563. string Tars2Cpp::tostrMap(const MapPtr& pPtr) const
  564. {
  565. string s = Builtin::builtinTable[Builtin::KindMap] + string("<") + tostr(pPtr->getLeftTypePtr()) + ", " + tostr(pPtr->getRightTypePtr());
  566. if (MapPtr::dynamicCast(pPtr->getRightTypePtr()) || VectorPtr::dynamicCast(pPtr->getRightTypePtr()))
  567. {
  568. s += " >";
  569. }
  570. else
  571. {
  572. s += ">";
  573. }
  574. return s;
  575. }
  576. /*******************************StructPtr********************************/
  577. string Tars2Cpp::tostrStruct(const StructPtr& pPtr) const
  578. {
  579. return pPtr->getSid();
  580. }
  581. string Tars2Cpp::MD5(const StructPtr& pPtr) const
  582. {
  583. string s;
  584. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  585. for (size_t j = 0; j < member.size(); j++)
  586. {
  587. s += "_" + tostr(member[j]->getTypePtr());
  588. }
  589. return "\"" + tars::TC_MD5::md5str(s) + "\"";
  590. }
  591. /////////////////////////////////////////////////////////////////////
  592. string Tars2Cpp::tostrEnum(const EnumPtr& pPtr) const
  593. {
  594. return pPtr->getSid();
  595. }
  596. ///////////////////////////////////////////////////////////////////////
  597. string Tars2Cpp::generateH(const StructPtr& pPtr, const string& namespaceId) const
  598. {
  599. ostringstream s;
  600. s << TAB << "struct " << pPtr->getId() << " : public " + _namespace + "::TarsStructBase" << endl;
  601. s << TAB << "{" << endl;
  602. s << TAB << "public:" << endl;
  603. INC_TAB;
  604. s << TAB << "static string className()" << endl;
  605. s << TAB << "{" << endl;
  606. INC_TAB;
  607. s << TAB << "return " << "\"" << namespaceId << "." << pPtr->getId() << "\"" << ";" << endl;
  608. DEL_TAB;
  609. s << TAB << "}" << endl;
  610. s << TAB << "static string MD5()" << endl;
  611. s << TAB << "{" << endl;
  612. INC_TAB;
  613. s << TAB << "return " << MD5(pPtr) << ";" << endl;
  614. DEL_TAB;
  615. s << TAB << "}" << endl;
  616. ////////////////////////////////////////////////////////////
  617. //定义缺省构造函数
  618. s << TAB << pPtr->getId() << "()" << endl;
  619. s << TAB << "{" << endl;
  620. INC_TAB;
  621. s << TAB << "resetDefautlt();" << endl;
  622. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  623. /*
  624. bool b = false;
  625. //定义初始化列表
  626. for (size_t j = 0; j < member.size(); j++)
  627. {
  628. if (member[j]->getTypePtr()->isArray())
  629. {
  630. if (!b) s << TAB << ":";
  631. else s << ",";
  632. s << member[j]->getId() << "Len(0)";
  633. b = true;
  634. continue;
  635. }
  636. if (member[j]->getTypePtr()->isPointer())
  637. {
  638. if (!b) s << TAB << ":";
  639. else s << ",";
  640. s << member[j]->getId() << "Len(0)," << member[j]->getId() << "(NULL)";
  641. b = true;
  642. continue;
  643. }
  644. if (member[j]->hasDefault())
  645. {
  646. if (!b) s << TAB << ":";
  647. else s << ",";
  648. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[j]->getTypePtr());
  649. //string值要转义
  650. if (bPtr && bPtr->kind() == Builtin::KindString)
  651. {
  652. string tmp = tars::TC_Common::replace(member[j]->def(), "\"", "\\\"");
  653. s << member[j]->getId() << "(\"" << tmp << "\")";
  654. }
  655. else
  656. {
  657. s << member[j]->getId() << "(" << member[j]->def() << ")";
  658. }
  659. b = true;
  660. }
  661. else
  662. { //没有提供初始值才会走到这里,提供枚举类型初始化值
  663. EnumPtr ePtr = EnumPtr::dynamicCast(member[j]->getTypePtr());
  664. if (ePtr)
  665. {
  666. vector<TypeIdPtr>& eMember = ePtr->getAllMemberPtr();
  667. if (eMember.size() > 0)
  668. {
  669. if (!b) s << TAB << ":";
  670. else s << ",";
  671. string sid = ePtr->getSid();
  672. s << member[j]->getId() << "(" << sid.substr(0, sid.find_first_of("::")) << "::" << eMember[0]->getId() << ")";
  673. b = true;
  674. }
  675. }
  676. }
  677. }
  678. // if (b)
  679. // {
  680. // if (_unknownField)
  681. // {
  682. // s << ",sUnknownField(\"\")";
  683. // }
  684. // s << endl;
  685. // }
  686. s << TAB << "{" << endl;
  687. INC_TAB;
  688. for (size_t j = 0; j < member.size(); j++)
  689. {
  690. VectorPtr vPtr = VectorPtr::dynamicCast(member[j]->getTypePtr());
  691. if (vPtr)
  692. {
  693. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr());
  694. if (!bPtr || bPtr->kind() == Builtin::KindString) //非内建类型或者string 类型不能memset
  695. {
  696. continue;
  697. }
  698. }
  699. if (!member[j]->getTypePtr()->isArray())
  700. {
  701. continue;
  702. }
  703. s << TAB << "memset(" << member[j]->getId() << ", 0, " << "sizeof(" << member[j]->getId() << "));" << endl;
  704. }
  705. */
  706. if (_bXmlSupport)
  707. {
  708. s << TAB << "_cdata_format = false;" << endl;
  709. }
  710. DEL_TAB;
  711. s << TAB << "}" << endl;
  712. //resetDefault()函数
  713. s << TAB << "void resetDefautlt()" << endl;
  714. s << TAB << "{" << endl;
  715. INC_TAB;
  716. member = pPtr->getAllMemberPtr();
  717. for (size_t j = 0; j < member.size(); j++)
  718. {
  719. if (member[j]->getTypePtr()->isArray())
  720. {
  721. s << TAB << member[j]->getId() << "Len = 0;" << endl;
  722. VectorPtr vPtr = VectorPtr::dynamicCast(member[j]->getTypePtr());
  723. if (vPtr)
  724. {
  725. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr());
  726. if (bPtr && bPtr->kind() != Builtin::KindString) //非内建类型或者string 类型不能memset
  727. {
  728. s << TAB << "memset(" << member[j]->getId() << ", 0, " << "sizeof(" << member[j]->getId() << "));" << endl;
  729. }
  730. }
  731. continue;
  732. }
  733. if (member[j]->getTypePtr()->isPointer())
  734. {
  735. s << TAB << member[j]->getId() << "Len = 0;" << endl;
  736. s << TAB << member[j]->getId() << " = NULL;" << endl;
  737. continue;
  738. }
  739. VectorPtr vPtr = VectorPtr::dynamicCast(member[j]->getTypePtr());
  740. MapPtr mPtr = MapPtr::dynamicCast(member[j]->getTypePtr());
  741. // 如果是vector或者map,reset时需要调用clear方法
  742. if (vPtr || mPtr)
  743. {
  744. s << TAB << member[j]->getId() << ".clear();" << endl;
  745. continue;
  746. }
  747. StructPtr sPtr = StructPtr::dynamicCast(member[j]->getTypePtr());
  748. // 如果是结构体,那么需要调用resetDefautlt方法
  749. if (sPtr)
  750. {
  751. s << TAB << member[j]->getId() << ".resetDefautlt();" << endl;
  752. continue;
  753. }
  754. if (member[j]->hasDefault())
  755. {
  756. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[j]->getTypePtr());
  757. //string值要转义
  758. if (bPtr && bPtr->kind() == Builtin::KindString)
  759. {
  760. string tmp = tars::TC_Common::replace(member[j]->def(), "\"", "\\\"");
  761. s << TAB << member[j]->getId() << " = \"" << tmp << "\";" << endl;
  762. }
  763. else
  764. {
  765. s << TAB << member[j]->getId() << " = " << member[j]->def() << ";" << endl;
  766. }
  767. }
  768. else
  769. { //没有提供初始值才会走到这里,提供枚举类型初始化值
  770. EnumPtr ePtr = EnumPtr::dynamicCast(member[j]->getTypePtr());
  771. if (ePtr)
  772. {
  773. vector<TypeIdPtr>& eMember = ePtr->getAllMemberPtr();
  774. if (eMember.size() > 0)
  775. {
  776. string sid = ePtr->getSid();
  777. s << TAB << member[j]->getId() << " = " << sid.substr(0, sid.find_first_of("::")) << "::" << eMember[0]->getId() << ";" << endl;
  778. }
  779. }
  780. }
  781. }
  782. DEL_TAB;
  783. s << TAB << "}" << endl;
  784. s << TAB << "template<typename WriterT>" << endl;
  785. s << TAB << "void writeTo(" + _namespace + "::TarsOutputStream<WriterT>& _os) const" << endl;
  786. s << TAB << "{" << endl;
  787. INC_TAB;
  788. for (size_t j = 0; j < member.size(); j++)
  789. {
  790. s << writeTo(member[j]);
  791. }
  792. // if (_unknownField)
  793. // {
  794. // s << writeUnknown();
  795. // }
  796. DEL_TAB;
  797. s << TAB << "}" << endl;
  798. ///////////////////////////////////////////////////////////
  799. s << TAB << "template<typename ReaderT>" << endl;
  800. s << TAB << "void readFrom(" + _namespace + "::TarsInputStream<ReaderT>& _is)" << endl;
  801. s << TAB << "{" << endl;
  802. INC_TAB;
  803. s << TAB << "resetDefautlt();" << endl;
  804. for (size_t j = 0; j < member.size(); j++)
  805. {
  806. s << readFrom(member[j]);
  807. }
  808. // if (_unknownField)
  809. // {
  810. // s << readUnknown(member[member.size() - 1]);
  811. // }
  812. DEL_TAB;
  813. s << TAB << "}" << endl;
  814. if (_bJsonSupport)
  815. {
  816. s << TAB << "tars::JsonValueObjPtr writeToJson() const" << endl;
  817. s << TAB << "{" << endl;
  818. INC_TAB;
  819. s << TAB << "tars::JsonValueObjPtr p = new tars::JsonValueObj();" << endl;
  820. for (size_t j = 0; j < member.size(); j++)
  821. {
  822. s << writeToJson(member[j]);
  823. }
  824. s << TAB << "return p;" << endl;
  825. DEL_TAB;
  826. s << TAB << "}" << endl;
  827. s << TAB << "string writeToJsonString() const" << endl;
  828. s << TAB << "{" << endl;
  829. INC_TAB;
  830. s << TAB << "return tars::TC_Json::writeValue(writeToJson());" << endl;
  831. DEL_TAB;
  832. s << TAB << "}" << endl;
  833. s << TAB << "void readFromJson(const tars::JsonValuePtr & p, bool isRequire = true)" << endl;
  834. s << TAB << "{" << endl;
  835. INC_TAB;
  836. s << TAB << "resetDefautlt();" << endl;
  837. s << TAB << "if(NULL == p.get() || p->getType() != tars::eJsonTypeObj)" << endl;
  838. s << TAB << "{" << endl;
  839. INC_TAB;
  840. s << TAB << "char s[128];" << endl;
  841. s << TAB << "snprintf(s, sizeof(s), \"read 'struct' type mismatch, get type: %d.\", (p.get() ? p->getType() : 0));" << endl;
  842. s << TAB << "throw tars::TC_Json_Exception(s);" << endl;
  843. DEL_TAB;
  844. s << TAB << "}" << endl;
  845. s << TAB << "tars::JsonValueObjPtr pObj=tars::JsonValueObjPtr::dynamicCast(p);" << endl;
  846. for (size_t j = 0; j < member.size(); j++)
  847. {
  848. s << readFromJson(member[j]);
  849. }
  850. DEL_TAB;
  851. s << TAB << "}" << endl;
  852. s << TAB << "void readFromJsonString(const string & str)" << endl;
  853. s << TAB << "{" << endl;
  854. INC_TAB;
  855. s << TAB << "readFromJson(tars::TC_Json::getValue(str));" << endl;
  856. DEL_TAB;
  857. s << TAB << "}" << endl;
  858. }
  859. if (_bXmlSupport)
  860. {
  861. s << TAB << "void setXmlFormat(bool cdata = false)" << endl;
  862. s << TAB << "{" << endl;
  863. INC_TAB;
  864. s << TAB << "_cdata_format = cdata;" <<endl;
  865. DEL_TAB;
  866. s << TAB << "}" << endl;
  867. s << TAB << "tars::XmlValueObjPtr writeToXml() const" << endl;
  868. s << TAB << "{" << endl;
  869. INC_TAB;
  870. s << TAB << "tars::XmlValueObjPtr p = new tars::XmlValueObj();" << endl;
  871. for(size_t j = 0; j < member.size(); j++)
  872. {
  873. s << writeToXml(member[j]);
  874. }
  875. s << TAB << "return p;" <<endl;
  876. DEL_TAB;
  877. s << TAB << "}" << endl;
  878. s << TAB << "string writeToXmlString() const" << endl;
  879. s << TAB << "{" << endl;
  880. INC_TAB;
  881. s << TAB << "return tars::TC_Xml::writeValue(writeToXml());" <<endl;
  882. DEL_TAB;
  883. s << TAB << "}" << endl;
  884. s << TAB << "void readFromXml(const tars::XmlValuePtr & p, bool isRequire = true)" << endl;
  885. s << TAB << "{" << endl;
  886. INC_TAB;
  887. s << TAB << "resetDefautlt();" << endl;
  888. s << TAB << "if(NULL == p.get() || p->getType() != eXmlTypeObj)" << endl;
  889. s << TAB << "{" << endl;
  890. INC_TAB;
  891. s << TAB << "char s[128];" << endl;
  892. s << TAB << "snprintf(s, sizeof(s), \"read 'struct' type mismatch, get type: %d.\", p->getType());" << endl;
  893. s << TAB << "throw TC_Xml_Exception(s);" << endl;
  894. DEL_TAB;
  895. s << TAB << "}" << endl;
  896. s << TAB << "tars::XmlValueObjPtr pObj= tars::XmlValueObjPtr::dynamicCast(p);" << endl;
  897. for(size_t j = 0; j < member.size(); j++)
  898. {
  899. s << readFromXml(member[j]);
  900. }
  901. DEL_TAB;
  902. s << TAB << "}" << endl;
  903. s << TAB << "void readFromXmlString(const string & str)" << endl;
  904. s << TAB << "{" << endl;
  905. INC_TAB;
  906. s << TAB << "readFromXml(tars::TC_Xml::getValue(str));" <<endl;
  907. DEL_TAB;
  908. s << TAB << "}" << endl;
  909. }
  910. if (_bSqlSupport)
  911. {
  912. s << TAB << "tars::TC_Mysql::RECORD_DATA& toSql(tars::TC_Mysql::RECORD_DATA& _mycols) const" << endl;
  913. s << TAB << "{" << endl;
  914. INC_TAB;
  915. for(size_t j = 0; j < member.size(); j++)
  916. {
  917. s << writeToSql(member[j]);
  918. }
  919. s << TAB << "return _mycols;" << endl;
  920. DEL_TAB;
  921. s << TAB << "}" << endl;
  922. s << TAB << "void fromSql(tars::TC_Mysql::MysqlRecord& _mysrd)" << endl;
  923. s << TAB << "{" << endl;
  924. INC_TAB;
  925. s << TAB << "resetDefautlt();" << endl;
  926. for(size_t j = 0; j < member.size(); j++)
  927. {
  928. s << readFromSql(member[j]);
  929. }
  930. DEL_TAB;
  931. s << TAB << "}" << endl;
  932. }
  933. s << TAB << "ostream& display(ostream& _os, int _level=0) const" << endl;
  934. s << TAB << "{" << endl;
  935. INC_TAB;
  936. s << TAB << _namespace + "::TarsDisplayer _ds(_os, _level);" << endl;
  937. for (size_t j = 0; j < member.size(); j++)
  938. {
  939. s << display(member[j]);
  940. }
  941. s << TAB << "return _os;" << endl;
  942. DEL_TAB;
  943. s << TAB << "}" << endl;
  944. s << TAB << "ostream& displaySimple(ostream& _os, int _level=0) const" << endl;
  945. s << TAB << "{" << endl;
  946. INC_TAB;
  947. s << TAB << _namespace + "::TarsDisplayer _ds(_os, _level);" << endl;
  948. for (size_t j = 0; j < member.size(); j++)
  949. {
  950. s << displaySimple(member[j], (j != member.size() - 1 ? true : false));
  951. }
  952. s << TAB << "return _os;" << endl;
  953. DEL_TAB;
  954. s << TAB << "}" << endl;
  955. DEL_TAB;
  956. s << TAB << "public:" << endl;
  957. INC_TAB;
  958. //定义成员变量
  959. for (size_t j = 0; j < member.size(); j++)
  960. {
  961. if (member[j]->getTypePtr()->isArray() || member[j]->getTypePtr()->isPointer()) //数组类型、指针类型需要定义长度
  962. {
  963. s << TAB << _namespace + "::" << "UInt32 " << member[j]->getId() << "Len" << ";" << endl;
  964. }
  965. s << TAB << tostr(member[j]->getTypePtr()) << " " << member[j]->getId() << toStrSuffix(member[j]) << ";" << endl;
  966. }
  967. if (_bXmlSupport)
  968. {
  969. DEL_TAB;
  970. s << TAB << "private:" << endl;
  971. INC_TAB;
  972. s << TAB << "bool _cdata_format;" << endl;
  973. }
  974. // if (_unknownField)
  975. // {
  976. // s << TAB << "std::string sUnknownField;" << endl;
  977. // }
  978. DEL_TAB;
  979. s << TAB << "};" << endl;
  980. //定义==操作
  981. s << TAB << "inline bool operator==(const " << pPtr->getId() << "&l, const " << pPtr->getId() << "&r)" << endl;
  982. s << TAB << "{" << endl;
  983. INC_TAB;
  984. s << TAB << "return ";
  985. for (size_t j = 0; j < member.size(); j++)
  986. {
  987. if (member[j]->getTypePtr()->isArray() || member[j]->getTypePtr()->isPointer()) //数组类型、指针类型
  988. {
  989. s << "!memcmp(l." << member[j]->getId() << ",r." << member[j]->getId() << ",l." << member[j]->getId() << "Len)";
  990. }
  991. else
  992. {
  993. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[j]->getTypePtr());
  994. MapPtr mPtr = MapPtr::dynamicCast(member[j]->getTypePtr());
  995. VectorPtr vPtr = VectorPtr::dynamicCast(member[j]->getTypePtr());
  996. bool mapDouble = false;
  997. if (mPtr)
  998. {
  999. {
  1000. BuiltinPtr innerPtr = BuiltinPtr::dynamicCast(mPtr->getLeftTypePtr());
  1001. if (innerPtr && (innerPtr->kind() == Builtin::KindFloat || innerPtr->kind() == Builtin::KindDouble))
  1002. {
  1003. mapDouble = true;
  1004. }
  1005. }
  1006. {
  1007. BuiltinPtr innerPtr = BuiltinPtr::dynamicCast(mPtr->getRightTypePtr());
  1008. if (innerPtr && (innerPtr->kind() == Builtin::KindFloat || innerPtr->kind() == Builtin::KindDouble))
  1009. {
  1010. mapDouble = true;
  1011. }
  1012. }
  1013. }
  1014. bool vecDouble = false;
  1015. //vector比较
  1016. if (vPtr)
  1017. {
  1018. BuiltinPtr innerPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr());
  1019. if (innerPtr && (innerPtr->kind() == Builtin::KindFloat || innerPtr->kind() == Builtin::KindDouble))
  1020. {
  1021. vecDouble = true;
  1022. }
  1023. }
  1024. if (mapDouble || vecDouble)
  1025. {
  1026. s << "tars::TC_Common::equal(" << "l." << member[j]->getId() << "," << "r." << member[j]->getId() << ")";
  1027. }
  1028. else if (bPtr && (bPtr->kind() == Builtin::KindFloat || bPtr->kind() == Builtin::KindDouble))
  1029. {
  1030. s << "tars::TC_Common::equal(" << "l." << member[j]->getId() << "," << "r." << member[j]->getId() << ")" ;
  1031. }
  1032. else
  1033. {
  1034. s << "l." << member[j]->getId() << " == r." << member[j]->getId();
  1035. }
  1036. }
  1037. if (j != member.size() - 1)
  1038. {
  1039. s << " && ";
  1040. }
  1041. }
  1042. s << ";" << endl;
  1043. DEL_TAB;
  1044. s << TAB << "}" << endl;
  1045. //定义!=
  1046. s << TAB << "inline bool operator!=(const " << pPtr->getId() << "&l, const " << pPtr->getId() << "&r)" << endl;
  1047. s << TAB << "{" << endl;
  1048. INC_TAB;
  1049. s << TAB << "return !(l == r);" << endl;
  1050. DEL_TAB;
  1051. s << TAB << "}" << endl;
  1052. //定义 << >>
  1053. if (_bJsonSupport)
  1054. {
  1055. //重载 <<
  1056. s << TAB << "inline ostream& operator<<(ostream & os,const " << pPtr->getId() << "&r)" << endl;
  1057. s << TAB << "{" << endl;
  1058. INC_TAB;
  1059. s << TAB << "os << r.writeToJsonString();" << endl;
  1060. s << TAB << "return os;" << endl;
  1061. DEL_TAB;
  1062. s << TAB << "}" << endl;
  1063. //重载 >>
  1064. s << TAB << "inline istream& operator>>(istream& is," << pPtr->getId() << "&l)" << endl;
  1065. s << TAB << "{" << endl;
  1066. INC_TAB;
  1067. s << TAB << "std::istreambuf_iterator<char> eos;" << endl;
  1068. s << TAB << "std::string s(std::istreambuf_iterator<char>(is), eos);" << endl;
  1069. s << TAB << "l.readFromJsonString(s);" << endl;
  1070. s << TAB << "return is;" << endl;
  1071. DEL_TAB;
  1072. s << TAB << "}" << endl;
  1073. }
  1074. vector<string> key = pPtr->getKey();
  1075. //定义<
  1076. if (key.size() > 0)
  1077. {
  1078. s << TAB << "inline bool operator<(const " << pPtr->getId() << "&l, const " << pPtr->getId() << "&r)" << endl;
  1079. s << TAB << "{" << endl;
  1080. INC_TAB;
  1081. for (size_t i = 0; i < key.size(); i++)
  1082. {
  1083. s << TAB << "if(l." << key[i] << " != r." << key[i] << ") ";
  1084. for (size_t z = 0; z < member.size(); z++)
  1085. {
  1086. if (key[i] == member[z]->getId() && (member[z]->getTypePtr()->isArray() || member[z]->getTypePtr()->isPointer())) //数组类型、指针类型
  1087. {
  1088. s << "memcmp(l." << key[i] << ",r." << key[i] << ",l." << key[i] << "Len)< 0";
  1089. }
  1090. }
  1091. s << " return (l." << key[i] << " < r." << key[i] << ");" << endl;
  1092. }
  1093. s << TAB << "return false;" << endl;
  1094. DEL_TAB;
  1095. s << TAB << "}" << endl;
  1096. //定义<=
  1097. s << TAB << "inline bool operator<=(const " << pPtr->getId() << "&l, const " << pPtr->getId() << "&r)" << endl;
  1098. s << TAB << "{" << endl;
  1099. INC_TAB;
  1100. s << TAB << "return !(r < l);" << endl;
  1101. DEL_TAB;
  1102. s << TAB << "}" << endl;
  1103. //定义>
  1104. s << TAB << "inline bool operator>(const " << pPtr->getId() << "&l, const " << pPtr->getId() << "&r)" << endl;
  1105. s << TAB << "{" << endl;
  1106. INC_TAB;
  1107. s << TAB << "return r < l;" << endl;
  1108. DEL_TAB;
  1109. s << TAB << "}" << endl;
  1110. //定义>=
  1111. s << TAB << "inline bool operator>=(const " << pPtr->getId() << "&l, const " << pPtr->getId() << "&r)" << endl;
  1112. s << TAB << "{" << endl;
  1113. INC_TAB;
  1114. s << TAB << "return !(l < r);" << endl;
  1115. DEL_TAB;
  1116. s << TAB << "}" << endl;
  1117. }
  1118. return s.str();
  1119. }
  1120. /*******************************ContainerPtr********************************/
  1121. string Tars2Cpp::generateH(const ContainerPtr& pPtr) const
  1122. {
  1123. ostringstream s;
  1124. for (size_t i = 0; i < pPtr->getAllNamespacePtr().size(); i++)
  1125. {
  1126. s << generateH(pPtr->getAllNamespacePtr()[i]) << endl;
  1127. s << endl;
  1128. }
  1129. return s.str();
  1130. }
  1131. /******************************ParamDeclPtr***************************************/
  1132. string Tars2Cpp::generateH(const ParamDeclPtr& pPtr) const
  1133. {
  1134. ostringstream s;
  1135. //输出参数, 或简单类型
  1136. if (pPtr->isOut() || pPtr->getTypeIdPtr()->getTypePtr()->isSimple())
  1137. {
  1138. s << tostr(pPtr->getTypeIdPtr()->getTypePtr());
  1139. }
  1140. else
  1141. {
  1142. //结构, map, vector, string
  1143. s << "const " << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " &";
  1144. }
  1145. if (pPtr->isOut())
  1146. {
  1147. s << " &";
  1148. }
  1149. else
  1150. {
  1151. s << " ";
  1152. }
  1153. s << pPtr->getTypeIdPtr()->getId();
  1154. return s.str();
  1155. }
  1156. string Tars2Cpp::generateOutH(const ParamDeclPtr& pPtr) const
  1157. {
  1158. if (!pPtr->isOut()) return "";
  1159. ostringstream s;
  1160. //输出参数, 或简单类型
  1161. if (pPtr->getTypeIdPtr()->getTypePtr()->isSimple())
  1162. {
  1163. s << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " ";
  1164. }
  1165. else
  1166. {
  1167. //结构, map, vector, string
  1168. s << "const " << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " &";
  1169. }
  1170. s << pPtr->getTypeIdPtr()->getId();
  1171. return s.str();
  1172. }
  1173. string Tars2Cpp::generateParamDecl(const ParamDeclPtr& pPtr) const
  1174. {
  1175. ostringstream s;
  1176. if (pPtr->isOut() || pPtr->getTypeIdPtr()->getTypePtr()->isSimple())
  1177. {
  1178. s << tostr(pPtr->getTypeIdPtr()->getTypePtr());
  1179. if (pPtr->isOut()) s << " &";
  1180. else s << " ";
  1181. }
  1182. else
  1183. {
  1184. //输入参数
  1185. s << "const " << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " &";
  1186. }
  1187. s << pPtr->getTypeIdPtr()->getId();
  1188. return s.str();
  1189. }
  1190. string Tars2Cpp::generateDispatchAsync(const OperationPtr& pPtr, const string& cn) const
  1191. {
  1192. ostringstream s;
  1193. s << TAB << "if (msg->response->iRet != tars::TARSSERVERSUCCESS)" << endl
  1194. << TAB << "{" << endl;
  1195. INC_TAB;
  1196. s << TAB << "callback_" << pPtr->getId() << "_exception(msg->response->iRet);" << endl;
  1197. s << endl;
  1198. s << TAB << "return msg->response->iRet;" << endl;
  1199. DEL_TAB;
  1200. s << TAB << "}" << endl;
  1201. s << TAB << _namespace + "::TarsInputStream<" + _namespace + "::BufferReader> _is;" << endl;
  1202. s << endl;
  1203. vector<ParamDeclPtr>& vParamDecl = pPtr->getAllParamDeclPtr();
  1204. s << TAB << "_is.setBuffer(msg->response->sBuffer);" << endl;
  1205. //对输出参数编码
  1206. if (pPtr->getReturnPtr()->getTypePtr())
  1207. {
  1208. s << TAB << tostr(pPtr->getReturnPtr()->getTypePtr()) << " " << pPtr->getReturnPtr()->getId() << generateInitValue(pPtr->getReturnPtr()) << ";" << endl;
  1209. s << readFrom(pPtr->getReturnPtr()) << endl;
  1210. }
  1211. for (size_t i = 0; i < vParamDecl.size(); i++)
  1212. {
  1213. if (vParamDecl[i]->isOut())
  1214. {
  1215. s << TAB << tostr(vParamDecl[i]->getTypeIdPtr()->getTypePtr()) << " "
  1216. << vParamDecl[i]->getTypeIdPtr()->getId() << generateInitValue(vParamDecl[i]->getTypeIdPtr()) << ";" << endl;
  1217. s << readFrom(vParamDecl[i]->getTypeIdPtr());
  1218. }
  1219. }
  1220. //处理线程私有数据
  1221. s << TAB << "CallbackThreadData * pCbtd = CallbackThreadData::getData();" << endl;
  1222. s << TAB << "assert(pCbtd != NULL);" << endl;
  1223. s << endl;
  1224. s << TAB << "pCbtd->setResponseContext(msg->response->context);" << endl;
  1225. s << endl;
  1226. //异步回调都无返回值
  1227. s << TAB << "callback_" << pPtr->getId() << "(";
  1228. string sParams;
  1229. if (pPtr->getReturnPtr()->getTypePtr())
  1230. {
  1231. sParams = pPtr->getReturnPtr()->getId() + ", ";
  1232. }
  1233. for (size_t i = 0; i < vParamDecl.size(); i++)
  1234. {
  1235. if (vParamDecl[i]->isOut())
  1236. {
  1237. sParams += vParamDecl[i]->getTypeIdPtr()->getId() + ", ";
  1238. }
  1239. }
  1240. s << tars::TC_Common::trimright(sParams, ", ", false) << ");" << endl;
  1241. s << endl;
  1242. s << TAB << "pCbtd->delResponseContext();" << endl;
  1243. s << endl;
  1244. s << TAB << "return tars::TARSSERVERSUCCESS;" << endl;
  1245. return s.str();
  1246. }
  1247. ///////////////////////////////////////////////////////////////////////////////////////////////
  1248. string Tars2Cpp::generateDispatchCoroAsync(const OperationPtr& pPtr, const string& cn) const
  1249. {
  1250. ostringstream s;
  1251. s << TAB << "if (msg->response->iRet != tars::TARSSERVERSUCCESS)" << endl
  1252. << TAB << "{" << endl;
  1253. INC_TAB;
  1254. s << TAB << "callback_" << pPtr->getId() << "_exception(msg->response->iRet);" << endl;
  1255. s << endl;
  1256. s << TAB << "return msg->response->iRet;" << endl;
  1257. DEL_TAB;
  1258. s << TAB << "}" << endl;
  1259. s << TAB << _namespace + "::TarsInputStream<" + _namespace + "::BufferReader> _is;" << endl;
  1260. s << endl;
  1261. vector<ParamDeclPtr>& vParamDecl = pPtr->getAllParamDeclPtr();
  1262. s << TAB << "_is.setBuffer(msg->response->sBuffer);" << endl;
  1263. if(pPtr->getReturnPtr()->getTypePtr() || vParamDecl.size() >0)
  1264. {
  1265. s << TAB << "try" << endl;
  1266. s << TAB << "{" << endl;
  1267. INC_TAB;
  1268. }
  1269. //对输出参数编码
  1270. if (pPtr->getReturnPtr()->getTypePtr())
  1271. {
  1272. s << TAB << tostr(pPtr->getReturnPtr()->getTypePtr()) << " " << pPtr->getReturnPtr()->getId() << generateInitValue(pPtr->getReturnPtr()) << ";" << endl;
  1273. s << readFrom(pPtr->getReturnPtr()) << endl;
  1274. }
  1275. for (size_t i = 0; i < vParamDecl.size(); i++)
  1276. {
  1277. if (vParamDecl[i]->isOut())
  1278. {
  1279. s << TAB << tostr(vParamDecl[i]->getTypeIdPtr()->getTypePtr()) << " "
  1280. << vParamDecl[i]->getTypeIdPtr()->getId() << generateInitValue(vParamDecl[i]->getTypeIdPtr()) << ";" << endl;
  1281. s << readFrom(vParamDecl[i]->getTypeIdPtr());
  1282. }
  1283. }
  1284. s << TAB << "setResponseContext(msg->response->context);" << endl;
  1285. s << endl;
  1286. //异步回调都无返回值
  1287. s << TAB << "callback_" << pPtr->getId() << "(";
  1288. string sParams;
  1289. if (pPtr->getReturnPtr()->getTypePtr())
  1290. {
  1291. sParams = pPtr->getReturnPtr()->getId() + ", ";
  1292. }
  1293. for (size_t i = 0; i < vParamDecl.size(); i++)
  1294. {
  1295. if (vParamDecl[i]->isOut())
  1296. {
  1297. sParams += vParamDecl[i]->getTypeIdPtr()->getId() + ", ";
  1298. }
  1299. }
  1300. s << tars::TC_Common::trimright(sParams, ", ", false) << ");" << endl;
  1301. s << endl;
  1302. if(pPtr->getReturnPtr()->getTypePtr() || vParamDecl.size() >0)
  1303. {
  1304. DEL_TAB;
  1305. s << TAB << "}" << endl;
  1306. s << TAB << "catch(std::exception &ex)" << endl;
  1307. s << TAB << "{" << endl;
  1308. INC_TAB;
  1309. s << TAB << "callback_" << pPtr->getId() << "_exception(tars::TARSCLIENTDECODEERR);" << endl;
  1310. s << endl;
  1311. s << TAB << "return tars::TARSCLIENTDECODEERR;" << endl;
  1312. DEL_TAB;
  1313. s << TAB << "}" << endl;
  1314. s << TAB << "catch(...)" << endl;
  1315. s << TAB << "{" << endl;
  1316. INC_TAB;
  1317. s << TAB << "callback_" << pPtr->getId() << "_exception(tars::TARSCLIENTDECODEERR);" << endl;
  1318. s << endl;
  1319. s << TAB << "return tars::TARSCLIENTDECODEERR;" << endl;
  1320. DEL_TAB;
  1321. s << TAB << "}" << endl;
  1322. s << endl;
  1323. }
  1324. s << TAB << "return tars::TARSSERVERSUCCESS;" << endl;
  1325. return s.str();
  1326. }
  1327. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  1328. string Tars2Cpp::generateHAsync(const OperationPtr& pPtr) const
  1329. {
  1330. ostringstream s;
  1331. vector<ParamDeclPtr>& vParamDecl = pPtr->getAllParamDeclPtr();
  1332. s << TAB << "virtual void " << "callback_" << pPtr->getId() << "(";
  1333. string sParams;
  1334. if (pPtr->getReturnPtr()->getTypePtr())
  1335. {
  1336. if (pPtr->getReturnPtr()->getTypePtr()->isSimple())
  1337. {
  1338. sParams = tostr(pPtr->getReturnPtr()->getTypePtr()) + " ret, ";
  1339. }
  1340. else
  1341. {
  1342. //结构, map, vector, string
  1343. sParams = "const " + tostr(pPtr->getReturnPtr()->getTypePtr()) + "& ret, ";
  1344. }
  1345. }
  1346. for (size_t i = 0; i < vParamDecl.size(); i++)
  1347. {
  1348. ParamDeclPtr& pPtr = vParamDecl[i];
  1349. if (pPtr->isOut())
  1350. {
  1351. //输出参数, 或简单类型
  1352. if (pPtr->getTypeIdPtr()->getTypePtr()->isSimple())
  1353. {
  1354. sParams += tostr(pPtr->getTypeIdPtr()->getTypePtr());
  1355. }
  1356. else
  1357. {
  1358. //结构, map, vector, string
  1359. sParams += " const " + tostr(pPtr->getTypeIdPtr()->getTypePtr()) + "&";
  1360. }
  1361. sParams += " " + pPtr->getTypeIdPtr()->getId() + ", ";
  1362. }
  1363. }
  1364. s << tars::TC_Common::trimright(sParams, ", ", false) << ")" << endl;
  1365. s << TAB << "{ throw std::runtime_error(\"callback_" << pPtr->getId() << "() override incorrect.\"); }" << endl;
  1366. s << TAB << "virtual void " << "callback_" << pPtr->getId() << "_exception(" + _namespace + "::Int32 ret)" << endl;
  1367. s << TAB << "{ throw std::runtime_error(\"callback_" << pPtr->getId() << "_exception() override incorrect.\"); }";
  1368. s << endl;
  1369. return s.str();
  1370. }
  1371. string Tars2Cpp::generateInitValue(const TypeIdPtr& pPtr) const
  1372. {
  1373. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  1374. string init = "";
  1375. if (bPtr && Builtin::KindBool == bPtr->kind())
  1376. {
  1377. init = " = false";
  1378. }
  1379. //枚举强制类型转换在O2编译选项情况下会告警
  1380. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr->getTypePtr());
  1381. if (ePtr)
  1382. {
  1383. if (pPtr->hasDefault())
  1384. {
  1385. string sid = ePtr->getSid();
  1386. init = " = " + pPtr->def() + ";";
  1387. }
  1388. else
  1389. {
  1390. vector<TypeIdPtr>& eMember = ePtr->getAllMemberPtr();
  1391. if (eMember.size() > 0)
  1392. {
  1393. string sid = ePtr->getSid();
  1394. init = " = " + sid.substr(0, sid.find_first_of("::")) + "::" + eMember[0]->getId() + ";";
  1395. }
  1396. }
  1397. }
  1398. return init;
  1399. }
  1400. //////////////////////////////////////////////////////////////////////////////////////////////////////
  1401. string Tars2Cpp::generateServantDispatch(const OperationPtr& pPtr, const string& cn) const
  1402. {
  1403. ostringstream s;
  1404. s << TAB << _namespace + "::TarsInputStream<" + _namespace + "::BufferReader> _is;" << endl;
  1405. s << TAB << "_is.setBuffer(_current->getRequestBuffer());" << endl;
  1406. vector<ParamDeclPtr>& vParamDecl = pPtr->getAllParamDeclPtr();
  1407. string routekey;
  1408. for(size_t i = 0; i < vParamDecl.size(); i++)
  1409. {
  1410. s << TAB << tostr(vParamDecl[i]->getTypeIdPtr()->getTypePtr()) << " "<< vParamDecl[i]->getTypeIdPtr()->getId()
  1411. << generateInitValue(vParamDecl[i]->getTypeIdPtr()) << ";" << endl;
  1412. if (routekey.empty() && vParamDecl[i]->isRouteKey())
  1413. {
  1414. routekey = vParamDecl[i]->getTypeIdPtr()->getId();
  1415. }
  1416. }
  1417. s << TAB << "if (_current->getRequestVersion() == TUPVERSION)" << endl;
  1418. s << TAB << "{" << endl;
  1419. INC_TAB;
  1420. s << TAB << "UniAttribute<" + _namespace + "::BufferWriterVector, " + _namespace + "::BufferReader> tarsAttr;" << endl;
  1421. s << TAB << "tarsAttr.setVersion(_current->getRequestVersion());" << endl;
  1422. s << TAB << "tarsAttr.decode(_current->getRequestBuffer());" << endl;
  1423. for(size_t i = 0; i < vParamDecl.size(); i++)
  1424. {
  1425. string sParamName = vParamDecl[i]->getTypeIdPtr()->getId();
  1426. string sEnum2Int = (EnumPtr::dynamicCast(vParamDecl[i]->getTypeIdPtr()->getTypePtr())) ? "(" + _namespace + "::Int32)" : "";
  1427. if (!vParamDecl[i]->isOut())
  1428. {
  1429. //枚举类型转成int
  1430. if (EnumPtr::dynamicCast(vParamDecl[i]->getTypeIdPtr()->getTypePtr()))
  1431. {
  1432. s << TAB << sParamName << " = (" << tostr(vParamDecl[i]->getTypeIdPtr()->getTypePtr())
  1433. << ") tarsAttr.get<" + _namespace + "::Int32>(\"" << sParamName << "\");" << endl;
  1434. }
  1435. else
  1436. {
  1437. s << TAB << "tarsAttr.get(\"" << sParamName << "\", " << sParamName << ");" << endl;
  1438. }
  1439. }
  1440. else
  1441. {
  1442. //枚举类型转成int
  1443. if (EnumPtr::dynamicCast(vParamDecl[i]->getTypeIdPtr()->getTypePtr()))
  1444. {
  1445. s << TAB << sParamName << " = (" << tostr(vParamDecl[i]->getTypeIdPtr()->getTypePtr())
  1446. << ") tarsAttr.getByDefault<" + _namespace + "::Int32>(\"" << sParamName << "\", " << sEnum2Int << sParamName << ");" << endl;
  1447. }
  1448. else
  1449. {
  1450. s << TAB << "tarsAttr.getByDefault(\"" << sParamName << "\", " << sEnum2Int << sParamName << ", "
  1451. << sEnum2Int << sParamName << ");" << endl;
  1452. }
  1453. }
  1454. }
  1455. DEL_TAB;
  1456. s << TAB << "}" << endl;
  1457. // 支持JSON协议分发
  1458. //if (_bJsonSupport && tars::TC_Common::matchPeriod(pPtr->getId(), _vJsonIntf))
  1459. if (_bJsonSupport)
  1460. {
  1461. s << TAB << "else if (_current->getRequestVersion() == JSONVERSION)" << endl;
  1462. s << TAB << "{" << endl;
  1463. INC_TAB;
  1464. s << TAB << _namespace << "::JsonValueObjPtr _jsonPtr = " << _namespace << "::JsonValueObjPtr::dynamicCast(" << _namespace << "::TC_Json::getValue(_current->getRequestBuffer()));" << endl;
  1465. for(size_t i = 0; i < vParamDecl.size(); i++)
  1466. {
  1467. string sParamName = vParamDecl[i]->getTypeIdPtr()->getId();
  1468. string sEnum2Int = (EnumPtr::dynamicCast(vParamDecl[i]->getTypeIdPtr()->getTypePtr())) ? "(" + _namespace + "::Int32)" : "";
  1469. if (!vParamDecl[i]->isOut())
  1470. {
  1471. // tars::JsonInput::readJson(uin, _jsonPtr->value["uin"], true); 枚举类型转成int
  1472. s << TAB << _namespace << "::JsonInput::readJson(" << sParamName << ", _jsonPtr->value[\"" << sParamName << "\"], true);" << endl;
  1473. }
  1474. else
  1475. {
  1476. s << TAB << _namespace << "::JsonInput::readJson(" << sParamName << ", _jsonPtr->value[\"" << sParamName << "\"], false);" << endl;
  1477. }
  1478. }
  1479. DEL_TAB;
  1480. s << TAB << "}" << endl;
  1481. }
  1482. // 支持XML协议分发
  1483. if (_bXmlSupport && tars::TC_Common::matchPeriod(pPtr->getId(), _vXmlIntf))
  1484. {
  1485. s << TAB << "else if (_current->getRequestVersion() == XMLVERSION)" << endl;
  1486. s << TAB << "{" << endl;
  1487. INC_TAB;
  1488. s << TAB << "tars::XmlValueObjPtr _xmlPtr = tars::XmlValueObjPtr::dynamicCast(tars::TC_Xml::getValue(_current->getRequestBuffer()));" << endl;
  1489. for(size_t i = 0; i < vParamDecl.size(); i++)
  1490. {
  1491. string sParamName = vParamDecl[i]->getTypeIdPtr()->getId();
  1492. if(!vParamDecl[i]->isOut())
  1493. {
  1494. //枚举类型转成int
  1495. s << TAB << "tars::XmlInput::readXml(" << sParamName << ", _xmlPtr->value[\"" << sParamName << "\"], true);" << endl;
  1496. }
  1497. else
  1498. {
  1499. s << TAB << "tars::XmlInput::readXml(" << sParamName << ", _xmlPtr->value[\"" << sParamName << "\"], false);" << endl;
  1500. }
  1501. }
  1502. DEL_TAB;
  1503. s << TAB << "}" << endl;
  1504. }
  1505. s << TAB << "else" << endl;
  1506. s << TAB << "{" << endl;
  1507. INC_TAB;
  1508. //普通tars请求
  1509. for (size_t i = 0; i < vParamDecl.size(); i++)
  1510. {
  1511. s << readFrom(vParamDecl[i]->getTypeIdPtr(), (!vParamDecl[i]->isOut()));
  1512. }
  1513. DEL_TAB;
  1514. s << TAB << "}" << endl;
  1515. if(pPtr->getReturnPtr()->getTypePtr())
  1516. {
  1517. s << TAB << tostr(pPtr->getReturnPtr()->getTypePtr()) << " " << pPtr->getReturnPtr()->getId() << " = " << pPtr->getId() << "(";
  1518. }
  1519. else
  1520. {
  1521. s << TAB << pPtr->getId() << "(";
  1522. }
  1523. for(size_t i = 0; i < vParamDecl.size(); i++)
  1524. {
  1525. s << vParamDecl[i]->getTypeIdPtr()->getId();
  1526. if(i != vParamDecl.size() - 1)
  1527. s << ",";
  1528. else
  1529. s << ", _current);" << endl;
  1530. }
  1531. if (vParamDecl.size() == 0)
  1532. {
  1533. s << "_current);" << endl;
  1534. }
  1535. s << TAB << "if(_current->isResponse())" << endl;
  1536. s << TAB << "{" << endl;
  1537. INC_TAB;
  1538. s << TAB << "if (_current->getRequestVersion() == TUPVERSION)" << endl;
  1539. s << TAB << "{" << endl;
  1540. INC_TAB;
  1541. s << TAB << "UniAttribute<" + _namespace + "::BufferWriterVector, " + _namespace + "::BufferReader> tarsAttr;" << endl;
  1542. s << TAB << "tarsAttr.setVersion(_current->getRequestVersion());" << endl;
  1543. if(pPtr->getReturnPtr()->getTypePtr())
  1544. {
  1545. string sEnum2Int = (EnumPtr::dynamicCast(pPtr->getReturnPtr()->getTypePtr())) ? "(" + _namespace + "::Int32)" : "";
  1546. s << TAB << "tarsAttr.put(\"\", " << sEnum2Int << "_ret);" << endl;
  1547. s << TAB << "tarsAttr.put(\"tars_ret\", " << sEnum2Int << "_ret);" << endl;
  1548. }
  1549. for (size_t i = 0; i < vParamDecl.size(); i++)
  1550. {
  1551. string sParamName = vParamDecl[i]->getTypeIdPtr()->getId();
  1552. string sEnum2Int = (EnumPtr::dynamicCast(vParamDecl[i]->getTypeIdPtr()->getTypePtr())) ? "(" + _namespace + "::Int32)" : "";
  1553. if (vParamDecl[i]->isOut())
  1554. {
  1555. s << TAB << "tarsAttr.put(\"" << sParamName << "\", " << sEnum2Int << sParamName << ");" << endl;
  1556. }
  1557. }
  1558. s << TAB << "tarsAttr.encode(_sResponseBuffer);" << endl;
  1559. DEL_TAB;
  1560. s << TAB << "}" << endl;
  1561. // 支持JSON协议分发
  1562. if (_bJsonSupport)
  1563. //if (_bJsonSupport && tars::TC_Common::matchPeriod(pPtr->getId(), _vJsonIntf))
  1564. {
  1565. s << TAB << "else if (_current->getRequestVersion() == JSONVERSION)" << endl;
  1566. s << TAB << "{" << endl;
  1567. INC_TAB;
  1568. s << TAB << _namespace << "::JsonValueObjPtr _p = new " << _namespace << "::JsonValueObj();" << endl;
  1569. for(size_t i = 0; i < vParamDecl.size(); i++)
  1570. {
  1571. string sParamName = vParamDecl[i]->getTypeIdPtr()->getId();
  1572. if (vParamDecl[i]->isOut())
  1573. {
  1574. s << TAB << "_p->value[\"" << sParamName << "\"] = "<< _namespace << "::JsonOutput::writeJson(" << sParamName << ");" << endl;
  1575. }
  1576. }
  1577. if (pPtr->getReturnPtr()->getTypePtr())
  1578. {
  1579. s << TAB << "_p->value[\"tars_ret\"] = "<< _namespace << "::JsonOutput::writeJson(_ret);" << endl;
  1580. // BuiltinPtr retPtr = BuiltinPtr::dynamicCast(pPtr->getReturnPtr()->getTypePtr());
  1581. // if (retPtr->kind() >= Builtin::KindBool && retPtr->kind() <= Builtin::KindLong)
  1582. // {
  1583. // s << TAB << "_p->value[\"tars_ret\"] = "<< _namespace << "::JsonOutput::writeJson(" << pPtr->getReturnPtr()->getId() << ");" << endl;
  1584. // }
  1585. }
  1586. s << TAB << _namespace << "::TC_Json::writeValue(_p, _sResponseBuffer);" << endl;
  1587. DEL_TAB;
  1588. s << TAB << "}" << endl;
  1589. }
  1590. // 支持XML协议分发
  1591. if (_bXmlSupport && tars::TC_Common::matchPeriod(pPtr->getId(), _vXmlIntf))
  1592. {
  1593. s << TAB << "else if (_current->getRequestVersion() == XMLVERSION)" << endl;
  1594. s << TAB << "{" << endl;
  1595. INC_TAB;
  1596. s << TAB << "tars::XmlValueObjPtr _p = new tars::XmlValueObj();" << endl;
  1597. for(size_t i = 0; i < vParamDecl.size(); i++)
  1598. {
  1599. string sParamName = vParamDecl[i]->getTypeIdPtr()->getId();
  1600. if (vParamDecl[i]->isOut())
  1601. {
  1602. s << TAB << "_p->value[\"" << sParamName << "\"] = tars::XmlOutput::writeXml(" << sParamName << ");" << endl;
  1603. }
  1604. }
  1605. if (pPtr->getReturnPtr()->getTypePtr())
  1606. {
  1607. BuiltinPtr retPtr = BuiltinPtr::dynamicCast(pPtr->getReturnPtr()->getTypePtr());
  1608. if (retPtr->kind() >= Builtin::KindBool && retPtr->kind() <= Builtin::KindLong)
  1609. {
  1610. s << TAB << "_p->value[\"ret\"] = tars::XmlOutput::writeXml(" << pPtr->getReturnPtr()->getId() << ");" << endl;
  1611. }
  1612. }
  1613. s << TAB << "tars::TC_Xml::writeValue(_p, _sResponseBuffer);" << endl;
  1614. DEL_TAB;
  1615. s << TAB << "}" << endl;
  1616. }
  1617. s << TAB << "else" << endl;
  1618. //普通tars调用输出参数
  1619. s << TAB << "{" << endl;
  1620. INC_TAB;
  1621. s << TAB << _namespace + "::TarsOutputStream<" + _namespace + "::BufferWriterVector> _os;" << endl;
  1622. if (pPtr->getReturnPtr()->getTypePtr())
  1623. {
  1624. s << writeTo(pPtr->getReturnPtr());
  1625. }
  1626. //解码输出参数
  1627. for (size_t i = 0; i < vParamDecl.size(); i++)
  1628. {
  1629. if (vParamDecl[i]->isOut())
  1630. {
  1631. s << writeTo(vParamDecl[i]->getTypeIdPtr());
  1632. }
  1633. }
  1634. s << TAB << "_os.swap(_sResponseBuffer);" << endl;
  1635. DEL_TAB;
  1636. s << TAB << "}" << endl;
  1637. DEL_TAB;
  1638. s << TAB << "}" << endl;
  1639. s << TAB << "return tars::TARSSERVERSUCCESS;" << endl;
  1640. return s.str();
  1641. }
  1642. /*
  1643. string Tars2Cpp::promiseReadFrom(const TypeIdPtr &pPtr, bool bIsRequire) const
  1644. {
  1645. ostringstream s;
  1646. if(EnumPtr::dynamicCast(pPtr->getTypePtr()))
  1647. {
  1648. //枚举强制类型转换在O2编译选项情况下会告警
  1649. string tmp = _namespace + "::Int32 eTemp" + TC_Common::tostr(pPtr->getTag()) + generateInitValue(pPtr);
  1650. s << TAB << tmp <<endl;
  1651. s << TAB << "_is.read(eTemp"<<TC_Common::tostr(pPtr->getTag());
  1652. }
  1653. else if(pPtr->getTypePtr()->isArray())
  1654. {
  1655. s << TAB << "_is.read(ptr->"<< pPtr->getId()<<", "<<getSuffix(pPtr)<<", "<< pPtr->getId() << "Len";
  1656. }
  1657. else if(pPtr->getTypePtr()->isPointer())
  1658. {
  1659. s << TAB << pPtr->getId() <<" = ("<<tostr(pPtr->getTypePtr())<<")_is.cur();"<<endl;
  1660. s << TAB << "_is.read(ptr->"<< pPtr->getId()<<", _is.left(), "<< pPtr->getId() << "Len";
  1661. }
  1662. else
  1663. {
  1664. s << TAB << "_is.read(ptr->"<< pPtr->getId();
  1665. }
  1666. s << ", " << pPtr->getTag() << ", " << ((pPtr->isRequire() && bIsRequire)?"true":"false") << ");" << endl;
  1667. if(EnumPtr::dynamicCast(pPtr->getTypePtr()))
  1668. {
  1669. s << TAB << "ptr->" << pPtr->getId() << " = (" <<tostr(pPtr->getTypePtr()) <<")eTemp"<<TC_Common::tostr(pPtr->getTag())<<";"<<endl;
  1670. }
  1671. if(pPtr->getTypePtr()->isPointer())
  1672. s << TAB <<"_is.mapBufferSkip("<<pPtr->getId() << "Len);"<<endl;
  1673. return s.str();
  1674. }
  1675. bool Tars2Cpp::isPromiseDispatchInitValue(const TypeIdPtr &pPtr) const
  1676. {
  1677. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  1678. string init = "";
  1679. if(bPtr && Builtin::KindBool == bPtr->kind())
  1680. {
  1681. return true;
  1682. }
  1683. //枚举强制类型转换在O2编译选项情况下会告警
  1684. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr->getTypePtr());
  1685. if(ePtr)
  1686. {
  1687. if(pPtr->hasDefault())
  1688. {
  1689. return true;
  1690. }
  1691. else
  1692. {
  1693. vector<TypeIdPtr>& eMember = ePtr->getAllMemberPtr();
  1694. if(eMember.size() > 0)
  1695. {
  1696. return true;
  1697. }
  1698. }
  1699. }
  1700. return false;
  1701. }
  1702. */
  1703. string Tars2Cpp::generateHAsync(const OperationPtr& pPtr, const string& cn) const
  1704. {
  1705. ostringstream s;
  1706. //生成函数声明
  1707. s << TAB << "void async_" << pPtr->getId() << "(";
  1708. s << cn << "PrxCallbackPtr callback,";
  1709. vector<ParamDeclPtr>& vParamDecl = pPtr->getAllParamDeclPtr();
  1710. string routekey = "";
  1711. for (size_t i = 0; i < vParamDecl.size(); i++)
  1712. {
  1713. if (!vParamDecl[i]->isOut() )
  1714. {
  1715. s << generateParamDecl(vParamDecl[i]) << ",";
  1716. }
  1717. if (routekey.empty() && vParamDecl[i]->isRouteKey())
  1718. {
  1719. routekey = vParamDecl[i]->getTypeIdPtr()->getId();
  1720. }
  1721. }
  1722. s << "const map<string, string>& context = TARS_CONTEXT())";
  1723. s << endl;
  1724. s << TAB << "{" << endl;
  1725. INC_TAB;
  1726. if (_tarsMaster)
  1727. {
  1728. s << TAB << "this->tars_setMasterFlag(true);" << endl;
  1729. }
  1730. s << TAB << _namespace + "::TarsOutputStream<" + _namespace + "::BufferWriterVector> _os;" << endl;
  1731. for (size_t i = 0; i < vParamDecl.size(); i++)
  1732. {
  1733. if (vParamDecl[i]->isOut())
  1734. {
  1735. continue;
  1736. }
  1737. s << writeTo(vParamDecl[i]->getTypeIdPtr());
  1738. }
  1739. s << TAB << "std::map<string, string> _mStatus;" << endl;
  1740. if (!routekey.empty())
  1741. {
  1742. ostringstream os;
  1743. os << routekey;
  1744. s << TAB << "_mStatus.insert(std::make_pair(ServantProxy::STATUS_GRID_KEY, " << os.str() << "));" << endl;
  1745. }
  1746. s << TAB << "tars_invoke_async(tars::TARSNORMAL,\"" << pPtr->getId() << "\", _os, context, _mStatus, callback);" << endl;
  1747. DEL_TAB;
  1748. s << TAB << "}" << endl;
  1749. s << TAB << endl;
  1750. /*
  1751. //promise异步的函数声明
  1752. string sStruct = pPtr->getId();
  1753. s << TAB << "tars::Future< " << cn <<"PrxCallbackPromise::Promise" << sStruct << "Ptr > promise_async_" << pPtr->getId() << "(";
  1754. for(size_t i = 0; i < vParamDecl.size(); i++)
  1755. {
  1756. if (!vParamDecl[i]->isOut())
  1757. {
  1758. s << generateParamDecl(vParamDecl[i]) << ",";
  1759. }
  1760. }
  1761. s << "const map<string, string>& context)" << endl;
  1762. s << TAB << "{" << endl;
  1763. INC_TAB;
  1764. if (_tarsMaster)
  1765. {
  1766. s << TAB << "this->tars_setMasterFlag(true);" << endl;
  1767. }
  1768. s << TAB << "tars::Promise< " << cn <<"PrxCallbackPromise::Promise" << sStruct << "Ptr > promise;" << endl;
  1769. s << TAB << cn << "PrxCallbackPromisePtr callback = new " << cn << "PrxCallbackPromise(promise);" << endl;
  1770. s << endl;
  1771. s << TAB << _namespace + "::TarsOutputStream<" + _namespace + "::BufferWriterVector> _os;" << endl;
  1772. for(size_t i = 0; i < vParamDecl.size(); i++)
  1773. {
  1774. if(vParamDecl[i]->isOut())
  1775. {
  1776. continue;
  1777. }
  1778. s << writeTo(vParamDecl[i]->getTypeIdPtr());
  1779. }
  1780. s << TAB << "std::map<string, string> _mStatus;" << endl;
  1781. if (!routekey.empty())
  1782. {
  1783. ostringstream os;
  1784. os << routekey;
  1785. s << TAB << "_mStatus.insert(std::make_pair(ServantProxy::STATUS_GRID_KEY, " << os.str() << "));" << endl;
  1786. }
  1787. s << TAB << "tars_invoke_async(tars::TARSNORMAL,\"" << pPtr->getId() << "\", _os, context, _mStatus, callback);" << endl;
  1788. s << endl;
  1789. s << TAB << "return promise.getFuture();" << endl;
  1790. DEL_TAB;
  1791. s << TAB << "}" << endl;
  1792. s << endl;
  1793. */
  1794. //协程并行异步的函数声明
  1795. s << TAB << "void coro_" << pPtr->getId() << "(";
  1796. s << cn << "CoroPrxCallbackPtr callback,";
  1797. for (size_t i = 0; i < vParamDecl.size(); i++)
  1798. {
  1799. if (!vParamDecl[i]->isOut())
  1800. {
  1801. s << generateParamDecl(vParamDecl[i]) << ",";
  1802. }
  1803. }
  1804. s << "const map<string, string>& context = TARS_CONTEXT())";
  1805. s << endl;
  1806. s << TAB << "{" << endl;
  1807. INC_TAB;
  1808. if (_tarsMaster)
  1809. {
  1810. s << TAB << "this->tars_setMasterFlag(true);" << endl;
  1811. }
  1812. s << TAB << _namespace + "::TarsOutputStream<" + _namespace + "::BufferWriterVector> _os;" << endl;
  1813. for (size_t i = 0; i < vParamDecl.size(); i++)
  1814. {
  1815. if (vParamDecl[i]->isOut())
  1816. {
  1817. continue;
  1818. }
  1819. s << writeTo(vParamDecl[i]->getTypeIdPtr());
  1820. }
  1821. s << TAB << "std::map<string, string> _mStatus;" << endl;
  1822. if (!routekey.empty())
  1823. {
  1824. ostringstream os;
  1825. os << routekey;
  1826. s << TAB << "_mStatus.insert(std::make_pair(ServantProxy::STATUS_GRID_KEY, " << os.str() << "));" << endl;
  1827. }
  1828. s << TAB << "tars_invoke_async(tars::TARSNORMAL,\"" << pPtr->getId() << "\", _os, context, _mStatus, callback, true);" << endl;
  1829. DEL_TAB;
  1830. s << TAB << "}" << endl;
  1831. return s.str();
  1832. }
  1833. /////////////////////////////////////////////////////////////////////////////////////////////////
  1834. string Tars2Cpp::generateH(const OperationPtr& pPtr, bool bVirtual, const string& interfaceId) const
  1835. {
  1836. ostringstream s;
  1837. vector<ParamDeclPtr>& vParamDecl = pPtr->getAllParamDeclPtr();
  1838. s << TAB;
  1839. if (bVirtual) s << "virtual ";
  1840. s << tostr(pPtr->getReturnPtr()->getTypePtr()) << " " << pPtr->getId() << "(";
  1841. string routekey = "";
  1842. for (size_t i = 0; i < vParamDecl.size(); i++)
  1843. {
  1844. s << generateH(vParamDecl[i]) << ",";
  1845. if (routekey.empty() && vParamDecl[i]->isRouteKey())
  1846. {
  1847. routekey = vParamDecl[i]->getTypeIdPtr()->getId();
  1848. }
  1849. }
  1850. if (bVirtual)
  1851. {
  1852. s << "tars::TarsCurrentPtr current) = 0;";
  1853. }
  1854. else
  1855. {
  1856. s << "const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)";
  1857. s << endl;
  1858. s << TAB << "{" << endl;
  1859. INC_TAB;
  1860. if (_tarsMaster)
  1861. {
  1862. s << TAB << "this->tars_setMasterFlag(true);" << endl;
  1863. }
  1864. s << TAB << _namespace + "::TarsOutputStream<" + _namespace + "::BufferWriterVector> _os;" << endl;
  1865. for (size_t i = 0; i < vParamDecl.size(); i++)
  1866. {
  1867. //if(vParamDecl[i]->isOut()) continue;
  1868. s << writeTo(vParamDecl[i]->getTypeIdPtr());
  1869. }
  1870. // s << TAB << "" + _namespace + "::ResponsePacket rep;" << endl;
  1871. s << TAB << "std::map<string, string> _mStatus;" << endl;
  1872. if (!routekey.empty())
  1873. {
  1874. ostringstream os;
  1875. os << routekey;
  1876. s << TAB << "_mStatus.insert(std::make_pair(ServantProxy::STATUS_GRID_KEY, " << os.str() << "));" << endl;
  1877. }
  1878. // s << TAB << "tars_invoke(tars::TARSNORMAL,\"" << pPtr->getId() << "\", _os.getByteBuffer(), context, _mStatus, rep);" << endl;
  1879. s << TAB << "shared_ptr<" + _namespace + "::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,\"" << pPtr->getId() << "\", _os, context, _mStatus);" << endl;
  1880. s << TAB << "if(pResponseContext)" << endl;
  1881. s << TAB << "{" << endl;
  1882. INC_TAB;
  1883. s << TAB << "pResponseContext->swap(rep->context);" << endl;
  1884. // s << TAB << "*pResponseContext = rep.context;" << endl;
  1885. DEL_TAB;
  1886. s << TAB << "}" << endl;
  1887. s << endl;
  1888. if (vParamDecl.size() > 0 || pPtr->getReturnPtr()->getTypePtr())
  1889. {
  1890. s << TAB << _namespace + "::TarsInputStream<" + _namespace + "::BufferReader> _is;" << endl;
  1891. s << TAB << "_is.setBuffer(rep->sBuffer);" << endl;
  1892. if (pPtr->getReturnPtr()->getTypePtr())
  1893. {
  1894. s << TAB << tostr(pPtr->getReturnPtr()->getTypePtr()) << " " << pPtr->getReturnPtr()->getId() << generateInitValue(pPtr->getReturnPtr()) << ";" << endl;
  1895. s << readFrom(pPtr->getReturnPtr());
  1896. }
  1897. for (size_t i = 0; i < vParamDecl.size(); i++)
  1898. {
  1899. if (vParamDecl[i]->isOut())
  1900. {
  1901. s << readFrom(vParamDecl[i]->getTypeIdPtr());
  1902. }
  1903. }
  1904. if (pPtr->getReturnPtr()->getTypePtr())
  1905. {
  1906. s << TAB << "return " << pPtr->getReturnPtr()->getId() << ";" << endl;
  1907. }
  1908. }
  1909. DEL_TAB;
  1910. s << TAB << "}" << endl;
  1911. }
  1912. s << endl;
  1913. if (bVirtual)
  1914. {
  1915. //异步回调
  1916. s << TAB << "static void async_response_" << pPtr->getId() << "(tars::TarsCurrentPtr current";
  1917. if (pPtr->getReturnPtr()->getTypePtr())
  1918. {
  1919. s << ", ";
  1920. if (pPtr->getReturnPtr()->getTypePtr()->isSimple())
  1921. {
  1922. s << tostr(pPtr->getReturnPtr()->getTypePtr()) << " ";
  1923. }
  1924. else
  1925. {
  1926. //结构, map, vector, string
  1927. s << "const " << tostr(pPtr->getReturnPtr()->getTypePtr()) << " &";
  1928. }
  1929. s << pPtr->getReturnPtr()->getId();
  1930. }
  1931. for (size_t i = 0; i < vParamDecl.size(); i++)
  1932. {
  1933. if(!vParamDecl[i]->isOut())
  1934. continue;
  1935. s << ", ";
  1936. s << generateOutH(vParamDecl[i]);
  1937. }
  1938. s << ")" << endl;
  1939. s << TAB << "{" << endl;
  1940. INC_TAB;
  1941. s << TAB << "if (current->getRequestVersion() == TUPVERSION )" << endl;
  1942. s << TAB << "{" << endl;
  1943. INC_TAB;
  1944. s << TAB << "UniAttribute<" + _namespace + "::BufferWriterVector, " + _namespace + "::BufferReader> tarsAttr;" << endl;
  1945. s << TAB << "tarsAttr.setVersion(current->getRequestVersion());" << endl;
  1946. if(pPtr->getReturnPtr()->getTypePtr())
  1947. {
  1948. string sEnum2Int = (EnumPtr::dynamicCast(pPtr->getReturnPtr()->getTypePtr())) ? "(" + _namespace + "::Int32)" : "";
  1949. s << TAB << "tarsAttr.put(\"\", " << sEnum2Int << "_ret);" << endl;
  1950. s << TAB << "tarsAttr.put(\"tars_ret\", " << sEnum2Int << "_ret);" << endl;
  1951. }
  1952. for(size_t i = 0; i < vParamDecl.size(); i++)
  1953. {
  1954. string sParamName = vParamDecl[i]->getTypeIdPtr()->getId();
  1955. string sEnum2Int = (EnumPtr::dynamicCast(vParamDecl[i]->getTypeIdPtr()->getTypePtr())) ? "(" + _namespace + "::Int32)" : "";
  1956. if(vParamDecl[i]->isOut())
  1957. {
  1958. s << TAB << "tarsAttr.put(\"" << sParamName << "\", " << sEnum2Int << sParamName << ");" << endl;
  1959. }
  1960. }
  1961. s << endl;
  1962. s << TAB << "vector<char> sTupResponseBuffer;" << endl;
  1963. s << TAB << "tarsAttr.encode(sTupResponseBuffer);"<< endl;
  1964. s << TAB << "current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);" << endl;
  1965. DEL_TAB;
  1966. s << TAB << "}" << endl;
  1967. if (_bJsonSupport)
  1968. {
  1969. s << TAB << "else if (current->getRequestVersion() == JSONVERSION)" << endl;
  1970. s << TAB << "{" << endl;
  1971. INC_TAB;
  1972. s << TAB << _namespace << "::JsonValueObjPtr _p = new " << _namespace << "::JsonValueObj();" << endl;
  1973. for (size_t i = 0; i < vParamDecl.size(); i++)
  1974. {
  1975. string sParamName = vParamDecl[i]->getTypeIdPtr()->getId();
  1976. if (vParamDecl[i]->isOut())
  1977. {
  1978. s << TAB << "_p->value[\"" << sParamName << "\"] = " << _namespace << "::JsonOutput::writeJson(" << sParamName << ");" << endl;
  1979. }
  1980. }
  1981. if (pPtr->getReturnPtr()->getTypePtr())
  1982. {
  1983. s << TAB << "_p->value[\"tars_ret\"] = " << _namespace << "::JsonOutput::writeJson(_ret);" << endl;
  1984. // BuiltinPtr retPtr = BuiltinPtr::dynamicCast(pPtr->getReturnPtr()->getTypePtr());
  1985. // if (retPtr && retPtr->kind() >= Builtin::KindBool && retPtr->kind() <= Builtin::KindLong)
  1986. // {
  1987. // s << TAB << "_p->value[\"tars_ret\"] = " << _namespace << "::JsonOutput::writeJson(" << pPtr->getReturnPtr()->getId() << ");" << endl;
  1988. // //s << TAB << "_p->value[\"\"] = " << _namespace << "::JsonOutput::writeJson(" << pPtr->getReturnPtr()->getId() << ");" << endl;
  1989. // }
  1990. }
  1991. s << TAB << "vector<char> sJsonResponseBuffer;" << endl;
  1992. s << TAB << _namespace << "::TC_Json::writeValue(_p, sJsonResponseBuffer);" << endl;
  1993. s << TAB << "current->sendResponse(tars::TARSSERVERSUCCESS, sJsonResponseBuffer);" << endl;
  1994. DEL_TAB;
  1995. s << TAB << "}" << endl;
  1996. }
  1997. s << TAB << "else" << endl;
  1998. s << TAB << "{" << endl;
  1999. INC_TAB;
  2000. s << TAB << _namespace + "::TarsOutputStream<" + _namespace + "::BufferWriterVector> _os;" << endl;
  2001. if(pPtr->getReturnPtr()->getTypePtr())
  2002. {
  2003. s << writeTo(pPtr->getReturnPtr()) << endl;
  2004. }
  2005. for(size_t i = 0; i < vParamDecl.size(); i++)
  2006. {
  2007. if(!vParamDecl[i]->isOut())
  2008. continue;
  2009. s << writeTo(vParamDecl[i]->getTypeIdPtr()) << endl;
  2010. }
  2011. //s << TAB << "current->sendResponse(tars::TARSSERVERSUCCESS, string(_os.getBuffer(), _os.getLength()));" << endl;
  2012. s << TAB << "current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());" << endl;
  2013. DEL_TAB;
  2014. s << TAB << "}" << endl;
  2015. DEL_TAB;
  2016. s << TAB << "}" << endl;
  2017. }
  2018. return s.str();
  2019. }
  2020. /**
  2021. * 对接口名排序
  2022. */
  2023. struct SortOperation {
  2024. bool operator ()(const OperationPtr& o1, const OperationPtr& o2)
  2025. {
  2026. return o1->getId() < o2->getId();
  2027. }
  2028. };
  2029. /*
  2030. string Tars2Cpp::generateHPromiseAsync(const InterfacePtr &pInter, const OperationPtr &pPtr) const
  2031. {
  2032. ostringstream s;
  2033. string sStruct = pPtr->getId();
  2034. vector<ParamDeclPtr>& vParamDecl = pPtr->getAllParamDeclPtr();
  2035. ////////
  2036. DEL_TAB;
  2037. s << TAB << "public:" << endl;
  2038. INC_TAB;
  2039. s << TAB << "struct Promise" << sStruct << ": virtual public TC_HandleBase" << endl;
  2040. s << TAB << "{" << endl;
  2041. s << TAB << "public:" << endl;
  2042. INC_TAB;
  2043. if (pPtr->getReturnPtr()->getTypePtr())
  2044. {
  2045. s << TAB << tostr(pPtr->getReturnPtr()->getTypePtr()) << " _ret;" << endl;
  2046. }
  2047. for(size_t i = 0; i < vParamDecl.size(); i++)
  2048. {
  2049. ParamDeclPtr& pPtr = vParamDecl[i];
  2050. if (pPtr->isOut())
  2051. {
  2052. s << TAB << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " " << pPtr->getTypeIdPtr()->getId() << ";" << endl;
  2053. }
  2054. }
  2055. s << TAB << "map<std::string, std::string> _mRspContext;" << endl;
  2056. DEL_TAB;
  2057. s << TAB << "};" << endl;
  2058. s << TAB << endl;
  2059. s << TAB << "typedef tars::TC_AutoPtr< " << pInter->getId() << "PrxCallbackPromise::Promise" << sStruct << " > Promise" << sStruct << "Ptr;" << endl;
  2060. s << endl;
  2061. s << TAB << pInter->getId() << "PrxCallbackPromise(const tars::Promise< " << pInter->getId() << "PrxCallbackPromise::Promise" << sStruct << "Ptr > &promise)" << endl;
  2062. s << TAB << ": _promise_" << sStruct << "(promise)" << endl;
  2063. s << TAB << "{}" << endl;
  2064. s << TAB << endl;
  2065. s << TAB << "virtual void " << "callback_" << pPtr->getId() << "(const " << pInter->getId() << "PrxCallbackPromise::Promise" << sStruct << "Ptr &ptr)" << endl;
  2066. s << TAB << "{" << endl;
  2067. INC_TAB;
  2068. s << TAB << "_promise_" << sStruct << ".setValue(ptr);" << endl;
  2069. DEL_TAB;
  2070. s << TAB << "}" << endl;
  2071. s << TAB << "virtual void " << "callback_" << pPtr->getId() << "_exception(" + _namespace + "::Int32 ret)" << endl;
  2072. s << TAB << "{" << endl;
  2073. INC_TAB;
  2074. s << TAB << "std::string str(\"\");" << endl;
  2075. s << TAB << "str += \"Function:" << pPtr->getId() << "_exception|Ret:\";" << endl;
  2076. s << TAB << "str += TC_Common::tostr(ret);" << endl;
  2077. s << TAB << "_promise_" << sStruct << ".setException(tars::copyException(str, ret));" << endl;
  2078. DEL_TAB;
  2079. s << TAB << "}" << endl;
  2080. s << endl;
  2081. DEL_TAB;
  2082. s << TAB << "protected:" << endl;
  2083. INC_TAB;
  2084. s << TAB << "tars::Promise< " << pInter->getId() << "PrxCallbackPromise::Promise" << sStruct << "Ptr > _promise_" << sStruct << ";" << endl;
  2085. return s.str();
  2086. }
  2087. string Tars2Cpp::generateDispatchPromiseAsync(const OperationPtr &pPtr, const string &cn) const
  2088. {
  2089. ostringstream s;
  2090. s << TAB << "if (msg->response->iRet != tars::TARSSERVERSUCCESS)" << endl
  2091. << TAB << "{" << endl;
  2092. INC_TAB;
  2093. s << TAB << "callback_" << pPtr->getId() << "_exception(msg->response->iRet);" << endl;
  2094. s << endl;
  2095. s << TAB << "return msg->response->iRet;" << endl;
  2096. DEL_TAB;
  2097. s << TAB << "}" << endl;
  2098. s << TAB << _namespace + "::TarsInputStream<" + _namespace + "::BufferReader> _is;" << endl;
  2099. s << endl;
  2100. vector<ParamDeclPtr>& vParamDecl = pPtr->getAllParamDeclPtr();
  2101. s << TAB << "_is.setBuffer(msg->response->sBuffer);" << endl;
  2102. s << endl;
  2103. string sStruct = pPtr->getId();
  2104. s << TAB << cn << "PrxCallbackPromise::Promise" << sStruct << "Ptr ptr = new "<< cn << "PrxCallbackPromise::Promise" << sStruct << "();" << endl;
  2105. s << endl;
  2106. if(pPtr->getReturnPtr()->getTypePtr() || vParamDecl.size() >0)
  2107. {
  2108. s << TAB << "try" << endl;
  2109. s << TAB << "{" << endl;
  2110. INC_TAB;
  2111. }
  2112. //对输出参数编码
  2113. if(pPtr->getReturnPtr()->getTypePtr())
  2114. {
  2115. if(isPromiseDispatchInitValue(pPtr->getReturnPtr()))
  2116. s << TAB << "ptr->_ret " << generateInitValue(pPtr->getReturnPtr())<< ";"<< endl;
  2117. s << promiseReadFrom(pPtr->getReturnPtr()) << endl;
  2118. }
  2119. for(size_t i = 0; i < vParamDecl.size(); i++)
  2120. {
  2121. if(vParamDecl[i]->isOut())
  2122. {
  2123. if(isPromiseDispatchInitValue(vParamDecl[i]->getTypeIdPtr()))
  2124. s << TAB << "ptr->" << vParamDecl[i]->getTypeIdPtr()->getId() << generateInitValue(vParamDecl[i]->getTypeIdPtr())<< ";" << endl;
  2125. s << promiseReadFrom(vParamDecl[i]->getTypeIdPtr());
  2126. }
  2127. }
  2128. if(pPtr->getReturnPtr()->getTypePtr() || vParamDecl.size() >0)
  2129. {
  2130. DEL_TAB;
  2131. s << TAB << "}" << endl;
  2132. s << TAB << "catch(std::exception &ex)" << endl;
  2133. s << TAB << "{" << endl;
  2134. INC_TAB;
  2135. s << TAB << "callback_" << pPtr->getId() << "_exception(tars::TARSCLIENTDECODEERR);" << endl;
  2136. s << endl;
  2137. s << TAB << "return tars::TARSCLIENTDECODEERR;" << endl;
  2138. DEL_TAB;
  2139. s << TAB << "}" << endl;
  2140. s << TAB << "catch(...)" << endl;
  2141. s << TAB << "{" << endl;
  2142. INC_TAB;
  2143. s << TAB << "callback_" << pPtr->getId() << "_exception(tars::TARSCLIENTDECODEERR);" << endl;
  2144. s << endl;
  2145. s << TAB << "return tars::TARSCLIENTDECODEERR;" << endl;
  2146. DEL_TAB;
  2147. s << TAB << "}" << endl;
  2148. s << endl;
  2149. }
  2150. s << TAB << "ptr->_mRspContext = msg->response->context;" << endl;
  2151. s << endl;
  2152. s << TAB << "callback_" << pPtr->getId() << "(ptr);" << endl;
  2153. s << endl;
  2154. s << TAB << "return tars::TARSSERVERSUCCESS;" << endl;
  2155. return s.str();
  2156. }
  2157. */
  2158. /******************************InterfacePtr***************************************/
  2159. string Tars2Cpp::generateH(const InterfacePtr &pPtr, const NamespacePtr &nPtr) const
  2160. {
  2161. ostringstream s;
  2162. vector<OperationPtr>& vOperation = pPtr->getAllOperationPtr();
  2163. std::sort(vOperation.begin(), vOperation.end(), SortOperation());
  2164. //生成异步回调Proxy
  2165. s << TAB << "/* callback of async proxy for client */" << endl;
  2166. s << TAB << "class " << pPtr->getId() << "PrxCallback: public tars::ServantProxyCallback" << endl;
  2167. s << TAB << "{" << endl;
  2168. s << TAB << "public:" << endl;
  2169. INC_TAB;
  2170. s << TAB << "virtual ~" << pPtr->getId() << "PrxCallback(){}" << endl;
  2171. for (size_t i = 0; i < vOperation.size(); i++)
  2172. {
  2173. s << generateHAsync(vOperation[i]) << endl;
  2174. }
  2175. DEL_TAB;
  2176. s << TAB << "public:" << endl;
  2177. INC_TAB;
  2178. s << TAB << "virtual const map<std::string, std::string> & getResponseContext() const" << endl;
  2179. s << TAB << "{" << endl;
  2180. INC_TAB;
  2181. s << TAB << "CallbackThreadData * pCbtd = CallbackThreadData::getData();" << endl;
  2182. s << TAB << "assert(pCbtd != NULL);" << endl;
  2183. s << endl;
  2184. s << TAB << "if(!pCbtd->getContextValid())" << endl;
  2185. s << TAB << "{" << endl;
  2186. INC_TAB;
  2187. s << TAB << "throw TC_Exception(\"cann't get response context\");" << endl;
  2188. DEL_TAB;
  2189. s << TAB << "}" << endl;
  2190. s << TAB << "return pCbtd->getResponseContext();" << endl;
  2191. DEL_TAB;
  2192. s << TAB << "}" << endl;
  2193. s << endl;
  2194. DEL_TAB;
  2195. s << TAB << "public:" << endl;
  2196. INC_TAB;
  2197. s << TAB << "virtual int onDispatch(tars::ReqMessagePtr msg)" << endl;
  2198. //生成异步回调接口
  2199. s << TAB << "{" << endl;
  2200. INC_TAB;
  2201. string dname = "__" + pPtr->getId() + "_all";
  2202. string dispatch = "static ::std::string " + dname;
  2203. s << TAB << dispatch << "[]=" << endl;
  2204. s << TAB << "{" << endl;
  2205. INC_TAB;
  2206. for (size_t i = 0; i < vOperation.size(); i++)
  2207. {
  2208. s << TAB << "\"" << vOperation[i]->getId() << "\"";
  2209. if (i != vOperation.size() - 1)
  2210. {
  2211. s << ",";
  2212. }
  2213. s << endl;
  2214. }
  2215. DEL_TAB;
  2216. s << TAB << "};" << endl;
  2217. s << TAB << "pair<string*, string*> r = equal_range(" << dname << ", " << dname << "+" << vOperation.size() << ", string(msg->request.sFuncName));" << endl;
  2218. s << TAB << "if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;" << endl;
  2219. s << TAB << "switch(r.first - " << dname << ")" << endl;
  2220. s << TAB << "{" << endl;
  2221. INC_TAB;
  2222. for (size_t i = 0; i < vOperation.size(); i++)
  2223. {
  2224. s << TAB << "case " << i << ":" << endl;
  2225. s << TAB << "{" << endl;
  2226. INC_TAB;
  2227. s << generateDispatchAsync(vOperation[i], pPtr->getId()) << endl;
  2228. DEL_TAB;
  2229. s << TAB << "}" << endl;
  2230. }
  2231. DEL_TAB;
  2232. s << TAB << "}" << endl;
  2233. s << TAB << "return tars::TARSSERVERNOFUNCERR;" << endl;
  2234. DEL_TAB;
  2235. s << TAB << "}" << endl;
  2236. s << endl;
  2237. DEL_TAB;
  2238. s << TAB << "};" << endl;
  2239. s << TAB << "typedef tars::TC_AutoPtr<" << pPtr->getId() << "PrxCallback> " << pPtr->getId() << "PrxCallbackPtr;" << endl;
  2240. s << endl;
  2241. /*
  2242. //生成promise异步回调Proxy
  2243. s << TAB << "//callback of promise async proxy for client" << endl;
  2244. s << TAB << "class " << pPtr->getId() << "PrxCallbackPromise: public tars::ServantProxyCallback" << endl;
  2245. s << TAB << "{" << endl;
  2246. s << TAB << "public:" << endl;
  2247. INC_TAB;
  2248. s << TAB << "virtual ~" << pPtr->getId() << "PrxCallbackPromise(){}" << endl;
  2249. for(size_t i = 0; i < vOperation.size(); i++)
  2250. {
  2251. s << generateHPromiseAsync(pPtr, vOperation[i]) << endl;
  2252. }
  2253. DEL_TAB;
  2254. s << TAB << "public:" << endl;
  2255. INC_TAB;
  2256. s << TAB << "virtual int onDispatch(tars::ReqMessagePtr msg)" << endl;
  2257. s << TAB << "{" << endl;
  2258. INC_TAB;
  2259. dname = "__" + pPtr->getId() + "_all";
  2260. dispatch = "static ::std::string " + dname;
  2261. s << TAB << dispatch << "[]=" << endl;
  2262. s << TAB << "{" << endl;
  2263. INC_TAB;
  2264. for (size_t i = 0; i < vOperation.size(); i++)
  2265. {
  2266. s << TAB << "\"" << vOperation[i]->getId() << "\"";
  2267. if (i != vOperation.size() - 1)
  2268. {
  2269. s << ",";
  2270. }
  2271. s << endl;
  2272. }
  2273. DEL_TAB;
  2274. s << TAB << "};" << endl;
  2275. s << endl;
  2276. s << TAB << "pair<string*, string*> r = equal_range(" << dname << ", " << dname << "+" << vOperation.size() << ", string(msg->request.sFuncName));" << endl;
  2277. s << TAB << "if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;" << endl;
  2278. s << TAB << "switch(r.first - " << dname << ")" << endl;
  2279. s << TAB << "{" << endl;
  2280. INC_TAB;
  2281. for(size_t i = 0; i < vOperation.size(); i++)
  2282. {
  2283. s << TAB << "case " << i << ":" << endl;
  2284. s << TAB << "{" << endl;
  2285. INC_TAB;
  2286. s << generateDispatchPromiseAsync(vOperation[i], pPtr->getId()) << endl;
  2287. DEL_TAB;
  2288. s << TAB << "}" << endl;
  2289. }
  2290. DEL_TAB;
  2291. s << TAB << "}" << endl;
  2292. s << TAB << "return tars::TARSSERVERNOFUNCERR;" << endl;
  2293. DEL_TAB;
  2294. s << TAB << "}" << endl;
  2295. s << endl;
  2296. DEL_TAB;
  2297. s << TAB << "};" << endl;
  2298. s << TAB << "typedef tars::TC_AutoPtr<" << pPtr->getId() << "PrxCallbackPromise> " << pPtr->getId() << "PrxCallbackPromisePtr;" << endl;
  2299. s << endl;
  2300. */
  2301. //生成协程异步回调类,用于并发请求
  2302. s << TAB << "/* callback of coroutine async proxy for client */" << endl;
  2303. s << TAB << "class " << pPtr->getId() << "CoroPrxCallback: public " << pPtr->getId() << "PrxCallback" << endl;
  2304. s << TAB << "{" << endl;
  2305. s << TAB << "public:" << endl;
  2306. INC_TAB;
  2307. s << TAB << "virtual ~" << pPtr->getId() << "CoroPrxCallback(){}" << endl;
  2308. DEL_TAB;
  2309. s << TAB << "public:" << endl;
  2310. INC_TAB;
  2311. s << TAB << "virtual const map<std::string, std::string> & getResponseContext() const { return _mRspContext; }" << endl;
  2312. s << endl;
  2313. s << TAB << "virtual void setResponseContext(const map<std::string, std::string> &mContext) { _mRspContext = mContext; }" << endl;
  2314. s << endl;
  2315. DEL_TAB;
  2316. s << TAB << "public:" << endl;
  2317. INC_TAB;
  2318. //生成协程异步回调接口
  2319. s << TAB << "int onDispatch(tars::ReqMessagePtr msg)" << endl;
  2320. s << TAB << "{" << endl;
  2321. INC_TAB;
  2322. dname = "__" + pPtr->getId() + "_all";
  2323. dispatch = "static ::std::string " + dname;
  2324. s << TAB << dispatch << "[]=" << endl;
  2325. s << TAB << "{" << endl;
  2326. INC_TAB;
  2327. for (size_t i = 0; i < vOperation.size(); i++)
  2328. {
  2329. s << TAB << "\"" << vOperation[i]->getId() << "\"";
  2330. if (i != vOperation.size() - 1)
  2331. {
  2332. s << ",";
  2333. }
  2334. s << endl;
  2335. }
  2336. DEL_TAB;
  2337. s << TAB << "};" << endl;
  2338. s << endl;
  2339. s << TAB << "pair<string*, string*> r = equal_range(" << dname << ", " << dname << "+" << vOperation.size() << ", string(msg->request.sFuncName));" << endl;
  2340. s << TAB << "if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;" << endl;
  2341. s << TAB << "switch(r.first - " << dname << ")" << endl;
  2342. s << TAB << "{" << endl;
  2343. INC_TAB;
  2344. for (size_t i = 0; i < vOperation.size(); i++)
  2345. {
  2346. s << TAB << "case " << i << ":" << endl;
  2347. s << TAB << "{" << endl;
  2348. INC_TAB;
  2349. s << generateDispatchCoroAsync(vOperation[i], pPtr->getId()) << endl;
  2350. DEL_TAB;
  2351. s << TAB << "}" << endl;
  2352. }
  2353. DEL_TAB;
  2354. s << TAB << "}" << endl;
  2355. s << TAB << "return tars::TARSSERVERNOFUNCERR;" << endl;
  2356. DEL_TAB;
  2357. s << TAB << "}" << endl;
  2358. s << endl;
  2359. ////////////////////////////////////////////////////////////////////
  2360. DEL_TAB;
  2361. s << TAB << "protected:" << endl;
  2362. INC_TAB;
  2363. s << TAB << "map<std::string, std::string> _mRspContext;" << endl;
  2364. //s << TAB << "tars::ParallelSharedBasePtr _pPtr;" << endl;
  2365. DEL_TAB;
  2366. s << TAB << "};" << endl;
  2367. s << TAB << "typedef tars::TC_AutoPtr<" << pPtr->getId() << "CoroPrxCallback> " << pPtr->getId() << "CoroPrxCallbackPtr;" << endl;
  2368. s << endl;
  2369. //生成客户端代理
  2370. s << TAB << "/* proxy for client */" << endl;
  2371. s << TAB << "class " << pPtr->getId() << "Proxy : public tars::ServantProxy" << endl;
  2372. s << TAB << "{" << endl;
  2373. s << TAB << "public:" << endl;
  2374. INC_TAB;
  2375. s << TAB << "typedef map<string, string> TARS_CONTEXT;" << endl;
  2376. for (size_t i = 0; i < vOperation.size(); i++)
  2377. {
  2378. s << generateH(vOperation[i], false, pPtr->getId()); // << endl;
  2379. s << generateHAsync(vOperation[i], pPtr->getId()) << endl;
  2380. }
  2381. s << TAB << pPtr->getId() << "Proxy* tars_hash(int64_t key)" << endl;
  2382. s << TAB << "{" << endl;
  2383. INC_TAB;
  2384. s << TAB << "return (" << pPtr->getId() + "Proxy*)ServantProxy::tars_hash(key);" << endl;
  2385. DEL_TAB;
  2386. s << TAB << "}" << endl;
  2387. s << endl;
  2388. s << TAB << pPtr->getId() << "Proxy* tars_consistent_hash(int64_t key)" << endl;
  2389. s << TAB << "{" << endl;
  2390. INC_TAB;
  2391. s << TAB << "return (" << pPtr->getId() + "Proxy*)ServantProxy::tars_consistent_hash(key);" << endl;
  2392. DEL_TAB;
  2393. s << TAB << "}" << endl;
  2394. s << endl;
  2395. s << TAB << pPtr->getId() << "Proxy* tars_set_timeout(int msecond)" << endl;
  2396. s << TAB << "{" << endl;
  2397. INC_TAB;
  2398. s << TAB << "return (" << pPtr->getId() + "Proxy*)ServantProxy::tars_set_timeout(msecond);" << endl;
  2399. DEL_TAB;
  2400. s << TAB << "}" << endl;
  2401. s << endl;
  2402. s << TAB << "static const char* tars_prxname() { return \"" << pPtr->getId() << "Proxy\"; }" << endl;
  2403. DEL_TAB;
  2404. s << TAB << "};" << endl;
  2405. s << TAB << "typedef tars::TC_AutoPtr<" << pPtr->getId() << "Proxy> " << pPtr->getId() << "Prx;" << endl;
  2406. s << endl;
  2407. //生成服务端Servant
  2408. s << TAB << "/* servant for server */" << endl;
  2409. s << TAB << "class " << pPtr->getId() << " : public tars::Servant" << endl;
  2410. s << TAB << "{" << endl;
  2411. s << TAB << "public:" << endl;
  2412. INC_TAB;
  2413. s << TAB << "virtual ~" << pPtr->getId() << "(){}" << endl;
  2414. for (size_t i = 0; i < vOperation.size(); i++)
  2415. {
  2416. s << generateH(vOperation[i], true, pPtr->getId()) << endl;
  2417. }
  2418. DEL_TAB;
  2419. s << TAB << "public:" << endl;
  2420. INC_TAB;
  2421. s << TAB << "int onDispatch(tars::TarsCurrentPtr _current, vector<char> &_sResponseBuffer)" << endl;
  2422. s << TAB << "{" << endl;
  2423. INC_TAB;
  2424. dname = "__" + nPtr->getId() + "__" + pPtr->getId() + "_all";
  2425. dispatch = "static ::std::string " + dname;
  2426. s << TAB << dispatch << "[]=" << endl;
  2427. s << TAB << "{" << endl;
  2428. INC_TAB;
  2429. for (size_t i = 0; i < vOperation.size(); i++)
  2430. {
  2431. s << TAB << "\"" << vOperation[i]->getId() << "\"";
  2432. if (i != vOperation.size() - 1)
  2433. {
  2434. s << ",";
  2435. }
  2436. s << endl;
  2437. }
  2438. DEL_TAB;
  2439. s << TAB << "};" << endl;
  2440. s << endl;
  2441. s << TAB << "pair<string*, string*> r = equal_range(" << dname << ", " << dname << "+" << vOperation.size() << ", _current->getFuncName());" << endl;
  2442. s << TAB << "if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;" << endl;
  2443. s << TAB << "switch(r.first - " << dname << ")" << endl;
  2444. s << TAB << "{" << endl;
  2445. INC_TAB;
  2446. for (size_t i = 0; i < vOperation.size(); i++)
  2447. {
  2448. s << TAB << "case " << i << ":" << endl;
  2449. s << TAB << "{" << endl;
  2450. INC_TAB;
  2451. s << generateServantDispatch(vOperation[i], pPtr->getId()) << endl;
  2452. DEL_TAB;
  2453. s << TAB << "}" << endl;
  2454. }
  2455. DEL_TAB;
  2456. s << TAB << "}" << endl;
  2457. s << TAB << "return tars::TARSSERVERNOFUNCERR;" << endl;
  2458. DEL_TAB;
  2459. s << TAB << "}" << endl;
  2460. DEL_TAB;
  2461. s << TAB << "};" << endl;
  2462. return s.str();
  2463. }
  2464. //struct SortOperation
  2465. //{
  2466. // bool operator()(const OperationPtr &o1, const OperationPtr &o2)
  2467. // {
  2468. // return o1->getId() < o2->getId();
  2469. // }
  2470. //};
  2471. /******************************EnumPtr***************************************/
  2472. string Tars2Cpp::generateH(const EnumPtr& pPtr) const
  2473. {
  2474. ostringstream s;
  2475. s << TAB << "enum " << pPtr->getId() << endl;
  2476. s << TAB << "{" << endl;
  2477. INC_TAB;
  2478. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  2479. for (size_t i = 0; i < member.size(); i++)
  2480. {
  2481. s << TAB << member[i]->getId();
  2482. if (member[i]->hasDefault())
  2483. {
  2484. s << " = " << member[i]->def();
  2485. }
  2486. s << "," << endl;
  2487. }
  2488. DEL_TAB;
  2489. s << TAB << "};" << endl;
  2490. //生成枚举转字符串函数
  2491. s << TAB << "inline string etos" << "(const " << pPtr->getId() << " & e)" << endl;
  2492. s << TAB << "{" << endl;
  2493. INC_TAB;
  2494. s << TAB << "switch(e)" << endl;
  2495. s << TAB << "{" << endl;
  2496. INC_TAB;
  2497. for (size_t i = 0; i < member.size(); i++)
  2498. {
  2499. s << TAB << "case " << member[i]->getId() << ": return "
  2500. << "\"" << member[i]->getId() << "\";" << endl;
  2501. }
  2502. s << TAB << "default: return \"\";" << endl;
  2503. DEL_TAB;
  2504. s << TAB << "}" << endl;
  2505. //s << TAB << "return \"\";" << endl;
  2506. DEL_TAB;
  2507. s << TAB << "}" << endl;
  2508. //生成字符串转枚举函数
  2509. s << TAB << "inline int stoe" << "(const string & s, " << pPtr->getId() << " & e)" << endl;
  2510. s << TAB << "{" << endl;
  2511. INC_TAB;
  2512. for (size_t i = 0; i < member.size(); i++)
  2513. {
  2514. s << TAB << "if(s == \"" << member[i]->getId() << "\") { e=" << member[i]->getId() << "; return 0;}" << endl;
  2515. }
  2516. s << endl;
  2517. s << TAB << "return -1;" << endl;
  2518. DEL_TAB;
  2519. s << TAB << "}" << endl;
  2520. return s.str();
  2521. }
  2522. /******************************ConstPtr***************************************/
  2523. string Tars2Cpp::generateH(const ConstPtr& pPtr) const
  2524. {
  2525. ostringstream s;
  2526. if (pPtr->getConstGrammarPtr()->t == ConstGrammar::STRING)
  2527. {
  2528. string tmp = tars::TC_Common::replace(pPtr->getConstGrammarPtr()->v, "\"", "\\\"");
  2529. s << TAB << "const " << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " " << pPtr->getTypeIdPtr()->getId() << " = \"" << tmp << "\";" << endl;
  2530. }
  2531. else
  2532. {
  2533. s << TAB << "const " << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " " << pPtr->getTypeIdPtr()->getId() << " = " << pPtr->getConstGrammarPtr()->v
  2534. << ((tostr(pPtr->getTypeIdPtr()->getTypePtr()) == _namespace + "::Int64") ? "LL;" : ";") << endl;
  2535. }
  2536. return s.str();
  2537. }
  2538. /******************************NamespacePtr***************************************/
  2539. string Tars2Cpp::generateH(const NamespacePtr& pPtr) const
  2540. {
  2541. ostringstream s;
  2542. vector<InterfacePtr>& is = pPtr->getAllInterfacePtr();
  2543. vector<StructPtr>& ss = pPtr->getAllStructPtr();
  2544. vector<EnumPtr>& es = pPtr->getAllEnumPtr();
  2545. vector<ConstPtr>& cs = pPtr->getAllConstPtr();
  2546. s << endl;
  2547. s << TAB << "namespace " << pPtr->getId() << endl;
  2548. s << TAB << "{" << endl;
  2549. INC_TAB;
  2550. for (size_t i = 0; i < cs.size(); i++)
  2551. {
  2552. s << generateH(cs[i]) << endl;
  2553. }
  2554. for (size_t i = 0; i < es.size(); i++)
  2555. {
  2556. s << generateH(es[i]) << endl;
  2557. }
  2558. for (size_t i = 0; i < ss.size(); i++)
  2559. {
  2560. s << generateH(ss[i], pPtr->getId()) << endl;
  2561. }
  2562. s << endl;
  2563. for (size_t i = 0; i < is.size() && _onlyStruct == false; i++)
  2564. {
  2565. s << generateH(is[i], pPtr) << endl;
  2566. s << endl;
  2567. }
  2568. DEL_TAB;
  2569. s << "}";
  2570. s << endl << endl;
  2571. return s.str();
  2572. }
  2573. void Tars2Cpp::generateH(const ContextPtr &pPtr) const
  2574. {
  2575. string n = g_parse->getFileName(pPtr->getFileName());
  2576. string fileH = g_parse->getAbsoluteFileName(_baseDir, g_parse->replaceFileName(n, "h"));
  2577. string fileCpp = g_parse->getAbsoluteFileName(_baseDir, g_parse->replaceFileName(n, "cpp"));
  2578. //
  2579. // string n = tars::TC_File::excludeFileExt(tars::TC_File::extractFileName(pPtr->getFileName()));
  2580. //
  2581. // string fileH = _baseDir + FILE_SEP + n + ".h";
  2582. string define = tars::TC_Common::upper("__" + n + "_h_");
  2583. ostringstream s;
  2584. s << g_parse->printHeaderRemark();
  2585. s << "#ifndef " << define << endl;
  2586. s << "#define " << define << endl;
  2587. s << endl;
  2588. s << "#include <map>" << endl;
  2589. s << "#include <string>" << endl;
  2590. s << "#include <vector>" << endl;
  2591. s << "#include \"tup/Tars.h\"" << endl;
  2592. if (_bJsonSupport) s << "#include \"tup/TarsJson.h\"" << endl;
  2593. if (_bSqlSupport) s << "#include \"util/tc_mysql.h\"" << endl;
  2594. if (_bXmlSupport) s << "#include \"tup/TarsXml.h\"" << endl;
  2595. s << "using namespace std;" << endl;
  2596. vector<string> include = pPtr->getIncludes();
  2597. for (size_t i = 0; i < include.size(); i++)
  2598. {
  2599. s << "#include \"" << g_parse->getHeader() << tars::TC_File::extractFileName(include[i]) << "\"" << endl;
  2600. }
  2601. vector<NamespacePtr> namespaces = pPtr->getNamespaces();
  2602. //名字空间有接口
  2603. for (size_t i = 0; i < namespaces.size() && _onlyStruct == false; i++)
  2604. {
  2605. if (namespaces[i]->hasInterface())
  2606. {
  2607. s << "#include \"servant/ServantProxy.h\"" << endl;
  2608. s << "#include \"servant/Servant.h\"" << endl;
  2609. // s << "#include \"promise/promise.h\"" << endl;
  2610. break;
  2611. }
  2612. }
  2613. s << endl;
  2614. for (size_t i = 0; i < namespaces.size(); i++)
  2615. {
  2616. s << generateH(namespaces[i]) << endl;
  2617. }
  2618. s << endl;
  2619. s << "#endif" << endl;
  2620. tars::TC_File::makeDirRecursive(_baseDir);
  2621. tars::TC_File::save2file(fileH, s.str());
  2622. }
  2623. void Tars2Cpp::createFile(const string& file)//, const vector<string>& vsCoder)
  2624. {
  2625. std::vector<ContextPtr> contexts = g_parse->getContexts();
  2626. for (size_t i = 0; i < contexts.size(); i++)
  2627. {
  2628. if (file == contexts[i]->getFileName())
  2629. {
  2630. // if (vsCoder.size() == 0)
  2631. // {
  2632. generateH(contexts[i]);
  2633. // }
  2634. // else
  2635. // {
  2636. // for (size_t j = 0; j < vsCoder.size(); j++)
  2637. // {
  2638. // generateCoder(contexts[i], vsCoder[j]);
  2639. // }
  2640. // }
  2641. }
  2642. }
  2643. }
  2644. StructPtr Tars2Cpp::findStruct(const ContextPtr& pPtr, const string& id)
  2645. {
  2646. string sid = id;
  2647. //在当前namespace中查找
  2648. vector<NamespacePtr> namespaces = pPtr->getNamespaces();
  2649. for (size_t i = 0; i < namespaces.size(); i++)
  2650. {
  2651. NamespacePtr np = namespaces[i];
  2652. vector<StructPtr> structs = np->getAllStructPtr();
  2653. for (size_t i = 0; i < structs.size(); i++)
  2654. {
  2655. if (structs[i]->getSid() == sid)
  2656. {
  2657. return structs[i];
  2658. }
  2659. }
  2660. }
  2661. return NULL;
  2662. }
  2663. // ////////////////////////////////
  2664. // //for coder generating
  2665. // ////////////////////////////////
  2666. // string Tars2Cpp::generateCoder(const NamespacePtr& pPtr, const string& sInterface) const
  2667. // {
  2668. // ostringstream s;
  2669. // vector<InterfacePtr>& is = pPtr->getAllInterfacePtr();
  2670. // vector<StructPtr>& ss = pPtr->getAllStructPtr();
  2671. // vector<EnumPtr>& es = pPtr->getAllEnumPtr();
  2672. // vector<ConstPtr>& cs = pPtr->getAllConstPtr();
  2673. // s << endl;
  2674. // s << TAB << "namespace " << pPtr->getId() << endl;
  2675. // s << TAB << "{" << endl;
  2676. // INC_TAB;
  2677. // for (size_t i = 0; i < cs.size(); i++)
  2678. // {
  2679. // s << generateH(cs[i]) << endl;
  2680. // }
  2681. // for (size_t i = 0; i < es.size(); i++)
  2682. // {
  2683. // s << generateH(es[i]) << endl;
  2684. // }
  2685. // for (size_t i = 0; i < ss.size(); i++)
  2686. // {
  2687. // s << generateH(ss[i], pPtr->getId()) << endl;
  2688. // }
  2689. // s << endl;
  2690. // for (size_t i = 0; i < is.size(); i++)
  2691. // {
  2692. // if (pPtr->getId() + "::" + is[i]->getId() == sInterface)
  2693. // {
  2694. // s << generateCoder(is[i]) << endl;
  2695. // s << endl;
  2696. // }
  2697. // }
  2698. // DEL_TAB;
  2699. // s << "}";
  2700. // s << endl << endl;
  2701. // return s.str();
  2702. // }
  2703. // string Tars2Cpp::generateCoder(const InterfacePtr& pPtr) const
  2704. // {
  2705. // ostringstream s;
  2706. // vector<OperationPtr>& vOperation = pPtr->getAllOperationPtr();
  2707. // //生成编解码类
  2708. // s << TAB << "// encode and decode for client" << endl;
  2709. // s << TAB << "class " << pPtr->getId() << "Coder" << endl;
  2710. // s << TAB << "{" << endl;
  2711. // s << TAB << "public:" << endl << endl;
  2712. // INC_TAB;
  2713. // s << TAB << "typedef map<string, string> TARS_CONTEXT;" << endl << endl;
  2714. // s << TAB << "enum enumResult" << endl;
  2715. // s << TAB << "{" << endl;
  2716. // INC_TAB;
  2717. // s << TAB << "eTarsServerSuccess = 0," << endl;
  2718. // s << TAB << "eTarsPacketLess = 1," << endl;
  2719. // s << TAB << "eTarsPacketErr = 2," << endl;
  2720. // s << TAB << "eTarsServerDecodeErr = -1," << endl;
  2721. // s << TAB << "eTarsServerEncodeErr = -2," << endl;
  2722. // s << TAB << "eTarsServerNoFuncErr = -3," << endl;
  2723. // s << TAB << "eTarsServerNoServantErr = -4," << endl;
  2724. // s << TAB << "eTarsServerQueueTimeout = -6," << endl;
  2725. // s << TAB << "eTarsAsyncCallTimeout = -7," << endl;
  2726. // s << TAB << "eTarsProxyConnectErr = -8," << endl;
  2727. // s << TAB << "eTarsServerUnknownErr = -99," << endl;
  2728. // DEL_TAB;
  2729. // s << TAB << "};" << endl << endl;
  2730. // for (size_t i = 0; i < vOperation.size(); i++)
  2731. // {
  2732. // s << generateCoder(vOperation[i]) << endl;
  2733. // }
  2734. // DEL_TAB;
  2735. // s << TAB << "protected:" << endl << endl;
  2736. // INC_TAB;
  2737. // s << TAB << "static " + _namespace + "::Int32 fetchPacket(const string & in, string & out)" << endl;
  2738. // s << TAB << "{" << endl;
  2739. // INC_TAB;
  2740. // s << TAB << "if(in.length() < sizeof(" + _namespace + "::Int32)) return eTarsPacketLess;" << endl;
  2741. // s << TAB << "" + _namespace + "::Int32 iHeaderLen;" << endl;
  2742. // s << TAB << "memcpy(&iHeaderLen, in.c_str(), sizeof(" + _namespace + "::Int32));" << endl;
  2743. // s << TAB << "iHeaderLen = ntohl(iHeaderLen);" << endl;
  2744. // s << TAB << "if(iHeaderLen < (" + _namespace + "::Int32)sizeof(" + _namespace + "::Int32) || iHeaderLen > 100000000) return eTarsPacketErr;" << endl;
  2745. // s << TAB << "if((" + _namespace + "::Int32)in.length() < iHeaderLen) return eTarsPacketLess;" << endl;
  2746. // s << TAB << "out = in.substr(sizeof(" + _namespace + "::Int32), iHeaderLen - sizeof(" + _namespace + "::Int32)); " << endl;
  2747. // s << TAB << "return 0;" << endl;
  2748. // DEL_TAB;
  2749. // s << TAB << "}" << endl;
  2750. // s << endl;
  2751. // s << TAB << "static string encodeBasePacket(const string & sServantName, const string & sFuncName, const vector<char> & buffer, "
  2752. // << "const map<string, string>& context = TARS_CONTEXT())" << endl;
  2753. // s << TAB << "{" << endl;
  2754. // INC_TAB;
  2755. // s << TAB << _namespace + "::TarsOutputStream<" + _namespace + "::BufferWriterVector> os;" << endl;
  2756. // s << TAB << "os.write(1, 1);" << endl;
  2757. // s << TAB << "os.write(0, 2);" << endl;
  2758. // s << TAB << "os.write(0, 3);" << endl;
  2759. // s << TAB << "os.write(0, 4);" << endl;
  2760. // s << TAB << "os.write(sServantName, 5);" << endl;
  2761. // s << TAB << "os.write(sFuncName, 6);" << endl;
  2762. // s << TAB << "os.write(buffer, 7);" << endl;
  2763. // s << TAB << "os.write(60, 8);" << endl;
  2764. // s << TAB << "os.write(context, 9);" << endl;
  2765. // s << TAB << "os.write(map<string, string>(), 10);" << endl;
  2766. // s << TAB << _namespace + "::Int32 iHeaderLen;" << endl;
  2767. // s << TAB << "iHeaderLen = htonl(sizeof(" + _namespace + "::Int32) + os.getLength());" << endl;
  2768. // s << TAB << "string s;" << endl;
  2769. // s << TAB << "s.append((const char*)&iHeaderLen, sizeof(" + _namespace + "::Int32));" << endl;
  2770. // s << TAB << "s.append(os.getBuffer(), os.getLength());" << endl;
  2771. // s << TAB << "return s;" << endl;
  2772. // DEL_TAB;
  2773. // s << TAB << "}" << endl;
  2774. // s << endl;
  2775. // s << TAB << "static " + _namespace + "::Int32 decodeBasePacket(const string & in, " + _namespace + "::Int32 & iServerRet, vector<char> & buffer)" << endl;
  2776. // s << TAB << "{" << endl;
  2777. // INC_TAB;
  2778. // s << TAB << _namespace + "::TarsInputStream<" + _namespace + "::BufferReader> is;" << endl;
  2779. // s << TAB << "is.setBuffer(in.c_str(), in.length());" << endl;
  2780. // s << TAB << "is.read(iServerRet, 5, true);" << endl;
  2781. // s << TAB << "is.read(buffer, 6, true);" << endl;
  2782. // s << TAB << "return 0;" << endl;
  2783. // DEL_TAB;
  2784. // s << TAB << "}" << endl;
  2785. // s << endl;
  2786. // DEL_TAB;
  2787. // s << TAB << "};" << endl;
  2788. // return s.str();
  2789. // }
  2790. // string Tars2Cpp::generateCoder(const OperationPtr& pPtr) const
  2791. // {
  2792. // ostringstream s;
  2793. // vector<ParamDeclPtr>& vParamDecl = pPtr->getAllParamDeclPtr();
  2794. // //编码函数
  2795. // s << TAB << "//encode & decode function for '" << pPtr->getId() << "()'" << endl << endl;
  2796. // s << TAB << "static string encode_" << pPtr->getId() << "(const string & sServantName, ";
  2797. // for (size_t i = 0; i < vParamDecl.size(); i++)
  2798. // {
  2799. // if (!vParamDecl[i]->isOut())
  2800. // {
  2801. // s << generateH(vParamDecl[i]) << ",";
  2802. // }
  2803. // }
  2804. // s << endl;
  2805. // s << TAB << " const map<string, string>& context = TARS_CONTEXT())" << endl;
  2806. // s << TAB << "{" << endl;
  2807. // INC_TAB;
  2808. // s << TAB << "try" << endl;
  2809. // s << TAB << "{" << endl;
  2810. // INC_TAB;
  2811. // s << TAB << _namespace + "::TarsOutputStream<" + _namespace + "::BufferWriterVector> _os;" << endl;
  2812. // for (size_t i = 0; i < vParamDecl.size(); i++)
  2813. // {
  2814. // if (vParamDecl[i]->isOut()) continue;
  2815. // s << writeTo(vParamDecl[i]->getTypeIdPtr());
  2816. // }
  2817. // s << TAB << "return encodeBasePacket(sServantName, \"" << pPtr->getId() << "\", _os.getByteBuffer(), context);" << endl;
  2818. // DEL_TAB;
  2819. // s << TAB << "}" << endl;
  2820. // s << TAB << "catch (" + _namespace + "::TarsException & ex)" << endl;
  2821. // s << TAB << "{" << endl;
  2822. // INC_TAB;
  2823. // s << TAB << "return \"\";" << endl;
  2824. // DEL_TAB;
  2825. // s << TAB << "}" << endl;
  2826. // DEL_TAB;
  2827. // s << TAB << "}" << endl;
  2828. // s << endl;
  2829. // //解码函数
  2830. // s << TAB << "static " + _namespace + "::Int32 decode_" << pPtr->getId() << "(const string & in ";
  2831. // if (pPtr->getReturnPtr()->getTypePtr())
  2832. // {
  2833. // s << ", " << tostr(pPtr->getReturnPtr()->getTypePtr()) << " & _ret ";
  2834. // }
  2835. // for (size_t i = 0; i < vParamDecl.size(); i++)
  2836. // {
  2837. // if(!vParamDecl[i]->isOut())
  2838. // continue;
  2839. // s << ", " << generateH(vParamDecl[i]);
  2840. // }
  2841. // s << ")" << endl;
  2842. // s << TAB << "{" << endl;
  2843. // INC_TAB;
  2844. // s << TAB << "try" << endl;
  2845. // s << TAB << "{" << endl;
  2846. // INC_TAB;
  2847. // s << TAB << "string out;" << endl;
  2848. // s << TAB << _namespace + "::Int32 iRet = 0;" << endl;
  2849. // s << TAB << "if((iRet = fetchPacket(in, out)) != 0) return iRet;" << endl;
  2850. // s << TAB << _namespace + "::TarsInputStream<" + _namespace + "::BufferReader> _is;" << endl;
  2851. // s << TAB << _namespace + "::Int32 iServerRet=0;" << endl;
  2852. // s << TAB << "vector<char> buffer;" << endl;
  2853. // s << TAB << "decodeBasePacket(out, iServerRet, buffer);" << endl;
  2854. // s << TAB << "if(iServerRet != 0) return iServerRet;" << endl;
  2855. // s << TAB << "_is.setBuffer(buffer);" << endl;
  2856. // if (pPtr->getReturnPtr()->getTypePtr())
  2857. // {
  2858. // s << readFrom(pPtr->getReturnPtr());
  2859. // }
  2860. // for (size_t i = 0; i < vParamDecl.size(); i++)
  2861. // {
  2862. // if (vParamDecl[i]->isOut())
  2863. // {
  2864. // s << readFrom(vParamDecl[i]->getTypeIdPtr());
  2865. // }
  2866. // }
  2867. // s << TAB << "return 0;" << endl;
  2868. // DEL_TAB;
  2869. // s << TAB << "}" << endl;
  2870. // s << TAB << "catch (" + _namespace + "::TarsException & ex)" << endl;
  2871. // s << TAB << "{" << endl;
  2872. // INC_TAB;
  2873. // s << TAB << "return eTarsPacketErr;" << endl;
  2874. // DEL_TAB;
  2875. // s << TAB << "}" << endl;
  2876. // DEL_TAB;
  2877. // s << TAB << "}" << endl;
  2878. // s << endl;
  2879. // return s.str();
  2880. // }
  2881. // void Tars2Cpp::generateCoder(const ContextPtr& pPtr, const string& sInterface) const
  2882. // {
  2883. // cout << "Interface:" << sInterface << endl;
  2884. // string n = tars::TC_File::excludeFileExt(tars::TC_File::extractFileName(pPtr->getFileName())) + "Coder";
  2885. // string fileH = _baseDir + FILE_SEP + n + ".h";
  2886. // string define = tars::TC_Common::upper("__" + n + "_h_");
  2887. // ostringstream s;
  2888. // s << g_parse->printHeaderRemark();
  2889. // s << "#ifndef " << define << endl;
  2890. // s << "#define " << define << endl;
  2891. // s << endl;
  2892. // s << "#include <map>" << endl;
  2893. // s << "#include <string>" << endl;
  2894. // s << "#include <vector>" << endl;
  2895. // s << "#include \"tup/Tars.h\"" << endl;
  2896. // s << "using namespace std;" << endl;
  2897. // vector<string> include = pPtr->getIncludes();
  2898. // for (size_t i = 0; i < include.size(); i++)
  2899. // {
  2900. // s << "#include \"" << g_parse->getHeader()
  2901. // << tars::TC_Common::replace(tars::TC_File::extractFileName(include[i]), ".h", "Coder.h") << "\"" << endl;
  2902. // }
  2903. // vector<NamespacePtr> namespaces = pPtr->getNamespaces();
  2904. // s << endl;
  2905. // for (size_t i = 0; i < namespaces.size(); i++)
  2906. // {
  2907. // s << generateCoder(namespaces[i], sInterface) << endl;
  2908. // }
  2909. // s << endl;
  2910. // s << "#endif" << endl;
  2911. //