StateAutoConnector* IState::Update(void* sender, float dt) { for (auto connector : mBeforeConnectors) { if (connector->Evaluate(sender)) { return connector; } } RETURN_NULL_IF_TRUE(OnUpdate(sender, dt)); for (auto connector : mAfterConnectors) { if (connector->Evaluate(sender)) { return connector; } } return nullptr; }
IStream* FileStorage::WriteFile(const StringRef& path, DirectoryEntry* parent /*= nullptr*/, FileOpenMode openMode /*= FileOpenMode::DestoryWriteOrCreate*/, FileDataType dataType /*= FileDataType::Binary*/) { RETURN_NULL_IF_TRUE(IsReadOnly()); FileEntry* fileEntry = FindFile(path, parent); CoderList coders = GetFileCoders(*fileEntry); if (fileEntry == nullptr) { //not exists switch (openMode) { case FileOpenMode::ReadOnly: case FileOpenMode::ReadWrite: return nullptr; case FileOpenMode::DestoryWriteOrCreate: //create file to only write break; case FileOpenMode::DestoryReadWriteOrCreate: case FileOpenMode::AppendReadWriteClearEOFOrCreate: case FileOpenMode::AppendWriteKeepEOFOrCreate: if (coders != 0) { Log::AssertFailedFormat("Not support read & write file with coder:{}", coders); return nullptr; } ////create file to read write break; default: break; } fileEntry = FindOrCreateFileEntry(path, parent); IStream* stream = WriteFileHelper(*fileEntry, openMode, dataType); if (stream == nullptr) { RemoveFile(fileEntry); //remove back file } return stream; } else { //exists switch (openMode) { case FileOpenMode::ReadOnly: break; case FileOpenMode::ReadWrite: if (fileEntry->IsReadonly()) { Log::AssertFailedFormat("Cannot read & write readonly file:{}", path); return nullptr; } if (coders != 0) { Log::AssertFailedFormat("Not support read & write file with coder:{}", coders); return nullptr; } break; case FileOpenMode::DestoryWriteOrCreate: //use new attribute break; case FileOpenMode::AppendWriteKeepEOFOrCreate: if (coders != 0) { Log::AssertFailedFormat("Cannot append & write readonly file:{}", path); return nullptr; } break; case FileOpenMode::DestoryReadWriteOrCreate: RETURN_NULL_IF_TRUE(IsReadOnly()); if (coders != 0) { Log::AssertFailedFormat("Not support read & write file with coder:{}", coders); return nullptr; } break; case FileOpenMode::AppendReadWriteClearEOFOrCreate: if (fileEntry->IsReadonly()) { Log::AssertFailedFormat("Cannot read & write readonly file:{}", path); return nullptr; } if (GetFileCoders(*fileEntry)) { Log::AssertFailedFormat("Not support read & write file with coder:{}", coders); return nullptr; } break; default: break; } IStream* stream = WriteFileHelper(*fileEntry, openMode, dataType); RETURN_NULL_IF_NULL(stream); return stream; } }