wdm 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +21 -21
- data/README.md +206 -206
- data/ext/wdm/entry.c +71 -71
- data/ext/wdm/entry.h +46 -46
- data/ext/wdm/extconf.rb +28 -27
- data/ext/wdm/memory.c +26 -26
- data/ext/wdm/memory.h +29 -29
- data/ext/wdm/monitor.c +74 -74
- data/ext/wdm/monitor.h +49 -49
- data/ext/wdm/queue.c +195 -195
- data/ext/wdm/queue.h +72 -72
- data/ext/wdm/rb_change.c +198 -198
- data/ext/wdm/rb_change.h +27 -27
- data/ext/wdm/rb_monitor.c +574 -570
- data/ext/wdm/rb_monitor.h +39 -39
- data/ext/wdm/utils.c +76 -76
- data/ext/wdm/utils.h +25 -25
- data/ext/wdm/wdm.c +46 -46
- data/ext/wdm/wdm.h +81 -71
- data/ext/wdm/wdm.sln +20 -20
- data/ext/wdm/wdm.vcxproj +105 -105
- data/ext/wdm/wdm.vcxproj.filters +73 -73
- data/lib/wdm.rb +9 -9
- metadata +20 -64
data/ext/wdm/rb_monitor.h
CHANGED
@@ -1,40 +1,40 @@
|
|
1
|
-
#ifndef WDM_RB_MONITOR_H
|
2
|
-
#define WDM_RB_MONITOR_H
|
3
|
-
|
4
|
-
#ifdef __cplusplus
|
5
|
-
extern "C" {
|
6
|
-
#endif // __cplusplus
|
7
|
-
|
8
|
-
// ---------------------------------------------------------
|
9
|
-
// Constants
|
10
|
-
// ---------------------------------------------------------
|
11
|
-
|
12
|
-
#define WDM_MONITOR_FLAGS_DEFAULT \
|
13
|
-
FILE_NOTIFY_CHANGE_FILE_NAME \
|
14
|
-
| FILE_NOTIFY_CHANGE_DIR_NAME \
|
15
|
-
| FILE_NOTIFY_CHANGE_LAST_WRITE
|
16
|
-
|
17
|
-
// ----------------------------------------------------------
|
18
|
-
// Global variables
|
19
|
-
// ----------------------------------------------------------
|
20
|
-
|
21
|
-
extern VALUE cWDM_Monitor;
|
22
|
-
|
23
|
-
extern VALUE eWDM_UnknownFlagError;
|
24
|
-
extern VALUE eWDM_MonitorRunningError;
|
25
|
-
extern VALUE eWDM_InvalidDirectoryError;
|
26
|
-
extern VALUE eWDM_UnwatchableDirectoryError;
|
27
|
-
|
28
|
-
// ---------------------------------------------------------
|
29
|
-
// Prototypes
|
30
|
-
// ---------------------------------------------------------
|
31
|
-
|
32
|
-
void wdm_rb_monitor_init();
|
33
|
-
|
34
|
-
// ---------------------------------------------------------
|
35
|
-
|
36
|
-
#ifdef __cplusplus
|
37
|
-
}
|
38
|
-
#endif // __cplusplus
|
39
|
-
|
1
|
+
#ifndef WDM_RB_MONITOR_H
|
2
|
+
#define WDM_RB_MONITOR_H
|
3
|
+
|
4
|
+
#ifdef __cplusplus
|
5
|
+
extern "C" {
|
6
|
+
#endif // __cplusplus
|
7
|
+
|
8
|
+
// ---------------------------------------------------------
|
9
|
+
// Constants
|
10
|
+
// ---------------------------------------------------------
|
11
|
+
|
12
|
+
#define WDM_MONITOR_FLAGS_DEFAULT \
|
13
|
+
FILE_NOTIFY_CHANGE_FILE_NAME \
|
14
|
+
| FILE_NOTIFY_CHANGE_DIR_NAME \
|
15
|
+
| FILE_NOTIFY_CHANGE_LAST_WRITE
|
16
|
+
|
17
|
+
// ----------------------------------------------------------
|
18
|
+
// Global variables
|
19
|
+
// ----------------------------------------------------------
|
20
|
+
|
21
|
+
extern VALUE cWDM_Monitor;
|
22
|
+
|
23
|
+
extern VALUE eWDM_UnknownFlagError;
|
24
|
+
extern VALUE eWDM_MonitorRunningError;
|
25
|
+
extern VALUE eWDM_InvalidDirectoryError;
|
26
|
+
extern VALUE eWDM_UnwatchableDirectoryError;
|
27
|
+
|
28
|
+
// ---------------------------------------------------------
|
29
|
+
// Prototypes
|
30
|
+
// ---------------------------------------------------------
|
31
|
+
|
32
|
+
void wdm_rb_monitor_init();
|
33
|
+
|
34
|
+
// ---------------------------------------------------------
|
35
|
+
|
36
|
+
#ifdef __cplusplus
|
37
|
+
}
|
38
|
+
#endif // __cplusplus
|
39
|
+
|
40
40
|
#endif // WDM_RB_MONITOR_H
|
data/ext/wdm/utils.c
CHANGED
@@ -1,77 +1,77 @@
|
|
1
|
-
#include "wdm.h"
|
2
|
-
|
3
|
-
#include "memory.h"
|
4
|
-
#include "utils.h"
|
5
|
-
|
6
|
-
// ---------------------------------------------------------
|
7
|
-
// Paths functions
|
8
|
-
// ---------------------------------------------------------
|
9
|
-
|
10
|
-
LPWSTR
|
11
|
-
wdm_utils_convert_back_to_forward_slashes(LPWSTR path, DWORD path_len)
|
12
|
-
{
|
13
|
-
UINT i;
|
14
|
-
|
15
|
-
for(i = 0; i < (path_len - 1); ++i) { // path_len-1 because we don't need to check the NULL-char!
|
16
|
-
if ( path[i] == L'\\' ) path[i] = L'/';
|
17
|
-
}
|
18
|
-
|
19
|
-
return path;
|
20
|
-
}
|
21
|
-
|
22
|
-
LPWSTR
|
23
|
-
wdm_utils_full_pathname(const LPWSTR path)
|
24
|
-
{
|
25
|
-
WCHAR maxed_path[WDM_MAX_WCHAR_LONG_PATH];
|
26
|
-
LPWSTR full_path;
|
27
|
-
size_t full_path_len;
|
28
|
-
BOOL is_directory;
|
29
|
-
|
30
|
-
if ( GetFullPathNameW(path, WDM_MAX_WCHAR_LONG_PATH, maxed_path, NULL) == 0 ) {
|
31
|
-
return 0;
|
32
|
-
}
|
33
|
-
|
34
|
-
is_directory = wdm_utils_unicode_is_directory(maxed_path);
|
35
|
-
|
36
|
-
full_path_len = wcslen(maxed_path);
|
37
|
-
full_path = WDM_ALLOC_N(WCHAR, full_path_len + (is_directory ? 2 : 1)); // When it's a directory, add extra 1 for the (\) at the end
|
38
|
-
|
39
|
-
wcscpy(full_path, maxed_path);
|
40
|
-
|
41
|
-
if ( is_directory ) wcscat(full_path, L"\\");
|
42
|
-
|
43
|
-
return full_path;
|
44
|
-
}
|
45
|
-
|
46
|
-
BOOL
|
47
|
-
wdm_utils_unicode_is_directory(const LPWSTR path)
|
48
|
-
{
|
49
|
-
WCHAR unicode_path[WDM_MAX_WCHAR_LONG_PATH];
|
50
|
-
|
51
|
-
wcscpy(unicode_path, L"\\\\?\\");
|
52
|
-
|
53
|
-
if ( wdm_utils_is_unc_path(path) ) {
|
54
|
-
wcscat(unicode_path, L"UNC\\");
|
55
|
-
wcscat(unicode_path, path + 2); // +2 to skip the begin of a UNC path
|
56
|
-
}
|
57
|
-
else {
|
58
|
-
wcscat(unicode_path, path);
|
59
|
-
}
|
60
|
-
|
61
|
-
return wdm_utils_is_directory(unicode_path);
|
62
|
-
}
|
63
|
-
|
64
|
-
BOOL
|
65
|
-
wdm_utils_is_directory(const LPWSTR path)
|
66
|
-
{
|
67
|
-
DWORD dwAttrib = GetFileAttributesW(path);
|
68
|
-
|
69
|
-
return (dwAttrib != INVALID_FILE_ATTRIBUTES &&
|
70
|
-
(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
|
71
|
-
}
|
72
|
-
|
73
|
-
BOOL
|
74
|
-
wdm_utils_is_unc_path(const LPWSTR path)
|
75
|
-
{
|
76
|
-
return path[0] == path[1] && path[0] == L'\\';
|
1
|
+
#include "wdm.h"
|
2
|
+
|
3
|
+
#include "memory.h"
|
4
|
+
#include "utils.h"
|
5
|
+
|
6
|
+
// ---------------------------------------------------------
|
7
|
+
// Paths functions
|
8
|
+
// ---------------------------------------------------------
|
9
|
+
|
10
|
+
LPWSTR
|
11
|
+
wdm_utils_convert_back_to_forward_slashes(LPWSTR path, DWORD path_len)
|
12
|
+
{
|
13
|
+
UINT i;
|
14
|
+
|
15
|
+
for(i = 0; i < (path_len - 1); ++i) { // path_len-1 because we don't need to check the NULL-char!
|
16
|
+
if ( path[i] == L'\\' ) path[i] = L'/';
|
17
|
+
}
|
18
|
+
|
19
|
+
return path;
|
20
|
+
}
|
21
|
+
|
22
|
+
LPWSTR
|
23
|
+
wdm_utils_full_pathname(const LPWSTR path)
|
24
|
+
{
|
25
|
+
WCHAR maxed_path[WDM_MAX_WCHAR_LONG_PATH];
|
26
|
+
LPWSTR full_path;
|
27
|
+
size_t full_path_len;
|
28
|
+
BOOL is_directory;
|
29
|
+
|
30
|
+
if ( GetFullPathNameW(path, WDM_MAX_WCHAR_LONG_PATH, maxed_path, NULL) == 0 ) {
|
31
|
+
return 0;
|
32
|
+
}
|
33
|
+
|
34
|
+
is_directory = wdm_utils_unicode_is_directory(maxed_path);
|
35
|
+
|
36
|
+
full_path_len = wcslen(maxed_path);
|
37
|
+
full_path = WDM_ALLOC_N(WCHAR, full_path_len + (is_directory ? 2 : 1)); // When it's a directory, add extra 1 for the (\) at the end
|
38
|
+
|
39
|
+
wcscpy(full_path, maxed_path);
|
40
|
+
|
41
|
+
if ( is_directory ) wcscat(full_path, L"\\");
|
42
|
+
|
43
|
+
return full_path;
|
44
|
+
}
|
45
|
+
|
46
|
+
BOOL
|
47
|
+
wdm_utils_unicode_is_directory(const LPWSTR path)
|
48
|
+
{
|
49
|
+
WCHAR unicode_path[WDM_MAX_WCHAR_LONG_PATH];
|
50
|
+
|
51
|
+
wcscpy(unicode_path, L"\\\\?\\");
|
52
|
+
|
53
|
+
if ( wdm_utils_is_unc_path(path) ) {
|
54
|
+
wcscat(unicode_path, L"UNC\\");
|
55
|
+
wcscat(unicode_path, path + 2); // +2 to skip the begin of a UNC path
|
56
|
+
}
|
57
|
+
else {
|
58
|
+
wcscat(unicode_path, path);
|
59
|
+
}
|
60
|
+
|
61
|
+
return wdm_utils_is_directory(unicode_path);
|
62
|
+
}
|
63
|
+
|
64
|
+
BOOL
|
65
|
+
wdm_utils_is_directory(const LPWSTR path)
|
66
|
+
{
|
67
|
+
DWORD dwAttrib = GetFileAttributesW(path);
|
68
|
+
|
69
|
+
return (dwAttrib != INVALID_FILE_ATTRIBUTES &&
|
70
|
+
(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
|
71
|
+
}
|
72
|
+
|
73
|
+
BOOL
|
74
|
+
wdm_utils_is_unc_path(const LPWSTR path)
|
75
|
+
{
|
76
|
+
return path[0] == path[1] && path[0] == L'\\';
|
77
77
|
}
|
data/ext/wdm/utils.h
CHANGED
@@ -1,26 +1,26 @@
|
|
1
|
-
#include <Windows.h>
|
2
|
-
|
3
|
-
#ifndef WDM_UTILS_H
|
4
|
-
#define WDM_UTILS_H
|
5
|
-
|
6
|
-
#ifdef __cplusplus
|
7
|
-
extern "C" {
|
8
|
-
#endif // __cplusplus
|
9
|
-
|
10
|
-
// ---------------------------------------------------------
|
11
|
-
// Prototypes
|
12
|
-
// ---------------------------------------------------------
|
13
|
-
|
14
|
-
LPWSTR wdm_utils_convert_back_to_forward_slashes(LPWSTR, DWORD);
|
15
|
-
LPWSTR wdm_utils_full_pathname(const LPWSTR path);
|
16
|
-
BOOL wdm_utils_is_unc_path(const LPWSTR);
|
17
|
-
BOOL wdm_utils_is_directory(const LPWSTR);
|
18
|
-
BOOL wdm_utils_unicode_is_directory(const LPWSTR);
|
19
|
-
|
20
|
-
// ---------------------------------------------------------
|
21
|
-
|
22
|
-
#ifdef __cplusplus
|
23
|
-
}
|
24
|
-
#endif // __cplusplus
|
25
|
-
|
1
|
+
#include <Windows.h>
|
2
|
+
|
3
|
+
#ifndef WDM_UTILS_H
|
4
|
+
#define WDM_UTILS_H
|
5
|
+
|
6
|
+
#ifdef __cplusplus
|
7
|
+
extern "C" {
|
8
|
+
#endif // __cplusplus
|
9
|
+
|
10
|
+
// ---------------------------------------------------------
|
11
|
+
// Prototypes
|
12
|
+
// ---------------------------------------------------------
|
13
|
+
|
14
|
+
LPWSTR wdm_utils_convert_back_to_forward_slashes(LPWSTR, DWORD);
|
15
|
+
LPWSTR wdm_utils_full_pathname(const LPWSTR path);
|
16
|
+
BOOL wdm_utils_is_unc_path(const LPWSTR);
|
17
|
+
BOOL wdm_utils_is_directory(const LPWSTR);
|
18
|
+
BOOL wdm_utils_unicode_is_directory(const LPWSTR);
|
19
|
+
|
20
|
+
// ---------------------------------------------------------
|
21
|
+
|
22
|
+
#ifdef __cplusplus
|
23
|
+
}
|
24
|
+
#endif // __cplusplus
|
25
|
+
|
26
26
|
#endif // WDM_UTILS_H
|
data/ext/wdm/wdm.c
CHANGED
@@ -1,47 +1,47 @@
|
|
1
|
-
#include "wdm.h"
|
2
|
-
|
3
|
-
#include "entry.h"
|
4
|
-
#include "queue.h"
|
5
|
-
#include "monitor.h"
|
6
|
-
|
7
|
-
#include "rb_monitor.h"
|
8
|
-
#include "rb_change.h"
|
9
|
-
|
10
|
-
// ----------------------------------------------------------
|
11
|
-
// Global variables
|
12
|
-
// ----------------------------------------------------------
|
13
|
-
|
14
|
-
VALUE mWDM;
|
15
|
-
|
16
|
-
VALUE eWDM_Error;
|
17
|
-
VALUE eWDM_MonitorRunningError;
|
18
|
-
VALUE eWDM_InvalidDirectoryError;
|
19
|
-
VALUE eWDM_UnwatchableDirectoryError;
|
20
|
-
|
21
|
-
ID wdm_rb_sym_call;
|
22
|
-
ID wdm_rb_sym_at_file;
|
23
|
-
ID wdm_rb_sym_at_type;
|
24
|
-
ID wdm_rb_sym_added;
|
25
|
-
ID wdm_rb_sym_modified;
|
26
|
-
ID wdm_rb_sym_removed;
|
27
|
-
ID wdm_rb_sym_renamed_old_file;
|
28
|
-
ID wdm_rb_sym_renamed_new_file;
|
29
|
-
|
30
|
-
rb_encoding *wdm_rb_enc_utf8;
|
31
|
-
|
32
|
-
// ----------------------------------------------------------
|
33
|
-
|
34
|
-
void
|
35
|
-
Init_wdm_ext()
|
36
|
-
{
|
37
|
-
WDM_DEBUG("Registering WDM with Ruby!");
|
38
|
-
|
39
|
-
wdm_rb_enc_utf8 = rb_utf8_encoding();
|
40
|
-
|
41
|
-
mWDM = rb_define_module("WDM");
|
42
|
-
|
43
|
-
eWDM_Error = rb_define_class_under(mWDM, "Error", rb_eStandardError);
|
44
|
-
|
45
|
-
wdm_rb_monitor_init();
|
46
|
-
wdm_rb_change_init();
|
1
|
+
#include "wdm.h"
|
2
|
+
|
3
|
+
#include "entry.h"
|
4
|
+
#include "queue.h"
|
5
|
+
#include "monitor.h"
|
6
|
+
|
7
|
+
#include "rb_monitor.h"
|
8
|
+
#include "rb_change.h"
|
9
|
+
|
10
|
+
// ----------------------------------------------------------
|
11
|
+
// Global variables
|
12
|
+
// ----------------------------------------------------------
|
13
|
+
|
14
|
+
VALUE mWDM;
|
15
|
+
|
16
|
+
VALUE eWDM_Error;
|
17
|
+
VALUE eWDM_MonitorRunningError;
|
18
|
+
VALUE eWDM_InvalidDirectoryError;
|
19
|
+
VALUE eWDM_UnwatchableDirectoryError;
|
20
|
+
|
21
|
+
ID wdm_rb_sym_call;
|
22
|
+
ID wdm_rb_sym_at_file;
|
23
|
+
ID wdm_rb_sym_at_type;
|
24
|
+
ID wdm_rb_sym_added;
|
25
|
+
ID wdm_rb_sym_modified;
|
26
|
+
ID wdm_rb_sym_removed;
|
27
|
+
ID wdm_rb_sym_renamed_old_file;
|
28
|
+
ID wdm_rb_sym_renamed_new_file;
|
29
|
+
|
30
|
+
rb_encoding *wdm_rb_enc_utf8;
|
31
|
+
|
32
|
+
// ----------------------------------------------------------
|
33
|
+
|
34
|
+
void
|
35
|
+
Init_wdm_ext()
|
36
|
+
{
|
37
|
+
WDM_DEBUG("Registering WDM with Ruby!");
|
38
|
+
|
39
|
+
wdm_rb_enc_utf8 = rb_utf8_encoding();
|
40
|
+
|
41
|
+
mWDM = rb_define_module("WDM");
|
42
|
+
|
43
|
+
eWDM_Error = rb_define_class_under(mWDM, "Error", rb_eStandardError);
|
44
|
+
|
45
|
+
wdm_rb_monitor_init();
|
46
|
+
wdm_rb_change_init();
|
47
47
|
}
|
data/ext/wdm/wdm.h
CHANGED
@@ -1,72 +1,82 @@
|
|
1
|
-
#include <stdio.h>
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
|
10
|
-
#
|
11
|
-
|
12
|
-
|
13
|
-
#
|
14
|
-
|
15
|
-
#
|
16
|
-
#
|
17
|
-
|
18
|
-
#
|
19
|
-
|
20
|
-
#
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
#define
|
27
|
-
|
28
|
-
#
|
29
|
-
|
30
|
-
//
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
// ---------------------------------------------------------
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
#
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
//
|
61
|
-
//
|
62
|
-
//
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
1
|
+
#include <stdio.h>
|
2
|
+
|
3
|
+
// Support Windows 2000 and later,
|
4
|
+
// this is needed for 'GetLongPathNameW' (both of the following defines)
|
5
|
+
#ifndef WINVER
|
6
|
+
#define WINVER 0x0500
|
7
|
+
#endif
|
8
|
+
#ifndef _WIN32_WINNT
|
9
|
+
#define _WIN32_WINNT 0x0500
|
10
|
+
#endif
|
11
|
+
|
12
|
+
// Exclude rarely-used stuff from Windows headers (both of the following defines)
|
13
|
+
#ifndef WIN32_LEAN_AND_MEAN
|
14
|
+
#define WIN32_LEAN_AND_MEAN
|
15
|
+
#endif
|
16
|
+
#ifndef VC_EXTRALEAN
|
17
|
+
#define VC_EXTRALEAN
|
18
|
+
#endif
|
19
|
+
|
20
|
+
#include <Windows.h>
|
21
|
+
|
22
|
+
#include <ruby.h>
|
23
|
+
#include <ruby/encoding.h>
|
24
|
+
|
25
|
+
#ifndef WDM_H
|
26
|
+
#define WDM_H
|
27
|
+
|
28
|
+
#ifdef __cplusplus
|
29
|
+
extern "C" {
|
30
|
+
#endif // __cplusplus
|
31
|
+
|
32
|
+
// ---------------------------------------------------------
|
33
|
+
// Constants
|
34
|
+
// ---------------------------------------------------------
|
35
|
+
|
36
|
+
#define WDM_DEBUG_ENABLED FALSE
|
37
|
+
|
38
|
+
#define WDM_BUFFER_SIZE 16384 // 2^14 or 16Kb
|
39
|
+
|
40
|
+
// The maximum WCHAR's for buffers used in functions that have
|
41
|
+
// a unicode variant and require to prepend "\\?\" to the path
|
42
|
+
#define WDM_MAX_WCHAR_LONG_PATH 32767
|
43
|
+
|
44
|
+
// ---------------------------------------------------------
|
45
|
+
// Macros
|
46
|
+
// ---------------------------------------------------------
|
47
|
+
|
48
|
+
#if WDM_DEBUG_ENABLED == TRUE
|
49
|
+
#define WDM_DEBUG(str, ...) \
|
50
|
+
fprintf(stderr, "[DEBUG] (%s@%d): " str "\n", __FILE__, __LINE__, ##__VA_ARGS__)
|
51
|
+
|
52
|
+
#define WDM_WDEBUG(str, ...) \
|
53
|
+
fwprintf(stderr, L"[DEBUG] (%S@%d): " str "\n", __FILE__, __LINE__, ##__VA_ARGS__)
|
54
|
+
|
55
|
+
#else
|
56
|
+
#define WDM_DEBUG(str, ...)
|
57
|
+
#define WDM_WDEBUG(str, ...)
|
58
|
+
#endif
|
59
|
+
|
60
|
+
// ----------------------------------------------------------
|
61
|
+
// Extern global variables
|
62
|
+
// ----------------------------------------------------------
|
63
|
+
|
64
|
+
extern VALUE mWDM;
|
65
|
+
|
66
|
+
extern VALUE eWDM_Error;
|
67
|
+
|
68
|
+
extern rb_encoding *wdm_rb_enc_utf8;
|
69
|
+
|
70
|
+
// ---------------------------------------------------------
|
71
|
+
// Prototypes
|
72
|
+
// ---------------------------------------------------------
|
73
|
+
|
74
|
+
void Init_wdm_ext();
|
75
|
+
|
76
|
+
// ---------------------------------------------------------
|
77
|
+
|
78
|
+
#ifdef __cplusplus
|
79
|
+
}
|
80
|
+
#endif // __cplusplus
|
81
|
+
|
72
82
|
#endif // WDM_H
|