mirror of
https://gitlab.freedesktop.org/upower/upower.git
synced 2026-05-02 08:28:05 +02:00
libupower-glib: Define the types for the charge strategies
The charge strategies includes Unknown, N/A, Trickle, Fast, Standard, Adaptive, Custom Long Life and Bypass. up_device_battery_charge_strategy_from_string() converts the charge strategy string to a enume value. If the string can be found, UP_DEVICE_CHARGE_STRATEGIES_LAST will be returned.
This commit is contained in:
parent
423c912905
commit
6c8e5e283f
4 changed files with 151 additions and 98 deletions
|
|
@ -420,6 +420,8 @@ up_device_to_text (UpDevice *device)
|
|||
g_string_append_printf (string, " charge-threshold-enabled: %s\n", up_device_bool_to_string (up_exported_device_get_charge_threshold_enabled (priv->proxy_device)));
|
||||
if (up_exported_device_get_charge_threshold_supported (priv->proxy_device))
|
||||
g_string_append_printf (string, " charge-threshold-supported: %s\n", up_device_bool_to_string (up_exported_device_get_charge_threshold_supported (priv->proxy_device)));
|
||||
if (up_exported_device_get_charge_strategy (priv->proxy_device) != UP_DEVICE_CHARGE_STRATEGIES_UNKNOWN)
|
||||
g_string_append_printf (string, " charge-strategy: %s\n", up_device_charge_strategy_to_str (up_exported_device_get_charge_strategy (priv->proxy_device)));
|
||||
}
|
||||
if (kind == UP_DEVICE_KIND_LINE_POWER)
|
||||
g_string_append_printf (string, " online: %s\n", up_device_bool_to_string (up_exported_device_get_online (priv->proxy_device)));
|
||||
|
|
|
|||
|
|
@ -371,3 +371,81 @@ up_device_level_from_string (const gchar *level)
|
|||
return UP_DEVICE_LEVEL_FULL;
|
||||
return UP_DEVICE_LEVEL_UNKNOWN;
|
||||
}
|
||||
|
||||
/**
|
||||
* up_device_charge_strategy_to_str:
|
||||
*
|
||||
* Converts a #UpDeviceChargeStrategies to a string.
|
||||
*
|
||||
* Return value: identifier string
|
||||
*
|
||||
* Since: 1.91.1
|
||||
**/
|
||||
const gchar *
|
||||
up_device_charge_strategy_to_str (UpDeviceChargeStrategies strategy)
|
||||
{
|
||||
if (strategy == UP_DEVICE_CHARGE_STRATEGIES_UNKNOWN)
|
||||
return "Unknown";
|
||||
if (strategy == UP_DEVICE_CHARGE_STRATEGIES_NA)
|
||||
return "N/A";
|
||||
if (strategy == UP_DEVICE_CHARGE_STRATEGIES_TRICKLE)
|
||||
return "Trickle";
|
||||
if (strategy == UP_DEVICE_CHARGE_STRATEGIES_FAST)
|
||||
return "Fast";
|
||||
if (strategy == UP_DEVICE_CHARGE_STRATEGIES_STANDARD)
|
||||
return "Standard";
|
||||
if (strategy == UP_DEVICE_CHARGE_STRATEGIES_ADAPTIVE)
|
||||
return "Adaptive";
|
||||
if (strategy == UP_DEVICE_CHARGE_STRATEGIES_CUSTOM)
|
||||
return "Custom";
|
||||
if (strategy == UP_DEVICE_CHARGE_STRATEGIES_LONG_LIFE)
|
||||
return "Long Life";
|
||||
if (strategy == UP_DEVICE_CHARGE_STRATEGIES_BYPASS)
|
||||
return "Bypass";
|
||||
|
||||
/* invalid type */
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
/**
|
||||
* up_device_battery_charge_strategy_from_string:
|
||||
*
|
||||
* Converts a string to #UpDeviceChargeStrategies.
|
||||
*
|
||||
* Return value: enumerated value
|
||||
*
|
||||
* Since: 1.91.1
|
||||
**/
|
||||
UpDeviceChargeStrategies
|
||||
up_device_battery_charge_strategy_from_string (const gchar *strategy)
|
||||
{
|
||||
if (strategy == NULL)
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_UNKNOWN;
|
||||
|
||||
/* Codes are suggested by Claude AI
|
||||
*
|
||||
* co-worked-with: Cursor and Claude AI
|
||||
* Reviewed-by: Kate Hsuan <hpa@redhat.com>
|
||||
*/
|
||||
if (g_str_equal (strategy, "Unknown"))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_UNKNOWN;
|
||||
if (g_str_equal (strategy, "N/A"))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_NA;
|
||||
if (g_str_equal (strategy, "Trickle"))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_TRICKLE;
|
||||
if (g_str_equal (strategy, "Fast"))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_FAST;
|
||||
if (g_str_equal (strategy, "Standard"))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_STANDARD;
|
||||
if (g_str_equal (strategy, "Adaptive"))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_ADAPTIVE;
|
||||
if (g_str_equal (strategy, "Custom"))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_CUSTOM;
|
||||
if (g_str_equal (strategy, "Long Life"))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_LONG_LIFE;
|
||||
if (g_str_equal (strategy, "Bypass"))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_BYPASS;
|
||||
|
||||
/* invalid type */
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_LAST;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,14 +127,35 @@ typedef enum {
|
|||
UP_DEVICE_LEVEL_LAST
|
||||
} UpDeviceLevel;
|
||||
|
||||
const gchar *up_device_kind_to_string (UpDeviceKind type_enum);
|
||||
const gchar *up_device_state_to_string (UpDeviceState state_enum);
|
||||
const gchar *up_device_technology_to_string (UpDeviceTechnology technology_enum);
|
||||
const gchar *up_device_level_to_string (UpDeviceLevel level_enum);
|
||||
UpDeviceKind up_device_kind_from_string (const gchar *type);
|
||||
UpDeviceState up_device_state_from_string (const gchar *state);
|
||||
UpDeviceTechnology up_device_technology_from_string (const gchar *technology);
|
||||
UpDeviceLevel up_device_level_from_string (const gchar *level);
|
||||
/**
|
||||
* UpDeviceChargeTypes:
|
||||
*
|
||||
* Select the charging algorithm to use for a battery.
|
||||
**/
|
||||
typedef enum {
|
||||
UP_DEVICE_CHARGE_STRATEGIES_0,
|
||||
UP_DEVICE_CHARGE_STRATEGIES_UNKNOWN = 1 << 0,
|
||||
UP_DEVICE_CHARGE_STRATEGIES_NA = 1 << 1,
|
||||
UP_DEVICE_CHARGE_STRATEGIES_TRICKLE = 1 << 2,
|
||||
UP_DEVICE_CHARGE_STRATEGIES_FAST = 1 << 3,
|
||||
UP_DEVICE_CHARGE_STRATEGIES_STANDARD = 1 << 4,
|
||||
UP_DEVICE_CHARGE_STRATEGIES_ADAPTIVE = 1 << 5,
|
||||
UP_DEVICE_CHARGE_STRATEGIES_CUSTOM = 1 << 6,
|
||||
UP_DEVICE_CHARGE_STRATEGIES_LONG_LIFE = 1 << 7,
|
||||
UP_DEVICE_CHARGE_STRATEGIES_BYPASS = 1 << 8,
|
||||
UP_DEVICE_CHARGE_STRATEGIES_LAST,
|
||||
} UpDeviceChargeStrategies;
|
||||
|
||||
const gchar *up_device_kind_to_string (UpDeviceKind type_enum);
|
||||
const gchar *up_device_state_to_string (UpDeviceState state_enum);
|
||||
const gchar *up_device_technology_to_string (UpDeviceTechnology technology_enum);
|
||||
const gchar *up_device_level_to_string (UpDeviceLevel level_enum);
|
||||
const gchar *up_device_charge_strategy_to_str (UpDeviceChargeStrategies charge_type_enum);
|
||||
UpDeviceChargeStrategies up_device_battery_charge_strategy_from_string (const gchar *strategy);
|
||||
UpDeviceKind up_device_kind_from_string (const gchar *type);
|
||||
UpDeviceState up_device_state_from_string (const gchar *state);
|
||||
UpDeviceTechnology up_device_technology_from_string (const gchar *technology);
|
||||
UpDeviceLevel up_device_level_from_string (const gchar *level);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
|||
|
|
@ -45,20 +45,6 @@ enum {
|
|||
PROP_IGNORE_SYSTEM_PERCENTAGE
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_0,
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_UNKNOWN = 1 << 0,
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_NA = 1 << 1,
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_TRICKLE = 1 << 2,
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_FAST = 1 << 3,
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_STANDARD = 1 << 4,
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_ADAPTIVE = 1 << 5,
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_CUSTOM = 1 << 6,
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_LONG_LIFE = 1 << 7,
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_BYPASS = 1 << 8,
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPE_LAST,
|
||||
} UpDeviceSupplyBatteryChargeTypes;
|
||||
|
||||
typedef enum {
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_THRESHOLD_SETTINGS_0,
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_THRESHOLD_SETTINGS_CHARGE_CONTROL_START_THRESHOLD = 1 << 0,
|
||||
|
|
@ -76,7 +62,7 @@ struct _UpDeviceSupplyBattery
|
|||
guint energy_old_first;
|
||||
gdouble rate_old;
|
||||
guint supported_charge_types;
|
||||
UpDeviceSupplyBatteryChargeTypes charge_type;
|
||||
UpDeviceChargeStrategies charge_types;
|
||||
UpDeviceSupplyBatteryChargeThresholdSettings charge_threshold_settings;
|
||||
gboolean charge_threshold_by_charge_type;
|
||||
gboolean shown_invalid_voltage_warning;
|
||||
|
|
@ -234,84 +220,50 @@ remove_brackets (const gchar *type)
|
|||
return g_string_free (washed_type, FALSE);
|
||||
}
|
||||
|
||||
static UpDeviceSupplyBatteryChargeTypes
|
||||
static UpDeviceChargeStrategies
|
||||
up_device_battery_charge_type_str_to_enum (const gchar *type)
|
||||
{
|
||||
if (type == NULL)
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPE_LAST;
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_LAST;
|
||||
|
||||
if (!g_strcmp0 ("Unknown", type))
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_UNKNOWN;
|
||||
else if (!g_strcmp0 ("N/A", type))
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_NA;
|
||||
else if (!g_strcmp0 ("Trickle", type))
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_TRICKLE;
|
||||
else if (!g_strcmp0 ("Fast", type))
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_FAST;
|
||||
else if (!g_strcmp0 ("Standard", type))
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_STANDARD;
|
||||
else if (!g_strcmp0 ("Adaptive", type))
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_ADAPTIVE;
|
||||
else if (!g_strcmp0 ("Custom", type))
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_CUSTOM;
|
||||
else if (!g_strcmp0 ("Long_Life", type))
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_LONG_LIFE;
|
||||
else if (!g_strcmp0 ("Bypass", type))
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_BYPASS;
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_UNKNOWN;
|
||||
if (!g_strcmp0 ("N/A", type))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_NA;
|
||||
if (!g_strcmp0 ("Trickle", type))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_TRICKLE;
|
||||
if (!g_strcmp0 ("Fast", type))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_FAST;
|
||||
if (!g_strcmp0 ("Standard", type))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_STANDARD;
|
||||
if (!g_strcmp0 ("Adaptive", type))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_ADAPTIVE;
|
||||
if (!g_strcmp0 ("Custom", type))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_CUSTOM;
|
||||
if (!g_strcmp0 ("Long_Life", type))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_LONG_LIFE;
|
||||
if (!g_strcmp0 ("Bypass", type))
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_BYPASS;
|
||||
|
||||
/* invalid type */
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPE_LAST;
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_LAST;
|
||||
}
|
||||
|
||||
static gchar *
|
||||
up_device_battery_charge_type_enum_to_str (UpDeviceSupplyBatteryChargeTypes types)
|
||||
{
|
||||
if (types == UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_UNKNOWN)
|
||||
return g_strdup ("Unknown");
|
||||
|
||||
if (types == UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_NA)
|
||||
return g_strdup ("N/A");
|
||||
|
||||
if (types == UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_TRICKLE)
|
||||
return g_strdup ("Trickle");
|
||||
|
||||
if (types == UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_FAST)
|
||||
return g_strdup ("Fast");
|
||||
|
||||
if (types == UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_STANDARD)
|
||||
return g_strdup ("Standard");
|
||||
|
||||
if (types == UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_ADAPTIVE)
|
||||
return g_strdup ("Adaptive");
|
||||
|
||||
if (types == UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_CUSTOM)
|
||||
return g_strdup ("Custom");
|
||||
|
||||
if (types == UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_LONG_LIFE)
|
||||
return g_strdup ("Long_Life");
|
||||
|
||||
if (types == UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_BYPASS)
|
||||
return g_strdup ("Bypass");
|
||||
|
||||
/* invalid type */
|
||||
return g_strdup ("Unknown");
|
||||
}
|
||||
|
||||
static UpDeviceSupplyBatteryChargeTypes
|
||||
static UpDeviceChargeStrategies
|
||||
up_device_battery_charge_find_available_charge_types_for_charging (UpDevice *device) {
|
||||
UpDeviceSupplyBattery *self = UP_DEVICE_SUPPLY_BATTERY (device);
|
||||
UpDeviceSupplyBatteryChargeTypes charge_types = self->supported_charge_types;
|
||||
UpDeviceChargeStrategies charge_types = self->supported_charge_types;
|
||||
|
||||
if (charge_types & UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_FAST)
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_FAST;
|
||||
if (charge_types & UP_DEVICE_CHARGE_STRATEGIES_FAST)
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_FAST;
|
||||
|
||||
if (charge_types & UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_STANDARD)
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_STANDARD;
|
||||
if (charge_types & UP_DEVICE_CHARGE_STRATEGIES_STANDARD)
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_STANDARD;
|
||||
|
||||
if (charge_types & UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_ADAPTIVE)
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_ADAPTIVE;
|
||||
if (charge_types & UP_DEVICE_CHARGE_STRATEGIES_ADAPTIVE)
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_ADAPTIVE;
|
||||
|
||||
return UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPE_LAST;
|
||||
return UP_DEVICE_CHARGE_STRATEGIES_LAST;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -336,7 +288,7 @@ up_device_battery_get_supported_charge_types (UpDevice *device, UpBatteryInfo *i
|
|||
for (int i = 0; i < g_strv_length(types); i++) {
|
||||
if (g_utf8_strchr (types[i], 1, '[') != NULL) {
|
||||
tmp_type = remove_brackets (types[i]);
|
||||
self->charge_type = up_device_battery_charge_type_str_to_enum (tmp_type);
|
||||
self->charge_strategy = up_device_battery_charge_type_str_to_enum (tmp_type);
|
||||
} else {
|
||||
tmp_type = g_strdup (types[i]);
|
||||
}
|
||||
|
|
@ -368,10 +320,10 @@ up_device_supply_battery_is_charge_threshold_by_charge_type (UpDevice *device) {
|
|||
g_udev_device_has_sysfs_attr (native, "charge_control_end_threshold"))
|
||||
return FALSE;
|
||||
|
||||
if (self->supported_charge_types & UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_LONG_LIFE) {
|
||||
if (self->supported_charge_types & (UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_STANDARD |
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_ADAPTIVE |
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_FAST)) {
|
||||
if (self->supported_charge_types & UP_DEVICE_CHARGE_STRATEGIES_LONG_LIFE) {
|
||||
if (self->supported_charge_types & (UP_DEVICE_CHARGE_STRATEGIES_STANDARD |
|
||||
UP_DEVICE_CHARGE_STRATEGIES_ADAPTIVE |
|
||||
UP_DEVICE_CHARGE_STRATEGIES_FAST)) {
|
||||
g_debug ("charge_control_start_threshold and charge_control_end_threshold are not found but the supported charge_types Long_lift, Standard or Adaptive was found. Assuming charging threshold is supported");
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -628,7 +580,7 @@ up_device_supply_device_path (GUdevDevice *device)
|
|||
static gboolean
|
||||
up_device_supply_battery_is_charge_type_exist (UpDevice *device, const gchar *charge_type) {
|
||||
UpDeviceSupplyBattery *self = UP_DEVICE_SUPPLY_BATTERY (device);
|
||||
UpDeviceSupplyBatteryChargeTypes type;
|
||||
UpDeviceChargeStrategies type;
|
||||
|
||||
type = up_device_battery_charge_type_str_to_enum (charge_type);
|
||||
|
||||
|
|
@ -640,16 +592,16 @@ up_device_supply_battery_is_charge_type_exist (UpDevice *device, const gchar *ch
|
|||
|
||||
static gboolean
|
||||
up_device_supply_battery_set_battery_charge_types (UpDevice *device,
|
||||
UpDeviceSupplyBatteryChargeTypes charge_type,
|
||||
UpDeviceChargeStrategies charge_type,
|
||||
GError **error) {
|
||||
GUdevDevice *native;
|
||||
g_autofree gchar *charge_type_str = NULL;
|
||||
g_autofree const gchar *charge_type_str = NULL;
|
||||
g_autofree gchar *native_path = NULL;
|
||||
g_autofree gchar *type_filename = NULL;
|
||||
|
||||
native = G_UDEV_DEVICE (up_device_get_native (device));
|
||||
|
||||
charge_type_str = up_device_battery_charge_type_enum_to_str (charge_type);
|
||||
charge_type_str = up_device_charge_strategies_to_str (charge_type);
|
||||
|
||||
/* return, if the attribute "charge_types" is not found */
|
||||
if (!g_udev_device_has_sysfs_attr (native, "charge_types"))
|
||||
|
|
@ -683,7 +635,7 @@ up_device_supply_battery_set_battery_charge_thresholds(UpDevice *device, guint s
|
|||
g_autofree gchar *end_filename = NULL;
|
||||
g_autoptr (GString) start_str = g_string_new (NULL);
|
||||
g_autoptr (GString) end_str = g_string_new (NULL);
|
||||
UpDeviceSupplyBatteryChargeTypes charge_type_enum;
|
||||
UpDeviceChargeStrategies charge_type_enum;
|
||||
|
||||
native = G_UDEV_DEVICE (up_device_get_native (device));
|
||||
native_path = up_device_supply_device_path (native);
|
||||
|
|
@ -701,7 +653,7 @@ up_device_supply_battery_set_battery_charge_thresholds(UpDevice *device, guint s
|
|||
NULL);
|
||||
} else {
|
||||
up_device_supply_battery_set_battery_charge_types (device,
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_LONG_LIFE,
|
||||
UP_DEVICE_CHARGE_STRATEGIES_LONG_LIFE,
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
|
@ -740,7 +692,7 @@ up_device_supply_battery_set_battery_charge_thresholds(UpDevice *device, guint s
|
|||
} else {
|
||||
/* for the Dell laptops, the charge_types has to be set to "Custom" to enable the charging threshold */
|
||||
up_device_supply_battery_set_battery_charge_types (device,
|
||||
UP_DEVICE_SUPPLY_BATTERY_CHARGE_TYPES_CUSTOM,
|
||||
UP_DEVICE_CHARGE_STRATEGIES_CUSTOM,
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue