summaryrefslogtreecommitdiffstats
path: root/src/VBox/Main/include/HostPower.h
blob: 4f0f92dcfe12af6cf7b547682629bf6536df779b (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
/* $Id: HostPower.h $ */
/** @file
 *
 * VirtualBox interface to host's power notification service
 */

/*
 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
 *
 * This file is part of VirtualBox base platform packages, as
 * available from https://www.virtualbox.org.
 *
 * 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, in version 3 of the
 * License.
 *
 * 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 <https://www.gnu.org/licenses>.
 *
 * SPDX-License-Identifier: GPL-3.0-only
 */

#ifndef MAIN_INCLUDED_HostPower_h
#define MAIN_INCLUDED_HostPower_h
#ifndef RT_WITHOUT_PRAGMA_ONCE
# pragma once
#endif

#ifdef RT_OS_DARWIN /* first, so we can undef pVM in iprt/cdefs.h */
# include <IOKit/pwr_mgt/IOPMLib.h>
# include <Carbon/Carbon.h>
#endif

#include "VirtualBoxBase.h"

#include <vector>

#ifdef RT_OS_LINUX
# include <VBox/dbus.h>
#endif

class HostPowerService
{
  public:
    HostPowerService(VirtualBox *aVirtualBox);
    virtual ~HostPowerService();
    void notify(Reason_T aReason);

  protected:
    VirtualBox *mVirtualBox;
    std::vector<ComPtr<IInternalSessionControl> > mSessionControls;
};

# if defined(RT_OS_WINDOWS) || defined(DOXYGEN_RUNNING)
/**
 * The Windows hosted Power Service.
 */
class HostPowerServiceWin : public HostPowerService
{
public:

    HostPowerServiceWin(VirtualBox *aVirtualBox);
    virtual ~HostPowerServiceWin();

private:

    static DECLCALLBACK(int) NotificationThread(RTTHREAD ThreadSelf, void *pInstance);
    static LRESULT CALLBACK  WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

    HWND        mHwnd;
    RTTHREAD    mThread;
};
# endif
# if defined(RT_OS_LINUX) || defined(DOXYGEN_RUNNING)
/**
 * The Linux hosted Power Service.
 */
class HostPowerServiceLinux : public HostPowerService
{
public:

    HostPowerServiceLinux(VirtualBox *aVirtualBox);
    virtual ~HostPowerServiceLinux();

private:

    static DECLCALLBACK(int) powerChangeNotificationThread(RTTHREAD ThreadSelf, void *pInstance);

    /* Private member vars */
    /** Our message thread. */
    RTTHREAD mThread;
    /** Our (private) connection to the DBus.  Closing this will cause the
     * message thread to exit. */
    DBusConnection *mpConnection;
};

# endif
# if defined(RT_OS_DARWIN) || defined(DOXYGEN_RUNNING)
/**
 * The Darwin hosted Power Service.
 */
class HostPowerServiceDarwin : public HostPowerService
{
public:

    HostPowerServiceDarwin(VirtualBox *aVirtualBox);
    virtual ~HostPowerServiceDarwin();

private:

    static DECLCALLBACK(int) powerChangeNotificationThread(RTTHREAD ThreadSelf, void *pInstance);
    static void powerChangeNotificationHandler(void *pvData, io_service_t service, natural_t messageType, void *pMessageArgument);
    static void lowPowerHandler(void *pvData);

    void checkBatteryCriticalLevel(bool *pfCriticalChanged = NULL);

    /* Private member vars */
    RTTHREAD mThread; /* Our message thread. */

    io_connect_t mRootPort; /* A reference to the Root Power Domain IOService */
    IONotificationPortRef mNotifyPort; /* Notification port allocated by IORegisterForSystemPower */
    io_object_t mNotifierObject; /* Notifier object, used to deregister later */
    CFRunLoopRef mRunLoop; /* A reference to the local thread run loop */

    bool mCritical; /* Indicate if the battery was in the critical state last checked */
};
# endif

#endif /* !MAIN_INCLUDED_HostPower_h */
/* vi: set tabstop=4 shiftwidth=4 expandtab: */