]> gitweb.factorcode.org Git - factor.git/commitdiff
windows.registry: add change-registry-value and delete-value
authorAlexander Iljin <ajsoft@yandex.ru>
Wed, 11 Jul 2018 09:58:08 +0000 (16:58 +0700)
committerDoug Coleman <doug.coleman@gmail.com>
Fri, 13 Jul 2018 04:33:14 +0000 (23:33 -0500)
basis/windows/advapi32/advapi32.factor
basis/windows/registry/authors.txt
basis/windows/registry/registry-tests.factor
basis/windows/registry/registry.factor

index 7f3e8780050fc5e7100aae723ce5c9e3020f152e..0981c55524e19e05b37173d9bde43ef5b2f03077 100755 (executable)
@@ -1317,7 +1317,14 @@ FUNCTION: LONG RegDeleteKeyExW (
 ALIAS: RegDeleteKeyEx RegDeleteKeyExW
 
 ! : RegDeleteValueA ;
-! : RegDeleteValueW ;
+
+FUNCTION: LONG RegDeleteValueW (
+        HKEY    hKey,
+        LPCWSTR lpValueName
+    )
+
+ALIAS: RegDeleteValue RegDeleteValueW
+
 ! : RegDisablePredefinedCache ;
 ! : RegEnumKeyA ;
 ! : RegEnumKeyExA ;
index 7c1b2f22790bfdca05f14a555a40b7eaa3ce2abd..d652f68ac871fb0bf59a892373e3b1cbfccc4183 100644 (file)
@@ -1 +1,2 @@
 Doug Coleman
+Alexander Ilin
index 17662bf75ac09247d67a2fd77814d231a0b70030..839f2eecd396954b1fdd2351535ba109afa6385f 100644 (file)
@@ -1,7 +1,27 @@
 ! Copyright (C) 2010 Doug Coleman.
+! Copyright (C) 2018 Alexander Ilin.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel tools.test windows.advapi32 windows.registry ;
+USING: byte-arrays io.encodings.string io.encodings.utf16n
+kernel sequences tools.test windows.advapi32 windows.kernel32
+windows.registry ;
 IN: windows.registry.tests
 
 [ ]
 [ HKEY_CURRENT_USER "SOFTWARE\\\\Microsoft" read-registry drop ] unit-test
+
+[ t ]
+[
+    HKEY_CURRENT_USER "Environment" KEY_SET_VALUE [
+        "factor-test" "value" utf16n encode dup length set-reg-sz
+    ] with-open-registry-key
+    HKEY_CURRENT_USER "Environment" "factor-test" [
+        "test-string" ";" glue
+    ] change-registry-value
+    HKEY_CURRENT_USER "Environment" KEY_QUERY_VALUE [
+        "factor-test" f f MAX_PATH <byte-array> reg-query-value-ex
+        utf16n decode "value;test-string\0" =
+    ] with-open-registry-key
+    HKEY_CURRENT_USER "Environment" KEY_SET_VALUE [
+        "factor-test" delete-value
+    ] with-open-registry-key
+] unit-test
index 465d617a3d209a79ab02f0a0f8b70139c6058cfe..03d2228abfe60616218fe1d6a771630fbed63c85 100644 (file)
@@ -1,9 +1,11 @@
 ! Copyright (C) 2010 Doug Coleman.
+! Copyright (C) 2018 Alexander Ilin.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien.c-types byte-arrays kernel locals sequences
-windows.advapi32 windows.errors math windows
-windows.kernel32 windows.time accessors alien.data
-windows.types classes.struct continuations ;
+USING: accessors alien.c-types alien.data byte-arrays
+classes.struct continuations io.encodings.string
+io.encodings.utf16n kernel literals locals math sequences sets
+splitting windows windows.advapi32 windows.errors
+windows.kernel32 windows.time windows.types ;
 IN: windows.registry
 
 ERROR: open-key-failed key subkey mode error-string ;
@@ -66,22 +68,31 @@ CONSTANT: registry-value-max-length 16384
 : grow-buffer ( byte-array -- byte-array' )
     length 2 * <byte-array> ;
 
-:: reg-query-value-ex ( key subkey ptr1 ptr2 buffer -- buffer )
+PRIVATE>
+
+:: reg-query-value-ex ( key value-name ptr1 lpType buffer -- buffer )
     buffer length uint <ref> :> pdword
-    key subkey ptr1 ptr2 buffer pdword [ RegQueryValueEx ] 2keep
+    key value-name ptr1 lpType buffer pdword [ RegQueryValueEx ] 2keep
     rot :> ret
     ret ERROR_SUCCESS = [
         uint deref head
     ] [
         ret ERROR_MORE_DATA = [
             2drop
-            key subkey ptr1 ptr2 buffer
+            key value-name ptr1 lpType buffer
             grow-buffer reg-query-value-ex
         ] [
             ret n>win32-error-string throw
         ] if
     ] if ;
 
+: delete-value ( key value-name -- )
+    RegDeleteValue dup ERROR_SUCCESS = [
+        drop
+    ] [
+        n>win32-error-string throw
+    ] if ;
+
 TUPLE: registry-info
 key
 class-name
@@ -184,11 +195,30 @@ TUPLE: registry-enum-key ;
 : set-reg-sz ( hkey value lpdata cbdata -- )
     [ REG_SZ ] 2dip set-reg-key ;
 
-PRIVATE>
-
 : windows-performance-data ( -- byte-array )
     HKEY_PERFORMANCE_DATA "Global" f f
     21 2^ <byte-array> reg-query-value-ex ;
 
 : read-registry ( key subkey -- registry-info )
     KEY_READ [ reg-query-info-key ] with-open-registry-key ;
+
+:: change-registry-value ( key subkey value-name quot: ( value -- value' ) -- )
+    0 DWORD <ref> :> type
+    key subkey KEY_QUERY_VALUE KEY_SET_VALUE bitor [
+        dup :> hkey value-name f type MAX_PATH <byte-array>
+        reg-query-value-ex
+        type DWORD deref ${ REG_SZ REG_EXPAND_SZ REG_MULTI_SZ } in?
+        dup :> string-type? [
+            utf16n decode type DWORD deref REG_MULTI_SZ = [
+                "\0" split 2
+            ] [ 1 ] if head*
+        ] when
+        quot call( x -- x' )
+        string-type? [
+            type DWORD deref REG_MULTI_SZ = [
+                "\0" join 2
+            ] [ 1 ] if [ CHAR: \0 suffix ] times utf16n encode
+        ] when
+        [ hkey value-name type DWORD deref ] dip dup length
+        set-reg-key
+    ] with-open-registry-key ;