예제 #1
0
std::vector<double> PottsMeshReader<SPACE_DIM>::GetNextNode()
{
    std::vector<double> node_data;

    std::string buffer;
    GetNextLineFromStream(mNodesFile, buffer);

    std::stringstream buffer_stream(buffer);

    unsigned index;
    buffer_stream >> index;

    unsigned offset = mIndexFromZero ? 0 : 1;
    if (index != mNodesRead + offset)
    {
        EXCEPTION("Data for node " << mNodesRead << " missing");
    }

    double node_value;
    for (unsigned i=0; i<SPACE_DIM+1; i++)
    {
        buffer_stream >> node_value;
        node_data.push_back(node_value);
    }

    mNodesRead++;
    return node_data;
}
    virtual void do_send(const char * const buffer, size_t len) {
        const char * temp_buffer = buffer;
        size_t       temp_length = len;

        const size_t MAX_DATA_LENGTH = 1024 * 60;

        BStream buffer_stream(65536);

        while (temp_length) {
            const size_t data_length = (temp_length > MAX_DATA_LENGTH) ? MAX_DATA_LENGTH : temp_length;

            uint8_t  compressed_type      = 0;
            uint16_t compressed_data_size = 0;

            this->mppc_enc.compress(reinterpret_cast<const uint8_t *>(temp_buffer), data_length,
                compressed_type, compressed_data_size, rdp_mppc_enc::MAX_COMPRESSED_DATA_SIZE_UNUSED);

            buffer_stream.reset();

            buffer_stream.out_uint8(this->reset_compressor ? 1 : 0);
            this->reset_compressor = false;

            buffer_stream.out_uint8(compressed_type);

            if (compressed_type & PACKET_COMPRESSED) {
                buffer_stream.out_uint16_le(compressed_data_size);

                this->mppc_enc.get_compressed_data(buffer_stream);

                buffer_stream.mark_end();

                this->target_transport.send(buffer_stream);
            }
            else {
                buffer_stream.out_uint16_le(data_length);

                buffer_stream.mark_end();

                this->target_transport.send(buffer_stream);

                this->target_transport.send(temp_buffer, data_length);
            }

            temp_buffer += data_length;
            temp_length -= data_length;
        }
    }
예제 #3
0
ElementData PottsMeshReader<SPACE_DIM>::GetNextElementData()
{
    // Create data structure for this element
    ElementData element_data;

    std::string buffer;
    GetNextLineFromStream(mElementsFile, buffer);

    std::stringstream buffer_stream(buffer);

    unsigned element_index;
    buffer_stream >> element_index;

    unsigned offset = mIndexFromZero ? 0 : 1;
    if (element_index != mElementsRead + offset)
    {
        EXCEPTION("Data for element " << mElementsRead << " missing");
    }

    unsigned num_nodes_in_element;
    buffer_stream >> num_nodes_in_element;

    // Store node indices owned by this element
    unsigned node_index;
    for (unsigned i=0; i<num_nodes_in_element; i++)
    {
        buffer_stream >> node_index;
        element_data.NodeIndices.push_back(node_index - offset);
    }

    if (mNumElementAttributes > 0)
    {
        assert(mNumElementAttributes==1);

        unsigned attribute_value;
        buffer_stream >> attribute_value;
        element_data.AttributeValue = attribute_value;
    }
    void send_to_target() {
        if (!this->compressed_data_length)
            return;

        BStream buffer_stream(128);

        buffer_stream.out_uint8(this->reset_compressor ? 1 : 0);
        this->reset_compressor = false;

        buffer_stream.out_uint32_le(this->compressed_data_length);
        if (this->verbose) {
            LOG( LOG_INFO
               , "GZipCompressionOutTransport::send_to_target: compressed_data_length=%u"
               , this->compressed_data_length);
        }

        buffer_stream.mark_end();
        this->target_transport.send(buffer_stream);

        this->target_transport.send(this->compressed_data, this->compressed_data_length);

        this->compressed_data_length = 0;
    }