-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdisk_info.h
More file actions
216 lines (172 loc) · 4.04 KB
/
disk_info.h
File metadata and controls
216 lines (172 loc) · 4.04 KB
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
#ifndef _DISK_INFO_H_
#define _DISK_INFO_H_
using namespace ftp_server;
namespace ftp_server
{
extern _ftpserver_config g_config;
class disk_info
{
private:
int fd; // 控制连接
int data_action; // 数据连接动作
char cur_path[PATHSIZE]; // 用户当前目录
int path_len; // 当前目录长度
/** 列表信息 */
dirlnk *cur_dir; // 列表表头
char list_info[INDEXSIZE]; // 存储列表信息
// char file_name[PATHSIZE]; // 文件名
long file_len; // 文件大小
long rest_size; // 续传位置(上传下载)
int file_handle; // 文件句柄
char file_buffer[FILEBUFSIZE]; // 文件数据缓存区
int buf_len; // 缓存数据长度
struct timeval start_time; // 传输起始时间
struct timeval end_time; // 传输结束时间
struct timezone tz;
file_index g_file_index;
public:
disk_info(disk_task *fsm_task)
{
/** 初始化句柄、会话动作、用户当前路径 */
fd = fsm_task -> get_ctrl_fd();
data_action = fsm_task -> get_action();
strncpy(cur_path, fsm_task -> get_cur_path(), PATHSIZE);
rest_size = fsm_task -> get_rest_size(); // 续传位置为0
cur_dir = NULL; // 列表队列为空
file_handle = -1; // 初始化文件句柄
file_len = 0; // 空文件文件长度为0
};
~disk_info()
{
if(file_handle != -1)
{
close(file_handle);
}
};
void data_post();
int get_fd()
{
return fd;
};
int get_data_action()
{
return data_action;
};
void set_data_action(int new_action)
{
data_action = new_action;
};
void set_cur_path(char *path)
{
strncpy(cur_path, path, PATHSIZE);
};
char *get_cur_path()
{
return cur_path;
};
void set_file_len(long size)
{
file_len = size;
};
void set_rest_size(long rest)
{
rest_size = rest;
};
long get_rest_size()
{
return rest_size;
};
void set_cur_dir( dirlnk *dir )
{
cur_dir = dir;
};
dirlnk *get_cur_dir()
{
return cur_dir;
};
void open_create()
{
file_handle = open(cur_path, O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
// cout<<"open_create():"<<file_handle<<endl;
};
void open_writeonly()
{
file_handle = open(cur_path, O_WRONLY);
// cout<<"open_writeonly():"<<file_handle<<endl;
};
void open_readonly()
{
file_handle = open(cur_path, O_RDONLY);
// cout<<"open_readonly():"<<file_handle<<endl;
};
void seek_file_handle()
{
lseek(file_handle, rest_size, SEEK_SET);
};
int read_from_disk()
{
buf_len = read(file_handle, file_buffer, FILEBUFSIZE);
return buf_len;
};
int write_to_disk(disk_task *input_task)
{
return write(file_handle, input_task -> get_file_buffer(), input_task -> get_buf_len());
};
void close_file_handle()
{
// cout<<"close_file_handle:"<<file_handle<<endl;
if(file_handle != -1)
{
close(file_handle);
}
};
dirlnk *get_list()
{
cur_dir = g_file_index.get_list(list_info, cur_path);
return cur_dir;
};
dirlnk *get_list(int i)
{
cur_dir = g_file_index.get_list(list_info, cur_path, cur_dir);
return cur_dir;
};
char* get_file_buffer()
{
return file_buffer;
};
void clear_list_info()
{
buf_len = 0;
memset(list_info, 0, INDEXSIZE);
};
int get_buf_len()
{
return buf_len;
}
char* get_list_info()
{
return list_info;
};
int get_list_info_len()
{
return strlen(list_info);
};
/** 设置文件传输起始时间 */
void set_start_time()
{
gettimeofday (&start_time , &tz);
};
/** 设置文件传输结束时间 */
void set_end_time()
{
gettimeofday (&end_time, &tz);
};
/** 计算文件传输持续时间 */
long get_duration()
{
return ( ( end_time.tv_sec - start_time.tv_sec ) * 1000
+ ( end_time.tv_usec - start_time.tv_usec) / 1000 );
};
};
}
#endif /* _DISK_INFO_H_ */