105 lines
3.4 KiB
ObjectPascal
105 lines
3.4 KiB
ObjectPascal
unit srvTransfereciaFicheros_Impl;
|
|
|
|
{----------------------------------------------------------------------------}
|
|
{ This unit was automatically generated by the RemObjects SDK after reading }
|
|
{ the RODL file associated with this project . }
|
|
{ }
|
|
{ This is where you are supposed to code the implementation of your objects. }
|
|
{----------------------------------------------------------------------------}
|
|
|
|
interface
|
|
|
|
uses
|
|
{vcl:} Classes, SysUtils,
|
|
{RemObjects:} uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
|
|
{Required:} uRORemoteDataModule,
|
|
{Used RODLs:} DataAbstract3_Intf,
|
|
{Generated:} VARELA_Intf;
|
|
|
|
type
|
|
{ TsrvTransfereciaFicheros }
|
|
TsrvTransfereciaFicheros = class(TRORemoteDataModule, IsrvTransfereciaFicheros)
|
|
private
|
|
function getFileDirectory: String;
|
|
protected
|
|
{ IsrvTransfereciaFicheros methods }
|
|
procedure DownloadSequence(const Filename: String; const Sequence: Integer; out Filedata: Binary; out Filesize: Int64);
|
|
procedure UploadChunk(const IsFirst: Boolean; const Filename: String; const Filedata: Binary);
|
|
procedure UploadFinished(const Filename: String; const Filesize: Int64);
|
|
end;
|
|
|
|
implementation
|
|
|
|
{$R *.dfm}
|
|
uses
|
|
{Generated:} VARELA_Invk, uDataModuleServer,
|
|
JclFileUtils;
|
|
|
|
procedure Create_srvTransfereciaFicheros(out anInstance : IUnknown);
|
|
begin
|
|
anInstance := TsrvTransfereciaFicheros.Create(NIL);
|
|
end;
|
|
|
|
{ srvTransfereciaFicheros }
|
|
procedure TsrvTransfereciaFicheros.DownloadSequence(const Filename: String; const Sequence: Integer; out Filedata: Binary; out Filesize: Int64);
|
|
const
|
|
Block: Integer = 65536;
|
|
var
|
|
Position: Int64;
|
|
MemStream: TFileStream;
|
|
localfilename:String;
|
|
begin
|
|
fileData := Binary.Create;
|
|
localfilename:=getFileDirectory+filename;
|
|
if not FileExists(localfilename) then exit;
|
|
MemStream:=TFileStream.Create(localfilename,fmopenRead);
|
|
try
|
|
FileSize := MemStream.Size;
|
|
Position := Block * (Sequence - 1);
|
|
if Position <= FileSize then begin
|
|
MemStream.Position := Position;
|
|
if Position + Block > FileSize then
|
|
fileData.CopyFrom(MemStream, FileSize - Position)
|
|
else
|
|
fileData.CopyFrom(MemStream, Block);
|
|
end;
|
|
finally
|
|
MemStream.Free;
|
|
end;
|
|
end;
|
|
|
|
function TsrvTransfereciaFicheros.getFileDirectory: String;
|
|
begin
|
|
result := PathAddSeparator(dmServer.FDirEntrada);
|
|
end;
|
|
|
|
procedure TsrvTransfereciaFicheros.UploadChunk(const IsFirst: Boolean; const Filename: String; const Filedata: Binary);
|
|
var
|
|
NewFile: TFileStream;
|
|
localfilename:String;
|
|
begin
|
|
Localfilename:= GetFileDirectory + Filename;
|
|
if isfirst and Fileexists(localfilename) then DeleteFile(localfilename);
|
|
if FileExists(localfilename)
|
|
then NewFile := TFileStream.Create(localfilename,fmOpenReadWrite)
|
|
else NewFile := TFileStream.Create(localfilename,fmCreate);
|
|
try
|
|
NewFile.Seek(0,soFromEnd);
|
|
filedata.SaveToStream(NewFile);
|
|
finally
|
|
NewFile.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TsrvTransfereciaFicheros.UploadFinished(const Filename: String; const Filesize: Int64);
|
|
begin
|
|
// (EventRepository as IFileEvents_Writer).OnNewFileAvailable(Session.SessionID, Filename, Filesize);
|
|
end;
|
|
|
|
initialization
|
|
TROClassFactory.Create('srvTransfereciaFicheros', Create_srvTransfereciaFicheros, TsrvTransfereciaFicheros_Invoker);
|
|
|
|
finalization
|
|
|
|
end.
|