teFile: string;
166
167 const pvFileSize: Int64): Int64;
168
169 begin
170 FFileStream:= TFileStream.Create(FLocalFile, fmCreate or fmShareDenyWrite);
171 FRemoteFile:= pvRemoteFile;
172 FFileSize := pvFileSize;
173 downloadNextBlock();
174 end;
175
176 procedure TSNTFileTransContext.downloadNextBlock;
177 var
178 lvPosition, lvSize: Int64;
179 lvBytes: TBytes;
180 begin
181 lvBytes := FCMDMsgPack.ForcePathObject('data').AsBytes;
182 FFileStream.Write(lvBytes[0], Length(lvBytes));
183 if FFileStream.Size = FFileSize then exit;
184
185 FCMDMsgPack.clear();
186 FCMDMsgPack.I['service.type'] := MSG_SERVICE_FILE;
187 FCMDMsgPack.I['msg.code'] := MSG_FILE_DOWNLOADING;
188 FCMDMsgPack.S['params.filename'] := FRemoteFile;
189 FCMDMsgPack.I['params.start'] := FFileStream.Position;
190 FCMDStream.Clear;
191 FCMDMsgPack.EncodeToStream(FCMDStream);
192 FDiocpContext.WriteObject(FCMDStream);
193 end;
194
195 procedure TSNTFileTransContext.OnRecvObject(pvObject: TObject);
196 var
197 lvMsgData: TSimpleMsgPack;
198 begin
199 lvMsgData:= TSimpleMsgPack.Create;
200 try
201 lvMsgData.DecodeFromStream(TMemoryStream(pvObject));
202 // server error
203 if lvMsgData.I['result.code'] = -1 then
204 begin
205 sfLogger.logMessage(lvMsgData.S['result.msg']);
206 exit;
207 end;
208 sfLogger.logMessage(lvMsgData.S['msg.code']);
209 // logic
210 case lvMsgData.I['msg.code'] of
211 MSG_FILE_READYUPLOAD:
212 upload(lvMsgData.S['params.filename'],lvMsgData.S['params.token']);
213 MSG_FILE_UPLOADING:
214 uploadNextBlock();
215 MSG_FILE_READYDOWNLOAD:
216 download(lvMsgData.S['params.filename'],lvMsgData.I['params.filesize']);
217 MSG_FILE_DOWNLOADING:
218 downloadNextBlock();
219 MSG_ERR_NOTAUTHUPLOAD:
220 ;//没有上传权限
221 MSG_ERR_SPACEFULL:
222 ;//空间不足
223 MSG_ERR_NOTAUTHDOWNLOAD:
224 ;//没有下载权限
225 MSG_ERR_FILENOTFOUND:
226 ;//文件不存在
227 end;
228 finally
229 lvMsgData.Free;
230 end;
231 end;
|