summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/FileMonitor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/DiscIO/FileMonitor.cpp')
-rw-r--r--Source/Core/DiscIO/FileMonitor.cpp170
1 files changed, 170 insertions, 0 deletions
diff --git a/Source/Core/DiscIO/FileMonitor.cpp b/Source/Core/DiscIO/FileMonitor.cpp
new file mode 100644
index 0000000000..0583d17a44
--- /dev/null
+++ b/Source/Core/DiscIO/FileMonitor.cpp
@@ -0,0 +1,170 @@
+// Copyright 2009 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include <algorithm>
+#include <cctype>
+#include <cstring>
+#include <string>
+#include <unordered_set>
+#include <vector>
+
+#include "Common/CommonTypes.h"
+#include "Common/StringUtil.h"
+#include "Common/Logging/LogManager.h"
+
+#include "Core/ConfigManager.h"
+#include "Core/Core.h"
+#include "Core/Boot/Boot.h"
+
+#include "DiscIO/FileMonitor.h"
+#include "DiscIO/Filesystem.h"
+#include "DiscIO/Volume.h"
+#include "DiscIO/VolumeCreator.h"
+
+namespace FileMon
+{
+
+static DiscIO::IVolume *OpenISO = nullptr;
+static DiscIO::IFileSystem *pFileSystem = nullptr;
+static std::string ISOFile = "", CurrentFile = "";
+static bool FileAccess = true;
+
+// Filtered files
+bool IsSoundFile(const std::string& filename)
+{
+ std::string extension;
+ SplitPath(filename, nullptr, nullptr, &extension);
+ std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
+
+ static std::unordered_set<std::string> extensions = {
+ ".adp", // 1080 Avalanche, Crash Bandicoot, etc.
+ ".adx", // Sonic Adventure 2 Battle, etc.
+ ".afc", // Zelda WW
+ ".ast", // Zelda TP, Mario Kart
+ ".brstm", // Wii Sports, Wario Land, etc.
+ ".dsp", // Metroid Prime
+ ".hps", // SSB Melee
+ ".ogg", // Tony Hawk's Underground 2
+ ".sad", // Disaster
+ ".snd", // Tales of Symphonia
+ ".song", // Tales of Symphonia
+ ".ssm", // Custom Robo, Kirby Air Ride, etc.
+ ".str", // Harry Potter & the Sorcerer's Stone
+ };
+
+ return extensions.find(extension) != extensions.end();
+}
+
+
+// Read the file system
+void ReadFileSystem(const std::string& filename)
+{
+ // Should have an actual Shutdown procedure or something
+ if (OpenISO != nullptr)
+ {
+ delete OpenISO;
+ OpenISO = nullptr;
+ }
+ if (pFileSystem != nullptr)
+ {
+ delete pFileSystem;
+ pFileSystem = nullptr;
+ }
+
+ OpenISO = DiscIO::CreateVolumeFromFilename(filename);
+ if (!OpenISO)
+ return;
+
+ if (OpenISO->GetVolumeType() != DiscIO::IVolume::WII_WAD)
+ {
+ pFileSystem = DiscIO::CreateFileSystem(OpenISO);
+
+ if (!pFileSystem)
+ return;
+ }
+
+ FileAccess = true;
+}
+
+// Logs a file if it passes a few checks
+void CheckFile(const std::string& file, u64 size)
+{
+ // Don't do anything if the log is unselected
+ if (!LogManager::GetInstance()->IsEnabled(LogTypes::FILEMON, LogTypes::LWARNING))
+ return;
+ // Do nothing if we found the same file again
+ if (CurrentFile == file)
+ return;
+
+ if (size > 0)
+ size = (size / 1000);
+
+ std::string str = StringFromFormat("%s kB %s", ThousandSeparate(size, 7).c_str(), file.c_str());
+ if (IsSoundFile(file))
+ {
+ INFO_LOG(FILEMON, "%s", str.c_str());
+ }
+ else
+ {
+ WARN_LOG(FILEMON, "%s", str.c_str());
+ }
+
+ // Update the current file
+ CurrentFile = file;
+}
+
+
+// Find the filename
+void FindFilename(u64 offset)
+{
+ // Don't do anything if a game is not running
+ if (Core::GetState() != Core::CORE_RUN)
+ return;
+
+ // Or if the log is unselected
+ if (!LogManager::GetInstance()->IsEnabled(LogTypes::FILEMON, LogTypes::LWARNING))
+ return;
+
+ // Or if we don't have file access
+ if (!FileAccess)
+ return;
+
+ if (!pFileSystem || ISOFile != SConfig::GetInstance().m_LastFilename)
+ {
+ FileAccess = false;
+ ReadFileSystem(SConfig::GetInstance().m_LastFilename);
+ ISOFile = SConfig::GetInstance().m_LastFilename;
+ INFO_LOG(FILEMON, "Opening '%s'", ISOFile.c_str());
+ return;
+ }
+
+ const std::string filename = pFileSystem->GetFileName(offset);
+
+ if (filename.empty())
+ return;
+
+ CheckFile(filename, pFileSystem->GetFileSize(filename));
+}
+
+void Close()
+{
+ if (OpenISO != nullptr)
+ {
+ delete OpenISO;
+ OpenISO = nullptr;
+ }
+
+ if (pFileSystem != nullptr)
+ {
+ delete pFileSystem;
+ pFileSystem = nullptr;
+ }
+
+ ISOFile = "";
+ CurrentFile = "";
+ FileAccess = true;
+}
+
+
+} // FileMon