CPPGenerator.cs 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942
  1. using System;
  2. using System.Text;
  3. using System.IO;
  4. using System.Collections.Generic;
  5. namespace spgen
  6. {
  7. public class CPPGenerator : GeneratorBase
  8. {
  9. static string[] CPP_TYPE_NAMES = new string[]
  10. {
  11. "bool",
  12. "short",
  13. "unsigned short",
  14. "char",
  15. "unsigned char",
  16. "int",
  17. "unsigned int",
  18. "__int64",
  19. "unsigned __int64",
  20. "double",
  21. "float",
  22. "CSimpleStringA",
  23. "CSimpleStringW",
  24. "CBlob", // blob
  25. "CAutoArray<bool>",
  26. "CAutoArray<short>",
  27. "CAutoArray<unsigned short>",
  28. "CAutoArray<char>",
  29. "CAutoArray<unsigned char>",
  30. "CAutoArray<int>",
  31. "CAutoArray<unsigned int>",
  32. "CAutoArray<__int64>",
  33. "CAutoArray<unsigned __int64>",
  34. "CAutoArray<double>",
  35. "CAutoArray<float>",
  36. "CAutoArray<CSimpleStringA>",
  37. "CAutoArray<CSimpleStringW>",
  38. "CAutoArray<CBlob>",
  39. };
  40. static string GetCodeType(ParamType type)
  41. {
  42. return CPP_TYPE_NAMES[(int)type];
  43. }
  44. public override void GenerateCode(string dir, Entity entity)
  45. {
  46. dir = Path.Combine(dir, "generate");
  47. if (!Directory.Exists(dir))
  48. Directory.CreateDirectory(dir);
  49. string deffilename = string.Format("{0}_def_g.h", entity.Name);
  50. string deffilepath = Path.Combine(dir, deffilename);
  51. GenerateDef(deffilepath, deffilename, entity);
  52. if (entity.ClassList.Count > 0)
  53. {
  54. string serverfile = string.Format("{0}_server_g.h", entity.Name);
  55. serverfile = Path.Combine(dir, serverfile);
  56. GenerateServer(deffilename, serverfile, entity);
  57. string clientfile = string.Format("{0}_client_g.h", entity.Name);
  58. clientfile = Path.Combine(dir, clientfile);
  59. GenerateClient(deffilename, clientfile, entity);
  60. }
  61. if (entity.MsgList.Count > 0)
  62. {
  63. string msgfile = string.Format("{0}_msg_g.h", entity.Name);
  64. msgfile = Path.Combine(dir, msgfile);
  65. GenerateMsg(msgfile, entity);
  66. }
  67. }
  68. string GetMethodEnumName(Entity entity, EntityClass cls, Method m)
  69. {
  70. return string.Format("{0}_Method_{1}", cls.Name, m.Name);
  71. }
  72. string GetMethodSignatureEnumName(Entity entity, EntityClass cls, Method m)
  73. {
  74. return string.Format("{0}_MethodSignature_{1}", cls.Name, m.Name);
  75. }
  76. void WriteConst(StreamWriter sw, Entity entity)
  77. {
  78. sw.WriteLine("//");
  79. sw.WriteLine("// const goes here");
  80. sw.WriteLine("//");
  81. foreach (ConstItem i in entity.ConstList)
  82. {
  83. WriteLineDefine(sw, entity, i.Name, i.Value.ToString());
  84. }
  85. sw.WriteLine();
  86. }
  87. void WriteLineDefine(StreamWriter sw, Entity entity, string name, string num)
  88. {
  89. string value = "";
  90. if(entity.defineDic.TryGetValue(name, out value))
  91. {
  92. //success ,judge if len > 3, len > 3, replace the new value; len <=3, must the same
  93. if(value.Length > 3)
  94. num = value;
  95. else
  96. {
  97. if (num != value)
  98. {
  99. Console.WriteLine("sequence changed ,failed!! {0}, {1}", name, num);
  100. Environment.Exit(-1);
  101. }
  102. }
  103. }
  104. sw.WriteLine("#define {0} {1}", name, num);
  105. }
  106. void WriteMethodEnum(StreamWriter sw, Entity entity, EntityClass cls)
  107. {
  108. foreach (Method m in cls.MethodList)
  109. {
  110. if (typeof(Subscribe).IsInstanceOfType(m))
  111. {
  112. Subscribe subscribe = m as Subscribe;
  113. WriteLineDefine(sw, entity, string.Format("{0}_Method_{1}", cls.Name, subscribe.Name), subscribe.Id.ToString());
  114. WriteLineDefine(sw, entity, string.Format("{0}_Method_{1}", cls.Name, subscribe.Cancel.Name), subscribe.Cancel.Id.ToString());
  115. WriteLineDefine(sw, entity, string.Format("{0}_Method_{1}", cls.Name, subscribe.Message.Name), subscribe.Message.Id.ToString());
  116. }
  117. else
  118. {
  119. WriteLineDefine(sw, entity, string.Format("{0}_Method_{1}", cls.Name, m.Name), m.Id.ToString());
  120. }
  121. }
  122. sw.WriteLine();
  123. }
  124. void WriteMethodSignatureEnum(StreamWriter sw, Entity entity, EntityClass cls)
  125. {
  126. foreach (Method m in cls.MethodList)
  127. {
  128. if (typeof(Subscribe).IsInstanceOfType(m))
  129. {
  130. Subscribe subscribe = m as Subscribe;
  131. WriteLineDefine(sw, entity, string.Format("{0}_MethodSignature_{1}", cls.Name, subscribe.Name), subscribe.Signature.ToString());
  132. WriteLineDefine(sw, entity, string.Format("{0}_MethodSignature_{1}", cls.Name, subscribe.Cancel.Name), subscribe.Cancel.Signature.ToString());
  133. WriteLineDefine(sw, entity, string.Format("{0}_MethodSignature_{1}", cls.Name, subscribe.Message.Name), subscribe.Message.Signature.ToString());
  134. }
  135. else
  136. {
  137. WriteLineDefine(sw, entity, string.Format("{0}_MethodSignature_{1}", cls.Name, m.Name), m.Signature.ToString());
  138. }
  139. }
  140. sw.WriteLine();
  141. }
  142. void WriteStruct(StreamWriter sw, string name, List<Param> ParamList)
  143. {
  144. sw.WriteLine("struct {0}", name);
  145. sw.WriteLine("{");
  146. foreach (Param i in ParamList)
  147. {
  148. sw.WriteLine("\t{0} {1};", GetCodeType(i.Type), i.Name);
  149. }
  150. sw.WriteLine();
  151. sw.WriteLine("\tvoid Serialize(SpBuffer &Buf)");
  152. sw.WriteLine("\t{");
  153. if (ParamList.Count > 0)
  154. {
  155. sw.Write("\t\tauto & buf = Buf");
  156. foreach (Param i in ParamList)
  157. {
  158. sw.Write(" & {0}", i.Name);
  159. }
  160. sw.WriteLine(";");
  161. }
  162. sw.WriteLine("\t}");
  163. sw.WriteLine("");
  164. sw.WriteLine("};");
  165. }
  166. string GetInfoStructName(Entity entity, EntityClass cls, Method m)
  167. {
  168. return string.Format("{0}_{1}_Info", cls.Name, m.Name);
  169. }
  170. string GetReqStructName(Entity entity, EntityClass cls, Method m)
  171. {
  172. return string.Format("{0}_{1}_Req", cls.Name, m.Name);
  173. }
  174. string GetAnsStructName(Entity entity, EntityClass cls, Method m)
  175. {
  176. return string.Format("{0}_{1}_Ans", cls.Name, m.Name);
  177. }
  178. string GetSubStructName(Entity entity, EntityClass cls, Method m)
  179. {
  180. return string.Format("{0}_{1}_Sub", cls.Name, m.Name);
  181. }
  182. void WriteMethodParam(StreamWriter sw, Entity entity, EntityClass cls)
  183. {
  184. foreach (Method m in cls.MethodList)
  185. {
  186. if (typeof(Oneway).IsInstanceOfType(m))
  187. {
  188. Oneway oneway = m as Oneway;
  189. string iname = GetInfoStructName(entity, cls, m);
  190. WriteStruct(sw, iname, oneway.InfoParamList);
  191. sw.WriteLine();
  192. }
  193. else if (typeof(Twoway).IsInstanceOfType(m))
  194. {
  195. Twoway twoway = m as Twoway;
  196. string reqname = GetReqStructName(entity, cls, m);
  197. WriteStruct(sw, reqname, twoway.ReqParamList);
  198. sw.WriteLine();
  199. string ansname = GetAnsStructName(entity, cls, m);
  200. WriteStruct(sw, ansname, twoway.ResParamList);
  201. sw.WriteLine();
  202. }
  203. else if (typeof(Subscribe).IsInstanceOfType(m))
  204. {
  205. Subscribe subscribe = m as Subscribe;
  206. string subname = GetSubStructName(entity, cls, m);
  207. WriteStruct(sw, subname, subscribe.SubParamList);
  208. sw.WriteLine();
  209. string canname = GetInfoStructName(entity, cls, subscribe.Cancel);
  210. WriteStruct(sw, canname, subscribe.Cancel.InfoParamList);
  211. sw.WriteLine();
  212. string msgname = GetInfoStructName(entity, cls, subscribe.Message);
  213. WriteStruct(sw, msgname, subscribe.Message.InfoParamList);
  214. sw.WriteLine();
  215. }
  216. else
  217. {
  218. throw new Exception("unknown");
  219. }
  220. }
  221. }
  222. void GenerateDef(string file, string file_name, Entity entity)
  223. {
  224. using (StreamWriter sw = new StreamWriter(file, false, Encoding.GetEncoding("gb2312")))
  225. {
  226. string guard_marco = string.Format("__{0}", file_name.Replace('.', '_').ToUpper());
  227. sw.WriteLine("#ifndef " + guard_marco);
  228. sw.WriteLine("#define " + guard_marco);
  229. sw.WriteLine();
  230. sw.WriteLine("#pragma once");
  231. sw.WriteLine();
  232. sw.WriteLine("// This code is generated by spgen tool!");
  233. sw.WriteLine();
  234. sw.WriteLine("#include \"SpHelper.h\"");
  235. sw.WriteLine();
  236. sw.WriteLine("namespace {0} {{", entity.Name);
  237. WriteConst(sw, entity);
  238. foreach (EntityClass cls in entity.ClassList)
  239. {
  240. WriteMethodEnum(sw, entity, cls);
  241. WriteMethodSignatureEnum(sw, entity, cls);
  242. WriteMethodParam(sw, entity, cls);
  243. sw.WriteLine();
  244. sw.WriteLine("///////////////////////////");
  245. sw.WriteLine();
  246. }
  247. sw.WriteLine("}} // namespace {0}", entity.Name);
  248. sw.WriteLine();
  249. sw.WriteLine(string.Format("#endif // {0}", guard_marco));
  250. }
  251. }
  252. void WriteServerConstructor(StreamWriter sw, Entity entity, EntityClass cls)
  253. {
  254. sw.WriteLine("\t{0}()", GetServerClassName(entity, cls));
  255. sw.WriteLine("\t{");
  256. sw.WriteLine("\t\t/// override by user");
  257. sw.WriteLine("\t}");
  258. sw.WriteLine();
  259. }
  260. void WriteServerDestructor(StreamWriter sw, Entity entity, EntityClass cls)
  261. {
  262. sw.WriteLine("\tvirtual ~{0}()", GetServerClassName(entity, cls));
  263. sw.WriteLine("\t{");
  264. sw.WriteLine("\t\t/// override by user");
  265. sw.WriteLine("\t}");
  266. sw.WriteLine();
  267. }
  268. void WriteSeverIsExclusive(StreamWriter sw, Entity entity, EntityClass cls)
  269. {
  270. sw.WriteLine("\tvirtual bool IsExclusive() {{ return {0}; }}", cls.Exclusive.ToString().ToLower());
  271. sw.WriteLine();
  272. }
  273. void WriteServerGetMessageAttr(StreamWriter sw, Entity entity, EntityClass cls)
  274. {
  275. sw.WriteLine("\tvirtual ErrorCodeEnum GetMessageAttr(DWORD dwMessageID, DWORD dwSignature, bool &bOverlap)");
  276. sw.WriteLine("\t{");
  277. sw.WriteLine("\t\tErrorCodeEnum Error = Error_Succeed;");
  278. sw.WriteLine("\t\tswitch (dwMessageID) {");
  279. foreach (Method m in cls.MethodList)
  280. {
  281. sw.WriteLine("\t\tcase {0}:", GetMethodEnumName(entity, cls, m));
  282. sw.WriteLine("\t\t\tif (dwSignature == {0}) {{", GetMethodSignatureEnumName(entity, cls, m));
  283. sw.WriteLine("\t\t\t\tbOverlap = {0};", m.Overlap.ToString().ToLower());
  284. sw.WriteLine("\t\t\t} else {");
  285. sw.WriteLine("\t\t\t\tError = Error_MethodSignatureFailed;");
  286. sw.WriteLine("\t\t\t}");
  287. sw.WriteLine("\t\t\tbreak;");
  288. if (typeof(Subscribe).IsInstanceOfType(m))
  289. {
  290. Subscribe subscribe = m as Subscribe;
  291. sw.WriteLine("\t\tcase {0}:", GetMethodEnumName(entity, cls, subscribe.Cancel));
  292. sw.WriteLine("\t\t\tif (dwSignature == {0}) {{", GetMethodSignatureEnumName(entity, cls, subscribe.Cancel));
  293. sw.WriteLine("\t\t\t\tbOverlap = {0};", subscribe.Cancel.Overlap.ToString().ToLower());
  294. sw.WriteLine("\t\t\t} else {");
  295. sw.WriteLine("\t\t\t\tError = Error_MethodSignatureFailed;");
  296. sw.WriteLine("\t\t\t}");
  297. sw.WriteLine("\t\t\tbreak;");
  298. }
  299. }
  300. sw.WriteLine("\t\tdefault:");
  301. sw.WriteLine("\t\t\tError = Error_MethodNotFound;");
  302. sw.WriteLine("\t\t\tbreak;");
  303. sw.WriteLine("\t\t}");
  304. sw.WriteLine("\t\treturn Error;");
  305. sw.WriteLine("\t}");
  306. sw.WriteLine();
  307. }
  308. void WriteServerCheckMessageSignature(StreamWriter sw, Entity entity, EntityClass cls)
  309. {
  310. sw.WriteLine("\tint CheckMessageSignature(DWORD dwMessageID, DWORD dwSignature)");
  311. sw.WriteLine("\t{");
  312. sw.WriteLine("\t\tErrorCodeEnum Error = Error_Succeed;");
  313. sw.WriteLine("\t\tswitch (dwMessageID) {");
  314. foreach (Method m in cls.MethodList)
  315. {
  316. sw.WriteLine("\t\tcase {0}:", GetMethodEnumName(entity, cls, m));
  317. sw.WriteLine("\t\t\tif (dwSignature != {0}) {{", GetMethodSignatureEnumName(entity, cls, m));
  318. sw.WriteLine("\t\t\t\tError = Error_MethodSignatureFailed;");
  319. sw.WriteLine("\t\t\t}");
  320. sw.WriteLine("\t\t\tbreak;");
  321. // gen cancel method signature check
  322. if (typeof(Subscribe).IsInstanceOfType(m))
  323. {
  324. Subscribe subscribe = m as Subscribe;
  325. sw.WriteLine("\t\tcase {0}:", GetMethodEnumName(entity, cls, subscribe.Cancel));
  326. sw.WriteLine("\t\t\tif (dwSignature != {0}) {{", GetMethodSignatureEnumName(entity, cls, subscribe.Cancel));
  327. sw.WriteLine("\t\t\t\tError = Error_MethodSignatureFailed;");
  328. sw.WriteLine("\t\t\t}");
  329. sw.WriteLine("\t\t\tbreak;");
  330. }
  331. }
  332. sw.WriteLine("\t\tdefault:");
  333. sw.WriteLine("\t\t\tError = Error_MethodNotFound;");
  334. sw.WriteLine("\t\t\tbreak;");
  335. sw.WriteLine("\t\t}");
  336. sw.WriteLine("\t\treturn Error;");
  337. sw.WriteLine("\t}");
  338. sw.WriteLine();
  339. }
  340. void WriteServerIsSessionOverlap(StreamWriter sw, Entity entity, EntityClass cls)
  341. {
  342. sw.WriteLine("\tvirtual bool IsSessionOverlap() {{ return {0}; }}", cls.Overlap.ToString().ToLower());
  343. sw.WriteLine();
  344. }
  345. void WriteServerOnewayHandler(StreamWriter sw, Entity entity, EntityClass cls, Oneway oneway)
  346. {
  347. sw.WriteLine("\tvirtual void Handle_{0}(SpOnewayCallContext<{1}>::Pointer ctx)", oneway.Name, GetInfoStructName(entity, cls, oneway));
  348. sw.WriteLine("\t{");
  349. sw.WriteLine("\t/// override by user");
  350. sw.WriteLine("\t}");
  351. sw.WriteLine("");
  352. }
  353. void WriteServerTwowayHandler(StreamWriter sw, Entity entity, EntityClass cls, Twoway twoway)
  354. {
  355. sw.WriteLine("\tvirtual void Handle_{0}(SpReqAnsContext<{1}, {2}>::Pointer ctx)", twoway.Name, GetReqStructName(entity, cls, twoway), GetAnsStructName(entity, cls, twoway));
  356. sw.WriteLine("\t{");
  357. sw.WriteLine("\t/// override by user");
  358. sw.WriteLine("\t}");
  359. sw.WriteLine("");
  360. }
  361. void WriteServerSubscibeHandler(StreamWriter sw, Entity entity, EntityClass cls, Subscribe subscribe)
  362. {
  363. // subscribe
  364. sw.WriteLine("\tvirtual void Handle_{0}(SpSubscribeContext<{1}, {2}>::Pointer ctx)", subscribe.Name, GetSubStructName(entity, cls, subscribe), GetInfoStructName(entity, cls, subscribe.Message));
  365. sw.WriteLine("\t{");
  366. sw.WriteLine("\t/// override by user");
  367. sw.WriteLine("\t}");
  368. sw.WriteLine("");
  369. // cancel
  370. sw.WriteLine("\tvirtual void Handle_{0}(SpOnewayCallContext<{1}>::Pointer ctx)", subscribe.Cancel.Name, GetInfoStructName(entity, cls, subscribe.Cancel));
  371. sw.WriteLine("\t{");
  372. sw.WriteLine("\t/// override by user");
  373. sw.WriteLine("\t}");
  374. sw.WriteLine("");
  375. }
  376. void WriteServerOnRequest(StreamWriter sw, Entity entity, EntityClass cls)
  377. {
  378. sw.WriteLine("\tvirtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)");
  379. sw.WriteLine("\t{");
  380. sw.WriteLine("\t\tCAutoBuffer Buf;");
  381. sw.WriteLine("\t\tDWORD dwMessageID;");
  382. sw.WriteLine("\t\tDWORD dwMessageSignature;");
  383. sw.WriteLine("\t\tErrorCodeEnum Error = pTransactionContext->GetReceiveBuffer(dwMessageID, dwMessageSignature, Buf);");
  384. sw.WriteLine("\t\tif (Error == Error_Succeed) {");
  385. sw.WriteLine("#ifdef DEBUG");
  386. sw.WriteLine("\t\t\tassert(CheckMessageSignature(dwMessageID, dwMessageSignature) == Error_Succeed);");
  387. sw.WriteLine("#else");
  388. sw.WriteLine("\t\t\tif (CheckMessageSignature(dwMessageID, dwMessageSignature) != Error_Succeed) {");
  389. sw.WriteLine("\t\t\t\tpTransactionContext->SendAnswer(Error_MethodSignatureFailed);");
  390. sw.WriteLine("\t\t\t\treturn;");
  391. sw.WriteLine("\t\t\t}");
  392. sw.WriteLine("#endif");
  393. sw.WriteLine("\t\t\tswitch (dwMessageID) {");
  394. foreach (Method m in cls.MethodList)
  395. {
  396. if (typeof(Oneway).IsInstanceOfType(m))
  397. {
  398. Oneway oneway = m as Oneway;
  399. sw.WriteLine("\t\t\t\tcase {0}:", GetMethodEnumName(entity, cls, m));
  400. sw.WriteLine("\t\t\t\t\t{");
  401. sw.WriteLine("\t\t\t\t\t\tSpOnewayCallContext<{0}>::Pointer ctx;", GetInfoStructName(entity, cls, m));
  402. sw.WriteLine("\t\t\t\t\t\tctx.Attach(new SpOnewayCallContext<{0}>());", GetInfoStructName(entity, cls, m));
  403. sw.WriteLine("\t\t\t\t\t\tSpBuffer2Object(Buf, ctx->Info);");
  404. sw.WriteLine("\t\t\t\t\t\tHandle_{0}(ctx);", m.Name);
  405. sw.WriteLine("\t\t\t\t\t}");
  406. sw.WriteLine("\t\t\t\t\tbreak;");
  407. }
  408. else if (typeof(Twoway).IsInstanceOfType(m))
  409. {
  410. Twoway twoway = m as Twoway;
  411. sw.WriteLine("\t\t\t\tcase {0}:", GetMethodEnumName(entity, cls, m));
  412. sw.WriteLine("\t\t\t\t\t{");
  413. sw.WriteLine("\t\t\t\t\t\tSpReqAnsContext<{0},{1}>::Pointer ctx;", GetReqStructName(entity, cls, m), GetAnsStructName(entity, cls, m));
  414. sw.WriteLine("\t\t\t\t\t\tctx.Attach(new SpReqAnsContext<{0},{1}>(pTransactionContext));", GetReqStructName(entity, cls, m), GetAnsStructName(entity, cls, m));
  415. sw.WriteLine("\t\t\t\t\t\tSpBuffer2Object(Buf, ctx->Req);");
  416. sw.WriteLine("\t\t\t\t\t\tHandle_{0}(ctx);", m.Name);
  417. sw.WriteLine("\t\t\t\t\t}");
  418. sw.WriteLine("\t\t\t\t\tbreak;");
  419. }
  420. else if (typeof(Subscribe).IsInstanceOfType(m))
  421. {
  422. Subscribe subscribe = m as Subscribe;
  423. sw.WriteLine("\t\t\t\tcase {0}:", GetMethodEnumName(entity, cls, m));
  424. sw.WriteLine("\t\t\t\t\t{");
  425. sw.WriteLine("\t\t\t\t\t\tSpSubscribeContext<{0},{1}>::Pointer ctx;", GetSubStructName(entity, cls, m), GetInfoStructName(entity, cls, subscribe.Message));
  426. sw.WriteLine("\t\t\t\t\t\tctx.Attach(new SpSubscribeContext<{0},{1}>(pTransactionContext));", GetSubStructName(entity, cls, m), GetInfoStructName(entity, cls, subscribe.Message));
  427. sw.WriteLine("\t\t\t\t\t\tSpBuffer2Object(Buf, ctx->Req);");
  428. sw.WriteLine("\t\t\t\t\t\tHandle_{0}(ctx);", m.Name);
  429. sw.WriteLine("\t\t\t\t\t}");
  430. sw.WriteLine("\t\t\t\t\tbreak;");
  431. sw.WriteLine("\t\t\t\tcase {0}:", GetMethodEnumName(entity, cls, subscribe.Cancel));
  432. sw.WriteLine("\t\t\t\t\t{");
  433. sw.WriteLine("\t\t\t\t\t\tSpOnewayCallContext<{0}>::Pointer ctx;", GetInfoStructName(entity, cls, subscribe.Cancel));
  434. sw.WriteLine("\t\t\t\t\t\tctx.Attach(new SpOnewayCallContext<{0}>());", GetInfoStructName(entity, cls, subscribe.Cancel));
  435. sw.WriteLine("\t\t\t\t\t\tSpBuffer2Object(Buf, ctx->Info);");
  436. sw.WriteLine("\t\t\t\t\t\tHandle_{0}(ctx);", subscribe.Cancel.Name);
  437. sw.WriteLine("\t\t\t\t\t}");
  438. sw.WriteLine("\t\t\t\t\tbreak;");
  439. }
  440. else
  441. {
  442. throw new Exception("unknown method!");
  443. }
  444. }
  445. sw.WriteLine("\t\t\t\tdefault:");
  446. sw.WriteLine("\t\t\t\t\tassert(0);");
  447. sw.WriteLine("\t\t\t\t\tbreak;");
  448. sw.WriteLine("\t\t\t}");
  449. sw.WriteLine("\t\t\t");
  450. sw.WriteLine("\t\t} else {");
  451. sw.WriteLine("\t\t\tpTransactionContext->SendAnswer(Error);");
  452. sw.WriteLine("\t\t}");
  453. sw.WriteLine("\t}");
  454. sw.WriteLine("");
  455. }
  456. string GetServerClassName(Entity entity, EntityClass cls)
  457. {
  458. return string.Format("{0}_ServerSessionBase", cls.Name);
  459. }
  460. void WriteClassServer(StreamWriter sw, Entity entity, EntityClass cls)
  461. {
  462. sw.WriteLine("class {0} : public CServerSessionBase", GetServerClassName(entity, cls));
  463. sw.WriteLine("{");
  464. sw.WriteLine("public:");
  465. WriteServerConstructor(sw, entity, cls);
  466. WriteServerDestructor(sw, entity, cls);
  467. WriteSeverIsExclusive(sw, entity, cls);
  468. WriteServerIsSessionOverlap(sw, entity, cls);
  469. WriteServerGetMessageAttr(sw, entity, cls);
  470. WriteServerCheckMessageSignature(sw, entity, cls);
  471. foreach (Method m in cls.MethodList)
  472. {
  473. if (typeof(Oneway).IsInstanceOfType(m))
  474. {
  475. WriteServerOnewayHandler(sw, entity, cls, m as Oneway);
  476. }
  477. else if (typeof(Twoway).IsInstanceOfType(m))
  478. {
  479. WriteServerTwowayHandler(sw, entity, cls, m as Twoway);
  480. }
  481. else if (typeof(Subscribe).IsInstanceOfType(m))
  482. {
  483. WriteServerSubscibeHandler(sw, entity, cls, m as Subscribe);
  484. }
  485. else
  486. {
  487. throw new Exception("unknown method!");
  488. }
  489. }
  490. WriteServerOnRequest(sw, entity, cls);
  491. sw.WriteLine("};");
  492. sw.WriteLine();
  493. }
  494. void GenerateServer(string deffilename, string file, Entity entity)
  495. {
  496. string file_name = System.IO.Path.GetFileName(file);
  497. using (StreamWriter sw = new StreamWriter(file, false, Encoding.GetEncoding("gb2312")))
  498. {
  499. string guard_marco = string.Format("__{0}", file_name.Replace('.', '_').ToUpper());
  500. sw.WriteLine();
  501. sw.WriteLine("#ifndef " + guard_marco);
  502. sw.WriteLine("#define " + guard_marco);
  503. sw.WriteLine();
  504. sw.WriteLine("#pragma once");
  505. sw.WriteLine();
  506. sw.WriteLine("// This code is generated by spgen tool!");
  507. sw.WriteLine();
  508. sw.WriteLine("#include \"{0}\"", deffilename);
  509. sw.WriteLine();
  510. sw.WriteLine("namespace {0} {{", entity.Name);
  511. foreach (EntityClass cls in entity.ClassList)
  512. {
  513. WriteClassServer(sw, entity, cls);
  514. sw.WriteLine();
  515. sw.WriteLine("///////////////////////////");
  516. sw.WriteLine();
  517. }
  518. sw.WriteLine("}} // namespace {0}", entity.Name);
  519. sw.WriteLine(string.Format("#endif // {0}", guard_marco));
  520. }
  521. }
  522. void WriteClientOneway(StreamWriter sw, Entity entity, EntityClass cls, Oneway oneway)
  523. {
  524. string iname = GetInfoStructName(entity, cls, oneway);
  525. if (oneway.InfoParamList.Count > 0)
  526. {
  527. sw.WriteLine("\tErrorCodeEnum {0}({1} &Info)", oneway.Name, iname);
  528. sw.WriteLine("\t{");
  529. sw.WriteLine("\t\tCSmartPointer<IClientSessionFunction> pFunc = GetFunction();");
  530. sw.WriteLine("\t\tCAutoBuffer Buf = SpObject2Buffer(Info);");
  531. sw.WriteLine("\t\treturn pFunc->OnewayCall({0}, {1}, Buf);", GetMethodEnumName(entity, cls, oneway), GetMethodSignatureEnumName(entity, cls, oneway));
  532. sw.WriteLine("\t}");
  533. }
  534. else
  535. {
  536. sw.WriteLine("\tErrorCodeEnum {0}()", oneway.Name);
  537. sw.WriteLine("\t{");
  538. sw.WriteLine("\t\tCSmartPointer<IClientSessionFunction> pFunc = GetFunction();");
  539. sw.WriteLine("\t\treturn pFunc->OnewayCall({0}, {1});", GetMethodEnumName(entity, cls, oneway), GetMethodSignatureEnumName(entity, cls, oneway));
  540. sw.WriteLine("\t}");
  541. }
  542. sw.WriteLine();
  543. }
  544. void WriteClientTwoway(StreamWriter sw, Entity entity, EntityClass cls, Twoway twoway)
  545. {
  546. // async
  547. sw.WriteLine("\tErrorCodeEnum {0}({1} &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)", twoway.Name, GetReqStructName(entity, cls, twoway));
  548. sw.WriteLine("\t{");
  549. sw.WriteLine("\t\tCSmartPointer<IClientSessionFunction> pFunc = GetFunction();");
  550. sw.WriteLine("\t\tCAutoBuffer Buf = SpObject2Buffer(Req);");
  551. sw.WriteLine("\t\treturn pFunc->AsyncRequest({0}, {1}, Buf, spAsyncWait, dwTimeout);", GetMethodEnumName(entity, cls, twoway), GetMethodSignatureEnumName(entity, cls, twoway));
  552. sw.WriteLine("\t}");
  553. // sync
  554. sw.WriteLine("\tErrorCodeEnum {0}({1} &Req, {2} &Ans, DWORD dwTimeout)", twoway.Name, GetReqStructName(entity, cls, twoway), GetAnsStructName(entity, cls, twoway));
  555. sw.WriteLine("\t{");
  556. sw.WriteLine("\t\tCSmartPointer<IAsynWaitSp> spAsyncWait;");
  557. sw.WriteLine("\t\tErrorCodeEnum Error = {0}(Req, spAsyncWait, dwTimeout);", twoway.Name);
  558. sw.WriteLine("\t\tif (Error == Error_Succeed) {");
  559. sw.WriteLine("\t\t\tbool bEnd = false;");
  560. sw.WriteLine("\t\t\tError = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);");
  561. sw.WriteLine("\t\t\tLOG_ASSERT(Error || bEnd);");
  562. sw.WriteLine("\t\t}");
  563. sw.WriteLine("\t\treturn Error;");
  564. sw.WriteLine("\t}");
  565. // sync with user error
  566. sw.WriteLine("\tErrorCodeEnum {0}({1} &Req, {2} &Ans, DWORD dwTimeout, DWORD &dwUserError)", twoway.Name, GetReqStructName(entity, cls, twoway), GetAnsStructName(entity, cls, twoway));
  567. sw.WriteLine("\t{");
  568. sw.WriteLine("\t\tCSmartPointer<IAsynWaitSp> spAsyncWait;");
  569. sw.WriteLine("\t\tErrorCodeEnum Error = {0}(Req, spAsyncWait, dwTimeout);", twoway.Name);
  570. sw.WriteLine("\t\tif (Error == Error_Succeed) {");
  571. sw.WriteLine("\t\t\tbool bEnd = false;");
  572. sw.WriteLine("\t\t\tError = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, dwTimeout);");
  573. sw.WriteLine("\t\t\tLOG_ASSERT(Error || bEnd);");
  574. sw.WriteLine("\t\t}");
  575. sw.WriteLine("\t\treturn Error;");
  576. sw.WriteLine("\t}");
  577. sw.WriteLine();
  578. }
  579. void WriteClientSubscribe(StreamWriter sw, Entity entity, EntityClass cls, Subscribe subscribe)
  580. {
  581. sw.WriteLine("\tErrorCodeEnum {0}({1} &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait)", subscribe.Name, GetSubStructName(entity, cls, subscribe));
  582. sw.WriteLine("\t{");
  583. sw.WriteLine("\t\tCSmartPointer<IClientSessionFunction> pFunc = GetFunction();");
  584. sw.WriteLine("\t\tCAutoBuffer Buf = SpObject2Buffer(Req);");
  585. sw.WriteLine("\t\tErrorCodeEnum Error = pFunc->AsyncRequest({0}, {1}, Buf, spAsyncWait, -1);", GetMethodEnumName(entity, cls, subscribe), GetMethodSignatureEnumName(entity, cls, subscribe));
  586. sw.WriteLine("\t\treturn Error;");
  587. sw.WriteLine("\t}");
  588. sw.WriteLine("\tErrorCodeEnum {0}({1} &Req, ICallbackListener *pCallback,IReleasable *pData = NULL)", subscribe.Name, GetSubStructName(entity, cls, subscribe));
  589. sw.WriteLine("\t{");
  590. sw.WriteLine("\t\tCSmartPointer<IAsynWaitSp> spAsyncWait;");
  591. sw.WriteLine("\t\tErrorCodeEnum Error = {0}(Req, spAsyncWait);", subscribe.Name);
  592. sw.WriteLine("\t\tif (Error == Error_Succeed) {");
  593. sw.WriteLine("\t\t\tspAsyncWait->SetCallback(pCallback, pData);");
  594. sw.WriteLine("\t\t}");
  595. sw.WriteLine("\t\treturn Error;");
  596. sw.WriteLine("\t}");
  597. sw.WriteLine("\tErrorCodeEnum {0}({1} &Req, IReleasable *pData = NULL)", subscribe.Name, GetSubStructName(entity, cls, subscribe));
  598. sw.WriteLine("\t{");
  599. sw.WriteLine("\t\treturn {0}(Req, this, pData);", subscribe.Name);
  600. sw.WriteLine("\t}");
  601. if (subscribe.Cancel.InfoParamList.Count > 0)
  602. {
  603. sw.WriteLine("\tErrorCodeEnum {0}({1} &CancelInfo)", subscribe.Cancel.Name, GetInfoStructName(entity, cls, subscribe.Cancel));
  604. sw.WriteLine("\t{");
  605. sw.WriteLine("\t\tCSmartPointer<IClientSessionFunction> pFunc = GetFunction();");
  606. sw.WriteLine("\t\tCAutoBuffer Buf = SpObject2Buffer(CancelInfo);");
  607. sw.WriteLine("\t\treturn pFunc->OnewayCall({0}, {1}, Buf);", GetMethodEnumName(entity, cls, subscribe.Cancel), GetMethodSignatureEnumName(entity, cls, subscribe.Cancel));
  608. sw.WriteLine("\t}");
  609. }
  610. else
  611. {
  612. sw.WriteLine("\tErrorCodeEnum {0}({1} &CancelInfo)", subscribe.Cancel.Name, GetInfoStructName(entity, cls, subscribe.Cancel));
  613. sw.WriteLine("\t{");
  614. sw.WriteLine("\t\tCSmartPointer<IClientSessionFunction> pFunc = GetFunction();");
  615. sw.WriteLine("\t\treturn pFunc->OnewayCall({0}, {1});", GetMethodEnumName(entity, cls, subscribe.Cancel), GetMethodSignatureEnumName(entity, cls, subscribe.Cancel));
  616. sw.WriteLine("\t}");
  617. }
  618. sw.WriteLine("\tvirtual void OnMessage(ErrorCodeEnum Error, {0} &Msg, CSmartPointer<IReleasable> pData)", GetInfoStructName(entity, cls, subscribe.Message));
  619. sw.WriteLine("\t{");
  620. sw.WriteLine("\t\t/// implement by user");
  621. sw.WriteLine("\t}");
  622. sw.WriteLine();
  623. }
  624. void WriteOnAnswer(StreamWriter sw, Entity entity, EntityClass cls)
  625. {
  626. sw.WriteLine("private:");
  627. sw.WriteLine("\tvirtual void OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)");
  628. sw.WriteLine("\t{");
  629. sw.WriteLine("\t\tCAutoBuffer Buf;");
  630. sw.WriteLine("\t\tbool bEnd;");
  631. sw.WriteLine("\t\tCSmartPointer<IReleasable> pData;");
  632. sw.WriteLine("\t\tErrorCodeEnum Error = pAsynWaitSp->AsyncGetAnswer(Buf, bEnd);");
  633. sw.WriteLine("\t\tDWORD dwMessageId = pAsynWaitSp->GetMessageID();");
  634. sw.WriteLine("\t\tCSmartPointer<ICallbackListener> pCallbackListener;");
  635. sw.WriteLine("\t\tpAsynWaitSp->GetCallback(pCallbackListener, pData);");
  636. sw.WriteLine("\t\t");
  637. sw.WriteLine("\t\tswitch (dwMessageId) {");
  638. foreach (Method m in cls.MethodList)
  639. {
  640. if (typeof(Subscribe).IsInstanceOfType(m))
  641. {
  642. Subscribe subscribe = m as Subscribe;
  643. sw.WriteLine("\t\tcase {0}:", GetMethodEnumName(entity, cls, subscribe));
  644. sw.WriteLine("\t\t\tif (Error) {");
  645. sw.WriteLine("\t\t\t\t{0} Msg;", GetInfoStructName(entity, cls, subscribe.Message));
  646. sw.WriteLine("\t\t\t\tOnMessage(Error, Msg, pData);");
  647. sw.WriteLine("\t\t\t} else {");
  648. sw.WriteLine("\t\t\t\t{0} Msg;", GetInfoStructName(entity, cls, subscribe.Message));
  649. sw.WriteLine("\t\t\t\tSpBuffer2Object(Buf, Msg);");
  650. sw.WriteLine("\t\t\t\tOnMessage(Error, Msg, pData);");
  651. sw.WriteLine("\t\t\t}");
  652. sw.WriteLine("\t\t\tbreak;");
  653. }
  654. }
  655. sw.WriteLine("\t\tdefault:");
  656. sw.WriteLine("\t\t\tassert(0);");
  657. sw.WriteLine("\t\t\tbreak;");
  658. sw.WriteLine("\t\t}");
  659. sw.WriteLine("\t\t");
  660. sw.WriteLine("\t\t");
  661. sw.WriteLine("\t}");
  662. sw.WriteLine();
  663. }
  664. bool HasSubscribe(EntityClass cls)
  665. {
  666. foreach (Method m in cls.MethodList)
  667. {
  668. if (typeof(Subscribe).IsInstanceOfType(m))
  669. return true;
  670. }
  671. return false;
  672. }
  673. void WriteClientConstructor(StreamWriter sw, Entity entity, EntityClass cls)
  674. {
  675. sw.WriteLine("\texplicit {0}(CEntityBase *pEntity) : m_pEntityBase(pEntity), m_bSysManaged(false) {{}}", GetClientClassName(entity, cls));
  676. sw.WriteLine();
  677. }
  678. void WriteClientDestructor(StreamWriter sw, Entity entity, EntityClass cls)
  679. {
  680. sw.WriteLine("protected:");
  681. sw.WriteLine("\tvirtual ~{0}()", GetClientClassName(entity, cls));
  682. sw.WriteLine("\t{");
  683. sw.WriteLine("\t\t/// override by user");
  684. sw.WriteLine("\t}");
  685. sw.WriteLine("public:");
  686. sw.WriteLine();
  687. }
  688. void WriteClientConnect(StreamWriter sw, Entity entity, EntityClass cls)
  689. {
  690. sw.WriteLine("\tErrorCodeEnum Connect(CSmartPointer<IAsynWaitSp> &spAsyncWait)");
  691. sw.WriteLine("\t{");
  692. sw.WriteLine("\t\tCSmartPointer<IEntityFunction> pFunc = m_pEntityBase->GetFunction();");
  693. sw.WriteLine("\t\tErrorCodeEnum Error = pFunc->ConnectRemoteEntity(this, \"{0}\", \"{1}\", spAsyncWait);", entity.Name, cls.Name);
  694. sw.WriteLine("\t\tif (Error == Error_Succeed) {");
  695. sw.WriteLine("\t\t\tm_bSysManaged = true;");
  696. sw.WriteLine("\t\t}");
  697. sw.WriteLine("\t\treturn Error;");
  698. sw.WriteLine("\t}");
  699. sw.WriteLine("\tErrorCodeEnum Connect()");
  700. sw.WriteLine("\t{");
  701. sw.WriteLine("\t\tCSmartPointer<IAsynWaitSp> spAsyncWait;");
  702. sw.WriteLine("\t\tErrorCodeEnum Error = Connect(spAsyncWait);");
  703. sw.WriteLine("\t\tif (Error == Error_Succeed) {");
  704. sw.WriteLine("\t\t\tError = spAsyncWait->WaitAnswer();");
  705. sw.WriteLine("\t\t}");
  706. sw.WriteLine("\t\treturn Error;");
  707. sw.WriteLine("\t}");
  708. sw.WriteLine();
  709. }
  710. string GetClientClassName(Entity entity, EntityClass cls)
  711. {
  712. return string.Format("{0}_ClientBase", cls.Name);
  713. }
  714. void WriteSafeDelete(StreamWriter sw, Entity entity, EntityClass cls)
  715. {
  716. sw.WriteLine("");
  717. sw.WriteLine("\tbool SafeDelete()");
  718. sw.WriteLine("\t{");
  719. sw.WriteLine("\t\tif (!m_bSysManaged) {");
  720. sw.WriteLine("\t\t\tdelete this;");
  721. sw.WriteLine("\t\t}");
  722. sw.WriteLine("\t\treturn m_bSysManaged;");
  723. sw.WriteLine("\t}");
  724. sw.WriteLine("");
  725. }
  726. void WriteClassClient(StreamWriter sw, Entity entity, EntityClass cls)
  727. {
  728. string clsname = GetClientClassName(entity, cls);
  729. bool bHasSub = HasSubscribe(cls);
  730. if (bHasSub)
  731. sw.WriteLine("class {0} : public CClientSessionBase, public ICallbackListener {{ ", clsname);
  732. else
  733. sw.WriteLine("class {0} : public CClientSessionBase {{", clsname);
  734. sw.WriteLine("public:");
  735. WriteClientConstructor(sw, entity, cls);
  736. WriteClientDestructor(sw, entity, cls);
  737. WriteClientConnect(sw, entity, cls);
  738. foreach (Method m in cls.MethodList)
  739. {
  740. if (typeof(Oneway).IsInstanceOfType(m))
  741. {
  742. WriteClientOneway(sw, entity, cls, m as Oneway);
  743. }
  744. else if (typeof(Twoway).IsInstanceOfType(m))
  745. {
  746. WriteClientTwoway(sw, entity, cls, m as Twoway);
  747. }
  748. else if (typeof(Subscribe).IsInstanceOfType(m))
  749. {
  750. WriteClientSubscribe(sw, entity, cls, m as Subscribe);
  751. }
  752. else
  753. {
  754. throw new Exception("unknown");
  755. }
  756. }
  757. WriteSafeDelete(sw, entity, cls);
  758. if (bHasSub)
  759. {
  760. WriteOnAnswer(sw, entity, cls);
  761. }
  762. sw.WriteLine("private:");
  763. sw.WriteLine("\tbool m_bSysManaged;");
  764. sw.WriteLine("\tCEntityBase *m_pEntityBase;");
  765. sw.WriteLine("};");
  766. }
  767. void GenerateClient(string deffilename, string file, Entity entity)
  768. {
  769. string file_name = System.IO.Path.GetFileName(file);
  770. using (StreamWriter sw = new StreamWriter(file, false, Encoding.GetEncoding("gb2312")))
  771. {
  772. string guard_marco = string.Format("__{0}", file_name.Replace('.', '_').ToUpper());
  773. sw.WriteLine();
  774. sw.WriteLine("#ifndef " + guard_marco);
  775. sw.WriteLine("#define " + guard_marco);
  776. sw.WriteLine();
  777. sw.WriteLine("#pragma once");
  778. sw.WriteLine();
  779. sw.WriteLine("// This code is generated by spgen tool!");
  780. sw.WriteLine();
  781. sw.WriteLine("#include \"{0}\"", deffilename);
  782. sw.WriteLine();
  783. sw.WriteLine("namespace {0} {{", entity.Name);
  784. foreach (EntityClass cls in entity.ClassList)
  785. {
  786. WriteClassClient(sw, entity, cls);
  787. sw.WriteLine();
  788. sw.WriteLine("///////////////////////////");
  789. sw.WriteLine();
  790. }
  791. sw.WriteLine("}} // namespace {0}", entity.Name);
  792. sw.WriteLine(string.Format("#endif // {0}", guard_marco));
  793. }
  794. }
  795. string GetMsgDefName(EntityMsg msg)
  796. {
  797. return string.Format("eMsg_{0}", msg.Name);
  798. }
  799. string GetMsgSigDefName(EntityMsg msg)
  800. {
  801. return string.Format("eMsgSig_{0}", msg.Name);
  802. }
  803. void WriteMsgDef(StreamWriter sw, Entity entity)
  804. {
  805. int i = 0;
  806. foreach (EntityMsg msg in entity.MsgList)
  807. {
  808. WriteLineDefine(sw, entity, GetMsgDefName(msg), i.ToString());
  809. i++;
  810. }
  811. sw.WriteLine();
  812. foreach (EntityMsg msg in entity.MsgList)
  813. {
  814. WriteLineDefine(sw, entity, GetMsgSigDefName(msg), msg.Signature.ToString());
  815. }
  816. sw.WriteLine();
  817. }
  818. #if false
  819. void WriteMsgReceiverBase(StreamWriter sw, Entity entity)
  820. {
  821. sw.WriteLine();
  822. sw.WriteLine("struct ReceiverBase : public IBroadcastListener {");
  823. foreach (EntityMsg msg in entity.MsgList)
  824. {
  825. sw.WriteLine("\tvirtual void Handle_{0}({0} &Event) = 0;", msg.Name);
  826. }
  827. sw.WriteLine("\tvirtual void OnBroadcastEvent(const char *pszEntityName,DWORD dwMessageId, DWORD dwMessageSignature,CAutoBuffer Buffer)");
  828. sw.WriteLine("\t{");
  829. sw.WriteLine("\t\tswitch(dwMessageId) {");
  830. foreach (EntityMsg msg in entity.MsgList)
  831. {
  832. sw.WriteLine("\t\tcase {0}:", GetMsgDefName(msg));
  833. sw.WriteLine("\t\t\t{");
  834. sw.WriteLine("\t\t\t\tif (dwMessageSignature == {0}) {{", GetMsgSigDefName(msg));
  835. sw.WriteLine("\t\t\t\t\t{0} Event;", msg.Name);
  836. sw.WriteLine("\t\t\t\t\tErrorCodeEnum Error = SpBuffer2Object<{0}>(Buffer, Event);", msg.Name);
  837. sw.WriteLine("\t\t\t\t\tif (Error == Error_Succeed) {");
  838. sw.WriteLine("\t\t\t\t\t\tHandle_{0}(Event);", msg.Name);
  839. sw.WriteLine("\t\t\t\t\t}");
  840. sw.WriteLine("\t\t\t\t} else {");
  841. sw.WriteLine("\t\t\t\t\tLOG_TRACE(\"sig mismatch, %d\", dwMessageId);");
  842. sw.WriteLine("\t\t\t\t}");
  843. sw.WriteLine("\t\t\t}");
  844. sw.WriteLine("\t\t\tbreak;");
  845. }
  846. sw.WriteLine("\t\tdefault:");
  847. sw.WriteLine("\t\t\tLOG_TRACE(\"ignore event! %d\", dwMessageId);");
  848. sw.WriteLine("\t\t}");
  849. sw.WriteLine("\t}");
  850. sw.WriteLine("};");
  851. sw.WriteLine();
  852. }
  853. #endif
  854. void GenerateMsg(string msgfile, Entity entity)
  855. {
  856. string file_name = System.IO.Path.GetFileName(msgfile);
  857. using (StreamWriter sw = new StreamWriter(msgfile, false, Encoding.GetEncoding("gb2312")))
  858. {
  859. string guard_marco = string.Format("__{0}", file_name.Replace('.', '_').ToUpper());
  860. sw.WriteLine();
  861. sw.WriteLine("#ifndef " + guard_marco);
  862. sw.WriteLine("#define " + guard_marco);
  863. sw.WriteLine();
  864. sw.WriteLine("#pragma once");
  865. sw.WriteLine();
  866. sw.WriteLine("// This code is generated by spgen tool!");
  867. sw.WriteLine();
  868. sw.WriteLine("#include \"SpHelper.h\"");
  869. sw.WriteLine();
  870. sw.WriteLine("namespace {0} {{", entity.Name);
  871. WriteMsgDef(sw, entity);
  872. foreach (EntityMsg msg in entity.MsgList)
  873. {
  874. WriteStruct(sw, msg.Name, msg.InfoParamList);
  875. sw.WriteLine();
  876. sw.WriteLine("///////////////////////////");
  877. sw.WriteLine();
  878. }
  879. sw.WriteLine("}} // namespace {0}", entity.Name);
  880. sw.WriteLine(string.Format("#endif // {0}", guard_marco));
  881. }
  882. }
  883. }
  884. }