unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, CommObjs, CommInt, ComCtrls;
const
ServerName = 'SX Web Server';
type
TFileAllocationStructure = packed array[0..255] of word;
TFileRecord = class
private
FSourceName : string;
FDestinName : string;
FTypeStr : string;
FReference : byte;
function Back2FowardSlash(Str: string): string;
function Filename2Reference(Str: string): byte;
function FileChecksum(Stream: TStream): word;
public
constructor Create(Filename, SourcePath, DestinPath: string);
function AddToData(Data: TMemoryStream): boolean;
property SourceName: string read FSourceName;
property DestinName: string read FDestinName;
property TypeStr: string read FTypeStr;
property Reference: byte read FReference;
end;
TMainForm = class(TForm)
DisplayList: TListBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
ComLink: TComm;
ProgressBar: TProgressBar;
Root: TEdit;
Port: TComboBox;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
FileList : TList;
FileData : TMemoryStream;
procedure AddDir(SourceDir, DestinDir: string);
procedure ClearFilelist;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
Position404 : integer;
implementation
{$R *.DFM}
const
CrLf = #$0D + #$0A;
constructor TFileRecord.Create(Filename, SourcePath, DestinPath: string);
var
Ext : string;
begin
inherited Create;
FSourceName := SourcePath + Filename;
FDestinName := Back2FowardSlash(DestinPath + Filename);
FReference := Filename2Reference(FDestinName);
FTypeStr := 'unknown';
Ext := LowerCase(ExtractFileExt(SourceName));
if Ext = '.gif' then FTypeStr := 'image/gif';
if Ext = '.htm' then FTypeStr := 'text/html';
if Ext = '.html' then FTypeStr := 'text/html';
end;
function SwapWord(Data: word): word;
begin
Result := ((Data shr 8) and $FF) + ((Data shl 8) and $FF00);
end;
function TFileRecord.AddToData(Data: TMemoryStream): boolean;
var
FileStream : TFileStream;
DataStream : TMemoryStream;
HeaderStr : string;
DataSize : word;
Checksum : word;
begin
Result := false;
if (Data <> nil) then
begin
FileStream := TFileStream.Create(FSourceName, fmOpenRead or fmShareDenyNone);
if FileStream <> nil then
begin
//Create http header
HeaderStr := 'HTTP/1.1 200 OK' + CrLf
+ 'Content-Length: ' + IntToStr(FileStream.Size) + CrLf
+ 'Server: ' + ServerName + CrLf
+ 'Content-Type: ' + FTypeStr + CrLf
+ 'Connection: close' + CrLf
+ CrLf;
//Create data
DataStream := TMemoryStream.Create;
DataSize := length(HeaderStr) + FileStream.Size;
//if DataSize and 1 = 1 then DataSize := DataSize + 1;
DataStream.Size := DataSize;
//Copy http header
DataStream.Write(HeaderStr[1], length(HeaderStr));
//Copy file data
DataStream.CopyFrom(FileStream, FileStream.Size);
//Store data
TFileAllocationStructure(Data.Memory^)[FReference] := SwapWord(Data.Position);
if ExtractFileName(FSourceName) = '404.html' then
Position404 := Data.Position;
DataSize := SwapWord(DataStream.Size);
if FTypeStr = 'text/html' then
Checksum := 1
else
Checksum := 0;
//Checksum := SwapWord(FileChecksum(DataStream));
Checksum := SwapWord( Checksum );
Data.Write(DataSize, 2);
Data.Write(Checksum, 2);
Data.CopyFrom(DataStream, 0);
//Complete
Result := true;
DataStream.Free;
FileStream.Free;
end;
end;
end;
function TFileRecord.Back2FowardSlash(Str: string): string;
var
i : integer;
begin
Result := '';
if length(Str) > 0 then
begin
for i := 1 to length(Str) do
begin
if Str[i] = '\'
then Result := Result + '/'
else Result := Result + Str[i];
end;
end;
end;
function TFileRecord.Filename2Reference(Str: string): byte;
var
i : integer;
begin
Result := 0;
if length(Str) > 0 then
begin
for i := 1 to length(Str)
do Result := Result + byte(Str[i]);
end;
Result := Result and $FF;
end;
function TFileRecord.FileChecksum(Stream: TStream): word;
var
Data : word;
Checksum : longint;
begin
Checksum := 0;
if Stream <> nil then
begin
Stream.Position :=0;
while Stream.Position < Stream.Size do
begin
Stream.Read(Data, 2);
Checksum := Checksum + SwapWord(Data);
if Checksum > 65535 then CheckSum := (CheckSum and $FFFF) + 1;
end;
Stream.Position :=0;
end;
Result := Checksum and $FFFF;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
FileList := TList.Create;
FileData := nil;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
if FileData <> nil then FileData.Free;
ClearFileList;
FileList.Free;
end;
procedure TMainForm.AddDir(SourceDir, DestinDir: string);
var
SearchRec : TSearchRec;
FileRecord : TFileRecord;
begin
SourceDir := SourceDir + '\';
DestinDir := DestinDir + '\';
if FindFirst(SourceDir + '*.*', faAnyFile, SearchRec) = 0 then
repeat
if (SearchRec.Attr and faDirectory) > 0 then
begin
if SearchRec.Name[1] <> '.'
then AddDir(SourceDir + SearchRec.Name, DestinDir + SearchRec.Name)
end
else
begin
FileRecord := TFileRecord.Create(SearchRec.Name, SourceDir, DestinDir);
FileList.Add(FileRecord);
end;
until FindNext(SearchRec) <> 0;
end;
procedure TMainForm.ClearFileList;
var
i : integer;
begin
if FileList.Count > 0 then
begin
for i := 0 to FileList.Count - 1
do TObject(FileList.Items[i]).Free;
FileList.Clear;
end;
end;
procedure TMainForm.Button1Click(Sender: TObject);
var
SourceDir : string;
i : integer;
begin
SourceDir := Root.Text;
//Build file list
ClearFileList;
DisplayList.Items.Clear;
if SourceDir <> ''
then AddDir(SourceDir, '');
if FileList.Count > 0 then
begin
for i := 0 to FileList.Count-1 do
with TFileRecord(FileList.Items[i])
do DisplayList.Items.Add(IntToHex(Reference, 2) + ':' + DestinName);
end;
end;
procedure TMainForm.Button2Click(Sender: TObject);
var
i : integer;
begin
FileData.Free;
FileData := nil;
if FileList.Count > 0 then
begin
FileData := TMemoryStream.Create;
FileData.Size := 65536;
FillChar(FileData.Memory^, FileData.Size, 0);
FileData.Position := SizeOf(TFileAllocationStructure);
for i := 0 to FileList.Count - 1 do
begin
TFileRecord(FileList.Items[i]).AddToData(FileData);
end;
FileData.Size := FileData.Position;
for i := 0 to 255 do
if TFileAllocationStructure(FileData.Memory^)[i] = 0 then
TFileAllocationStructure(FileData.Memory^)[i] := SwapWord(Position404);
end;
end;
procedure TMainForm.Button3Click(Sender: TObject);
var
Command : byte;
Reply : byte;
Size : longint;
Address : longint;
Data : array[0..31] of byte;
i : integer;
begin
if FileData = nil
then MessageDlg('Error: Must build file data', mtError, [mbOk], 0)
else
begin
FileData.SaveToFile('Test.dat');
ComLink.DeviceName := Port.Text;
ComLink.Open;
Command := byte('?');
ComLink.Write(Command, 1);
Sleep(100);
if (ComLink.Read(Reply, 1) <> 1) or (Reply <> byte('#'))
then MessageDlg('Error: Unable to find SX on ' + ComLink.DeviceName, mtError, [mbOk], 0)
else
begin
if ComLink.Read(Reply, 1) = 1
then Size := Reply * 256
else Size := 0;
MessageDlg('Found SX with ' + IntToStr(Size) + ' byte EEPROM', mtInformation, [mbOk], 0);
Screen.Cursor := crHourglass;
ProgressBar.Position := 0;
ProgressBar.Max := Size div 32;
FileData.Position := 0;
for i := 0 to (Size div 32) - 1 do
begin
Command := byte('W');
ComLink.Write(Command, 1); //Command = write block
Address := i * 32;
Command := Address shr 8;
ComLink.Write(Command, 1); //Address H
ComLink.Write(Address, 1); //Address L
FillChar(Data, 32, 0);
FileData.Read(Data, 32);
ComLink.Write(Data, 32);
Sleep(20); //35 bytes @ 57600 = 6ms, E2 write time = 10ms, Also allow for windows overhead
ProgressBar.StepIt;
Application.ProcessMessages;
if Application.Terminated then break;
end;
ProgressBar.Position := ProgressBar.Max;
Screen.Cursor := crDefault;
if not Application.Terminated
then MessageDlg('Download complete', mtInformation, [mbOk], 0);
ProgressBar.Position := 0;
end;
ComLink.Close;
end;
end;
end.
file: /Techref/scenix/lib/io/osi3/tcpip/isxsupportfiles/e2filesource/Main.pas, 9KB, , updated: 2005/8/19 17:49, local time: 2024/11/19 15:06,
|
| ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://linistepper.com/techref/scenix/lib/io/osi3/tcpip/isxsupportfiles/e2filesource/Main.pas"> scenix lib io osi3 tcpip isxsupportfiles e2filesource Main</A> |
Did you find what you needed?
|