windows-pr 0.5.0-mswin32 → 0.5.1-mswin32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +5 -0
- data/README +10 -0
- data/lib/windows/device_io.rb +17 -1
- data/lib/windows/directory.rb +20 -5
- data/lib/windows/error.rb +11 -12
- data/lib/windows/file.rb +17 -2
- data/lib/windows/shell.rb +2 -2
- data/lib/windows/unicode.rb +34 -2
- metadata +2 -2
data/CHANGES
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
= 0.5.1 - 26-May-2006
|
2
|
+
* Minor updates and fixes for the Unicode and DeviceIO modules.
|
3
|
+
* Added some wide character support, based on $KCODE values (which should
|
4
|
+
not be used at this time).
|
5
|
+
|
1
6
|
= 0.5.0 - 23-May-2006
|
2
7
|
* Added the Registry module
|
3
8
|
* Added the EventLog module
|
data/README
CHANGED
@@ -45,6 +45,16 @@
|
|
45
45
|
file contains clipboard related functions, such as CloseClipboard(), as
|
46
46
|
well as constants such as CF_TEXT, CF_BITMAP, etc.
|
47
47
|
|
48
|
+
== Wide character functions - DO NOT USE
|
49
|
+
Because there's no way to "#define UNICODE" from outside of C, I have
|
50
|
+
instead taken the approach of defining the wide character functions and
|
51
|
+
automatically using those if $KCODE is set to anything other than "NONE".
|
52
|
+
|
53
|
+
However, support for this is very incomplete at the moment. In addition,
|
54
|
+
unpredictable segfaults occur with Ruby's string processing in some cases,
|
55
|
+
the cause of which is unknown at this time. The upshot of this is that you
|
56
|
+
should not use these modules with $KCODE set to anything other than "NONE".
|
57
|
+
|
48
58
|
== Where are the tests, dude?
|
49
59
|
While I've made some effort to test these functions, there are simply too
|
50
60
|
many for me to effectively test them all. We're ultimately talking about
|
data/lib/windows/device_io.rb
CHANGED
@@ -63,10 +63,26 @@ module Windows
|
|
63
63
|
FILE_DEVICE_FIPS = 0x0000003A
|
64
64
|
FILE_DEVICE_INFINIBAND = 0x0000003B
|
65
65
|
|
66
|
+
METHOD_BUFFERED = 0
|
67
|
+
FILE_ANY_ACCESS = 0
|
68
|
+
|
66
69
|
DeviceIoControl = Win32API.new('kernel32', 'DeviceIoControl', 'LLPLPLPP', 'I')
|
67
70
|
|
68
71
|
def DeviceIoControl(dev, code, in_buf, in_buf_size, out_buf, out_buf_size, bytes, overlapped)
|
69
|
-
DeviceIoControl.call(dev, code, in_buf, in_buf_size, out_buf, out_buf_size, bytes, overlapped)
|
72
|
+
DeviceIoControl.call(dev, code, in_buf, in_buf_size, out_buf, out_buf_size, bytes, overlapped) > 0
|
73
|
+
end
|
74
|
+
|
75
|
+
# Macros from WinIoCtl.h
|
76
|
+
def CTL_CODE(device, function, method, access)
|
77
|
+
((device) << 16) | ((access) << 14) | ((function) << 2) | (method)
|
78
|
+
end
|
79
|
+
|
80
|
+
def FSCTL_SET_COMPRESSION
|
81
|
+
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, 0, FILE_READ_DATA | FILE_WRITE_DATA)
|
82
|
+
end
|
83
|
+
|
84
|
+
def FSCTL_SET_SPARSE
|
85
|
+
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, 0, FILE_SPECIAL_ACCESS)
|
70
86
|
end
|
71
87
|
end
|
72
88
|
end
|
data/lib/windows/directory.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
require '
|
1
|
+
require 'windows/unicode'
|
2
2
|
|
3
3
|
module Windows
|
4
4
|
module Directory
|
5
5
|
CreateDirectory = Win32API.new('kernel32', 'CreateDirectory', 'PP', 'I')
|
6
|
+
CreateDirectoryW = Win32API.new('kernel32', 'CreateDirectoryW', 'PP', 'I')
|
6
7
|
CreateDirectoryEx = Win32API.new('kernel32', 'CreateDirectoryEx', 'PPP', 'I')
|
7
8
|
FindCloseChangeNotification = Win32API.new('kernel32', 'FindCloseChangeNotification', 'L', 'I')
|
8
9
|
FindFirstChangeNotification = Win32API.new('kernel32', 'FindFirstChangeNotification', 'PIL', 'L')
|
@@ -10,10 +11,16 @@ module Windows
|
|
10
11
|
GetCurrentDirectory = Win32API.new('kernel32', 'GetCurrentDirectory', 'LP', 'L')
|
11
12
|
ReadDirectoryChangesW = Win32API.new('kernel32', 'ReadDirectoryChangesW', 'LPLILPPP', 'I')
|
12
13
|
RemoveDirectory = Win32API.new('kernel32', 'RemoveDirectory', 'P', 'I')
|
14
|
+
RemoveDirectoryW = Win32API.new('kernel32', 'RemoveDirectoryW', 'P', 'I')
|
13
15
|
SetCurrentDirectory = Win32API.new('kernel32', 'SetCurrentDirectory', 'P', 'I')
|
16
|
+
SetCurrentDirectoryW = Win32API.new('kernel32', 'SetCurrentDirectoryW', 'P', 'I')
|
14
17
|
|
15
|
-
def CreateDirectory(path, attributes)
|
16
|
-
|
18
|
+
def CreateDirectory(path, attributes = 0)
|
19
|
+
if $KCODE != 'NONE'
|
20
|
+
CreateDirectoryW.call(path, attributes) != 0
|
21
|
+
else
|
22
|
+
CreateDirectory.call(path, attributes) != 0
|
23
|
+
end
|
17
24
|
end
|
18
25
|
|
19
26
|
def CreateDirectoryEx(template, new, attributes)
|
@@ -41,11 +48,19 @@ module Windows
|
|
41
48
|
end
|
42
49
|
|
43
50
|
def RemoveDirectory(path)
|
44
|
-
|
51
|
+
if $KCODE != 'NONE'
|
52
|
+
RemoveDirectoryW.call(path) != 0
|
53
|
+
else
|
54
|
+
RemoveDirectory.call(path) != 0
|
55
|
+
end
|
45
56
|
end
|
46
57
|
|
47
58
|
def SetCurrentDirectory(path)
|
48
|
-
|
59
|
+
if $KCODE != 'NONE'
|
60
|
+
SetCurrentDirectoryW.call(path) != 0
|
61
|
+
else
|
62
|
+
SetCurrentDirectory.call(path) != 0
|
63
|
+
end
|
49
64
|
end
|
50
65
|
end
|
51
66
|
end
|
data/lib/windows/error.rb
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
# get_last_error - Returns a human readable string for the error returned
|
9
9
|
# by the GetLastError() function.
|
10
10
|
############################################################################
|
11
|
-
require '
|
11
|
+
require 'windows/unicode'
|
12
12
|
|
13
13
|
module Windows
|
14
14
|
module Error
|
@@ -273,6 +273,7 @@ module Windows
|
|
273
273
|
SetLastErrorEx = Win32API.new('kernel32', 'GetLastError', 'LL', 'V')
|
274
274
|
SetErrorMode = Win32API.new('kernel32', 'SetErrorMode', 'I', 'I')
|
275
275
|
FormatMessage = Win32API.new('kernel32', 'FormatMessage', 'LLLLPLP', 'L')
|
276
|
+
FormatMessageW = Win32API.new('kernel32', 'FormatMessageW', 'LLLLPLP', 'L')
|
276
277
|
|
277
278
|
def GetLastError
|
278
279
|
GetLastError.call
|
@@ -298,17 +299,15 @@ module Windows
|
|
298
299
|
# returns a human readable string.
|
299
300
|
#
|
300
301
|
def get_last_error(err_num = GetLastError.call)
|
301
|
-
buf
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
err_num,
|
306
|
-
|
307
|
-
buf,
|
308
|
-
|
309
|
-
|
310
|
-
)
|
311
|
-
buf.split(0.chr).first.chomp
|
302
|
+
buf = 0.chr * 260
|
303
|
+
flags = FORMAT_MESSAGE_FROM_SYSTEM + FORMAT_MESSAGE_ARGUMENT_ARRAY
|
304
|
+
|
305
|
+
if $KCODE != 'NONE'
|
306
|
+
FormatMessageW.call(flags, 0, err_num, 0, buf, buf.length, 0)
|
307
|
+
else
|
308
|
+
FormatMessage.call(flags, 0, err_num, 0, buf, buf.length, 0)
|
309
|
+
end
|
310
|
+
buf.split(0.chr).first.chomp
|
312
311
|
end
|
313
312
|
end
|
314
313
|
end
|
data/lib/windows/file.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'windows/unicode'
|
2
2
|
|
3
3
|
module Windows
|
4
4
|
module File
|
@@ -146,6 +146,7 @@ module Windows
|
|
146
146
|
CopyFile = Win32API.new('kernel32', 'CopyFile', 'PPI', 'I')
|
147
147
|
CopyFileEx = Win32API.new('kernel32', 'CopyFileEx', 'PPPPPL', 'I')
|
148
148
|
CreateFile = Win32API.new('kernel32', 'CreateFile', 'PLLPLLL', 'L')
|
149
|
+
CreateFileW = Win32API.new('kernel32', 'CreateFileW', 'PLLPLLL', 'L')
|
149
150
|
CreateHardLink = Win32API.new('kernel32', 'CreateHardLink', 'PPP', 'I')
|
150
151
|
DecryptFile = Win32API.new('advapi32', 'DecryptFile', 'PL', 'I')
|
151
152
|
DeleteFile = Win32API.new('kernel32', 'DeleteFile', 'P', 'I')
|
@@ -157,6 +158,8 @@ module Windows
|
|
157
158
|
GetFileSize = Win32API.new('kernel32', 'GetFileSize', 'LP', 'L')
|
158
159
|
GetFileSizeEx = Win32API.new('kernel32', 'GetFileSizeEx', 'LP', 'L')
|
159
160
|
GetFileType = Win32API.new('kernel32', 'GetFileType', 'L', 'L')
|
161
|
+
GetFullPathName = Win32API.new('kernel32', 'GetFullPathName', 'PLPP', 'L')
|
162
|
+
GetFullPathNameW = Win32API.new('kernel32', 'GetFullPathNameW', 'PLPP', 'L')
|
160
163
|
GetLongPathName = Win32API.new('kernel32', 'GetLongPathName', 'PPL', 'L')
|
161
164
|
GetShortPathName = Win32API.new('kernel32', 'GetShortPathName', 'PPL', 'L')
|
162
165
|
|
@@ -181,7 +184,11 @@ module Windows
|
|
181
184
|
end
|
182
185
|
|
183
186
|
def CreateFile(file, access, share, sec, disp, flags, template)
|
184
|
-
|
187
|
+
if $KCODE != 'NONE'
|
188
|
+
CreateFileW.call(file, access, share, sec, disp, flags, template)
|
189
|
+
else
|
190
|
+
CreateFile.call(file, access, share, sec, disp, flags, template)
|
191
|
+
end
|
185
192
|
end
|
186
193
|
|
187
194
|
def CreateHardLink(new_file, old_file, attributes)
|
@@ -224,6 +231,14 @@ module Windows
|
|
224
231
|
GetFileType.call(handle)
|
225
232
|
end
|
226
233
|
|
234
|
+
def GetFullPathName(file, buf, buf_size, part)
|
235
|
+
if $KCODE != 'NONE'
|
236
|
+
GetFullPathNameW.call(file, buf, buf_size, part)
|
237
|
+
else
|
238
|
+
GetFullPathName.call(file, buf, buf_size, part)
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
227
242
|
def GetLongPathName(short, buf, buf_size)
|
228
243
|
GetLongPathName.call(short, buf, buf_size)
|
229
244
|
end
|
data/lib/windows/shell.rb
CHANGED
@@ -66,8 +66,8 @@ module Windows
|
|
66
66
|
E_INVALIDARG = 2147483651
|
67
67
|
|
68
68
|
# Flags
|
69
|
-
SHGFP_TYPE_CURRENT
|
70
|
-
SHGFP_TYPE_DEFAULT
|
69
|
+
SHGFP_TYPE_CURRENT = 0
|
70
|
+
SHGFP_TYPE_DEFAULT = 1
|
71
71
|
|
72
72
|
SHGetFolderPath = Win32API.new('shell32', 'SHGetFolderPath', 'LLLLP', 'L')
|
73
73
|
SHGetSpecialFolderLocation = Win32API.new('shell32', 'SHGetSpecialFolderLocation', 'LIP', 'L')
|
data/lib/windows/unicode.rb
CHANGED
@@ -68,7 +68,7 @@ module Windows
|
|
68
68
|
IsDBCSLeadByteEx = Win32API.new('kernel32', 'IsDBCSLeadByteEx', 'IP', 'I')
|
69
69
|
IsTextUnicode = Win32API.new('advapi32', 'IsTextUnicode', 'PIP', 'I')
|
70
70
|
MultiByteToWideChar = Win32API.new('kernel32', 'MultiByteToWideChar', 'ILPIPI', 'I')
|
71
|
-
TranslateCharsetInfo = Win32API.new('
|
71
|
+
TranslateCharsetInfo = Win32API.new('gdi32', 'TranslateCharsetInfo', 'PPL', 'I')
|
72
72
|
WideCharToMultiByte = Win32API.new('kernel32', 'WideCharToMultiByte', 'ILPIPIPP', 'I')
|
73
73
|
|
74
74
|
def GetTextCharset(hdc)
|
@@ -87,7 +87,7 @@ module Windows
|
|
87
87
|
IsDBCSLeadByteEx.call(code_pag, char) != 0
|
88
88
|
end
|
89
89
|
|
90
|
-
def IsTextUnicode(buf, size, options)
|
90
|
+
def IsTextUnicode(buf, size = buf.size, options = 0)
|
91
91
|
IsTextUnicode.call(buf, size, options) != 0
|
92
92
|
end
|
93
93
|
|
@@ -102,5 +102,37 @@ module Windows
|
|
102
102
|
def WideCharToMultiByte(page, flags, str, str_size, buf, buf_size, defchar, used_def)
|
103
103
|
WideCharToMultiByte.call(page, flags, str, str_size, buf, buf_size, defchar, used_def)
|
104
104
|
end
|
105
|
+
|
106
|
+
# Convenient wrapper methods
|
107
|
+
|
108
|
+
# Maps a string to a wide (unicode) string using UTF8. If the function
|
109
|
+
# fails it just returns the string as is.
|
110
|
+
#
|
111
|
+
def multi_to_wide(str)
|
112
|
+
cp = ($KCODE == 'UTF8') ? CP_UTF8 : CP_ACP
|
113
|
+
buf = 0.chr * str.size * 2 # sizeof(WCHAR)
|
114
|
+
int = MultiByteToWideChar(cp, 0, str, str.size, buf, buf.size)
|
115
|
+
|
116
|
+
if int > 0
|
117
|
+
buf[0, int*2]
|
118
|
+
else
|
119
|
+
str
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# Maps a wide character string to a new character string. If the
|
124
|
+
# function fails it just returns the string as is.
|
125
|
+
#
|
126
|
+
def wide_to_multi(str)
|
127
|
+
cp = ($KCODE == 'UTF8') ? CP_UTF8 : CP_ACP
|
128
|
+
buf = 0.chr * str.size
|
129
|
+
int = WideCharToMultiByte(cp, 0, str, str.size/2, buf, buf.size, 0, 0)
|
130
|
+
|
131
|
+
if int > 0
|
132
|
+
buf[0, int]
|
133
|
+
else
|
134
|
+
str
|
135
|
+
end
|
136
|
+
end
|
105
137
|
end
|
106
138
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: windows-pr
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.5.
|
7
|
-
date: 2006-05-
|
6
|
+
version: 0.5.1
|
7
|
+
date: 2006-05-28 00:00:00 -06:00
|
8
8
|
summary: Windows functions and constants predefined via Win32API
|
9
9
|
require_paths:
|
10
10
|
- lib
|