summaryrefslogtreecommitdiff
path: root/archived/projt-launcher/launcher/PSaveFile.h
blob: e5e3c0614e896fb64fa1402279e7af47fe8e22f6 (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
// SPDX-License-Identifier: GPL-3.0-only
// SPDX-FileCopyrightText: 2026 Project Tick
// SPDX-FileContributor: Project Tick Team
/*
 *  ProjT Launcher - Minecraft Launcher
 *  Copyright (C) 2026 Project Tick
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, version 3.
 *
 *  This program 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, write to the Free Software Foundation,
 *  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * === Upstream License Block (Do Not Modify) ==============================
 *
 *
 *
 *  Prism Launcher - Minecraft Launcher
 *  Copyright (c) 2023-2024 Trial97 <alexandru.tripon97@gmail.com>
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, version 3.
 *
 *  This program 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, write to the Free Software Foundation,
 *  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 * ======================================================================== */
#pragma once

#include <QFileInfo>
#include <QSaveFile>
#include "Application.h"

#if defined(LAUNCHER_APPLICATION)

/* PSaveFile
 * A class that mimics QSaveFile for Windows.
 *
 * When reading resources, we need to avoid accessing temporary files
 * generated by QSaveFile. If we start reading such a file, we may
 * inadvertently keep it open while QSaveFile is trying to remove it,
 * or we might detect the file just before it is removed, leading to
 * race conditions and errors.
 *
 * Unfortunately, QSaveFile doesn't provide a way to retrieve the
 * temporary file name or to set a specific template for the temporary
 * file name it uses. By default, QSaveFile appends a `.XXXXXX` suffix
 * to the original file name, where the `XXXXXX` part is dynamically
 * generated to ensure uniqueness.
 *
 * This class acts like a lock by adding and removing the target file
 * name into/from a global string set, helping to manage access to
 * files during critical operations.
 *
 * Note: Please do not use the `setFileName` function directly, as it
 * is not virtual and cannot be overridden.
 */
class PSaveFile : public QSaveFile
{
  public:
	PSaveFile(const QString& name) : QSaveFile(name)
	{
		addPath(name);
	}
	PSaveFile(const QString& name, QObject* parent) : QSaveFile(name, parent)
	{
		addPath(name);
	}
	virtual ~PSaveFile()
	{
		if (auto app = APPLICATION_DYN)
		{
			app->removeQSavePath(m_absoluteFilePath);
		}
	}

  private:
	void addPath(const QString& path)
	{
		m_absoluteFilePath = QFileInfo(path).absoluteFilePath() + "."; // add dot for tmp files only
		if (auto app = APPLICATION_DYN)
		{
			app->addQSavePath(m_absoluteFilePath);
		}
	}
	QString m_absoluteFilePath;
};
#else
#define PSaveFile QSaveFile
#endif