Przeglądaj źródła

Merge branch 'master' of git.rwth-aachen.de:tobias.wach/ccats into us09-1-file-transfer-client-server

Missingmew 5 lat temu
rodzic
commit
88c432108f
3 zmienionych plików z 49 dodań i 4 usunięć
  1. 20 1
      daemon/include/base64.h
  2. 12 3
      daemon/src/Server.cpp
  3. 17 0
      daemon/src/base64.cpp

+ 20 - 1
daemon/include/base64.h

@@ -2,6 +2,7 @@
 #define BASE64_H
 
 #include <string>
+#include <vector>
 
 namespace base64 {
 /**
@@ -14,13 +15,31 @@ namespace base64 {
 std::string decode(const std::string &val);
 
 /**
- * Encodes base64 encoded strings.
+ * Decodes base64 encoded strings.
+ *
+ * @param val base64 encoded string
+ *
+ * @return char vector
+ */
+std::vector<char> decodeVector(const std::string &val);
+
+/**
+ * Encodes a string to base64.
  *
  * @param val normal string
  *
  * @return base64 encoded string
  */
 std::string encode(const std::string &val);
+
+/**
+ * Encodes a vector to base64.
+ *
+ * @param val char vector
+ *
+ * @return base64 encoded string
+ */
+std::string encodeVector(const std::vector<char> &val);
 } // namespace base64
 
 #endif

+ 12 - 3
daemon/src/Server.cpp

@@ -246,9 +246,12 @@ void con_handler::handle_read_command(const boost::system::error_code &err,
         // upload chunks
 
         // decode base64 string
-        const std::string data = base64::decode(root["data"].asString());
+        const std::vector<char> data =
+            base64::decodeVector(root["data"].asString());
 
-        this->putFile << data;
+        // write the vector data to the output file
+        std::ostream_iterator<char> output_iterator(putFile);
+        std::copy(data.begin(), data.end(), output_iterator);
 
         // close file if put sends remaining = 0
         if (root["remaining"].asInt() == 0) {
@@ -385,9 +388,15 @@ void con_handler::handle_read_command(const boost::system::error_code &err,
               size -= read;
               int remaining = size / max_data_length +
                               (size % max_data_length == 0 ? 0 : 1);
+
+              // store binary data in vector because a string whould end with
+              // '\0'
+              std::vector<char> data;
+              data.assign(fileBuffer, fileBuffer + read);
+
               answer["remaining"] = remaining;
               answer["cancel"] = false;
-              answer["data"] = base64::encode(fileBuffer);
+              answer["data"] = base64::encodeVector(data);
 
               const std::string answerString =
                   Json::writeString(stringBuilder, answer);

+ 17 - 0
daemon/src/base64.cpp

@@ -14,6 +14,15 @@ std::string base64::decode(const std::string &val) {
       [](char c) { return c == '\0'; });
 }
 
+std::vector<char> base64::decodeVector(const std::string &val) {
+  using namespace boost::archive::iterators;
+  using It =
+      transform_width<binary_from_base64<std::string::const_iterator>, 8, 6>;
+  return boost::algorithm::trim_right_copy_if(
+      std::vector<char>(It(std::begin(val)), It(std::end(val))),
+      [](char c) { return c == '\0'; });
+}
+
 std::string base64::encode(const std::string &val) {
   using namespace boost::archive::iterators;
   using It =
@@ -21,3 +30,11 @@ std::string base64::encode(const std::string &val) {
   auto tmp = std::string(It(std::begin(val)), It(std::end(val)));
   return tmp.append((3 - val.size() % 3) % 3, '=');
 }
+
+std::string base64::encodeVector(const std::vector<char> &val) {
+  using namespace boost::archive::iterators;
+  using It = base64_from_binary<
+      transform_width<std::vector<char>::const_iterator, 6, 8>>;
+  auto tmp = std::string(It(std::begin(val)), It(std::end(val)));
+  return tmp.append((3 - val.size() % 3) % 3, '=');
+}