der);
65 FDiocpContext.OnContextAction:= OnRecvObject;
66 if not FDiocpContext.Active then
67 begin
68 FDiocpContext.Host:= pvHost;
69 FDiocpContext.Port:= pvPort;
70 FDiocpContext.Connect;
71 end;
72 end;
73
74 procedure TSNTFileTransContext.SendCMDObject(pvCMDObject: TSimpleMsgPack);
75 var
76 lvCMDStream:TMemoryStream;
77 begin
78 lvCMDStream := TMemoryStream.Create;
79 try
80 pvCMDObject.EncodeToStream(lvCMDStream);
81 FDiocpContext.WriteObject(lvCMDStream);
82 finally
83 lvCMDStream.Free;
84 end;
85 end;
86
87 function TSNTFileTransContext.GetFileSize(const pvFile: string): Int64;
88 var
89 lvFileStream: TFileStream;
90 begin
91 lvFileStream:= TFileStream.Create(FLocalFile, fmOpenRead);
92 try
93 result:= lvFileStream.Size;
94 finally
95 lvFileStream.Free;
96 end;
97 end;
98
99 procedure TSNTFileTransContext.requestUpload(const pvLocalFile, pvToken: string);
100 var
101 lvMsgData: TSimpleMsgPack;
102 begin
103 lvMsgData:= TSimpleMsgPack.Create;
104 try
105 FLocalFile:= pvLocalFile;
106 lvMsgData.I['service.type'] := MSG_SERVICE_FILE;
107 lvMsgData.I['msg.code'] := MSG_FILE_REQ_UPLOAD;
108 lvMsgData.S['params.filename'] := ExtractFileName(pvLocalFile);
109 lvMsgData.I['params.filesize'] := GetFileSize(pvLocalFile);
110 lvMsgData.S['params.token'] := pvToken;
111 SendCMDObject(lvMsgData);
112 finally
113 FreeAndNil(lvMsgData);
114 end;
115 end;
116
117 procedure TSNTFileTransContext.requestDownload(const pvLocalFile, pvToken: string);
118 var
119 lvMsgData: TSimpleMsgPack;
120 begin
121 lvMsgData:= TSimpleMsgPack.Create;
122 try
123 FLocalFile:= pvLocalFile;
124 lvMsgData.I['service.type'] := MSG_SERVICE_FILE;
125 lvMsgData.I['msg.code'] := MSG_FILE_REQ_DOWNLOAD;
126 lvMsgData.S['params.filename'] := ExtractFileName(pvLocalFile);
127 lvMsgData.S['params.token'] := pvToken;
128 SendCMDObject(lvMsgData);
129 finally
130 FreeAndNil(lvMsgData);
131 end;
132 end;
133
134 function TSNTFileTransContext.upload(const pvRemoteFile, pvToken: string): Int64;
135 begin
136 FFileStream:= TFileStream.Create(FLocalFile, fmOpenRead);
137 FRemoteFile:= pvRemoteFile;
138 uploadNextBlock(pvToken);
139 end;
140
141 procedure TSNTFileTransContext.uploadNextBlock(const pvToken: string);
142 var
143 lvPosition, lvSize: Int64;
144 begin
145 lvPosition:= FFileStream.Position;
146 if (FFileStream.Position = FFileStream.Size) then exit;
147
148 FCMDMsgPack.clear();
149 FCMDMsgPack.I['service.type'] := MSG_SERVICE_FILE;
150 FCMDMsgPack.I['msg.code'] := MSG_FILE_UPLOADING;
151 FCMDMsgPack.S['params.filename']:= FRemoteFile;
152 FCMDMsgPack.S['params.token'] := pvToken;
153 FCMDMsgPack.I['params.start'] := lvPosition;
154 lvSize:= Min(SEC_SIZE, FFileStream.Size- FFileStream.Position);
155 FCMDMsgPack.ForcePathObject('params.data').LoadBinaryFromStream(FFileStream, lvSize);
156 if (FFileStream.Position = FFileStream.Size) then
157 FCMDMsgPack.B['params.isend'] := True;
158 //
159 FCMDStream.Clear;
160 FCMDMsgPack.EncodeToStream(FCMDStream);
161 FDiocpContext.WriteObject(FCMDStream);
162 end;
163
164
165 function TSNTFileTransContext.download(const pvRemo |