unit ExtendedFileTransferService_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. } {----------------------------------------------------------------------------} {$I RemObjects.inc} {$WARN SYMBOL_PLATFORM OFF} interface uses {vcl:} Classes, SysUtils, {RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions, {Required:} uRORemoteDataModule, {Generated:} ExtendedFileTransferLibrary_Intf; type { TExtendedFileTransferService } TExtendedFileTransferService = class(TRORemoteDataModule, IExtendedFileTransferService) private protected { IExtendedFileTransferService methods } function GetFilesList: FileInfoArray; function DownloadFilePart(const FileName: AnsiString; const PartNo: Integer; const PartSize: Integer): Binary; end; implementation {$R *.dfm} uses {Generated:} ExtendedFileTransferLibrary_Invk, fServerForm, uROClasses; procedure Create_ExtendedFileTransferService(out anInstance : IUnknown); begin anInstance := TExtendedFileTransferService.Create(nil); end; { ExtendedFileTransferService } function TExtendedFileTransferService.GetFilesList: FileInfoArray; var sr: TSearchRec; fi: TFileInfo; begin Result := FileInfoArray.Create; if FindFirst(ServerForm.SharedFolder + '\*.*', faReadOnly + faArchive, sr) = 0 then begin repeat fi := Result.Add; fi.FileName := {$IFDEF UNICODE}WideStringToAnsiString{$ENDIF}(ExtractFileName(sr.Name)); fi.TypeName := {$IFDEF UNICODE}WideStringToAnsiString{$ENDIF}(ExtractFileExt(sr.Name)); fi.Size := sr.Size; until FindNext(sr) <> 0; FindClose(sr); end; end; function TExtendedFileTransferService.DownloadFilePart(const FileName: AnsiString; const PartNo: Integer; const PartSize: Integer): Binary; var fs: TFileStream; lRemains, lOffset, lBufferSize: integer; begin Result := Binary.Create; fs := TFileStream.Create(ServerForm.SharedFolder + '\' + {$IFDEF UNICODE}AnsiStringToWideString{$ENDIF}(FileName), fmOpenRead + fmShareDenyWrite); lOffset := PartSize*(PartNo-1); lRemains := fs.Size - lOffset; if lRemains > PartSize then lBufferSize := PartSize else lBufferSize := lRemains; fs.Seek(lOffset, soFromBeginning); Result.CopyFrom(fs, lBufferSize); fs.Free; end; var fClassFactory: IROClassFactory; initialization fClassFactory := TROClassFactory.Create('ExtendedFileTransferService', Create_ExtendedFileTransferService, TExtendedFileTransferService_Invoker); // RegisterForZeroConf(fClassFactory,'_ExtendedFileTransferService_rosdk._tcp.'); finalization UnRegisterClassFactory(fClassFactory); fClassFactory := nil; end.