Skip to content

Commit bfa80db

Browse files
committed
Fix QSettings
Make it a safe API
1 parent 26f3dcb commit bfa80db

File tree

1 file changed

+24
-39
lines changed

1 file changed

+24
-39
lines changed

qttypes/src/qtcore/qsettings.rs

Lines changed: 24 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ cpp_class!(
1111
/// Wrapper around [`QSettings`][class] class.
1212
///
1313
/// [class]: https://doc.qt.io/qt-5/qsettings.html
14-
#[derive(Default)]
1514
pub unsafe struct QSettings as "std::unique_ptr<QSettings>"
1615
);
1716

@@ -22,34 +21,32 @@ impl QSettings {
2221
/// with setting `format` set to `IniFormat` and `scope` to (default) `UserScope`
2322
///
2423
/// [ctor]: https://doc.qt.io/qt-5/qsettings.html#QSettings-3
25-
pub fn new(organization: &str, application: &str) -> *mut Self {
24+
pub fn new(organization: &str, application: &str) -> Self {
2625
let organization = QString::from(organization);
2726
let application = QString::from(application);
2827
cpp!(
29-
unsafe [organization as "QString", application as "QString"] -> *mut QSettings as "QSettings*" {
30-
QSettings* settings = new QSettings(QSettings::IniFormat, QSettings::UserScope, organization, application);
31-
return settings;
28+
unsafe [organization as "QString", application as "QString"] -> QSettings as "std::unique_ptr<QSettings>" {
29+
return std::unique_ptr<QSettings>(new QSettings(QSettings::IniFormat, QSettings::UserScope, organization, application));
3230
}
3331
)
3432
}
3533

3634
/// Wrapper around [`QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr)`][ctor] constructor.
3735
///
3836
/// [ctor]: https://doc.qt.io/qt-5/qsettings.html#QSettings
39-
pub fn from_path(file_name: &str) -> *mut Self {
37+
pub fn from_path(file_name: &str) -> Self {
4038
let file_name = QString::from(file_name);
4139
cpp!(
42-
unsafe [file_name as "QString"] -> *mut QSettings as "QSettings*" {
43-
QSettings* settings = new QSettings(file_name, QSettings::IniFormat);
44-
return settings;
40+
unsafe [file_name as "QString"] -> QSettings as "std::unique_ptr<QSettings>" {
41+
return std::unique_ptr<QSettings>(new QSettings(file_name, QSettings::IniFormat));
4542
}
4643
)
4744
}
4845

4946
pub fn filename(&self) -> String {
5047
let filename: QString = cpp!(
51-
unsafe [self as "QSettings *"] -> QString as "QString" {
52-
return self->fileName();
48+
unsafe [self as "QSettings **"] -> QString as "QString" {
49+
return (*self)->fileName();
5350
}
5451
);
5552
filename.to_string()
@@ -58,35 +55,35 @@ impl QSettings {
5855
pub fn contains(&self, key: &str) -> bool {
5956
let key = QString::from(key);
6057
unsafe {
61-
cpp!([self as "QSettings *", key as "QString"] -> bool as "bool" {
62-
return self->contains(key);
58+
cpp!([self as "QSettings **", key as "QString"] -> bool as "bool" {
59+
return (*self)->contains(key);
6360
})
6461
}
6562
}
6663

6764
pub fn value_bool(&self, key: &str) -> bool {
6865
let key = QString::from(key);
6966
unsafe {
70-
cpp!([self as "QSettings *", key as "QString"] -> bool as "bool" {
71-
return self->value(key).toBool();
67+
cpp!([self as "QSettings **", key as "QString"] -> bool as "bool" {
68+
return (*self)->value(key).toBool();
7269
})
7370
}
7471
}
7572

7673
pub fn set_bool(&mut self, key: &str, value: bool) {
7774
let key = QString::from(key);
7875
unsafe {
79-
cpp!([self as "QSettings *", key as "QString", value as "bool"] {
80-
self->setValue(key, value);
76+
cpp!([self as "QSettings **", key as "QString", value as "bool"] {
77+
(*self)->setValue(key, value);
8178
})
8279
};
8380
}
8481

8582
pub fn value_string(&self, key: &str) -> String {
8683
let key = QString::from(key);
8784
let val = unsafe {
88-
cpp!([self as "QSettings *", key as "QString"] -> QString as "QString" {
89-
return self->value(key).toString();
85+
cpp!([self as "QSettings **", key as "QString"] -> QString as "QString" {
86+
return (*self)->value(key).toString();
9087
})
9188
};
9289
val.into()
@@ -96,49 +93,41 @@ impl QSettings {
9693
let key = QString::from(key);
9794
let value = QString::from(value);
9895
unsafe {
99-
cpp!([self as "QSettings *", key as "QString", value as "QString"] {
100-
self->setValue(key, value);
96+
cpp!([self as "QSettings **", key as "QString", value as "QString"] {
97+
(*self)->setValue(key, value);
10198
})
10299
};
103100
}
104101

105102
pub fn sync(&self) {
106103
unsafe {
107-
cpp!([self as "QSettings *"] {
108-
self->sync();
104+
cpp!([self as "QSettings **"] {
105+
(*self)->sync();
109106
})
110107
};
111108
}
112109
}
113110

114111
#[test]
115112
fn test_qsettings_filename() {
116-
let inner = QSettings::new("qmetaobject", "qsettings");
117-
let qsettings = unsafe { inner.as_ref().unwrap() };
113+
let qsettings = QSettings::new("qmetaobject", "qsettings");
118114

119115
assert!(
120116
qsettings.filename().ends_with("/qmetaobject/qsettings.ini"),
121117
"'{}' does not end with '/qmetaobject/qsettings.ini'",
122118
qsettings.filename()
123119
);
124-
125-
drop(qsettings);
126-
drop(inner);
127120
}
128121

129122
#[test]
130123
fn test_qsettings_new_from_path() {
131-
let inner = QSettings::from_path("/tmp/my_settings.conf");
132-
let qsettings = unsafe { inner.as_ref().unwrap() };
124+
let qsettings = QSettings::from_path("/tmp/my_settings.conf");
133125

134126
assert!(
135127
qsettings.filename().ends_with("/tmp/my_settings.conf"),
136128
"'{}' does not end with '/tmp/my_settings.conf'",
137129
qsettings.filename()
138130
);
139-
140-
drop(qsettings);
141-
drop(inner);
142131
}
143132

144133
#[test]
@@ -147,8 +136,7 @@ fn test_qsettings_values() {
147136
let config_pathbuf = temp_dir.path().join("qsettings.conf");
148137
let config_file = config_pathbuf.to_str().unwrap();
149138

150-
let inner = QSettings::from_path(config_file);
151-
let qsettings = unsafe { inner.as_mut().unwrap() };
139+
let mut qsettings = QSettings::from_path(config_file);
152140

153141
qsettings.set_bool("test_true", false);
154142
qsettings.set_bool("test_false", true);
@@ -165,10 +153,8 @@ fn test_qsettings_values() {
165153
assert_eq!(qsettings.value_string("test_emoji"), "🦀");
166154

167155
drop(qsettings);
168-
drop(inner);
169156

170-
let inner = QSettings::from_path(config_file);
171-
let qsettings = unsafe { inner.as_mut().unwrap() };
157+
let qsettings = QSettings::from_path(config_file);
172158

173159
assert_eq!(qsettings.value_bool("test_true"), false);
174160
assert_eq!(qsettings.value_bool("test_false"), true);
@@ -177,7 +163,6 @@ fn test_qsettings_values() {
177163
assert_eq!(qsettings.value_string("test_emoji"), "🦀");
178164

179165
drop(qsettings);
180-
drop(inner);
181166

182167
drop(temp_dir);
183168
assert!(!config_pathbuf.as_path().exists());

0 commit comments

Comments
 (0)