aboutsummaryrefslogtreecommitdiff
path: root/libs/game_bethesda/src/gamebryo/gamebryolocalsavegames.cpp
blob: 2daf2c3ef40c7bf0902e88ad4ff7b893ba2aa975 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
Copyright (C) 2015 Sebastian Herbord. All rights reserved.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*/

#include "gamebryolocalsavegames.h"
#include "registry.h"
#include <QtDebug>
#include <iprofile.h>
#include <stddef.h>
#include <string>

#include "gamegamebryo.h"

GamebryoLocalSavegames::GamebryoLocalSavegames(const GameGamebryo* game,
                                               const QString& iniFileName)
    : m_Game{game}, m_IniFileName(iniFileName)
{}

MappingType GamebryoLocalSavegames::mappings(const QDir& profileSaveDir) const
{
  return {{profileSaveDir.absolutePath(), localSavesDirectory().absolutePath(), true,
           true}};
}

QString GamebryoLocalSavegames::localSavesDummy() const
{
  return "__MO_Saves\\";
}

QDir GamebryoLocalSavegames::localSavesDirectory() const
{
  QString dummy = localSavesDummy();
  dummy.replace("\\", "/");
  return QDir(m_Game->myGamesPath()).absoluteFilePath(dummy);
}

QDir GamebryoLocalSavegames::localGameDirectory() const
{
  return QDir(m_Game->myGamesPath()).absolutePath();
}

bool GamebryoLocalSavegames::prepareProfile(MOBase::IProfile* profile)
{
  bool enable = profile->localSavesEnabled();

  QString basePath    = profile->localSettingsEnabled()
                            ? profile->absolutePath()
                            : localGameDirectory().absolutePath();
  QString iniFilePath = basePath + "/" + m_IniFileName;
  QString saveIni     = profile->absolutePath() + "/" + "savepath.ini";

  // Get the current sLocalSavePath
  QString currentPath =
      GameGamebryo::readIniValue(iniFilePath, "General", "sLocalSavePath", "SKIP_ME");
  bool alreadyEnabled = (currentPath == localSavesDummy());

  // Get the current bUseMyGamesDirectory
  QString currentMyGames = GameGamebryo::readIniValue(
      iniFilePath, "General", "bUseMyGamesDirectory", "SKIP_ME");

  // Create the __MO_Saves directory if local saves are enabled and it doesn't exist
  if (enable) {
    QDir saves = localSavesDirectory();
    if (!saves.exists()) {
      saves.mkdir(".");
    }
  }

  // Set the path to __MO_Saves if it's not already
  if (enable && !alreadyEnabled) {
    // If the path is not blank, save it to savepath.ini
    if (currentPath != "SKIP_ME") {
      MOBase::WriteRegistryValue("General", "sLocalSavePath", currentPath, saveIni);
    }
    if (currentMyGames != "SKIP_ME") {
      MOBase::WriteRegistryValue("General", "bUseMyGamesDirectory", currentMyGames,
                                 saveIni);
    }
    MOBase::WriteRegistryValue("General", "sLocalSavePath", localSavesDummy(),
                               iniFilePath);
    MOBase::WriteRegistryValue("General", "bUseMyGamesDirectory", "1", iniFilePath);
  }

  // Get rid of the local saves setting if it's still there
  if (!enable && alreadyEnabled) {
    // If savepath.ini exists, use it and delete it
    if (QFile::exists(saveIni)) {
      QString savedPath =
          GameGamebryo::readIniValue(saveIni, "General", "sLocalSavePath", "DELETE_ME");
      QString savedMyGames = GameGamebryo::readIniValue(
          saveIni, "General", "bUseMyGamesDirectory", "DELETE_ME");
      if (savedPath != "DELETE_ME") {
        MOBase::WriteRegistryValue("General", "sLocalSavePath", savedPath, iniFilePath);
      } else {
        MOBase::RemoveRegistryValue("General", "sLocalSavePath", iniFilePath);
      }
      if (savedMyGames != "DELETE_ME") {
        MOBase::WriteRegistryValue("General", "bUseMyGamesDirectory", savedMyGames,
                                   iniFilePath);
      } else {
        MOBase::RemoveRegistryValue("General", "bUseMyGamesDirectory", iniFilePath);
      }
      QFile::remove(saveIni);
    }
    // Otherwise just delete the setting
    else {
      MOBase::RemoveRegistryValue("General", "sLocalSavePath", iniFilePath);
      MOBase::RemoveRegistryValue("General", "bUseMyGamesDirectory", iniFilePath);
    }
  }

  return enable != alreadyEnabled;
}