PageRenderTime 47ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/tools/PacketSamurai/src/com/aionemu/packetsamurai/protocol/protocoltree/PacketFormat.java

http://slx-beta.googlecode.com/
Java | 270 lines | 238 code | 18 blank | 14 comment | 55 complexity | 8984e998f0af4eb00e80b5d5e7374796 MD5 | raw file
Possible License(s): GPL-2.0, Apache-2.0
  1. package packetsamurai.protocol.protocoltree;
  2. import java.util.List;
  3. import packetsamurai.Util;
  4. import packetsamurai.parser.PartType;
  5. import packetsamurai.parser.PartTypeManager;
  6. import packetsamurai.parser.formattree.Format;
  7. import packetsamurai.parser.formattree.Part;
  8. import packetsamurai.protocol.Protocol;
  9. import javolution.text.TextBuilder;
  10. import javolution.util.FastList;
  11. /**
  12. * This class represents a packet format in the protocol definition tree.
  13. * It is a container for {@link PacketParts PacketParts}
  14. * @author Gilles Duboscq
  15. * TODO: find a way to ensure part IDs unicity
  16. */
  17. public class PacketFormat extends ProtocolNode
  18. {
  19. private Format _format;
  20. private String _name;
  21. private String _opStr;
  22. private String _partStr;
  23. private Protocol _containingProtocol;
  24. public PacketFormat(int id, String name)
  25. {
  26. super(id);
  27. _name = name;
  28. _format = new Format(this);
  29. }
  30. public PacketFormat()
  31. {
  32. _format = new Format(this);
  33. }
  34. public Format getDataFormat()
  35. {
  36. return _format;
  37. }
  38. public void setContainingProtocol(Protocol p)
  39. {
  40. _containingProtocol = p;
  41. }
  42. public Protocol getContainingProtocol()
  43. {
  44. return _containingProtocol;
  45. }
  46. public String getName()
  47. {
  48. return _name;
  49. }
  50. public String getOpcodeStr()
  51. {
  52. if(_opStr == null)
  53. {
  54. TextBuilder tb = new TextBuilder();
  55. boolean first = true;
  56. for(int id : super.getIDs())
  57. {
  58. if(!first)
  59. {
  60. tb.append(":");
  61. }
  62. tb.append(Util.zeropad(Integer.toHexString(id), 2).toUpperCase());
  63. first = false;
  64. }
  65. _opStr = tb.toString();
  66. }
  67. return _opStr;
  68. }
  69. public String getPartsStr()
  70. {
  71. if (_partStr == null)
  72. {
  73. _partStr = new String();
  74. TextBuilder tb = new TextBuilder();
  75. tb.append("(");
  76. tb.append(Util.makeFormatString(super.getIdParts()));
  77. tb.append(") ");
  78. tb.append(Util.makeFormatString(this.getDataFormat().getMainBlock().getParts()));
  79. _partStr = tb.toString();
  80. }
  81. return _partStr;
  82. }
  83. public String toString()
  84. {
  85. return getOpcodeStr()+" "+_name;
  86. }
  87. /**
  88. * format : (c) chdfQSsbx[ddd]
  89. * ^id ^for
  90. * id is mandatory, spaces are allowed
  91. * @param str
  92. * @param ids
  93. * @return
  94. */
  95. public static PacketFormat generateFromString(String str, List<Integer> ids)
  96. {
  97. PacketFormat pf = new PacketFormat();
  98. str = str.trim();
  99. int i = 0;
  100. if(str.charAt(i) == '(')
  101. {
  102. List<PartType> idparts = new FastList<PartType>();
  103. while(str.charAt(i) != ')')
  104. {
  105. if(str.charAt(i) == ' ')
  106. {
  107. i++;
  108. if(i >= str.length())
  109. return null;
  110. }
  111. PartType type = PartTypeManager.getInstance().getType(str.substring(i, i+1));
  112. if(type != null)
  113. idparts.add(type);
  114. else
  115. return null;
  116. i++;
  117. if(i >= str.length())
  118. return null;
  119. }
  120. pf.addIdPartsAtBegining(idparts, ids);
  121. }
  122. else
  123. return null;
  124. while(i < str.length())
  125. {
  126. if(str.charAt(i) != '[')
  127. {
  128. i++;
  129. for(Part part : parseForString(str.substring(i, str.substring(i).indexOf(']'))))
  130. {
  131. pf.getDataFormat().getMainBlock().addPart(part);
  132. while(str.charAt(i) == ' ')
  133. {
  134. i++;
  135. if(i >= str.length())
  136. return null;
  137. }
  138. i++;
  139. if(i >= str.length())
  140. return null;
  141. }
  142. }
  143. else if(str.charAt(i) == ' ')
  144. {
  145. i++;
  146. if(i >= str.length())
  147. return null;
  148. }
  149. else
  150. {
  151. PartType type = PartTypeManager.getInstance().getType(str.substring(i, i+1));
  152. if(type != null)
  153. pf.getDataFormat().getMainBlock().addPart(new Part(type,-1,"","",""));
  154. else
  155. return null;
  156. i++;
  157. if(i >= str.length())
  158. return null;
  159. }
  160. }
  161. return pf;
  162. }
  163. private static List<Part> parseForString(String str)
  164. {
  165. int i = 0;
  166. List<Part> parts = new FastList<Part>();
  167. if(str.charAt(i) != '[')
  168. {
  169. i++;
  170. for(Part part : parseForString(str.substring(i, str.substring(i).indexOf(']'))))
  171. {
  172. parts.add(part);
  173. while(str.charAt(i) == ' ')
  174. {
  175. i++;
  176. if(i >= str.length())
  177. return null;
  178. }
  179. i++;
  180. if(i >= str.length())
  181. return null;
  182. }
  183. }
  184. else if(str.charAt(i) == ' ')
  185. {
  186. i++;
  187. if(i >= str.length())
  188. return null;
  189. }
  190. else
  191. {
  192. PartType type = PartTypeManager.getInstance().getType(str.substring(i, i+1));
  193. if(type != null)
  194. parts.add(new Part(type,-1,"","",""));
  195. else
  196. return null;
  197. i++;
  198. if(i >= str.length())
  199. return null;
  200. }
  201. return parts;
  202. }
  203. public static int countIdPartsInString(String str)
  204. {
  205. str = str.trim();
  206. int i = 0;
  207. int count = 0;
  208. if(str.charAt(i) == '(')
  209. {
  210. i++;
  211. while(str.charAt(i) != ')')
  212. {
  213. if(str.charAt(i) != ' ')
  214. {
  215. if(PartTypeManager.getInstance().getType(str.substring(i, i+1)) == null)
  216. {
  217. return 0;
  218. }
  219. count++;
  220. }
  221. i++;
  222. }
  223. }
  224. return count;
  225. }
  226. public static List<PartType> getIdPartsInString(String str)
  227. {
  228. FastList<PartType> list = new FastList<PartType>();
  229. str = str.trim();
  230. int i = 0;
  231. int count = 0;
  232. if(str.charAt(i) == '(')
  233. {
  234. i++;
  235. while(str.charAt(i) != ')')
  236. {
  237. if(str.charAt(i) != ' ')
  238. {
  239. PartType type = PartTypeManager.getInstance().getType(str.substring(i, i+1));
  240. if(type == null)
  241. {
  242. return null;
  243. }
  244. list.add(type);
  245. count++;
  246. }
  247. i++;
  248. }
  249. }
  250. return list;
  251. }
  252. }