tars2cpp.cpp 122 KB

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