the files are processed in chunks

This commit is contained in:
Luna 2025-05-16 06:01:13 +02:00
parent 085e7e6dfa
commit 0c00146151
2 changed files with 33 additions and 19 deletions

View file

@ -144,7 +144,7 @@ std::string get_filename(std::string data)
void write_file(const std::string& filename, char *start_data, char *end_data) void write_file(const std::string& filename, char *start_data, char *end_data)
{ {
FILE *fd = fopen(filename.c_str(), "wb"); FILE *fd = fopen(filename.c_str(), "ab");
while (start_data != end_data) while (start_data != end_data)
{ {
fwrite(start_data, sizeof(char), 1, fd); fwrite(start_data, sizeof(char), 1, fd);
@ -153,6 +153,14 @@ void write_file(const std::string& filename, char *start_data, char *end_data)
fclose(fd); fclose(fd);
} }
void write_file_size(const std::string& filename, char *start_data, size_t size)
{
FILE *fd = fopen(filename.c_str(), "ab");
int index = 0;
fwrite(start_data, sizeof(char), size, fd);
fclose(fd);
}
char *search_substring(char *start_data, const char *substring, size_t size) char *search_substring(char *start_data, const char *substring, size_t size)
{ {
size_t index = 0; size_t index = 0;
@ -251,28 +259,34 @@ int main()
{ {
std::string line_str = std::string(line1); std::string line_str = std::string(line1);
std::string line_str2 = std::string(line); std::string line_str2 = std::string(line);
std::string line_str3 = std::string(line2);
std::string line_str4 = std::string(line3);
auto h = parse_header(line_str); auto h = parse_header(line_str);
std::vector<std::string> file_ = split(h.begin()->second, "; "); std::vector<std::string> file_ = split(h.begin()->second, "; ");
std::string filename = get_filename(file_.back()); std::string filename = get_filename(file_.back());
size_t size = file_size - (line_str.size() + std::string(line2).size() + std::string(line3).size() + (line_str2.size())); int size_to_get = line_str.size() + line_str2.size() + line_str3.size() + line_str4.size();
char *file_data = server.receive_data_ensured(user, size); size_to_get = file_size - size_to_get;
if (!file_data) int chunks_to_get = (size_to_get / 2048) + 1;
throw std::runtime_error("Getting file data failed"); int last_chunk_size = size_to_get % 2048;
std::string final_boundary = std::format("\r\n--{}--", boundary); while (chunks_to_get > 0)
char *end = search_substring(file_data, final_boundary.c_str(), file_size);
if (!end)
{ {
std::println("Couldn't find ending for the file"); if (chunks_to_get == 1)
free(line); {
free(line1); char *chunk = server.receive_data_ensured(user, last_chunk_size);
free(line2); std::string final_boundary = std::format("\r\n--{}--", boundary);
free(line3); char *end = search_substring(chunk, final_boundary.c_str(), file_size);
break; write_file(filename, chunk, end);
free(chunk);
}
else
{
char *chunk = server.receive_data_ensured(user, 2048);
write_file_size(filename, chunk, 2048);
free(chunk);
}
chunks_to_get--;
std::println("Chunks left: {}", chunks_to_get);
} }
write_file(filename, file_data, end);
print_map(h);
free(file_data);
std::println("File {} received", filename);
} }
free(line); free(line);
free(line1); free(line1);

2
netlib

@ -1 +1 @@
Subproject commit 57b7a51ebbec052c421ecbab66884319faaad26f Subproject commit 81313776bc951f88387f0a9f7cec06fb04d1fcb9