protointerface.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. #include "protointerface.h"
  2. #include <QDir>
  3. #include <QFile>
  4. protointerface::protointerface(std::string strprotopath,std::string strmsgtypepath,std::string strprofolder)
  5. {
  6. mstrprotopath = strprotopath;
  7. mstrmsgtypepath = strmsgtypepath;
  8. mstrprofolder = strprofolder;
  9. }
  10. std::vector<std::string> protointerface::GetMessageName(std::string strfilepath,std::vector<std::string> & xvectormsgname)
  11. {
  12. std::vector<std::string> xvector;
  13. QFile xFile;
  14. xFile.setFileName(strfilepath.data());
  15. if(!xFile.open(QIODevice::ReadOnly))
  16. {
  17. return xvector;
  18. }
  19. QByteArray ba = xFile.readAll();
  20. xFile.close();
  21. QList<QByteArray> baline =ba.split('\n');//x.split(QRegExp("\n ")) ;//ba.split('\n');
  22. int nline = baline.size();
  23. int i;
  24. bool bFindPackName = false;
  25. std::string strclasspre = "";
  26. std::string strnamepre = "";
  27. for(i=0;i<nline;i++)
  28. {
  29. QString x(baline[i]);
  30. x.trimmed();
  31. // QList<QByteArray> badata = baline[i].split('\t');
  32. QStringList badata = x.split(QRegExp("[\t ,;{]+"));
  33. if(bFindPackName == false)
  34. {
  35. if(badata[0] == "package")
  36. {
  37. // qDebug("package name is %s",QString(badata[1]).toLatin1().data());
  38. bFindPackName = true;
  39. QString xpac(badata[1]);
  40. xpac.trimmed();
  41. QStringList bapack = xpac.split(QRegExp("[.]"));
  42. unsigned int j;
  43. for(j=0;j<bapack.size();j++)
  44. {
  45. strclasspre = strclasspre + QString(bapack[j]).toStdString() + "::";
  46. strnamepre = strnamepre + QString(bapack[j]).toStdString() + "_";
  47. }
  48. }
  49. }
  50. else
  51. {
  52. if(badata[0] == "message")
  53. {
  54. // qDebug("message name is %s",QString(badata[1]).toLatin1().data());
  55. std::string strclassname = strclasspre + QString(badata[1]).toStdString();
  56. std::string strxname = strnamepre + QString(badata[1]).toStdString();
  57. // qDebug("class name is %s",strclassname.data());
  58. xvector.push_back(strclassname);
  59. xvectormsgname.push_back(strxname);
  60. }
  61. }
  62. }
  63. return xvector;
  64. }
  65. std::vector<std::string> protointerface::GetFileNameVector(std::string strpath,std::string strsuff)
  66. {
  67. std::vector<std::string> xvector;
  68. QDir dir(strpath.data());
  69. QStringList nameFilters;
  70. nameFilters<<strsuff.data();
  71. QStringList files = dir.entryList(nameFilters,QDir::Files,QDir::Name);
  72. unsigned int i;
  73. for(i=0;i<files.size();i++)
  74. {
  75. xvector.push_back(QString(files.at(i)).toStdString());
  76. }
  77. return xvector;
  78. }
  79. bool protointerface::ccodeisexist(std::string strhname)
  80. {
  81. std::string strpath = mstrmsgtypepath;
  82. strpath = strpath + "/" + strhname;
  83. QFile xFile;
  84. xFile.setFileName(strpath.data());
  85. if(xFile.exists())
  86. {
  87. return true;
  88. }
  89. return false;
  90. }
  91. void protointerface::WriteCodeLine(std::string strline,QFile * pFile)
  92. {
  93. char str[1000];
  94. snprintf(str,1000,"%s\n",strline.data());
  95. pFile->write(str);
  96. }
  97. void protointerface::Proc()
  98. {
  99. QFile xFileout;
  100. QString strprofolder = mstrprofolder.data();
  101. strprofolder = strprofolder + "/ivprotoif";
  102. QDir xDir;
  103. xDir.mkpath(strprofolder);
  104. xFileout.setFileName(strprofolder + "/ivprotoif.cpp");
  105. if(!xFileout.open(QIODevice::ReadWrite|QIODevice::Truncate))
  106. {
  107. return;
  108. }
  109. QFile xFileHeader;
  110. xFileHeader.setFileName(strprofolder + "/ivprotoif.h");
  111. if(!xFileHeader.open(QIODevice::ReadWrite|QIODevice::Truncate))
  112. {
  113. return;
  114. }
  115. QFile xFilePro;
  116. xFilePro.setFileName(strprofolder + "/ivprotoif.pro");
  117. if(!xFilePro.open(QIODevice::ReadWrite|QIODevice::Truncate))
  118. {
  119. return;
  120. }
  121. std::vector<std::string> xvectorproto = GetFileNameVector(mstrprotopath,"*.proto");
  122. std::vector<std::string> xvectorclassname;
  123. std::vector<std::string > xvectorname;
  124. std::vector<std::string> xvectorprotoname;
  125. unsigned int i;
  126. for(i=0;i<xvectorproto.size();i++)
  127. {
  128. std::vector<std::string> xven;
  129. QString strtemp(xvectorproto[i].data());
  130. strtemp = strtemp.left(strtemp.size() - 6);
  131. std::string strheadarfilename = strtemp.toStdString() + ".pb.h";
  132. if(!ccodeisexist(strheadarfilename))
  133. {
  134. qDebug("proto %s is not generate c++ code.",xvectorproto[i].data());
  135. continue;
  136. }
  137. xvectorprotoname.push_back(strtemp.toStdString());
  138. // qDebug("header file is %s",strheadarfilename.data());
  139. char strline[1000];
  140. snprintf(strline,1000,"#include \"%s\"\n",strheadarfilename.data());
  141. xFileout.write(strline);
  142. // qDebug("%d:%s",i,xvectorproto[i].data());
  143. std::vector<std::string> xvectorcla = GetMessageName(mstrprotopath+"/" + xvectorproto[i],xven);
  144. unsigned int j;
  145. for(j=0;j<xvectorcla.size();j++)
  146. {
  147. xvectorclassname.push_back(xvectorcla[j]);
  148. xvectorname.push_back(xven[j]);
  149. }
  150. }
  151. WriteCodeLine("",&xFileout);
  152. WriteCodeLine("#include \"google/protobuf/io/zero_copy_stream_impl.h\"",&xFileout);
  153. WriteCodeLine("#include \"google/protobuf/text_format.h\"",&xFileout);
  154. WriteCodeLine("#include <iostream>",&xFileout);
  155. WriteCodeLine("#include <QString>",&xFileout);
  156. WriteCodeLine("#include <QStringList>",&xFileout);
  157. WriteCodeLine("",&xFileout);
  158. char strline[1000];
  159. WriteCodeLine("",&xFileout);
  160. WriteCodeLine("namespace iv",&xFileout);
  161. WriteCodeLine("{",&xFileout);
  162. WriteCodeLine("\tstruct protomsgtype",&xFileout);
  163. WriteCodeLine("\t{",&xFileout);
  164. WriteCodeLine("\t\tstd::string mstrtypename;",&xFileout);
  165. WriteCodeLine("\t\t::google::protobuf::Message * mpmsg;",&xFileout);
  166. WriteCodeLine("\t};",&xFileout);
  167. WriteCodeLine("}",&xFileout);
  168. WriteCodeLine("",&xFileout);
  169. snprintf(strline,1000,"#define MSGCOUNT %u\n",(unsigned int)xvectorclassname.size());xFileout.write(strline);
  170. snprintf(strline,1000,"const int typecount = %u;\n",(unsigned int)xvectorclassname.size());xFileout.write(strline);
  171. snprintf(strline,1000,"iv::protomsgtype gmsgtype[MSGCOUNT];\n");xFileout.write(strline);
  172. WriteCodeLine("",&xFileout);
  173. WriteCodeLine("static bool CheckAParseLine(QString strline)",&xFileout);
  174. WriteCodeLine("{",&xFileout);
  175. WriteCodeLine("\tif(strline.size()<3)return true;",&xFileout);
  176. WriteCodeLine("\tQString str = strline.mid(0,2);",&xFileout);
  177. WriteCodeLine("\tint i;",&xFileout);
  178. WriteCodeLine("\tfor(i=0;i<9;i++)",&xFileout);
  179. WriteCodeLine("\t{",&xFileout);
  180. WriteCodeLine("\t\tQString strmark = QString::number(i)+\":\";",&xFileout);
  181. WriteCodeLine("\t\tif(str == strmark)",&xFileout);
  182. WriteCodeLine("\t\t{",&xFileout);
  183. WriteCodeLine("\t\t\treturn false;",&xFileout);
  184. WriteCodeLine("\t}",&xFileout);
  185. WriteCodeLine("\t}",&xFileout);
  186. WriteCodeLine("\tstr = strline.mid(0,3);",&xFileout);
  187. WriteCodeLine("\tfor(i=10;i<99;i++)",&xFileout);
  188. WriteCodeLine("\t{",&xFileout);
  189. WriteCodeLine("\t\tQString strmark = QString::number(i)+\":\";",&xFileout);
  190. WriteCodeLine("\t\tif(str == strmark)",&xFileout);
  191. WriteCodeLine("\t\t{",&xFileout);
  192. WriteCodeLine("\t\t\treturn false;",&xFileout);
  193. WriteCodeLine("\t\t}",&xFileout);
  194. WriteCodeLine("\t}",&xFileout);
  195. WriteCodeLine("\treturn true;",&xFileout);
  196. WriteCodeLine("}",&xFileout);
  197. WriteCodeLine("",&xFileout);
  198. WriteCodeLine("",&xFileout);
  199. WriteCodeLine("static bool CheckParseOK(std::string strout)",&xFileout);
  200. WriteCodeLine("{",&xFileout);
  201. WriteCodeLine("\tQString str(strout.data());",&xFileout);
  202. WriteCodeLine("\tQStringList strline = str.split('\\n');",&xFileout);
  203. WriteCodeLine("\tint i;",&xFileout);
  204. WriteCodeLine("\tfor(i=0;i<strline.size();i++)",&xFileout);
  205. WriteCodeLine("\t{",&xFileout);
  206. WriteCodeLine("\t\tif(CheckAParseLine(strline[i]) == false)",&xFileout);
  207. WriteCodeLine("\t\t{",&xFileout);
  208. WriteCodeLine("\t\t\treturn false;",&xFileout);
  209. WriteCodeLine("\t\t}",&xFileout);
  210. WriteCodeLine("\t}",&xFileout);
  211. WriteCodeLine("\treturn true;",&xFileout);
  212. WriteCodeLine("\t}",&xFileout);
  213. WriteCodeLine("",&xFileout);
  214. WriteCodeLine("",&xFileout);
  215. // snprintf(strline,1000,"{\n");xFileout.write(strline);
  216. snprintf(strline,1000,"void InitMsgType()\n");xFileout.write(strline);
  217. snprintf(strline,1000,"{\n");xFileout.write(strline);
  218. for(i=0;i<xvectorclassname.size();i++)
  219. {
  220. snprintf(strline,1000,"\tgmsgtype[%d].mstrtypename = \"%s\";\n",
  221. i,xvectorclassname[i].data());
  222. xFileout.write(strline);
  223. snprintf(strline,1000,"\tgmsgtype[%d].mpmsg = (::google::protobuf::Message *)(new %s);\n",
  224. i,xvectorclassname[i].data());
  225. xFileout.write(strline);
  226. }
  227. snprintf(strline,1000,"}\n");xFileout.write(strline);
  228. snprintf(strline,1000,"\n");xFileout.write(strline);
  229. snprintf(strline,1000,"std::shared_ptr<::google::protobuf::Message > GetProtoMessage(char * strdata,int nsize,unsigned int protoindex)\n");
  230. xFileout.write(strline);
  231. snprintf(strline,1000,"{\n");xFileout.write(strline);
  232. snprintf(strline,1000,"\tstd::shared_ptr<::google::protobuf::Message > msg_ptr = NULL;\n");xFileout.write(strline);
  233. snprintf(strline,1000,"\tif(protoindex >= MSGCOUNT)\n");xFileout.write(strline);
  234. snprintf(strline,1000,"\t{\n");xFileout.write(strline);
  235. snprintf(strline,1000,"\t\treturn msg_ptr;\n");xFileout.write(strline);
  236. snprintf(strline,1000,"\t}\n");xFileout.write(strline);
  237. WriteCodeLine("",&xFileout);
  238. WriteCodeLine("\tmsg_ptr =std::shared_ptr<::google::protobuf::Message>(gmsgtype[protoindex].mpmsg->New(NULL));",&xFileout);
  239. WriteCodeLine("",&xFileout);
  240. WriteCodeLine("\tif(msg_ptr->ParseFromArray(strdata,nsize))",&xFileout);
  241. WriteCodeLine("\t{",&xFileout);
  242. WriteCodeLine("\treturn msg_ptr;",&xFileout);
  243. WriteCodeLine("\t}",&xFileout);
  244. WriteCodeLine("",&xFileout);
  245. WriteCodeLine("\treturn NULL;",&xFileout);
  246. WriteCodeLine("}",&xFileout);
  247. WriteCodeLine("",&xFileout);
  248. WriteCodeLine("std::vector<unsigned int> GetProbProtoIndex(char * strdata,int nsize,std::vector<std::string > & xvectorprobname)",&xFileout);
  249. WriteCodeLine("{",&xFileout);
  250. WriteCodeLine("\tstd::vector<unsigned int> xvectorrtn;",&xFileout);
  251. WriteCodeLine("\txvectorrtn.clear();",&xFileout);
  252. WriteCodeLine("\txvectorprobname.clear();",&xFileout);
  253. WriteCodeLine("\tunsigned int i;",&xFileout);
  254. WriteCodeLine("\tfor(i=0;i<MSGCOUNT;i++)",&xFileout);
  255. WriteCodeLine("\t{",&xFileout);
  256. WriteCodeLine("\t\tif(gmsgtype[i].mpmsg->ParseFromArray(strdata,nsize))",&xFileout);
  257. WriteCodeLine("\t\t{",&xFileout);
  258. WriteCodeLine("\t\t\tusing google::protobuf::TextFormat;",&xFileout);
  259. WriteCodeLine("\t\t\tusing google::protobuf::io::FileOutputStream;",&xFileout);
  260. WriteCodeLine("\t\t\tusing google::protobuf::io::ZeroCopyOutputStream;",&xFileout);
  261. WriteCodeLine("\t\t\tstd::string strout;",&xFileout);
  262. WriteCodeLine("\t\t\tZeroCopyOutputStream *output = new google::protobuf::io::StringOutputStream(&strout);",&xFileout);
  263. WriteCodeLine("\t\t\tbool success = TextFormat::Print(*(gmsgtype[i].mpmsg), output);",&xFileout);
  264. WriteCodeLine("\t\t\tif(success)",&xFileout);
  265. WriteCodeLine("\t\t\t{",&xFileout);
  266. WriteCodeLine("\t\t\t\tif(CheckParseOK(strout))",&xFileout);
  267. WriteCodeLine("\t\t\t\t{",&xFileout);
  268. WriteCodeLine("\t\t\t\t\txvectorrtn.push_back(i);",&xFileout);
  269. WriteCodeLine("\t\t\t\t\txvectorprobname.push_back(gmsgtype[i].mstrtypename);",&xFileout);
  270. WriteCodeLine("\t\t\t\t}",&xFileout);
  271. WriteCodeLine("\t\t\t}",&xFileout);
  272. WriteCodeLine("\t\t\tdelete output;",&xFileout);
  273. WriteCodeLine("\t\t}",&xFileout);
  274. WriteCodeLine("\t}",&xFileout);
  275. WriteCodeLine("\treturn xvectorrtn;",&xFileout);
  276. WriteCodeLine("}",&xFileout);
  277. WriteCodeLine("",&xFileout);
  278. // for(i=0;i<xvectorclassname.size();i++)
  279. // {
  280. // snprintf(strline,1000,"\t%s\t%s;\n",xvectorclassname[i].data(),xvectorname[i].data());
  281. // // qDebug("%s %s",xvectorclassname[i].data(),xvectorname[i].data());
  282. // xFileout.write(strline);
  283. // }
  284. xFileout.close();
  285. WriteCodeLine("#ifndef IVPROTOIF_H",&xFileHeader);
  286. WriteCodeLine("#define IVPROTOIF_H",&xFileHeader);
  287. WriteCodeLine("",&xFileHeader);
  288. WriteCodeLine("#include <QtCore/qglobal.h>",&xFileHeader);
  289. WriteCodeLine("#include <google/protobuf/stubs/common.h>",&xFileHeader);
  290. WriteCodeLine("#include <google/protobuf/stubs/port.h>",&xFileHeader);
  291. WriteCodeLine("#include <google/protobuf/stubs/once.h>",&xFileHeader);
  292. WriteCodeLine("#include <google/protobuf/io/coded_stream.h>",&xFileHeader);
  293. WriteCodeLine("#include <google/protobuf/wire_format_lite_inl.h>",&xFileHeader);
  294. WriteCodeLine("#include <google/protobuf/descriptor.h>",&xFileHeader);
  295. WriteCodeLine("#include <google/protobuf/generated_message_reflection.h>",&xFileHeader);
  296. WriteCodeLine("#include <google/protobuf/reflection_ops.h>",&xFileHeader);
  297. WriteCodeLine("#include <google/protobuf/wire_format.h>",&xFileHeader);
  298. WriteCodeLine("",&xFileHeader);
  299. WriteCodeLine("#if defined(PROTOINTERFACE_LIBRARY)",&xFileHeader);
  300. WriteCodeLine("# define PROTOINTERFACESHARED_EXPORT Q_DECL_EXPORT",&xFileHeader);
  301. WriteCodeLine("#else",&xFileHeader);
  302. WriteCodeLine("# define PROTOINTERFACESHARED_EXPORT Q_DECL_IMPORT",&xFileHeader);
  303. WriteCodeLine("#endif",&xFileHeader);
  304. WriteCodeLine("",&xFileHeader);
  305. WriteCodeLine("",&xFileHeader);
  306. WriteCodeLine("void PROTOINTERFACESHARED_EXPORT InitMsgType();",&xFileHeader);
  307. WriteCodeLine("std::shared_ptr<::google::protobuf::Message > PROTOINTERFACESHARED_EXPORT GetProtoMessage(char * strdata,int nsize,unsigned int protoindex);",&xFileHeader);
  308. WriteCodeLine("std::vector<unsigned int> PROTOINTERFACESHARED_EXPORT GetProbProtoIndex(char * strdata,int nsize,std::vector<std::string > & xvectorprobname);",&xFileHeader);
  309. WriteCodeLine("#endif",&xFileHeader);
  310. WriteCodeLine("",&xFileHeader);
  311. xFileHeader.close();
  312. WriteCodeLine("QT -= gui", &xFilePro);
  313. WriteCodeLine("", &xFilePro);
  314. WriteCodeLine("TEMPLATE = lib", &xFilePro);
  315. WriteCodeLine("DEFINES += PROTOINTERFACE_LIBRARY", &xFilePro);
  316. WriteCodeLine("", &xFilePro);
  317. WriteCodeLine("CONFIG += c++11", &xFilePro);
  318. WriteCodeLine("", &xFilePro);
  319. WriteCodeLine("SOURCES += ivprotoif.cpp \\", &xFilePro);
  320. for(i=0;i<xvectorprotoname.size();i++)
  321. {
  322. char strtemp[1000];
  323. if(i<(xvectorprotoname.size()-1))
  324. {
  325. snprintf(strtemp,1000,"\t%s/%s.pb.cc \\",mstrmsgtypepath.data(),
  326. xvectorprotoname[i].data());
  327. }
  328. else
  329. {
  330. snprintf(strtemp,1000,"\t%s/%s.pb.cc",mstrmsgtypepath.data(),
  331. xvectorprotoname[i].data());
  332. }
  333. WriteCodeLine(strtemp,&xFilePro);
  334. }
  335. WriteCodeLine("", &xFilePro);
  336. WriteCodeLine("", &xFilePro);
  337. WriteCodeLine("HEADERS += ivprotoif.h \\", &xFilePro);
  338. for(i=0;i<xvectorprotoname.size();i++)
  339. {
  340. char strtemp[1000];
  341. if(i<(xvectorprotoname.size()-1))
  342. {
  343. snprintf(strtemp,1000,"\t%s/%s.pb.h \\",mstrmsgtypepath.data(),
  344. xvectorprotoname[i].data());
  345. }
  346. else
  347. {
  348. snprintf(strtemp,1000,"\t%s/%s.pb.h ",mstrmsgtypepath.data(),
  349. xvectorprotoname[i].data());
  350. }
  351. WriteCodeLine(strtemp,&xFilePro);
  352. }
  353. WriteCodeLine("", &xFilePro);
  354. WriteCodeLine("", &xFilePro);
  355. WriteCodeLine("DEFINES += QT_DEPRECATED_WARNINGS", &xFilePro);
  356. WriteCodeLine("", &xFilePro);
  357. WriteCodeLine("CONFIG += plugin", &xFilePro);
  358. WriteCodeLine("", &xFilePro);
  359. snprintf(strline,1000,"INCLUDEPATH += %s",mstrmsgtypepath.data());
  360. WriteCodeLine(strline,&xFilePro);
  361. WriteCodeLine("LIBS+= -lprotobuf", &xFilePro);
  362. WriteCodeLine("", &xFilePro);
  363. WriteCodeLine("", &xFilePro);
  364. WriteCodeLine("", &xFilePro);
  365. xFilePro.close();
  366. }