(*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at
 * http://www.opensource.org/licenses/cddl1.php.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at
 * http://www.opensource.org/licenses/cddl1.php.  If applicable,
 * add the following below this CDDL HEADER, with the fields enclosed
 * by brackets "[]" replaced with your own identifying * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2008 Andreas Schneider
 *)
unit UAdminHandling;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, UPacket, UPacketHandlers, UEnhancedMemoryStream;
  
type

  TAdminHandlerAlreadyAssignedException = class(Exception);

  { TFlushServerPacket }

  TFlushServerPacket = class(TPacket)
    constructor Create;
  end;
  
  { TQuitServerPacket }

  TQuitServerPacket = class(TPacket)
    constructor Create(AReason: string);
  end;
  
procedure AssignAdminPacketHandler(APacketID: Byte; AHandler: TPacketHandler);
procedure OnAdminHandlerPacket(ABuffer: TEnhancedMemoryStream);

var
  AdminPacketHandlers: array[0..$FF] of TPacketHandler;

implementation

procedure AssignAdminPacketHandler(APacketID: Byte; AHandler: TPacketHandler);
begin
  if AdminPacketHandlers[APacketID] <> nil then
    raise TAdminHandlerAlreadyAssignedException.CreateFmt(
      'The AdminPacketHandler $%.2x is already assigned!', [APacketID]);

  AdminPacketHandlers[APacketID] := AHandler;
end;

procedure OnAdminHandlerPacket(ABuffer: TEnhancedMemoryStream);
var
  packetHandler: TPacketHandler;
begin
  packetHandler := AdminPacketHandlers[ABuffer.ReadByte];
  if packetHandler <> nil then
    packetHandler.Process(ABuffer);
end;

{ TFlushServerPacket }

constructor TFlushServerPacket.Create;
begin
  inherited Create($03, 0);
  FStream.WriteByte($01);
end;

{ TQuitServerPacket }

constructor TQuitServerPacket.Create(AReason: string);
begin
  inherited Create($03, 0);
  FStream.WriteByte($02);
  FStream.WriteStringNull(AReason);
end;

{$WARNINGS OFF}
var
  i: Integer;

initialization
  for i := 0 to $FF do
    AdminPacketHandlers[i] := nil;
finalization
  for i := 0 to $FF do
    if AdminPacketHandlers[i] <> nil then
      AdminPacketHandlers[i].Free;
{$WARNINGS ON}

end.

