tars2cpp.cpp 107 KB

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