Преглед изворни кода

2009-11-22 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Added bencode::decode overload functions. They have extra argument
	'end', passed by reference. 'end' points to the beyond the last
	position of data used in decoding process.
	* src/bencode.cc
	* src/bencode.h
	* test/BencodeTest.cc
Tatsuhiro Tsujikawa пре 16 година
родитељ
комит
5130b5c1e0
4 измењених фајлова са 36 додато и 1 уклоњено
  1. 9 0
      ChangeLog
  2. 14 1
      src/bencode.cc
  3. 6 0
      src/bencode.h
  4. 7 0
      test/BencodeTest.cc

+ 9 - 0
ChangeLog

@@ -1,3 +1,12 @@
+2009-11-22  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Added bencode::decode overload functions. They have extra argument
+	'end', passed by reference. 'end' points to the beyond the last
+	position of data used in decoding process.
+	* src/bencode.cc
+	* src/bencode.h
+	* test/BencodeTest.cc
+
 2009-11-21  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Initial support of Extension for Peers to Send Metadata

+ 14 - 1
src/bencode.cc

@@ -155,13 +155,21 @@ BDE decode(std::istream& in)
 }
 
 BDE decode(const std::string& s)
+{
+  size_t end;
+  return decode(s, end);
+}
+
+BDE decode(const std::string& s, size_t& end)
 {
   if(s.empty()) {
     return BDE::none;
   }
   std::istringstream ss(s);
 
-  return decodeiter(ss);
+  BDE bde = decodeiter(ss);
+  end = ss.tellg();
+  return bde;
 }
 
 BDE decode(const unsigned char* data, size_t length)
@@ -169,6 +177,11 @@ BDE decode(const unsigned char* data, size_t length)
   return decode(std::string(&data[0], &data[length]));
 }
 
+BDE decode(const unsigned char* data, size_t length, size_t& end)
+{
+  return decode(std::string(&data[0], &data[length]), end);
+}
+
 BDE decodeFromFile(const std::string& filename)
 {
   std::ifstream f(filename.c_str(), std::ios::binary);

+ 6 - 0
src/bencode.h

@@ -51,8 +51,14 @@ BDE decode(std::istream& in);
 // Decode the data in s.
 BDE decode(const std::string& s);
 
+// Decode the data in s. After decode is done successfully, return the
+// bencoded string length in end.
+BDE decode(const std::string& s, size_t& end);
+
 BDE decode(const unsigned char* data, size_t length);
 
+BDE decode(const unsigned char* data, size_t length, size_t& end);
+
 BDE decodeFromFile(const std::string& filename);
 
 std::string encode(const BDE& bde);

+ 7 - 0
test/BencodeTest.cc

@@ -146,6 +146,13 @@ void BencodeTest::testDecode()
     BDE s = bencode::decode("5:aria2trail");
     CPPUNIT_ASSERT_EQUAL(std::string("aria2"), s.s());
   }
+  {
+    // Get trailing garbage position
+    size_t end;
+    BDE s = bencode::decode("5:aria2trail", end);
+    CPPUNIT_ASSERT_EQUAL(std::string("aria2"), s.s());
+    CPPUNIT_ASSERT_EQUAL((size_t)7, end);
+  }
 }
 
 void BencodeTest::testEncode()