This source file includes following definitions.
- zip_source_win32w
- zip_source_win32w_create
- _win32_strdup_w
- _win32_open_w
- _win32_create_temp_w
- _win32_rename_temp_w
- _win32_remove_w
1
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
27
28
29
30
31
32
33
34
35 #include <stdio.h>
36
37 #include "zipint.h"
38 #include "zipwin32.h"
39
40 static void * _win32_strdup_w(const void *str);
41 static HANDLE _win32_open_w(_zip_source_win32_read_file_t *ctx);
42 static HANDLE _win32_create_temp_w(_zip_source_win32_read_file_t *ctx, void **temp, zip_uint32_t value, PSECURITY_ATTRIBUTES sa);
43 static int _win32_rename_temp_w(_zip_source_win32_read_file_t *ctx);
44 static int _win32_remove_w(const void *fname);
45
46 static _zip_source_win32_file_ops_t win32_ops_w = {
47 _win32_strdup_w,
48 _win32_open_w,
49 _win32_create_temp_w,
50 _win32_rename_temp_w,
51 _win32_remove_w
52 };
53
54 ZIP_EXTERN zip_source_t *
55 zip_source_win32w(zip_t *za, const wchar_t *fname, zip_uint64_t start, zip_int64_t len)
56 {
57 if (za == NULL)
58 return NULL;
59
60 return zip_source_win32w_create(fname, start, len, &za->error);
61 }
62
63
64 ZIP_EXTERN zip_source_t *
65 zip_source_win32w_create(const wchar_t *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error)
66 {
67 if (fname == NULL || length < -1) {
68 zip_error_set(error, ZIP_ER_INVAL, 0);
69 return NULL;
70 }
71
72 return _zip_source_win32_handle_or_name(fname, INVALID_HANDLE_VALUE, start, length, 1, NULL, &win32_ops_w, error);
73 }
74
75
76 static void *
77 _win32_strdup_w(const void *str)
78 {
79 return _wcsdup((const wchar_t *)str);
80 }
81
82
83 static HANDLE
84 _win32_open_w(_zip_source_win32_read_file_t *ctx)
85 {
86 return CreateFileW(ctx->fname, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
87 }
88
89
90 static HANDLE
91 _win32_create_temp_w(_zip_source_win32_read_file_t *ctx, void **temp, zip_uint32_t value, PSECURITY_ATTRIBUTES sa)
92 {
93 int len;
94
95 len = wcslen((const wchar_t *)ctx->fname) + 10;
96 if (*temp == NULL) {
97 if ((*temp = malloc(sizeof(wchar_t) * len)) == NULL) {
98 zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0);
99 return INVALID_HANDLE_VALUE;
100 }
101 }
102 if (_snwprintf((wchar_t *)*temp, len, L"%s.%08x", (const wchar_t *)ctx->fname, value) != len - 1) {
103 return INVALID_HANDLE_VALUE;
104 }
105
106 return CreateFileW((const wchar_t *)*temp, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, sa, CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY, NULL);
107 }
108
109
110 static int
111 _win32_rename_temp_w(_zip_source_win32_read_file_t *ctx)
112 {
113 if (!MoveFileExW(ctx->tmpname, ctx->fname, MOVEFILE_REPLACE_EXISTING))
114 return -1;
115 return 0;
116 }
117
118
119 static int
120 _win32_remove_w(const void *fname)
121 {
122 DeleteFileW((const wchar_t *)fname);
123 return 0;
124 }