BOOL LLVOCache::updateEntry(const HeaderEntryInfo* entry) { LLAPRFile apr_file(mHeaderFileName, APR_WRITE|APR_BINARY, mLocalAPRFilePoolp); apr_file.seek(APR_SET, entry->mIndex * sizeof(HeaderEntryInfo) + sizeof(HeaderMetaInfo)) ; return check_write(&apr_file, (void*)entry, sizeof(HeaderEntryInfo)) ; }
void LLVOCache::writeCacheHeader() { if (!mEnabled) { llwarns << "Not writing cache header: Cache is currently disabled." << llendl; return; } if(mReadOnly) { llwarns << "Not writing cache header: Cache is currently in read-only mode." << llendl; return; } bool success = true ; { LLAPRFile apr_file(mHeaderFileName, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp); //write the meta element success = check_write(&apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)) ; mNumEntries = 0 ; for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; success && iter != mHeaderEntryQueue.end(); ++iter) { (*iter)->mIndex = mNumEntries++ ; success = check_write(&apr_file, (void*)*iter, sizeof(HeaderEntryInfo)); } mNumEntries = mHeaderEntryQueue.size() ; if(success && mNumEntries < MAX_NUM_OBJECT_ENTRIES) { HeaderEntryInfo* entry = new HeaderEntryInfo() ; entry->mTime = INVALID_TIME ; for(S32 i = mNumEntries ; success && i < MAX_NUM_OBJECT_ENTRIES ; i++) { //fill the cache with the default entry. success = check_write(&apr_file, entry, sizeof(HeaderEntryInfo)) ; } delete entry ; } } if(!success) { clearCacheInMemory() ; mReadOnly = TRUE ; //disable the cache. } return ; }
bool LLAssetConverter::copyBVH(const std::string &src_filename, const std::string &dst_filename) { S32 file_size; LLAPRFile fp(src_filename, LL_APR_RB, &file_size); if(!fp.getFileHandle()) return false; std::vector<char> buffer(file_size + 1); ELoadStatus load_status = E_ST_OK; S32 line_number = 0; LLBVHLoader* loaderp = new LLBVHLoader(&buffer[0], load_status, line_number); if(load_status == E_ST_NO_XLT_FILE) { llwarns << "NOTE: No translation table found." << llendl; } else if(load_status != E_ST_OK) { llwarns << "ERROR: [line: " << line_number << "] " << STATUS[load_status].c_str() << llendl; } buffer.resize(loaderp->getOutputSize()); LLDataPackerBinaryBuffer dp((U8*)&buffer[0], buffer.size()); loaderp->serialize(dp); delete loaderp; LLAPRFile apr_file(dst_filename, LL_APR_RB, &file_size); if(!apr_file.getFileHandle()) return false; apr_file.write(&buffer[0], buffer.size()); return true; }
// static LLAssetType::EType LLAssetConverter::convert(std::string src_filename, std::string filename) { std::string exten = gDirUtilp->getExtension(src_filename); LLAssetType::EType asset_type = LLAssetType::AT_NONE; if (exten.empty()) return LLAssetType::AT_NONE; else if(exten == "bmp") { asset_type = LLAssetType::AT_TEXTURE; if (!LLViewerImageList::createUploadFile(src_filename, filename, IMG_CODEC_BMP )) { return LLAssetType::AT_NONE; } } else if( exten == "tga") { asset_type = LLAssetType::AT_TEXTURE; if (!LLViewerImageList::createUploadFile(src_filename, filename, IMG_CODEC_TGA )) { return LLAssetType::AT_NONE; } } else if( exten == "jpg" || exten == "jpeg") { asset_type = LLAssetType::AT_TEXTURE; if (!LLViewerImageList::createUploadFile(src_filename, filename, IMG_CODEC_JPEG )) { return LLAssetType::AT_NONE; } } else if( exten == "png") { asset_type = LLAssetType::AT_TEXTURE; if (!LLViewerImageList::createUploadFile(src_filename, filename, IMG_CODEC_PNG )) { return LLAssetType::AT_NONE; } } else if(exten == "wav") { asset_type = LLAssetType::AT_SOUND; if(encode_vorbis_file(src_filename, filename) != LLVORBISENC_NOERR) { return LLAssetType::AT_NONE; } } else if(exten == "ogg") { asset_type = LLAssetType::AT_SOUND; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } //else if(exten == "tmp") FIXME else if (exten == "bvh") { asset_type = LLAssetType::AT_ANIMATION; S32 file_size; LLAPRFile fp; fp.open(src_filename, LL_APR_RB, LLAPRFile::global, &file_size); if(!fp.getFileHandle()) return LLAssetType::AT_NONE; char* file_buffer = new char[file_size + 1]; if(fp.read(file_buffer, file_size) == 0) //not sure if this is right, gotta check this one { fp.close(); delete[] file_buffer; return LLAssetType::AT_NONE; } LLBVHLoader* loaderp = new LLBVHLoader(file_buffer); if(!loaderp->isInitialized()) { fp.close(); delete[] file_buffer; return LLAssetType::AT_NONE; } S32 buffer_size = loaderp->getOutputSize(); U8* buffer = new U8[buffer_size]; LLDataPackerBinaryBuffer dp(buffer, buffer_size); loaderp->serialize(dp); LLAPRFile apr_file(filename, LL_APR_WB, LLAPRFile::global); apr_file.write(buffer, buffer_size); delete[] file_buffer; delete[] buffer; fp.close(); apr_file.close(); } else if (exten == "animatn") { asset_type = LLAssetType::AT_ANIMATION; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } else if(exten == "jp2" || exten == "j2k" || exten == "j2c") { asset_type = LLAssetType::AT_TEXTURE; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } else if(exten == "gesture") { asset_type = LLAssetType::AT_GESTURE; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } else if(exten == "notecard") { asset_type = LLAssetType::AT_NOTECARD; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } else if(exten == "lsl") { asset_type = LLAssetType::AT_LSL_TEXT; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } else if(exten == "eyes" || exten == "gloves" || exten == "hair" || exten == "jacket" || exten == "pants" || exten == "shape" || exten == "shirt" || exten == "shoes" || exten == "skin" || exten == "skirt" || exten == "socks" || exten == "underpants" || exten == "undershirt" || exten == "bodypart" || exten == "clothing") { asset_type = LLAssetType::AT_CLOTHING; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } else { llwarns << "Unhandled extension" << llendl; return LLAssetType::AT_NONE; } return asset_type; }
void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, BOOL dirty_cache) { if(!mEnabled) { llwarns << "Not writing cache for handle " << handle << "): Cache is currently disabled." << llendl; return ; } llassert_always(mInitialized); if(mReadOnly) { llwarns << "Not writing cache for handle " << handle << "): Cache is currently in read-only mode." << llendl; return ; } HeaderEntryInfo* entry; handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ; if(iter == mHandleEntryMap.end()) //new entry { if(mNumEntries >= mCacheSize - 1) { purgeEntries(mCacheSize - 1) ; } entry = new HeaderEntryInfo(); entry->mHandle = handle ; entry->mTime = time(NULL) ; entry->mIndex = mNumEntries++; mHeaderEntryQueue.insert(entry) ; mHandleEntryMap[handle] = entry ; } else { // Update access time. entry = iter->second ; //resort mHeaderEntryQueue.erase(entry) ; entry->mTime = time(NULL) ; mHeaderEntryQueue.insert(entry) ; } //update cache header if(!updateEntry(entry)) { llwarns << "Failed to update cache header index " << entry->mIndex << ". handle = " << handle << llendl; return ; //update failed. } if(!dirty_cache) { llwarns << "Skipping write to cache for handle " << handle << ": cache not dirty" << llendl; return ; //nothing changed, no need to update. } //write to cache file bool success = true ; { std::string filename; getObjectCacheFilename(handle, filename); LLAPRFile apr_file(filename, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp); success = check_write(&apr_file, (void*)id.mData, UUID_BYTES) ; if(success) { S32 num_entries = cache_entry_map.size() ; success = check_write(&apr_file, &num_entries, sizeof(S32)); for (LLVOCacheEntry::vocache_entry_map_t::const_iterator iter = cache_entry_map.begin(); success && iter != cache_entry_map.end(); ++iter) { success = iter->second->writeToFile(&apr_file) ; } } } if(!success) { removeEntry(entry) ; } return ; }
void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map) { if(!mEnabled) { llwarns << "Not reading cache for handle " << handle << "): Cache is currently disabled." << llendl; return ; } llassert_always(mInitialized); handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ; if(iter == mHandleEntryMap.end()) //no cache { llwarns << "No handle map entry for " << handle << llendl; return ; } bool success = true ; { std::string filename; getObjectCacheFilename(handle, filename); LLAPRFile apr_file(filename, APR_READ|APR_BINARY, mLocalAPRFilePoolp); LLUUID cache_id ; success = check_read(&apr_file, cache_id.mData, UUID_BYTES) ; if(success) { if(cache_id != id) { llinfos << "Cache ID doesn't match for this region, discarding"<< llendl; success = false ; } if(success) { S32 num_entries; success = check_read(&apr_file, &num_entries, sizeof(S32)) ; for (S32 i = 0; success && i < num_entries; i++) { LLVOCacheEntry* entry = new LLVOCacheEntry(&apr_file); if (!entry->getLocalID()) { llwarns << "Aborting cache file load for " << filename << ", cache file corruption!" << llendl; delete entry ; success = false ; } cache_entry_map[entry->getLocalID()] = entry; } } } } if(!success) { if(cache_entry_map.empty()) { removeEntry(iter->second) ; } } return ; }
void LLVOCache::readCacheHeader() { if(!mEnabled) { llwarns << "Not reading cache header: Cache is currently disabled." << llendl; return; } //clear stale info. clearCacheInMemory(); bool success = true ; if (LLAPRFile::isExist(mHeaderFileName, mLocalAPRFilePoolp)) { LLAPRFile apr_file(mHeaderFileName, APR_READ|APR_BINARY, mLocalAPRFilePoolp); //read the meta element success = check_read(&apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)) ; if(success) { HeaderEntryInfo* entry = NULL ; mNumEntries = 0 ; U32 num_read = 0 ; while(num_read++ < MAX_NUM_OBJECT_ENTRIES) { if(!entry) { entry = new HeaderEntryInfo() ; } success = check_read(&apr_file, entry, sizeof(HeaderEntryInfo)); if(!success) //failed { llwarns << "Error reading cache header entry. (entry_index=" << mNumEntries << ")" << llendl; delete entry ; entry = NULL ; break ; } else if(entry->mTime == INVALID_TIME) { continue ; //an empty entry } entry->mIndex = mNumEntries++ ; mHeaderEntryQueue.insert(entry) ; mHandleEntryMap[entry->mHandle] = entry ; entry = NULL ; } if(entry) { delete entry ; } } //--------- //debug code //---------- //std::string name ; //for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; success && iter != mHeaderEntryQueue.end(); ++iter) //{ // getObjectCacheFilename((*iter)->mHandle, name) ; // llinfos << name << llendl ; //} //----------- } else { writeCacheHeader() ; } if(!success) { removeCache() ; //failed to read header, clear the cache } else if(mNumEntries >= mCacheSize) { purgeEntries(mCacheSize) ; } return ; }
LLAssetType::EType LLAssetConverter::convert(std::string src_filename, std::string filename) { std::string exten = gDirUtilp->getExtension(src_filename); LLAssetType::EType asset_type = LLAssetType::AT_NONE; if (exten.empty()) return LLAssetType::AT_NONE; else if(exten == "bmp") { asset_type = LLAssetType::AT_TEXTURE; if (!LLViewerTextureList::createUploadFile(src_filename, filename, IMG_CODEC_BMP )) { return LLAssetType::AT_NONE; } } else if( exten == "tga") { asset_type = LLAssetType::AT_TEXTURE; if (!LLViewerTextureList::createUploadFile(src_filename, filename, IMG_CODEC_TGA )) { return LLAssetType::AT_NONE; } } else if( exten == "jpg" || exten == "jpeg") { asset_type = LLAssetType::AT_TEXTURE; if (!LLViewerTextureList::createUploadFile(src_filename, filename, IMG_CODEC_JPEG )) { return LLAssetType::AT_NONE; } } else if( exten == "png") { asset_type = LLAssetType::AT_TEXTURE; if (!LLViewerTextureList::createUploadFile(src_filename, filename, IMG_CODEC_PNG )) { return LLAssetType::AT_NONE; } } else if(exten == "wav") { asset_type = LLAssetType::AT_SOUND; if(encode_vorbis_file(src_filename, filename) != LLVORBISENC_NOERR) { return LLAssetType::AT_NONE; } } else if(exten == "ogg") { asset_type = LLAssetType::AT_SOUND; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } //else if(exten == "tmp") FIXME else if (exten == "bvh") { asset_type = LLAssetType::AT_ANIMATION; S32 file_size; LLAPRFile fp; fp.open(src_filename, LL_APR_RB, LLAPRFile::global, &file_size); if(!fp.getFileHandle()) return LLAssetType::AT_NONE; char* file_buffer = new char[file_size + 1]; ELoadStatus load_status = E_ST_OK; S32 line_number = 0; LLBVHLoader* loaderp = new LLBVHLoader(file_buffer, load_status, line_number); if(load_status == E_ST_NO_XLT_FILE) { llwarns << "NOTE: No translation table found." << llendl; } else { llwarns << "ERROR: [line: " << line_number << "] " << STATUS[load_status].c_str() << llendl; } S32 buffer_size = loaderp->getOutputSize(); U8* buffer = new U8[buffer_size]; LLDataPackerBinaryBuffer dp(buffer, buffer_size); loaderp->serialize(dp); LLAPRFile apr_file(filename, LL_APR_WB, LLAPRFile::global); apr_file.write(buffer, buffer_size); delete[] file_buffer; delete[] buffer; fp.close(); apr_file.close(); } else if (exten == "animatn") { asset_type = LLAssetType::AT_ANIMATION; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } else if(exten == "jp2" || exten == "j2k" || exten == "j2c") { asset_type = LLAssetType::AT_TEXTURE; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } else if(exten == "gesture") { asset_type = LLAssetType::AT_GESTURE; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } else if(exten == "notecard") { asset_type = LLAssetType::AT_NOTECARD; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } else if(exten == "lsl") { asset_type = LLAssetType::AT_LSL_TEXT; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } else if(exten == "eyes" || exten == "gloves" || exten == "hair" || exten == "jacket" || exten == "pants" || exten == "shape" || exten == "shirt" || exten == "shoes" || exten == "skin" || exten == "skirt" || exten == "socks" || exten == "underpants" || exten == "undershirt" || exten == "bodypart" || exten == "clothing" || exten == "physics") { asset_type = LLAssetType::AT_CLOTHING; if(!copyFile(src_filename, filename)) { return LLAssetType::AT_NONE; } } else { llwarns << "Unhandled extension" << llendl; return LLAssetType::AT_NONE; } return asset_type; }