dav_ssize_t HttpIOVecOps::parseMultipartRequest(HttpRequest & _req, const IntervalTree<ElemChunk> & tree, DavixError** err) { std::string boundary; dav_ssize_t ret = 0, tmp_ret =0; DAVIX_SLOG(DAVIX_LOG_TRACE, DAVIX_LOG_CHAIN, "Davix::parseMultipartRequest multi part parsing"); if(get_multi_part_info(_req, boundary, err) != 0){ DAVIX_SLOG(DAVIX_LOG_TRACE, DAVIX_LOG_CHAIN, "Invalid Header Content info for multi part request"); return -1; } DAVIX_SLOG(DAVIX_LOG_DEBUG, DAVIX_LOG_CHAIN, "Davix::parseMultipartRequest multi-part boundary {}", boundary); while(1) { DAVIX_SLOG(DAVIX_LOG_DEBUG, DAVIX_LOG_CHAIN, "Davix::parseMultipartRequest parsing a new chunk"); ChunkInfo infos; int n_try = 0; tmp_ret = parse_multi_part_header(_req, boundary, infos, n_try, err); if(tmp_ret == -2) break; // terminating boundary if(tmp_ret == -1) return -1; // error if( (tmp_ret = copyChunk(_req, tree, infos.offset, infos.size, err)) <0 ) return -1; ret += tmp_ret; DAVIX_SLOG(DAVIX_LOG_DEBUG, DAVIX_LOG_CHAIN, "Davix::parseMultipartRequest chunk parsed with success, next chunk.."); } // finish with success, dump the remaining part of the query to end the request properly char buffer[255]; while( _req.readBlock(buffer, 255, NULL) > 0); return ret; }
void copyChunk(Chunk *dest, Chunk *src) { Block *srcBlock, *destBlock; for (int x = 0; x < CHUNK_SIZE; x++) { for (int y = 0; y < CHUNK_SIZE; y++) { for (int z = 0; z < CHUNK_SIZE; z++) { srcBlock = getBlock(src, x, y, z); destBlock = getBlock(dest, x, y, z); destBlock->active = srcBlock->active; destBlock->color = srcBlock->color; if (destBlock->logic) { free(destBlock->logic); destBlock->logic = NULL; } if (destBlock->data) { destBlock->data = NULL; } if (srcBlock->logic) { destBlock->logic = calloc(1, sizeof(Logic)); memcpy(destBlock->logic, srcBlock->logic, sizeof(Logic)); updateLogicModel(destBlock); } else if (srcBlock->data) { destBlock->data = createModel(); copyChunk(destBlock->data->chunk, srcBlock->data->chunk); renderModel(destBlock->data); } } } } renderChunk(dest); }