diff --git a/skeleton/Program/Build/RaspberryCloud.sdf b/skeleton/Program/Build/RaspberryCloud.sdf index 91ba34f0698f6bd2a2b93a41016139ecda53dad1..b02189586fc087e4ab4ae27e22e2a36710253432 100644 Binary files a/skeleton/Program/Build/RaspberryCloud.sdf and b/skeleton/Program/Build/RaspberryCloud.sdf differ diff --git a/skeleton/Program/Build/RaspberryCloud.v12.suo b/skeleton/Program/Build/RaspberryCloud.v12.suo index 8b277e7538bdb15dbfc9ef54f71888b851971cdb..e88b00ad8041e9b08d41c2bca7937b00532b09eb 100644 Binary files a/skeleton/Program/Build/RaspberryCloud.v12.suo and b/skeleton/Program/Build/RaspberryCloud.v12.suo differ diff --git a/skeleton/Program/Build/RaspberryCloud/RaspberryCloud.vcxproj b/skeleton/Program/Build/RaspberryCloud/RaspberryCloud.vcxproj index f1382ae2a8aec920161e0dff8606622c965d58fa..294671174eeb561188030ae310270bfcf1285438 100644 --- a/skeleton/Program/Build/RaspberryCloud/RaspberryCloud.vcxproj +++ b/skeleton/Program/Build/RaspberryCloud/RaspberryCloud.vcxproj @@ -42,7 +42,7 @@ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <LinkIncremental>true</LinkIncremental> <IncludePath>C:\KodoDependencies;$(IncludePath)</IncludePath> - <LibraryPath>c:\KodoDependencies\DependencyLIBS\;$(LibraryPath)</LibraryPath> + <LibraryPath>c:\KodoDependencies\DependencyLIBS\;C:\;$(LibraryPath)</LibraryPath> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <LinkIncremental>false</LinkIncremental> @@ -60,7 +60,9 @@ <Link> <SubSystem>Console</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> - <AdditionalDependencies>c:\KodoDependencies\DependencyLIBS\*.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>c:\KodoDependencies\DependencyLIBS\</AdditionalLibraryDirectories> + <ShowProgress>LinkVerbose</ShowProgress> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> diff --git a/skeleton/Program/Build/RaspberryCloud/store.dat b/skeleton/Program/Build/RaspberryCloud/store.dat index abe4227f7e8745374d1e7bb056cd166c8d9a5ce7..5e39d336a9d3bd58d2cda90215f1fb3843eebb7e 100644 --- a/skeleton/Program/Build/RaspberryCloud/store.dat +++ b/skeleton/Program/Build/RaspberryCloud/store.dat @@ -1,11 +1,24 @@ -2 -three.txt -104 1 -3.txt +test.jpg +283725 +10 +frag_000_000.frg localcm -two.txt -104 -1 -2.txt +frag_000_001.frg +localcm +frag_000_002.frg +localcm +frag_000_003.frg +localcm +frag_000_004.frg +localcm +frag_000_005.frg +localcm +frag_000_006.frg +localcm +frag_000_007.frg +localcm +frag_000_008.frg +localcm +frag_000_009.frg localcm diff --git a/skeleton/Program/Source/cloud/LocalCloudAdapter.cpp b/skeleton/Program/Source/cloud/LocalCloudAdapter.cpp index bd1854b9066a8aed7cb7c4b69108bc2c659aa227..164fd476d83f3d17e7ce32467129e8f6e187310d 100644 --- a/skeleton/Program/Source/cloud/LocalCloudAdapter.cpp +++ b/skeleton/Program/Source/cloud/LocalCloudAdapter.cpp @@ -2,6 +2,8 @@ #include "logger\\Logger.h" #include <fstream> +#include <boost/filesystem.hpp> + using namespace std; /** * LocalCloudAdapter implementation @@ -12,6 +14,14 @@ LocalCloudAdapter::LocalCloudAdapter(string _cloudID) : CloudAdapter(_cloudID) { bool LocalCloudAdapter::upload(CloudFile cloudFile) { LOG_ENTER_EXIT; + boost::filesystem::path cloudLocation = cloudFolder + cloudFile.getCloudFileID(); + boost::filesystem::path cloudParentDir = cloudLocation.parent_path(); + + if (!boost::filesystem::exists(cloudParentDir)) + { + boost::filesystem::create_directories(cloudParentDir); + } + //upload file ifstream src(fragFolder + cloudFile.getCloudFileID(), std::ios::binary); ofstream dst(cloudFolder + cloudFile.getCloudFileID(), std::ios::binary); 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 c7632b351cc0f481b05837b9113e6c0f0f0365dc..eea3992cd010b1cb1da41235ca798cc047ca4ea8 100644 --- a/skeleton/Program/Source/dataAccess/Encoder.cpp +++ b/skeleton/Program/Source/dataAccess/Encoder.cpp @@ -4,52 +4,36 @@ #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> +#include <boost/filesystem.hpp> /** * Encoder implementation */ -std::ifstream::pos_type filesize(std::string filename) -{ - std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary); - return in.tellg(); -} - FileDescriptor* Encoder::encode(string localFileID, string destinationFileID) { LOG_ENTER_EXIT; string dataFolder = "C:\\Users\\krisz\\raspberrycloud\\skeleton\\Program\\data\\"; string fragFolder = "C:\\Users\\krisz\\raspberrycloud\\skeleton\\Program\\temp\\"; - /*uint32_t max_symbols = 10; - uint32_t max_symbol_size = 5000;*/ - std::string encode_filename = dataFolder + localFileID; //check if file exists - if (!exists(encode_filename)){ + if (!boost::filesystem::exists(encode_filename)){ throw CloudException("No such file exists"); - return NULL; } - ifstream src(dataFolder + localFileID, std::ios::binary); - ofstream dst(fragFolder + destinationFileID, std::ios::binary); - dst << src.rdbuf(); - - src.close(); - dst.close(); - FileDescriptor* encoded = new FileDescriptor(localFileID); - ifstream in(dataFolder + localFileID, std::ifstream::ate | std::ifstream::binary); - long size = in.tellg(); - encoded->setSize(size); - in.close(); + long file_size = boost::filesystem::file_size(encode_filename); + encoded->setSize(file_size); - /*using file_encoder = kodo::object::file_encoder< + uint32_t max_symbols = 10; + uint32_t max_symbol_size = file_size / 10 + 1; + + using file_encoder = kodo::object::file_encoder< kodo::shallow_full_rlnc_encoder<fifi::binary >> ; file_encoder::factory encoder_factory(max_symbols, max_symbol_size); @@ -67,28 +51,25 @@ FileDescriptor* Encoder::encode(string localFileID, string destinationFileID) { { e->encode(payload.data()); - std::string filename = (boost::format("frag_%1$02d_%2$02d.frg") % i % j).str(); + std::string filename = (boost::format("%1%_%2$03d_%3$03d.frg") % destinationFileID % i % j).str(); + + boost::filesystem::path fragLocation = fragFolder + filename; + boost::filesystem::path fragParentDir = fragLocation.parent_path(); + + if (!boost::filesystem::exists(fragParentDir)) + { + boost::filesystem::create_directories(fragParentDir); + } std::ofstream fragFile( - fragFolder + filename, + fragLocation.c_str(), std::ios::out | std::ios::binary); std::copy(payload.begin(), payload.end(), std::ostreambuf_iterator<char>(fragFile)); fragFile.close(); - encoded->addFragment(*(new Fragment("unset", filename))); + encoded->addFragment(Fragment("unset", filename)); } - }*/ + } - encoded->addFragment(*(new Fragment("unset", destinationFileID))); return encoded; -} - -bool Encoder::exists(string name) { - if (FILE *file = fopen(name.c_str(), "r")) { - fclose(file); - return true; - } - else { - return false; - } } \ No newline at end of file diff --git a/skeleton/Program/Source/dataAccess/Encoder.h b/skeleton/Program/Source/dataAccess/Encoder.h index b46a38be5cbeab2198e2f061e62478085d1ee69e..ea46d69a8615032e74fdc68ca0b2688588164238 100644 --- a/skeleton/Program/Source/dataAccess/Encoder.h +++ b/skeleton/Program/Source/dataAccess/Encoder.h @@ -16,8 +16,6 @@ public: * @param localFileID id of the file to encode */ static FileDescriptor* encode(string localFileID, string destinationFileID); - - static bool exists(string name); }; #endif //_ENCODER_H \ No newline at end of file