diff --git a/skeleton/Program/Build/RaspberryCloud.v12.suo b/skeleton/Program/Build/RaspberryCloud.v12.suo index 8b277e7538bdb15dbfc9ef54f71888b851971cdb..72b9117380fa07eeaa98d85489ba24ec78451468 100644 Binary files a/skeleton/Program/Build/RaspberryCloud.v12.suo and b/skeleton/Program/Build/RaspberryCloud.v12.suo differ diff --git a/skeleton/Program/Source/dataAccess/ComputeOnClient.cpp b/skeleton/Program/Source/dataAccess/ComputeOnClient.cpp index 54a6dab39eb1a824c6218ff8ab6f0fdc84ed7154..215a21d7803ab2063ec9992239b4171967d74fa7 100644 --- a/skeleton/Program/Source/dataAccess/ComputeOnClient.cpp +++ b/skeleton/Program/Source/dataAccess/ComputeOnClient.cpp @@ -52,7 +52,7 @@ string ComputeOnClient::getFile(FileDescriptor fileDescriptor) { FileDescriptor* downloaded = cloudFileSystem.getCloudAccessLayer()->download(*fileToDownload); cloudFileSystem.unlock(*fileToDownload); - return Decoder::decode(downloaded); + return Decoder::decode(fileToDownload); } else { diff --git a/skeleton/Program/Source/dataAccess/Decoder.cpp b/skeleton/Program/Source/dataAccess/Decoder.cpp index bd17d22c2e464d3afacc23f13a05c5d0e905b026..711b3a73ea62c0b6556a58d990308f651749c9ed 100644 --- a/skeleton/Program/Source/dataAccess/Decoder.cpp +++ b/skeleton/Program/Source/dataAccess/Decoder.cpp @@ -4,6 +4,11 @@ #include "Encoder.h" #include <string> #include <fstream> + +#include <kodo/object/file_decoder.hpp> +#include <kodo/rlnc/full_rlnc_codes.hpp> + +#include <boost/format.hpp> /** * Decoder implementation */ @@ -17,29 +22,60 @@ string Decoder::decode(FileDescriptor* fileDescriptor) { return "unable to decode"; } - vector<Fragment> frags = fileDescriptor->getFragments(); - if (frags.size() > 0) + auto fragments = fileDescriptor->getFragments(); + if (fragments.size() > 0) { - Fragment f = frags.at(0); - //check if file exists - if (!Encoder::exists(fragFolder+f.getCloudFileID())){ - throw CloudException("No such file exists"); - return NULL; - } + uint32_t max_symbols = 10; + uint32_t max_symbol_size = fileDescriptor->getSize() / 10 + 1; + + using file_decoder = kodo::object::file_decoder< + kodo::shallow_full_rlnc_decoder<fifi::binary >> ; + + file_decoder::factory decoder_factory(max_symbols, max_symbol_size); + + decoder_factory.set_filename(dataFolder + fileDescriptor->getFileID()); + decoder_factory.set_file_size(fileDescriptor->getSize()); + + auto decoder = decoder_factory.build(); - ifstream src(fragFolder + f.getCloudFileID(), std::ios::binary); - ofstream dst(dataFolder + fileDescriptor->getFileID(), std::ios::binary); - dst << src.rdbuf(); + for (uint32_t i = 0; i < decoder->blocks(); i++) + { + auto d = decoder->build(i); - src.close(); - dst.close(); + for (int fragNum = 0; fragNum < fragments.size() && !d->is_complete(); fragNum++) + { + std::vector<uint8_t> payload; - //delete temp - string spath = fragFolder + f.getCloudFileID(); - const char* path = spath.c_str(); - int res = remove(path); - cout << res; - cout << spath << endl; + std::ifstream fragFile( + fragFolder + fragments[fragNum].getCloudFileID(), + std::ios::in | std::ios::binary); + + if (!fragFile) + { + throw CloudException("No such file exists"); + } + + std::copy(std::istreambuf_iterator<char>(fragFile), + std::istreambuf_iterator<char>(), + std::back_inserter(payload)); + fragFile.close(); + payload.shrink_to_fit(); + + d->decode(payload.data()); + } + + // Not removed in previous loop, because that doesn't necessarily + // iterate through every fragment + for each (Fragment fragment in fragments) + { + remove((fragFolder + fragment.getCloudFileID()).c_str()); + } + + if (!d->is_complete()) + { + throw CloudException("Error while assembling file"); + } + } return "Successfully decoded " + fileDescriptor->getFileID(); } else { diff --git a/skeleton/Program/Source/dataAccess/Encoder.cpp b/skeleton/Program/Source/dataAccess/Encoder.cpp index 6507ec7fe8bf22cea5e28a122b4a0d898a51d293..666d273c252e4415e3b040bc1641c7e0663b9039 100644 --- a/skeleton/Program/Source/dataAccess/Encoder.cpp +++ b/skeleton/Program/Source/dataAccess/Encoder.cpp @@ -4,7 +4,6 @@ #include <fstream> #include <kodo/object/file_encoder.hpp> -#include <kodo/object/file_decoder.hpp> #include <kodo/rlnc/full_rlnc_codes.hpp> #include <boost/format.hpp>