Exemple #1
0
void	ImporterSoundWAV::read(BinaryFileStream &infile, DTcharacter id[4])
{
    infile.read_raw((DTubyte*)&id[0], sizeof(DTcharacter));
    infile.read_raw((DTubyte*)&id[1], sizeof(DTcharacter));
    infile.read_raw((DTubyte*)&id[2], sizeof(DTcharacter));
    infile.read_raw((DTubyte*)&id[3], sizeof(DTcharacter));
}
Exemple #2
0
void TWMWriter::end_export_section (BinaryFileStream &file, DTsize size_location)
{
    DTsize save_location = file.p();
    file.seek_p(size_location, Stream::FROM_BEGINNING);
    file << (DTint) (save_location-size_location-sizeof(DTint));
    file.seek_p(save_location, Stream::FROM_BEGINNING);
}
Exemple #3
0
DTsize TWMWriter::begin_export_section (BinaryFileStream &file, DTint section)
{
    file << section;
    DTsize size_location = file.p();
    file << (DTint) 0;
    
    return size_location;
}
Exemple #4
0
void AssetDownloader::append_data (std::string &data, BinaryFileStream &temp_file)
{

    // Search for HTTP header
    if (_total_size == 0) {
    
        std::size_t header_pos = data.find("\r\n\r\n");
        if (header_pos != std::string::npos) {
        
            // Parse the header
            std::string header = data.substr(0,header_pos);
            std::vector<std::string> header_items = MoreStrings::split(header, "\r\n");
            
            std::map<std::string,std::string> header_items_map;

            // Find the content length
            for (std::size_t i = 0; i < header_items.size(); ++i) {
                std::vector<std::string> header_item = MoreStrings::split(header_items[i],":");

                // Validate entry
                if (header_item.size() != 2)
                    continue;

                std::string param = MoreStrings::trim(header_item[0]);
                std::string value = MoreStrings::trim(header_item[1]);
                
                LOG_MESSAGE << "Header: " << param << " " << value;
                
                header_items_map[param] = value;
            }
            
            auto i = header_items_map.find("Content-Length");
            if (i != header_items_map.end())
                _total_size = MoreStrings::cast_from_string<DTsize>(i->second);
        
            // Strip off header
            data = data.substr(header_pos+4);
        }
        
    // Append data
    }
    
    if (_total_size > 0) {
        
        // Write out data to a file
        temp_file.write_raw( (DTubyte*) &(data[0]), data.size());
        
        // Update sizes
        _current_size += data.size();
        data.clear();
    }

    // Update progress
    update_status (STATUS_DOWNLOADING, _current_size, _total_size);
}
Exemple #5
0
void AssetDownloader::finalize_data (std::string &data, BinaryFileStream &temp_file)
{
    // Write out data to a file
    temp_file.write_raw( (DTubyte*) &(data[0]), data.size());

    // Update sizes
    _current_size += data.size();
    data.clear();

    // Update progress
    update_status (STATUS_DOWNLOADING, _current_size, _total_size);
}
void TestObjectSerialization3()
{
	ObjectFactory<Serializable> factory;

	//factory.Register("ObjectA", new ObjectCreator<ObjectA, Serializable>());
	factory.Register("ObjectD", new ObjectCreator<ObjectD, Serializable>());


	ObjectD d = ObjectD();
	d.Set(6, 7, 8, "ObjectD baby");
	d.AccessA().Set(1, 2, 3, "ObjectA baby");
	
	BinaryFileStream stream;

	stream.StartWrite("test3.txt");
	d.Save(stream);
	stream.SerializeQueue();
	stream.Close();

	std::vector<Serializable *> load;

	stream.StartRead("test3.txt", factory);
	ObjectD * loaded = stream.GetNext<ObjectD*>();

	stream.Close();
	loaded->Print();
	delete loaded;
}
Exemple #7
0
DTerr ImporterFontTTF::import(FontResource *target, std::string args)
{
    // Open up the stream for the font file
	BinaryFileStream *file = new BinaryFileStream();    // This pointer has to go through a C-API so no shared_ptr
	DTerr err = FileManager::open(*file, target->path(), true);
    if (err != DT3_ERR_NONE) {
        LOG_MESSAGE << "Unable to open font " << target->path().full_path();
        delete file;
        return DT3_ERR_FILE_OPEN_FAILED;
    }
    
    // Send the stream to freetype
    FT_Open_Args ftargs;

    ::memset((void *)&ftargs,0,sizeof(ftargs));
    
    ftargs.flags = FT_OPEN_STREAM;
    ftargs.stream=(FT_Stream)malloc(sizeof *(ftargs.stream));
    
    ftargs.stream->base = NULL;
    ftargs.stream->size = static_cast<DTuint>(file->length());
    ftargs.stream->pos = 0;
    ftargs.stream->descriptor.pointer = (void*) (file);
    ftargs.stream->pathname.pointer = NULL;
    ftargs.stream->read = &ImporterFontTTF::ft_io_func;
    ftargs.stream->close = &ImporterFontTTF::ft_close_func;

	FT_Error error = ::FT_Open_Face(FontResource::library(),
                                    &ftargs,
                                    0,
                                    &(target->typeface()));
    
    ::FT_Select_Charmap(target->typeface(),FT_ENCODING_UNICODE);
    
	return error == 0 ? DT3_ERR_NONE : DT3_ERR_FILE_OPEN_FAILED;
}
Exemple #8
0
// Tests reading and writing of a single long variant from and to binary files
TEST_F(TestVariant, FileIOBinaryIOMultipleTypes) {
    BinaryFileStream stream;

    // Values we'll be testing for
    long value1 = 123;
    std::string value2 = "test";
    auto value3 = nullptr;

    // Initialize variants
    Variant variant1(value1);
    Variant variant2(value2);
    Variant variant3(value3);

    // Open stream for writing
    stream.open(filename, std::ios::out);

    // Write variants
    stream << variant1;
    stream << variant2;
    stream << variant3;

    // Close stream
    stream.close();

    // Open stream for reading
    stream.open(filename, std::ios::in);

    // Initialize a final variant for storage of data read from the stream
    Variant variant("a value that must not conflict with the tests");

    stream >> variant;
    EXPECT_EQ(variant, value1);

    stream >> variant;
    EXPECT_EQ(variant, value2);

    stream >> variant;
    EXPECT_EQ(variant, value3);

    // Lets make sure this was all the data. We need to read again to set the
    // EOF bit
    char tc;
    EXPECT_FALSE(stream.get(tc));

    // Ensure EOF
    EXPECT_TRUE(stream.eof());

    // Close stream
    stream.close();
}
void TestObjectSerialization()
{
	ObjectFactory<Serializable> factory;

	factory.Register("ObjectA", new ObjectCreator<ObjectA, Serializable>());
	factory.Register("ObjectB", new ObjectCreator<ObjectB, Serializable>());
	factory.Register("ObjectC", new ObjectCreator<ObjectC, Serializable>());
	factory.Register("STLVectorObjectIO", new ObjectCreator<STLVectorObjectIO<ObjectA>, Serializable>());


	ObjectA a = ObjectA();
	a.Set(1, 2, 3, "ObjectA baby");

	ObjectB b = ObjectB();
	b.Set(6, 7, 8, "ObjectB baby");
	

	ObjectC c = ObjectC();
	c.Set(3, 4, 5, "ObjectC baby");

	b.data4 = &c;
	c.data4 = &b;

	BinaryFileStream stream;

	stream.StartWrite("test.txt");
	a.Save(stream);
	b.Save(stream);
	//c.Save(stream, true);
	stream.SerializeQueue();
	stream.Close();

	std::vector<Serializable *> load;

	stream.StartRead("test.txt", factory);
	//stream.LoadObjects(factory);

	ObjectA * loaded_a = stream.GetNext<ObjectA*>();
	ObjectB * loaded_b = stream.GetNext<ObjectB*>();
	ObjectC * loaded_c = stream.GetNext<ObjectC*>();

	stream.Close();

	loaded_a->Print();
	loaded_b->Print();
	loaded_c->Print();

	delete loaded_a;
	delete loaded_b;
	delete loaded_c;
}
Exemple #10
0
void	ImporterSoundWAV::read(BinaryFileStream &infile, DTint &v)
{
    infile.read_raw((DTubyte*)&v, sizeof(DTint));
    Endian::from_little_endian(v);
}
Exemple #11
0
void	ImporterSoundWAV::read(BinaryFileStream &infile, DTubyte &v)
{
    infile.read_raw((DTubyte*)&v, sizeof(DTbyte));
}
Exemple #12
0
DTerr ImporterImageJPG::import(const FilePath &pathname, const std::string &args, DTuint &width, DTuint &height, std::shared_ptr<DTubyte> &data, DT3GLTextelFormat &format)
{
    
	//
	// The following is based on the libpng manual. http://www.libpng.org/pub/png/libpng-1.2.5-manual.html#section-3.1
	//

	//
	// Check the file header
	//

	// open the file
	BinaryFileStream file;
	DTerr err;
	if ((err = FileManager::open(file, pathname, true)) != DT3_ERR_NONE)
		return err;

    // This struct contains the JPEG decompression parameters and pointers to
    // working space (which is allocated as needed by the JPEG library).
    jpeg_decompress_struct cinfo;
    ImportSource           csrc;

    // We use our private extension JPEG error handler.
    // Note that this struct must live as long as the main JPEG parameter
    // struct, to avoid dangling-pointer problems.
    ImportErr jerr;

    cinfo.err = jpeg_std_error(&jerr.pub);
    jerr.pub.error_exit = ImporterImageJPG::error_handler;
    
    // Establish the setjmp return context for my_error_exit to use.
    if (setjmp(jerr.setjmp_buffer)) {
        // If we get here, the JPEG code has signaled an error.
        // We need to clean up the JPEG object, close the input file, and return.
        jpeg_destroy_decompress(&cinfo);
        file.close();
        return DT3_ERR_FILE_WRONG_TYPE;
    }

    //  Now we can initialize the JPEG decompression object.
    jpeg_create_decompress(&cinfo);
    cinfo.src = (jpeg_source_mgr*) &csrc;

    //  Step 2: specify data source (eg, a file)
    jpeg_stream_src(&cinfo, file);

    //  Step 3: read file parameters with jpeg_read_header()
    jpeg_read_header(&cinfo, TRUE);

    //  Step 4: set parameters for decompression

    //  In this example, we don't need to change any of the defaults set by
    //  jpeg_read_header(), so we do nothing here.

    //  Step 5: Start decompressor
    jpeg_start_decompress(&cinfo);
    
    ASSERT(cinfo.out_color_components == 3 && cinfo.data_precision == 8);
    
    // Build a buffer for reading in the image
    width = cinfo.output_width;
    height = cinfo.output_height;
    format = DT3GL_FORMAT_RGB;
    
    // Change data format to 16 bit
    data = std::shared_ptr<DTubyte>(new DTubyte[width * height * 3]);
	DTubyte *buffer = data.get();
    
    DTint row_stride = cinfo.output_width * cinfo.output_components;
    
    // Make a one-row-high sample array that will go away when done with image
    JSAMPARRAY scanline_buffer = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
    
    // Step 6: while (scan lines remain to be read)
    // Here we use the library's state variable cinfo.output_scanline as the
    // loop counter, so that we don't have to keep track ourselves.

    while (cinfo.output_scanline < cinfo.output_height) {
        //jpeg_read_scanlines expects an array of pointers to scanlines.
        // Here the array is only one element long, but you could ask for
        // more than one scanline at a time if that's more convenient.

        jpeg_read_scanlines(&cinfo, scanline_buffer, 1);
        
        // Copy Row into buffer
        DTubyte *src_data = (DTubyte*) scanline_buffer[0];
        DTubyte *dst_data = (DTubyte*) &buffer[width * (height - cinfo.output_scanline) * 3];
        
        // Copy row
        ::memcpy(dst_data, src_data, row_stride);
    }

    // Step 7: Finish decompression
    jpeg_finish_decompress(&cinfo);

    // Step 8: Release JPEG decompression object
    // This is an important step since it will release a good deal of memory.
    jpeg_destroy_decompress(&cinfo);
    
//#endif

	return DT3_ERR_NONE;
}
void TestObjectSerialization2()
{
	ObjectFactory<Serializable> factory;

	factory.Register("ObjectA", new ObjectCreator<ObjectA, Serializable>());
	factory.Register("ObjectB", new ObjectCreator<ObjectB, Serializable>());
	factory.Register("ObjectC", new ObjectCreator<ObjectC, Serializable>());
	factory.Register("STLVectorObjectIO_ObjectA", new ObjectCreator<STLVectorObjectIO<ObjectA>, Serializable>());
	factory.Register("STLVectorObjectIO_ObjectB", new ObjectCreator<STLVectorObjectIO<ObjectB>, Serializable>());
	factory.Register("STLVectorObjectIO_ObjectC", new ObjectCreator<STLVectorObjectIO<ObjectC>, Serializable>());
	factory.Register("STLVectorObjectIO_Serializable", new ObjectCreator<STLVectorObjectIO<Serializable>, Serializable>());


	
	ObjectC a = ObjectC();
	a.Set(1, 2, 3, "ObjectA baby");

	ObjectC b = ObjectC();
	b.Set(4, 5, 6, "ObjectB baby");

	ObjectC c = ObjectC();
	c.Set(7, 8, 9, "ObjectC baby");

	ObjectB d = ObjectB();
	d.Set(10, 11, 12, "ObjectD baby");

	ObjectB e = ObjectB();
	e.Set(13, 14, 15, "ObjectE baby");

	ObjectB f = ObjectB();
	f.Set(16, 17, 18, "ObjectF baby");

	a.data4 = &d;
	b.data4 = &e;
	c.data4 = &f;

	d.data4 = &a;
	e.data4 = &b;
	f.data4 = &c;


	BinaryFileStream stream;

	std::vector<ObjectC const *> to_serialize_C;
	to_serialize_C.push_back(&a);
	to_serialize_C.push_back(&b);
	to_serialize_C.push_back(&c);
	STLVectorObjectIO<ObjectC>  * proxy_C  = new STLVectorObjectIO<ObjectC>(&to_serialize_C, "ObjectC");

	std::vector<ObjectB const *> to_serialize_B;
	to_serialize_B.push_back(&d);
	to_serialize_B.push_back(&e);
	to_serialize_B.push_back(&f);
	STLVectorObjectIO<ObjectB>  * proxy_B  = new STLVectorObjectIO<ObjectB>(&to_serialize_B, "ObjectB");

	std::vector<Serializable *> to_serialize_master;
	to_serialize_master.push_back(proxy_C);
	to_serialize_master.push_back(proxy_B);
	STLVectorObjectIO<Serializable>  * proxy_master  = new STLVectorObjectIO<Serializable>(&to_serialize_master, "Serializable");


	stream.StartWrite("test2.txt");
	proxy_master->Save(stream);
	stream.SerializeQueue();
	stream.Close();
	

	std::vector<Serializable *> load;
	

	stream.StartRead("test2.txt", factory);
	STLVectorObjectIO<Serializable> * loaded_vector_proxy_M = stream.GetNext<STLVectorObjectIO<Serializable> *>();
	stream.SetEOF();


	STLVectorObjectIO<ObjectC> * loaded_vector_proxy_C = loaded_vector_proxy_M->GetAs<STLVectorObjectIO<ObjectC>*>(0);
	STLVectorObjectIO<ObjectB> * loaded_vector_proxy_B = loaded_vector_proxy_M->GetAs<STLVectorObjectIO<ObjectB>*>(1);
	
	for(unsigned int i = 0; i < loaded_vector_proxy_C->Size(); ++i)
	{
		(*loaded_vector_proxy_C)[i]->Print();
	}
	for(unsigned int i = 0; i < loaded_vector_proxy_B->Size(); ++i)
	{
		(*loaded_vector_proxy_B)[i]->Print();
	}

	loaded_vector_proxy_C->DeleteObjects();
	loaded_vector_proxy_B->DeleteObjects();
	loaded_vector_proxy_M->DeleteObjects();
	delete loaded_vector_proxy_M;
}