aboutsummaryrefslogtreecommitdiffstats
path: root/src/Response.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Response.cpp')
-rw-r--r--src/Response.cpp107
1 files changed, 106 insertions, 1 deletions
diff --git a/src/Response.cpp b/src/Response.cpp
index 286de52..d97ab40 100644
--- a/src/Response.cpp
+++ b/src/Response.cpp
@@ -44,4 +44,109 @@ Response::json Response::create_response(std::vector<json> &&reply, std::string
response["session"] = session;
response["reply"] = std::move(reply);
return response;
-} \ No newline at end of file
+}
+
+static std::string const base64_chars =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789+/";
+
+std::string base64_encode(unsigned char const *input, unsigned int const len) {
+ std::string ret;
+ size_t i = 0;
+ unsigned char bytes[3];
+ unsigned char sextets[4];
+
+ while (i <= (len - 3)) {
+ bytes[0] = *(input++);
+ bytes[1] = *(input++);
+ bytes[2] = *(input++);
+
+ sextets[0] = (bytes[0] & 0xfc) >> 2; // Cuts last two bits off of first byte
+ sextets[1] = ((bytes[0] & 0x03) << 4) + ((bytes[1] & 0xf0)
+ >> 4); // Takes last two bits from first byte and adds it to first 4 bits of 2nd byte
+ sextets[2] = ((bytes[1] & 0x0f) << 2) + ((bytes[2] & 0xc0)
+ >> 6); // Takes last 4 bits of 2nd byte and adds it to first 2 bits of third byte
+ sextets[3] = bytes[2] & 0x3f; // takes last 6 bits of third byte
+
+ for (size_t j = 0; j < 4; ++j) {
+ ret += base64_chars[sextets[j]];
+ }
+
+ i += 3; // increases to go to third byte
+ }
+
+ if (i != len) {
+ size_t k = 0;
+ size_t j = len - i; // Find index of last byte
+ while (k < j) { // Sets first bytes
+ bytes[k] = *(input++);
+ ++k;
+ }
+
+ while (j < 3) { // Set last bytes to 0x00
+ bytes[j] = '\0';
+ ++j;
+ }
+
+ sextets[0] = (bytes[0] & 0xfc) >> 2; // Cuts last two bits off of first byte
+ sextets[1] = ((bytes[0] & 0x03) << 4) + ((bytes[1] & 0xf0)
+ >> 4); // Takes last two bits from first byte and adds it to first 4 bits of 2nd byte
+ sextets[2] = ((bytes[1] & 0x0f) << 2) + ((bytes[2] & 0xc0)
+ >> 6); // Takes last 4 bits of 2nd byte and adds it to first 2 bits of third byte
+ // No last one is needed, because if there were 4, then (i == len) == true
+
+ for (j = 0; j < (len - i) + 1; ++j) { // Gets sextets that include data
+ ret += base64_chars[sextets[j]]; // Appends them to string
+ }
+
+ while ((j++) < 4) // Appends remaining ='s
+ ret += '=';
+
+ }
+
+ return ret;
+}
+
+std::string base64_encode_file(std::string const &path) {
+ std::vector<char> temp;
+
+ std::ifstream infile;
+ infile.open(path, std::ios::binary); // Open file in binary mode
+ if (infile.is_open()) {
+ while (!infile.eof()) {
+ char c = (char) infile.get();
+ temp.push_back(c);
+ }
+ infile.close();
+ } else return "File could not be opened";
+ std::string ret(temp.begin(), temp.end() - 1);
+ ret = base64_encode((unsigned const char *) ret.c_str(), ret.size());
+
+ return ret;
+}
+
+Response::json Response::create_attachment(std::string const &file_path) {
+ std::string name = file_path;
+ if (auto pos = file_path.find_last_of('/'); pos != std::string::npos) {
+ name = file_path.substr(pos + 1);
+ }
+ return create_attachment(file_path, name);
+}
+
+Response::json Response::create_attachment(std::string const &file_path, std::string const &file_name) {
+ std::string type = "unknown";
+ if (auto pos = file_name.find_last_of('.'); pos != std::string::npos) {
+ type = file_name.substr(pos + 1);
+ }
+ return create_attachment(file_path, file_name, type);
+}
+
+Response::json
+Response::create_attachment(std::string const &file_path, std::string const &file_name, std::string const &file_type) {
+ json attachment(crow::json::type::Object);
+ attachment["type"] = file_type;
+ attachment["name"] = file_name;
+ attachment["content"] = base64_encode_file(file_path);
+ return attachment;
+}