atom.h
上传用户:chn_coc
上传日期:2007-12-20
资源大小:563k
文件大小:3k
源码类别:

P2P编程

开发平台:

Windows_Unix

  1. // ------------------------------------------------
  2. // File : atom.h
  3. // Date: 1-mar-2004
  4. // Author: giles
  5. //
  6. // (c) 2002-4 peercast.org
  7. // ------------------------------------------------
  8. // This program is free software; you can redistribute it and/or modify
  9. // it under the terms of the GNU General Public License as published by
  10. // the Free Software Foundation; either version 2 of the License, or
  11. // (at your option) any later version.
  12. // This program is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. // GNU General Public License for more details.
  16. // ------------------------------------------------
  17. #ifndef _ATOM_H
  18. #define _ATOM_H
  19. #include "stream.h"
  20. #include "id.h"
  21. // ------------------------------------------------
  22. class AtomStream
  23. {
  24. public:
  25. AtomStream(Stream &s) : io(s),numChildren(0),numData(0)
  26. {}
  27. void checkData(int d)
  28. {
  29. if (numData != d)
  30. throw StreamException("Bad atom data");
  31. }
  32. void writeParent(ID4 id,int nc)
  33. {
  34. io.writeID4(id);
  35. io.writeInt(nc|0x80000000);
  36. }
  37. void writeInt(ID4 id,int d)
  38. {
  39. io.writeID4(id);
  40. io.writeInt(4);
  41. io.writeInt(d);
  42. }
  43. void writeID4(ID4 id,ID4 d)
  44. {
  45. io.writeID4(id);
  46. io.writeInt(4);
  47. io.writeID4(d);
  48. }
  49. void writeShort(ID4 id,short d)
  50. {
  51. io.writeID4(id);
  52. io.writeInt(2);
  53. io.writeShort(d);
  54. }
  55. void writeChar(ID4 id,char d)
  56. {
  57. io.writeID4(id);
  58. io.writeInt(1);
  59. io.writeChar(d);
  60. }
  61. void writeBytes(ID4 id,const void *p,int l)
  62. {
  63. io.writeID4(id);
  64. io.writeInt(l);
  65. io.write(p,l);
  66. }
  67. int writeStream(ID4 id,Stream &in,int l)
  68. {
  69. io.writeID4(id);
  70. io.writeInt(l);
  71. in.writeTo(io,l);
  72. return (sizeof(int)*2)+l;
  73. }
  74. void writeString(ID4 id,const char *p)
  75. {
  76. writeBytes(id,p,strlen(p)+1);
  77. }
  78. ID4 read(int &numc,int &dlen)
  79. {
  80. ID4 id = io.readID4();
  81. unsigned int v = io.readInt();
  82. if (v & 0x80000000)
  83. {
  84. numc = v&0x7fffffff;
  85. dlen = 0;
  86. }else
  87. {
  88. numc = 0;
  89. dlen = v;
  90. }
  91. numChildren = numc;
  92. numData = dlen;
  93. return id;
  94. }
  95. void skip(int c, int d)
  96. {
  97. if (d)
  98. io.skip(d);
  99. for(int i=0; i<c; i++)
  100. {
  101. int numc,data;
  102. read(numc,data);
  103. skip(numc,data);
  104. }
  105. }
  106. int readInt() 
  107. {
  108. checkData(4);
  109. return io.readInt();
  110. }
  111. int readID4() 
  112. {
  113. checkData(4);
  114. return io.readID4();
  115. }
  116. int readShort() 
  117. {
  118. checkData(2);
  119. return io.readShort();
  120. }
  121. int readChar() 
  122. {
  123. checkData(1);
  124. return io.readChar();
  125. }
  126. int readBytes(void *p,int l) 
  127. {
  128. checkData(l);
  129. return io.read(p,l);
  130. }
  131. void readString(char *s,int max,int dlen)
  132. {
  133. checkData(dlen);
  134. readBytes(s,max,dlen);
  135. s[max-1] = 0;
  136. }
  137. void readBytes(void *s,int max,int dlen)
  138. {
  139. checkData(dlen);
  140. if (max > dlen)
  141. readBytes(s,dlen);
  142. else
  143. {
  144. readBytes(s,max);
  145. io.skip(dlen-max);
  146. }
  147. }
  148. int writeAtoms(ID4 id, Stream &in, int cnt, int data)
  149. {
  150. int total=0;
  151. if (cnt)
  152. {
  153. writeParent(id,cnt);
  154. total+=sizeof(int)*2;
  155. for(int i=0; i<cnt; i++)
  156. {
  157. AtomStream ain(in);
  158. int c,d;
  159. ID4 cid = ain.read(c,d);
  160. total += writeAtoms(cid,in,c,d);
  161. }
  162. }else
  163. {
  164. total += writeStream(id,in,data);
  165. }
  166. return total;
  167. }
  168. bool eof() {return io.eof();}
  169. int numChildren,numData;
  170. Stream &io;
  171. };
  172. #endif