@@ -3,13 +3,13 @@ use crate::builtins::pystr::PyStrRef;
33use crate :: builtins:: pytype:: PyTypeRef ;
44use crate :: common:: lock:: { PyRwLock , PyRwLockReadGuard , PyRwLockWriteGuard } ;
55use crate :: exceptions:: IntoPyException ;
6- use crate :: function:: OptionalArg ;
76use crate :: pyobject:: {
87 BorrowValue , PyClassImpl , PyObjectRef , PyRef , PyResult , PyValue , StaticType , TryFromObject ,
98} ;
109use crate :: VirtualMachine ;
1110
1211use std:: convert:: TryInto ;
12+ use std:: ffi:: OsStr ;
1313use std:: io;
1414use winapi:: shared:: winerror;
1515use winreg:: { enums:: RegType , RegKey , RegValue } ;
@@ -98,25 +98,43 @@ impl Hkey {
9898 }
9999 }
100100 }
101+ fn into_key ( self ) -> RegKey {
102+ let k = match self {
103+ Self :: PyHKEY ( py) => py. key ( ) . raw_handle ( ) ,
104+ Self :: Constant ( k) => k,
105+ } ;
106+ RegKey :: predef ( k)
107+ }
101108}
102109
103- fn winreg_OpenKey (
110+ #[ derive( FromArgs ) ]
111+ struct OpenKeyArgs {
112+ #[ pyarg( any) ]
104113 key : Hkey ,
105- subkey : Option < PyStrRef > ,
106- reserved : OptionalArg < i32 > ,
107- access : OptionalArg < u32 > ,
108- vm : & VirtualMachine ,
109- ) -> PyResult < PyHKEY > {
110- let reserved = reserved. unwrap_or ( 0 ) ;
111- let access = access. unwrap_or ( winreg:: enums:: KEY_READ ) ;
114+ #[ pyarg( any) ]
115+ sub_key : Option < PyStrRef > ,
116+ #[ pyarg( any, default = "0" ) ]
117+ reserved : i32 ,
118+ #[ pyarg( any, default = "winreg::enums::KEY_READ" ) ]
119+ access : u32 ,
120+ }
121+
122+ fn winreg_OpenKey ( args : OpenKeyArgs , vm : & VirtualMachine ) -> PyResult < PyHKEY > {
123+ let OpenKeyArgs {
124+ key,
125+ sub_key,
126+ reserved,
127+ access,
128+ } = args;
129+
112130 if reserved != 0 {
113131 // RegKey::open_subkey* doesn't have a reserved param, so this'll do
114132 return Err ( vm. new_value_error ( "reserved param must be 0" . to_owned ( ) ) ) ;
115133 }
116134
117- let subkey = subkey . as_ref ( ) . map_or ( "" , |s| s. borrow_value ( ) ) ;
135+ let sub_key = sub_key . as_ref ( ) . map_or ( "" , |s| s. borrow_value ( ) ) ;
118136 let key = key
119- . with_key ( |k| k. open_subkey_with_flags ( subkey , access) )
137+ . with_key ( |k| k. open_subkey_with_flags ( sub_key , access) )
120138 . map_err ( |e| e. into_pyexception ( vm) ) ?;
121139
122140 Ok ( PyHKEY :: new ( key) )
@@ -177,6 +195,39 @@ fn winreg_CloseKey(key: Hkey) {
177195 }
178196}
179197
198+ fn winreg_CreateKey ( key : Hkey , subkey : Option < PyStrRef > , vm : & VirtualMachine ) -> PyResult < PyHKEY > {
199+ let k = match subkey {
200+ Some ( subkey) => {
201+ let ( k, _disp) = key
202+ . with_key ( |k| k. create_subkey ( & * subkey. borrow_value ( ) ) )
203+ . map_err ( |e| e. into_pyexception ( vm) ) ?;
204+ k
205+ }
206+ None => key. into_key ( ) ,
207+ } ;
208+ Ok ( PyHKEY :: new ( k) )
209+ }
210+
211+ fn winreg_SetValue (
212+ key : Hkey ,
213+ subkey : Option < PyStrRef > ,
214+ typ : u32 ,
215+ value : PyStrRef ,
216+ vm : & VirtualMachine ,
217+ ) -> PyResult < ( ) > {
218+ if typ != winreg:: enums:: REG_SZ as u32 {
219+ return Err ( vm. new_type_error ( "type must be winreg.REG_SZ" . to_owned ( ) ) ) ;
220+ }
221+ let subkey = subkey. as_ref ( ) . map_or ( "" , |s| s. borrow_value ( ) ) ;
222+ key. with_key ( |k| k. set_value ( subkey, & OsStr :: new ( value. borrow_value ( ) ) ) )
223+ . map_err ( |e| e. into_pyexception ( vm) )
224+ }
225+
226+ fn winreg_DeleteKey ( key : Hkey , subkey : PyStrRef , vm : & VirtualMachine ) -> PyResult < ( ) > {
227+ key. with_key ( |k| k. delete_subkey ( subkey. borrow_value ( ) ) )
228+ . map_err ( |e| e. into_pyexception ( vm) )
229+ }
230+
180231fn reg_to_py ( value : RegValue , vm : & VirtualMachine ) -> PyResult {
181232 macro_rules! bytes_to_int {
182233 ( $int: ident, $f: ident, $name: ident) => { {
@@ -255,6 +306,9 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
255306 "EnumKey" => named_function!( ctx, winreg, EnumKey ) ,
256307 "EnumValue" => named_function!( ctx, winreg, EnumValue ) ,
257308 "CloseKey" => named_function!( ctx, winreg, CloseKey ) ,
309+ "CreateKey" => named_function!( ctx, winreg, CreateKey ) ,
310+ "SetValue" => named_function!( ctx, winreg, SetValue ) ,
311+ "DeleteKey" => named_function!( ctx, winreg, DeleteKey ) ,
258312 } ) ;
259313
260314 macro_rules! add_constants {
0 commit comments