-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfileinfo.c
172 lines (139 loc) · 3.57 KB
/
fileinfo.c
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
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include "fileinfo.h"
int fileinfo_client_send(queue *q, fileinfo *f)
{
analysis_attr attr =
{
.task =
{
.cache = FALSE,
.retrans = FALSE,
.type = PACKAGE_TASK_TYPE_FILEINFO //任务类型
}
};
analysis_pack(q, &attr, 0, ANALYSIS_INIT);
analysis_pack(q, f->name_send, strlen(f->name_send), 0);
analysis_pack(q, f->name_recv, strlen(f->name_recv), 0);
analysis_pack(q, NULL, f->list->size, ANALYSIS_PREFIX);
list_each(f->list, {
tools_filenode *fn = val;
int len = strlen(fn->name);
//保证文件信息数据不被分割
analysis_pack(q, fn->name, len, 2 * sizeof(__int64) + len > analysis_remain() ? ANALYSIS_NEW : 0);
analysis_pack(q, NULL, fn->size, 0);
});
analysis_pack(q, NULL, 0, ANALYSIS_FINISH);
}
int _fileinfo_recv(queue *q)
{
user *u;
char name[USERNAME_SIZE];
void *data;
__int64 len;
//源用户名
if(analysis_unpack(q, &data, &len, ANALYSIS_STR) == FALSE)
return FALSE;
//目标用户名
if(analysis_unpack(q, &data, &len, ANALYSIS_STR) == FALSE)
return FALSE;
sprintf(name, "%.*s", len, data);
u = user_get(name);
analysis_unpack(u->q_recv, NULL, NULL, ANALYSIS_RESET);
return TRUE;
}
int fileinfo_recv(queue *q)
{
if(_fileinfo_recv(q) == FALSE)
analysis_unpack(q, NULL, NULL, ANALYSIS_FREE);
}
int _fileinfo_client_recv(queue *q, fileinfo *f)
{
void *data;
__int64 len;
//源用户名
if(analysis_unpack(q, &data, &len, ANALYSIS_STR) == FALSE)
return FALSE;
sprintf(f->name_send, "%.*s", len, data);
//目标用户名
if(analysis_unpack(q, &data, &len, ANALYSIS_STR) == FALSE)
return FALSE;
sprintf(f->name_recv, "%.*s", len, data);
//文件数量
if(analysis_unpack(q, &data, &len, ANALYSIS_INT) == FALSE)
return FALSE;
f->number = len;
int path_size = strlen(f->path);
//文件名
while(analysis_unpack(q, &data, &len, ANALYSIS_STR) == TRUE)
{
tools_filenode *fn = lib_calloc(sizeof(tools_filenode));
fn->path = lib_calloc(path_size + len + 1);
fn->name = fn->path + path_size;
sprintf(fn->path, "%s%.*s", f->path, len, data);
//文件长度
if(analysis_unpack(q, &data, &len, ANALYSIS_INT) == FALSE)
{
lib_free(fn->path);
lib_free(fn);
return FALSE;
}
fn->size = len;
list_push(f->list, fn);
}
return TRUE;
}
int fileinfo_client_recv(queue *q, fileinfo *f)
{
_fileinfo_client_recv(q, f);
analysis_unpack(q, NULL, NULL, ANALYSIS_FREE);
}
#ifdef TEST
#include "test.h"
void fileinfo_test_1(queue *q)
{
fileinfo f =
{
.name_send = "send",
.name_recv = "recv",
.path = "test/fileinfo"
};
f.list = list_new();
tools_listdir(f.path, f.list);
fileinfo_client_send(q, &f);
fileinfo_client_send(q, &f);
tools_listdir_clear(f.list);
list_free(f.list);
}
void fileinfo_test_2(queue *q)
{
test_assert(queue_size(user_get("recv")->q_recv), 0, 'd', TEST_EQUAL);
fileinfo_recv(q);
test_assert(queue_size(user_get("recv")->q_recv), 1, 'd', TEST_EQUAL);
fileinfo_recv(q);
test_assert(queue_size(user_get("recv")->q_recv), 2, 'd', TEST_EQUAL);
}
void fileinfo_test_3()
{
fileinfo f;
user *u;
u = user_get("recv");
f.list = list_new();
fileinfo_client_recv(u->q_recv, &f);
fileinfo_client_recv(u->q_recv, &f);
list_each(f.list, {
tools_filenode *fn = val;
char s[32];
sprintf(s, "file%d", fn->size - 1);
test_assert(fn->name, s, 's', TEST_EQUAL);
});
tools_listdir_clear(f.list);
list_free(f.list);
}
void fileinfo_test()
{
queue *q = queue_init(0);
fileinfo_test_1(q);
fileinfo_test_2(q);
fileinfo_test_3();
queue_destroy(q);
}
#endif