You've already forked lazarus-ccr
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5438 8e941d3f-bd1b-0410-a28a-d453659cc2b4
228 lines
6.0 KiB
ObjectPascal
228 lines
6.0 KiB
ObjectPascal
{*********************************************************}
|
|
{* FlashFiler: Range support for Client Tables *}
|
|
{*********************************************************}
|
|
|
|
(* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is TurboPower FlashFiler
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* TurboPower Software
|
|
*
|
|
* Portions created by the Initial Developer are Copyright (C) 1996-2002
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*
|
|
* ***** END LICENSE BLOCK ***** *)
|
|
|
|
{$I ffdefine.inc}
|
|
|
|
unit ffcltbrg;
|
|
|
|
interface
|
|
|
|
uses
|
|
ffllbase;
|
|
|
|
type
|
|
TffTableRangeStack = class
|
|
private
|
|
trsStack : pointer;
|
|
trsSavedRequest : pffByteArray;
|
|
trsSavedReqLen : integer;
|
|
protected
|
|
|
|
function GetSavedRequest : boolean;
|
|
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
|
|
procedure Clear;
|
|
procedure ClearSaved;
|
|
{ Use this method to clear out the saved request bucket. }
|
|
function IsEmpty : boolean;
|
|
procedure Pop(var aRequestPacket : PffByteArray;
|
|
var aPacketLen : integer);
|
|
|
|
procedure PopSavedRequest(var aRequestPacket : PffByteArray;
|
|
var aPacketLen : integer);
|
|
{ Use this method to pop the top of the stack into the
|
|
saved request bucket. This method also returns the
|
|
request and its length so that the caller may resend
|
|
the request to the server. However, the caller must not
|
|
free this request because it is still in the saved
|
|
bucket. }
|
|
|
|
procedure Push(aRequestPacket : PffByteArray;
|
|
aPacketLen : integer);
|
|
|
|
|
|
procedure PushSavedRequest;
|
|
{ Use this method to push the last saved request onto the
|
|
range stack. After it is pushed onto the stack, the last
|
|
saved request is removed from the save bucket. }
|
|
|
|
procedure SaveLastRequest(aRequestPacket : PffByteArray;
|
|
aPacketLen : integer);
|
|
{ This method is used as a bucket to hold the last range
|
|
request. If a request is already in the bucket, we dispose
|
|
of it prior to saving the new request.
|
|
@param aRequestPacket The setRange message sent to the
|
|
server.
|
|
@param aPacketLen The length of the setRange message sent
|
|
to the server. }
|
|
|
|
property SavedRequest : boolean read GetSavedRequest;
|
|
{ Returns True if a setRange request is in the saved bucket. }
|
|
|
|
end;
|
|
|
|
implementation
|
|
|
|
type
|
|
PStackNode = ^TStackNode;
|
|
TStackNode = packed record
|
|
snNext : PStackNode;
|
|
snReq : PffByteArray;
|
|
snLen : integer;
|
|
end;
|
|
|
|
{===TffTableRangeStack===============================================}
|
|
constructor TffTableRangeStack.Create;
|
|
begin
|
|
inherited Create;
|
|
trsStack := nil; {this means the stack is empty}
|
|
trsSavedRequest := nil;
|
|
trsSavedReqLen := -1;
|
|
end;
|
|
{--------}
|
|
destructor TffTableRangeStack.Destroy;
|
|
begin
|
|
Clear;
|
|
inherited Destroy;
|
|
end;
|
|
{--------}
|
|
procedure TffTableRangeStack.Clear;
|
|
var
|
|
Req : PffByteArray;
|
|
Len : integer;
|
|
begin
|
|
while not IsEmpty do begin
|
|
Pop(Req, Len);
|
|
FreeMem(Req, Len);
|
|
end;
|
|
ClearSaved;
|
|
end;
|
|
{--------}
|
|
procedure TffTableRangeStack.ClearSaved;
|
|
begin
|
|
if assigned(trsSavedRequest) then begin
|
|
FFFreeMem(trsSavedRequest, trsSavedReqLen);
|
|
trsSavedRequest := nil;
|
|
trsSavedReqLen := -1;
|
|
end;
|
|
end;
|
|
{--------}
|
|
function TffTableRangeStack.getSavedRequest : boolean;
|
|
begin
|
|
result := assigned(trsSavedRequest);
|
|
end;
|
|
{--------}
|
|
function TffTableRangeStack.IsEmpty : boolean;
|
|
begin
|
|
Result := trsStack = nil;
|
|
end;
|
|
{--------}
|
|
procedure TffTableRangeStack.Pop(var aRequestPacket : PffByteArray;
|
|
var aPacketLen : integer);
|
|
var
|
|
Temp : PStackNode;
|
|
begin
|
|
Temp := trsStack;
|
|
if (Temp <> nil) then begin
|
|
aRequestPacket := Temp^.snReq;
|
|
aPacketLen := Temp^.snLen;
|
|
trsStack := Temp^.snNext;
|
|
Dispose(Temp);
|
|
end
|
|
else begin
|
|
aRequestPacket := nil;
|
|
aPacketLen := 0;
|
|
end;
|
|
end;
|
|
{--------}
|
|
procedure TffTableRangeStack.PopSavedRequest
|
|
(var aRequestPacket : PffByteArray;
|
|
var aPacketLen : integer);
|
|
var
|
|
Temp : PStackNode;
|
|
begin
|
|
Temp := trsStack;
|
|
if (Temp <> nil) then begin
|
|
aRequestPacket := Temp^.snReq;
|
|
aPacketLen := Temp^.snLen;
|
|
trsSavedRequest := aRequestPacket;
|
|
trsSavedReqLen := aPacketLen;
|
|
trsStack := Temp^.snNext;
|
|
Dispose(Temp);
|
|
end
|
|
else begin
|
|
aRequestPacket := nil;
|
|
aPacketLen := 0;
|
|
end;
|
|
end;
|
|
{--------}
|
|
procedure TffTableRangeStack.Push(aRequestPacket : PffByteArray;
|
|
aPacketLen : integer);
|
|
var
|
|
Temp : PStackNode;
|
|
begin
|
|
New(Temp);
|
|
Temp^.snNext := trsStack;
|
|
Temp^.snReq := aRequestPacket;
|
|
Temp^.snLen := aPacketLen;
|
|
trsStack := Temp;
|
|
end;
|
|
{--------}
|
|
procedure TffTableRangeStack.PushSavedRequest;
|
|
var
|
|
Temp : PStackNode;
|
|
begin
|
|
New(Temp);
|
|
Temp^.snNext := trsStack;
|
|
Temp^.snReq := trsSavedRequest;
|
|
Temp^.snLen := trsSavedReqLen;
|
|
trsStack := Temp;
|
|
trsSavedRequest := nil;
|
|
trsSavedReqLen := -1;
|
|
end;
|
|
{--------}
|
|
procedure TffTableRangeStack.SaveLastRequest
|
|
(aRequestPacket : PffByteArray;
|
|
aPacketLen : integer);
|
|
begin
|
|
|
|
if assigned(trsSavedRequest) then
|
|
FFFreeMem(trsSavedRequest, trsSavedReqLen);
|
|
|
|
trsSavedRequest := aRequestPacket;
|
|
trsSavedReqLen := aPacketLen;
|
|
|
|
end;
|
|
{====================================================================}
|
|
|
|
end.
|