void Dispatcher::Did_FetchManager_FileSegmentFetch_Execute(Ccnx::Name deviceName, Ccnx::Name fileSegmentBaseName, uint32_t segment, Ccnx::PcoPtr fileSegmentPco) { // fileSegmentBaseName: /<device_name>/<appname>/file/<hash> const Bytes& hashBytes = fileSegmentBaseName.getCompFromBack(0); Hash hash(head(hashBytes), hashBytes.size()); _LOG_DEBUG("Received segment deviceName: " << deviceName << ", segmentBaseName: " << fileSegmentBaseName << ", segment: " << segment); // _LOG_DEBUG ("Looking up objectdb for " << hash); map<Hash, ObjectDbPtr>::iterator db = m_objectDbMap.find(hash); if (db != m_objectDbMap.end()) { db->second->saveContentObject(deviceName, segment, fileSegmentPco->buf()); } else { _LOG_ERROR("no db available for this content object: " << fileSegmentBaseName << ", size: " << fileSegmentPco->buf().size()); } // ObjectDb objectDb (m_rootDir / ".chronoshare", lexical_cast<string> (hash)); // objectDb.saveContentObject(deviceName, segment, fileSegmentPco->buf ()); }
void Dispatcher::Did_FetchManager_FileFetchComplete_Execute(Ccnx::Name deviceName, Ccnx::Name fileBaseName) { // fileBaseName: /<device_name>/<appname>/file/<hash> _LOG_DEBUG("Finished fetching " << deviceName << ", fileBaseName: " << fileBaseName); const Bytes& hashBytes = fileBaseName.getCompFromBack(0); Hash hash(head(hashBytes), hashBytes.size()); _LOG_DEBUG("Extracted hash: " << hash.shortHash()); if (m_objectDbMap.find(hash) != m_objectDbMap.end()) { // remove the db handle m_objectDbMap.erase(hash); // to commit write } else { _LOG_ERROR("no db available for this file: " << hash); } FileItemsPtr filesToAssemble = m_fileState->LookupFilesForHash(hash); for (FileItems::iterator file = filesToAssemble->begin(); file != filesToAssemble->end(); file++) { boost::filesystem::path filePath = m_rootDir / file->filename(); try { if (filesystem::exists(filePath) && filesystem::last_write_time(filePath) == file->mtime() && #if BOOST_VERSION >= 104900 filesystem::status(filePath).permissions() == static_cast<filesystem::perms>(file->mode()) && #endif *Hash::FromFileContent(filePath) == hash) { _LOG_DEBUG("Asking to assemble a file, but file already exists on a filesystem"); continue; } } catch (filesystem::filesystem_error& error) { _LOG_ERROR("File operations failed on [" << filePath << "] (ignoring)"); } if (ObjectDb::DoesExist(m_rootDir / ".chronoshare", deviceName, boost::lexical_cast<string>(hash))) { bool ok = m_objectManager.objectsToLocalFile(deviceName, hash, filePath); if (ok) { last_write_time(filePath, file->mtime()); #if BOOST_VERSION >= 104900 permissions(filePath, static_cast<filesystem::perms>(file->mode())); #endif m_fileState->SetFileComplete(file->filename()); } else { _LOG_ERROR("Notified about complete fetch, but file cannot be restored from the database: [" << filePath << "]"); } } else { _LOG_ERROR(filePath << " supposed to have all segments, but not"); // should abort for debugging } } }