void AssetsManager::loadLocalManifest(const std::string& manifestUrl) { // Prefer to use the cached manifest file, if not found use user configured manifest file if (_fileUtils->isFileExist(_cacheManifestPath)) { _localManifest->parse(_cacheManifestPath); if (_localManifest->isLoaded()) prepareLocalManifest(); else _fileUtils->removeFile(_cacheManifestPath); } // Fail to found or load cached manifest file if (!_localManifest->isLoaded()) { _localManifest->parse(_manifestUrl); if (_localManifest->isLoaded()) prepareLocalManifest(); } // Fail to load local manifest if (!_localManifest->isLoaded()) { CCLOG("AssetsManager : No local manifest file found error.\n"); dispatchUpdateEvent(EventAssetsManager::EventCode::ERROR_NO_LOCAL_MANIFEST); } }
void AssetsManagerEx::updateSucceed() { // Every thing is correctly downloaded, do the following // 1. rename temporary manifest to valid manifest std::string tempFileName = TEMP_MANIFEST_FILENAME; std::string fileName = MANIFEST_FILENAME; _fileUtils->renameFile(_tempStoragePath, tempFileName, fileName); // 2. merge temporary storage path to storage path so that temporary version turns to cached version if (_fileUtils->isDirectoryExist(_tempStoragePath)) { // Merging all files in temp storage path to storage path std::vector<std::string> files; _fileUtils->listFilesRecursively(_tempStoragePath, &files); int baseOffset = (int)_tempStoragePath.length(); std::string relativePath, dstPath; for (std::vector<std::string>::iterator it = files.begin(); it != files.end(); ++it) { relativePath.assign((*it).substr(baseOffset)); dstPath.assign(_storagePath + relativePath); // Create directory if (relativePath.back() == '/') { _fileUtils->createDirectory(dstPath); } // Copy file else { if (_fileUtils->isFileExist(dstPath)) { _fileUtils->removeFile(dstPath); } _fileUtils->renameFile(*it, dstPath); } } // Remove temp storage path _fileUtils->removeDirectory(_tempStoragePath); } // 3. swap the localManifest CC_SAFE_RELEASE(_localManifest); _localManifest = _remoteManifest; _localManifest->setManifestRoot(_storagePath); _remoteManifest = nullptr; // 4. make local manifest take effect prepareLocalManifest(); // 5. Set update state _updateState = State::UP_TO_DATE; // 6. Notify finished event dispatchUpdateEvent(EventAssetsManagerEx::EventCode::UPDATE_FINISHED); }
void AssetsManager::updateSucceed() { // Every thing is correctly downloaded, do the following // 1. rename temporary manifest to valid manifest _fileUtils->renameFile(_storagePath, TEMP_MANIFEST_FILENAME, MANIFEST_FILENAME); // 2. swap the localManifest if (_localManifest != nullptr) _localManifest->release(); _localManifest = _remoteManifest; _remoteManifest = nullptr; // 3. make local manifest take effect prepareLocalManifest(); // 4. decompress all compressed files decompressDownloadedZip(); // 5. Set update state _updateState = State::UP_TO_DATE; // 6. Notify finished event dispatchUpdateEvent(EventAssetsManager::EventCode::UPDATE_FINISHED); }
void AssetsManagerEx::loadLocalManifest(const std::string& /*manifestUrl*/) { Manifest *cachedManifest = nullptr; // Find the cached manifest file if (_fileUtils->isFileExist(_cacheManifestPath)) { cachedManifest = new (std::nothrow) Manifest(); if (cachedManifest) { cachedManifest->parse(_cacheManifestPath); if (!cachedManifest->isLoaded()) { _fileUtils->removeFile(_cacheManifestPath); CC_SAFE_RELEASE(cachedManifest); cachedManifest = nullptr; } } } // Ensure no search path of cached manifest is used to load this manifest std::vector<std::string> searchPaths = _fileUtils->getSearchPaths(); if (cachedManifest) { std::vector<std::string> cacheSearchPaths = cachedManifest->getSearchPaths(); std::vector<std::string> trimmedPaths = searchPaths; for (auto path : cacheSearchPaths) { const auto pos = std::find(trimmedPaths.begin(), trimmedPaths.end(), path); if (pos != trimmedPaths.end()) { trimmedPaths.erase(pos); } } _fileUtils->setSearchPaths(trimmedPaths); } // Load local manifest in app package _localManifest->parse(_manifestUrl); if (cachedManifest) { // Restore search paths _fileUtils->setSearchPaths(searchPaths); } if (_localManifest->isLoaded()) { // Compare with cached manifest to determine which one to use if (cachedManifest) { bool localNewer = _localManifest->versionGreater(cachedManifest, _versionCompareHandle); if (localNewer) { // Recreate storage, to empty the content _fileUtils->removeDirectory(_storagePath); _fileUtils->createDirectory(_storagePath); CC_SAFE_RELEASE(cachedManifest); } else { CC_SAFE_RELEASE(_localManifest); _localManifest = cachedManifest; } } prepareLocalManifest(); } // Fail to load local manifest if (!_localManifest->isLoaded()) { CCLOG("AssetsManagerEx : No local manifest file found error.\n"); dispatchUpdateEvent(EventAssetsManagerEx::EventCode::ERROR_NO_LOCAL_MANIFEST); } }