Changeset 8321
- Timestamp:
- 05/14/08 16:59:50
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
OpenSceneGraph/trunk/src/osgPlugins/curl/ReaderWriterCURL.cpp
r8320 r8321 19 19 #include <iostream> 20 20 #include <sstream> 21 #include <fstream> 21 22 22 23 #include <curl/curl.h> … … 27 28 public: 28 29 29 struct Stream Pair30 { 31 Stream Pair(std::ostream* stream1, std::ostream* stream2=0):30 struct StreamObject 31 { 32 StreamObject(std::ostream* stream1, const std::string& cacheFileName): 32 33 _stream1(stream1), 33 _stream2(stream2) {} 34 35 std::ostream* _stream1; 36 std::ostream* _stream2; 34 _cacheFileName(cacheFileName) 35 { 36 _foutOpened = false; 37 } 38 39 void write(const char* ptr, size_t realsize) 40 { 41 if (_stream1) _stream1->write(ptr, realsize); 42 43 if (!_cacheFileName.empty()) 44 { 45 if (!_foutOpened) 46 { 47 osg::notify(osg::INFO)<<"Writing to cache: "<<_cacheFileName<<std::endl; 48 _fout.open(_cacheFileName.c_str(), std::ios::out | std::ios::binary); 49 _foutOpened = true; 50 } 51 52 if (_fout) 53 { 54 _fout.write(ptr, realsize); 55 } 56 } 57 } 58 59 std::ostream* _stream1; 60 61 bool _foutOpened; 62 std::string _cacheFileName; 63 std::ofstream _fout; 37 64 }; 38 65 … … 40 67 { 41 68 size_t realsize = size * nmemb; 42 StreamPair* sp = (StreamPair*)data; 43 44 if (sp->_stream1) sp->_stream1->write((const char*)ptr, realsize); 45 if (sp->_stream2) sp->_stream2->write((const char*)ptr, realsize); 69 StreamObject* sp = (StreamObject*)data; 70 71 sp->write((const char*)ptr, realsize); 46 72 47 73 return realsize; … … 69 95 70 96 71 osgDB::ReaderWriter::ReadResult read(const std::string& proxyAddress, const std::string& fileName, Stream Pair& sp)97 osgDB::ReaderWriter::ReadResult read(const std::string& proxyAddress, const std::string& fileName, StreamObject& sp) 72 98 { 73 99 if(!proxyAddress.empty()) … … 255 281 osgDB::getServerAddress(fileName) + "/" + 256 282 osgDB::getServerFileName(fileName); 257 } 258 283 284 std::string path = osgDB::getFilePath(cacheFileName); 285 286 if (!osgDB::fileExists(path) && !osgDB::makeDirectory(path)) 287 { 288 cacheFileName.clear(); 289 } 290 } 291 259 292 if (!cacheFilePath.empty() && osgDB::fileExists(cacheFileName)) 260 293 { … … 286 319 287 320 std::stringstream buffer; 288 289 EasyCurl::StreamPair sp(&buffer); 290 321 ReadResult curlResult; 322 323 EasyCurl::StreamObject sp(&buffer, cacheFileName); 324 291 325 //ReadResult result = _easyCurl.read(proxyAddress, fileName, sp); 292 ReadResult result = getEasyCurl().read(proxyAddress, fileName, sp); 293 294 if (result.status()==ReadResult::FILE_LOADED) 295 { 326 curlResult = getEasyCurl().read(proxyAddress, fileName, sp); 327 328 if (curlResult.status()==ReadResult::FILE_LOADED) 329 { 330 296 331 osg::ref_ptr<Options> local_opt = const_cast<Options*>(options); 297 332 if (!local_opt) local_opt = new Options; … … 303 338 local_opt->getDatabasePathList().pop_front(); 304 339 305 if (!cacheFilePath.empty() && readResult.validObject())306 {307 osg::notify(osg::INFO)<<"Writing cache file "<<cacheFileName<<std::endl;308 309 std::string filePath = osgDB::getFilePath(cacheFileName);310 if (osgDB::fileExists(filePath) || osgDB::makeDirectory(filePath))311 {312 switch(objectType)313 {314 case(OBJECT): osgDB::writeObjectFile( *(readResult.getObject()), cacheFileName ); break;315 case(IMAGE): osgDB::writeImageFile( *(readResult.getImage()), cacheFileName ); break;316 case(HEIGHTFIELD): osgDB::writeHeightFieldFile( *(readResult.getHeightField()), cacheFileName ); break;317 case(NODE): osgDB::writeNodeFile( *(readResult.getNode()), cacheFileName ); break;318 default: break;319 }320 }321 else322 {323 osg::notify(osg::NOTICE)<<"Error: Failed to created directory "<<filePath<<std::endl;324 }325 326 }327 328 340 return readResult; 329 341 } 330 342 else 331 343 { 332 return result;344 return curlResult; 333 345 } 334 346 }
