summaryrefslogtreecommitdiffstats
path: root/src/app/system.h
blob: 4b4440fc5591443a68da111f41b992fddc918180 (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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// * This file is part of the COLOBOT source code
// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
// * Copyright (C) 2012, Polish Portal of Colobot (PPC)
// *
// * 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, either version 3 of the License, or
// * (at your option) any later version.
// *
// * 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, see  http://www.gnu.org/licenses/.

/**
 * \file app/system.h
 * \brief System functions: time stamps, info dialogs, etc.
 */

#pragma once

#include "common/singleton.h"

#include <string>

/**
 * \enum SystemDialogType
 * \brief Type of system dialog
 */
enum SystemDialogType
{
    //! Information message
    SDT_INFO,
    //! Warning message
    SDT_WARNING,
    //! Error message
    SDT_ERROR,
    //! Yes/No question
    SDT_YES_NO,
    //! Ok/Cancel question
    SDT_OK_CANCEL
};

/**
 * \enum SystemDialogResult
 * \brief Result of system dialog
 *
 * Means which button was pressed.
 */
enum SystemDialogResult
{
    SDR_OK,
    SDR_CANCEL,
    SDR_YES,
    SDR_NO
};

/**
 * \enum SystemTimeUnit
 * \brief Time unit
 */
enum SystemTimeUnit
{
    //! seconds
    STU_SEC,
    //! milliseconds
    STU_MSEC,
    //! microseconds
    STU_USEC
};

/*
 * Forward declaration of time stamp struct
 * SystemTimeStamp should only be used in a pointer context.
 * The implementation details are hidden because of platform dependence.
 */
struct SystemTimeStamp;

/**
 * \class CSystemUtils
 * \brief Platform-specific utils
 *
 * This class provides system-specific utilities like displaying user dialogs and
 * querying system timers for exact timestamps.
 */
class CSystemUtils : public CSingleton<CSystemUtils>
{
protected:
    CSystemUtils();

public:
    //! Creates system utils for specific platform
    static CSystemUtils* Create();

    //! Performs platform-specific initialization
    virtual void Init() = 0;

    //! Displays a system dialog
    virtual SystemDialogResult SystemDialog(SystemDialogType, const std::string &title, const std::string &message) = 0;

    //! Displays a fallback system dialog using console
    TEST_VIRTUAL SystemDialogResult ConsoleSystemDialog(SystemDialogType type, const std::string& title, const std::string& message);

    //! Creates a new time stamp object
    TEST_VIRTUAL SystemTimeStamp* CreateTimeStamp();

    //! Destroys a time stamp object
    TEST_VIRTUAL void DestroyTimeStamp(SystemTimeStamp *stamp);

    //! Copies the time stamp from \a src to \a dst
    TEST_VIRTUAL void CopyTimeStamp(SystemTimeStamp *dst, SystemTimeStamp *src);

    //! Returns a time stamp associated with current time
    virtual void GetCurrentTimeStamp(SystemTimeStamp *stamp) = 0;

    //! Returns the platform's expected time stamp resolution
    TEST_VIRTUAL float GetTimeStampResolution(SystemTimeUnit unit = STU_SEC);

    //! Returns the platform's exact (in nanosecond units) expected time stamp resolution
    virtual long long GetTimeStampExactResolution() = 0;

    //! Returns a difference between two timestamps in given time unit
    /** The difference is \a after - \a before. */
    TEST_VIRTUAL float TimeStampDiff(SystemTimeStamp *before, SystemTimeStamp *after, SystemTimeUnit unit = STU_SEC);

    //! Returns the exact (in nanosecond units) difference between two timestamps
    /** The difference is \a after - \a before. */
    virtual long long TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after) = 0;

    //! Returns the data path (containing textures, levels, helpfiles, etc)
    virtual std::string GetDataPath();

    //! Returns the translations path
    virtual std::string GetLangPath();

    //! Returns the save dir location
    virtual std::string GetSaveDir();
};

//! Global function to get CSystemUtils instance
inline CSystemUtils* GetSystemUtils()
{
    return CSystemUtils::GetInstancePointer();
}