Files

152 lines
3.7 KiB
C++
Raw Permalink Normal View History

// Copyright 2009 Dolphin Emulator Project
2015-05-18 01:08:10 +02:00
// Licensed under GPLv2+
// Refer to the license.txt file included.
2010-06-09 01:37:08 +00:00
#include <algorithm>
#include <cctype>
#include <cstring>
#include <memory>
2014-02-17 05:18:15 -05:00
#include <string>
2014-03-04 08:39:25 -05:00
#include <unordered_set>
2014-02-17 05:18:15 -05:00
#include <vector>
2010-06-09 01:37:08 +00:00
2014-09-07 20:06:58 -05:00
#include "Common/CommonTypes.h"
#include "Common/Logging/LogManager.h"
#include "Common/StringUtil.h"
2010-06-09 01:37:08 +00:00
#include "Core/Boot/Boot.h"
2014-02-17 05:18:15 -05:00
#include "Core/ConfigManager.h"
#include "Core/Core.h"
2010-06-09 01:37:08 +00:00
2016-07-06 20:33:05 +02:00
#include "DiscIO/Enums.h"
2014-07-08 14:29:26 +02:00
#include "DiscIO/FileMonitor.h"
#include "DiscIO/Filesystem.h"
#include "DiscIO/Volume.h"
2014-02-17 05:18:15 -05:00
#include "DiscIO/VolumeCreator.h"
2010-06-09 01:37:08 +00:00
namespace FileMon
{
static std::unique_ptr<DiscIO::IVolume> s_open_iso;
static std::unique_ptr<DiscIO::IFileSystem> s_filesystem;
2014-07-08 15:58:25 +02:00
static std::string ISOFile = "", CurrentFile = "";
static bool FileAccess = true;
2010-06-09 01:37:08 +00:00
// Filtered files
2014-03-04 08:39:25 -05:00
bool IsSoundFile(const std::string& filename)
2010-06-09 01:37:08 +00:00
{
std::string extension;
SplitPath(filename, nullptr, nullptr, &extension);
std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
2010-06-09 01:37:08 +00:00
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
};
2010-06-09 01:37:08 +00:00
return extensions.find(extension) != extensions.end();
2010-06-09 01:37:08 +00:00
}
// Read the file system
void ReadFileSystem(const std::string& filename)
2010-06-09 01:37:08 +00:00
{
// Should have an actual Shutdown procedure or something
s_open_iso.reset();
s_filesystem.reset();
s_open_iso = DiscIO::CreateVolumeFromFilename(filename);
if (!s_open_iso)
return;
2014-03-04 08:39:25 -05:00
2016-07-06 20:33:05 +02:00
if (s_open_iso->GetVolumeType() != DiscIO::Platform::WII_WAD)
{
s_filesystem = DiscIO::CreateFileSystem(s_open_iso.get());
2014-03-04 08:39:25 -05:00
if (!s_filesystem)
return;
}
FileAccess = true;
2010-06-09 01:37:08 +00:00
}
2014-12-27 20:13:31 +01:00
// Logs a file if it passes a few checks
2014-03-04 08:39:25 -05:00
void CheckFile(const std::string& file, u64 size)
2010-06-09 01:37:08 +00:00
{
// 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;
2010-06-09 01:37:08 +00:00
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());
}
2010-06-09 01:37:08 +00:00
// Update the current file
CurrentFile = file;
2010-06-09 01:37:08 +00:00
}
// Find the filename
2010-06-09 01:37:08 +00:00
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;
2010-06-09 01:37:08 +00:00
if (!s_filesystem || 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;
}
2010-06-09 01:37:08 +00:00
const std::string filename = s_filesystem->GetFileName(offset);
if (filename.empty())
return;
2010-06-09 01:37:08 +00:00
CheckFile(filename, s_filesystem->GetFileSize(filename));
2010-06-09 01:37:08 +00:00
}
void Close()
{
s_open_iso.reset();
s_filesystem.reset();
2010-06-09 01:37:08 +00:00
ISOFile = "";
CurrentFile = "";
FileAccess = true;
2010-06-09 01:37:08 +00:00
}
} // FileMon