Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
}