From 1cac1de3b27c5c6a511bf86bd9cb1d763c5c7d5d Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sun, 25 Mar 2012 14:47:51 +0300 Subject: Almost support loading sounds from server --- src/client.cpp | 206 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 106 insertions(+), 100 deletions(-) (limited to 'src/client.cpp') diff --git a/src/client.cpp b/src/client.cpp index 56555804e..6da26abfb 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -40,6 +40,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "clientmap.h" #include "filecache.h" #include "sound.h" +#include "utility_string.h" +#include "hex.h" static std::string getMediaCacheDir() { @@ -795,6 +797,66 @@ void Client::step(float dtime) } } +bool Client::loadMedia(const std::string &data, const std::string &filename) +{ + // Silly irrlicht's const-incorrectness + Buffer data_rw(data.c_str(), data.size()); + + std::string name; + + const char *image_ext[] = { + ".png", ".jpg", ".bmp", ".tga", + ".pcx", ".ppm", ".psd", ".wal", ".rgb", + NULL + }; + name = removeStringEnd(filename, image_ext); + if(name != "") + { + verbosestream<<"Client: Attempting to load image " + <<"file \""<getFileSystem(); + video::IVideoDriver *vdrv = m_device->getVideoDriver(); + + // Create an irrlicht memory file + io::IReadFile *rfile = irrfs->createMemoryReadFile( + *data_rw, data_rw.getSize(), "_tempreadfile"); + assert(rfile); + // Read image + video::IImage *img = vdrv->createImageFromFile(rfile); + if(!img){ + errorstream<<"Client: Cannot create image from data of " + <<"file \""<drop(); + return false; + } + else { + m_tsrc->insertSourceImage(filename, img); + img->drop(); + rfile->drop(); + return true; + } + } + + const char *sound_ext[] = { + "0.ogg", "1.ogg", "2.ogg", "3.ogg", "4.ogg", + "5.ogg", "6.ogg", "7.ogg", "8.ogg", "9.ogg", + ".ogg", NULL + }; + name = removeStringEnd(filename, sound_ext); + if(name != "") + { + verbosestream<<"Client: Attempting to load sound " + <<"file \""<loadSoundData(name, data); + return true; + } + + errorstream<<"Client: Don't know how to load file \"" + <getFileSystem(); - video::IVideoDriver *vdrv = m_device->getVideoDriver(); - std::string datastring((char*)&data[2], datasize-2); std::istringstream is(datastring, std::ios_base::binary); @@ -1410,13 +1469,11 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) core::list file_requests; - for(int i=0; i data_rw(tmp_os.str().c_str(), tmp_os.str().size()); - - // Create an irrlicht memory file - io::IReadFile *rfile = irrfs->createMemoryReadFile( - *data_rw, tmp_os.str().size(), "_tempreadfile"); - assert(rfile); - // Read image - video::IImage *img = vdrv->createImageFromFile(rfile); - if(!img){ - infostream<<"Client: Cannot create image from data of " - <<"received file \""<drop(); - } - else { - m_tsrc->insertSourceImage(name, img); - img->drop(); - rfile->drop(); - - file_found = true; - } + bool success = loadMedia(tmp_os.str(), name); + if(success){ + verbosestream<<"Client: Loaded cached media: " + <"< "<::Iterator i = file_requests.begin(); i != file_requests.end(); i++) { @@ -1521,11 +1538,6 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) } else if(command == TOCLIENT_MEDIA) { - verbosestream<<"Client received TOCLIENT_MEDIA"<getFileSystem(); - video::IVideoDriver *vdrv = m_device->getVideoDriver(); - std::string datastring((char*)&data[2], datasize-2); std::istringstream is(datastring, std::ios_base::binary); @@ -1547,7 +1559,10 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) */ int num_bunches = readU16(is); int bunch_i = readU16(is); - m_media_receive_progress = (float)bunch_i / (float)(num_bunches - 1); + if(num_bunches >= 2) + m_media_receive_progress = (float)bunch_i / (float)(num_bunches - 1); + else + m_media_receive_progress = 1.0; if(bunch_i == num_bunches - 1) m_media_received = true; int num_files = readU32(is); @@ -1564,19 +1579,14 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) <<"sent by server: \""< data_rw(data.c_str(), data.size()); - // Create an irrlicht memory file - io::IReadFile *rfile = irrfs->createMemoryReadFile( - *data_rw, data.size(), "_tempreadfile"); - assert(rfile); - // Read image - video::IImage *img = vdrv->createImageFromFile(rfile); - if(!img){ - errorstream<<"Client: Cannot create image from data of " - <<"received file \""<drop(); + + bool success = loadMedia(data, name); + if(success){ + verbosestream<<"Client: Loaded received media: " + <<"\""<getValue(), data); + m_media_cache.update_sha1(data); } - - m_tsrc->insertSourceImage(name, img); - img->drop(); - rfile->drop(); } ClientEvent event; -- cgit v1.2.3