Просмотр исходного кода

profile_manager: Create save data if it doesn't exist on use

Zach Hilman 7 лет назад
Родитель
Сommit
bfad41b0c1

+ 36 - 12
src/core/hle/service/acc/profile_manager.cpp

@@ -30,22 +30,20 @@ constexpr ResultCode ERROR_TOO_MANY_USERS(ErrorModule::Account, -1);
 constexpr ResultCode ERROR_USER_ALREADY_EXISTS(ErrorModule::Account, -2);
 constexpr ResultCode ERROR_USER_ALREADY_EXISTS(ErrorModule::Account, -2);
 constexpr ResultCode ERROR_ARGUMENT_IS_NULL(ErrorModule::Account, 20);
 constexpr ResultCode ERROR_ARGUMENT_IS_NULL(ErrorModule::Account, 20);
 
 
-constexpr const char* ACC_SAVE_AVATORS_BASE_PATH = "/system/save/8000000000000010/su/avators/";
+constexpr char ACC_SAVE_AVATORS_BASE_PATH[] = "/system/save/8000000000000010/su/avators/";
 
 
-const UUID& UUID::Generate() {
+UUID UUID::Generate() {
     std::random_device device;
     std::random_device device;
     std::mt19937 gen(device());
     std::mt19937 gen(device());
     std::uniform_int_distribution<u64> distribution(1, std::numeric_limits<u64>::max());
     std::uniform_int_distribution<u64> distribution(1, std::numeric_limits<u64>::max());
-    uuid[0] = distribution(gen);
-    uuid[1] = distribution(gen);
-    return *this;
+    return UUID{distribution(gen), distribution(gen)};
 }
 }
 
 
 ProfileManager::ProfileManager() {
 ProfileManager::ProfileManager() {
     ParseUserSaveFile();
     ParseUserSaveFile();
 
 
     if (user_count == 0)
     if (user_count == 0)
-        CreateNewUser(UUID{}.Generate(), "yuzu");
+        CreateNewUser(UUID::Generate(), "yuzu");
 
 
     auto current = std::clamp<int>(Settings::values.current_user, 0, MAX_USERS - 1);
     auto current = std::clamp<int>(Settings::values.current_user, 0, MAX_USERS - 1);
     if (UserExistsIndex(current))
     if (UserExistsIndex(current))
@@ -309,10 +307,18 @@ void ProfileManager::ParseUserSaveFile() {
                               ACC_SAVE_AVATORS_BASE_PATH + "profiles.dat",
                               ACC_SAVE_AVATORS_BASE_PATH + "profiles.dat",
                           "rb");
                           "rb");
 
 
+    if (!save.IsOpen()) {
+        LOG_WARNING(Service_ACC, "Failed to load profile data from save data... Generating new "
+                                 "user 'yuzu' with random UUID.");
+        return;
+    }
+
     ProfileDataRaw data;
     ProfileDataRaw data;
-    save.Seek(0, SEEK_SET);
-    if (save.ReadBytes(&data, sizeof(ProfileDataRaw)) != sizeof(ProfileDataRaw))
+    if (save.ReadBytes(&data, sizeof(ProfileDataRaw)) != sizeof(ProfileDataRaw)) {
+        LOG_WARNING(Service_ACC, "profiles.dat is smaller than expected... Generating new user "
+                                 "'yuzu' with random UUID.");
         return;
         return;
+    }
 
 
     for (std::size_t i = 0; i < MAX_USERS; ++i) {
     for (std::size_t i = 0; i < MAX_USERS; ++i) {
         const auto& user = data.users[i];
         const auto& user = data.users[i];
@@ -335,12 +341,30 @@ void ProfileManager::WriteUserSaveFile() {
         raw.users[i].timestamp = profiles[i].creation_time;
         raw.users[i].timestamp = profiles[i].creation_time;
     }
     }
 
 
-    FileUtil::IOFile save(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir) +
-                              ACC_SAVE_AVATORS_BASE_PATH + "profiles.dat",
-                          "wb");
+    const auto raw_path =
+        FileUtil::GetUserPath(FileUtil::UserPath::NANDDir) + "/system/save/8000000000000010";
+    if (FileUtil::Exists(raw_path) && !FileUtil::IsDirectory(raw_path))
+        FileUtil::Delete(raw_path);
+
+    const auto path = FileUtil::GetUserPath(FileUtil::UserPath::NANDDir) +
+                      ACC_SAVE_AVATORS_BASE_PATH + "profiles.dat";
+
+    if (!FileUtil::CreateFullPath(path)) {
+        LOG_WARNING(Service_ACC, "Failed to create full path of profiles.dat. Create the directory "
+                                 "nand/system/save/8000000000000010/su/avators to mitigate this "
+                                 "issue.");
+        return;
+    }
+
+    FileUtil::IOFile save(path, "wb");
+
+    if (!save.IsOpen()) {
+        LOG_WARNING(Service_ACC, "Failed to write save data to file... No changes to user data "
+                                 "made in current session will be saved.");
+        return;
+    }
 
 
     save.Resize(sizeof(ProfileDataRaw));
     save.Resize(sizeof(ProfileDataRaw));
-    save.Seek(0, SEEK_SET);
     save.WriteBytes(&raw, sizeof(ProfileDataRaw));
     save.WriteBytes(&raw, sizeof(ProfileDataRaw));
 }
 }
 
 

+ 1 - 1
src/core/hle/service/acc/profile_manager.h

@@ -36,7 +36,7 @@ struct UUID {
     }
     }
 
 
     // TODO(ogniK): Properly generate uuids based on RFC-4122
     // TODO(ogniK): Properly generate uuids based on RFC-4122
-    const UUID& Generate();
+    static UUID Generate();
 
 
     // Set the UUID to {0,0} to be considered an invalid user
     // Set the UUID to {0,0} to be considered an invalid user
     void Invalidate() {
     void Invalidate() {

+ 1 - 1
src/yuzu/configuration/configure_system.cpp

@@ -163,7 +163,7 @@ void ConfigureSystem::UpdateCurrentUser() {
 
 
 void ConfigureSystem::ReadSystemSettings() {}
 void ConfigureSystem::ReadSystemSettings() {}
 
 
-std::string ConfigureSystem::GetAccountUsername(Service::Account::UUID uuid) {
+std::string ConfigureSystem::GetAccountUsername(Service::Account::UUID uuid) const {
     Service::Account::ProfileBase profile;
     Service::Account::ProfileBase profile;
     if (!profile_manager->GetProfileBase(uuid, profile))
     if (!profile_manager->GetProfileBase(uuid, profile))
         return "";
         return "";

+ 4 - 4
src/yuzu/configuration/configure_system.h

@@ -10,11 +10,11 @@
 #include <QWidget>
 #include <QWidget>
 #include "core/hle/service/acc/profile_manager.h"
 #include "core/hle/service/acc/profile_manager.h"
 
 
-class QVBoxLayout;
-class QTreeView;
-class QStandardItemModel;
 class QGraphicsScene;
 class QGraphicsScene;
 class QStandardItem;
 class QStandardItem;
+class QStandardItemModel;
+class QTreeView;
+class QVBoxLayout;
 
 
 namespace Ui {
 namespace Ui {
 class ConfigureSystem;
 class ConfigureSystem;
@@ -45,7 +45,7 @@ public slots:
 
 
 private:
 private:
     void ReadSystemSettings();
     void ReadSystemSettings();
-    std::string GetAccountUsername(Service::Account::UUID uuid);
+    std::string GetAccountUsername(Service::Account::UUID uuid) const;
 
 
     QVBoxLayout* layout;
     QVBoxLayout* layout;
     QTreeView* tree_view;
     QTreeView* tree_view;