亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? wircommsocket.pas

?? 紅外通訊套件IrD Socket
?? PAS
字號(hào):
{: ICS WSocket extension supporting WinSock interface to IrDA:IrCOMM (IrSock).
   (c) 2000 Primoz Gabrijelcic

   Author           : Primoz Gabrijelcic
   Creation date    : 2000-11-01
   Last modification: 2000-11-08
   Version          : 1.0
   Limitations      : Currently only supports client side and 9 Wire mode.

   This unit won't compile without a minimal change to WSocket.pas:
   - In class TCustomWSocket move FSelectEvent variable from private to
     protected section.

   History:
   1.0: 2000-11-08
     - Released.

   0.0: 2000-11-01
     - Created.
}

unit WIrCOMMSocket;

interface

uses
  Windows,
  WinSock,
  WSocket,
  Classes;

const

{ Imports from AF_IRDA.H }

  //: IrDA protocol number
  AF_IRDA = 26;
  PF_IRDA = AF_IRDA;

  SOL_IRLMP            = $00FF;

  IRLMP_ENUMDEVICES    = $00000010;
  IRLMP_IAS_SET        = $00000011;
  IRLMP_IAS_QUERY      = $00000012;
  IRLMP_SEND_PDU_LEN   = $00000013;
  IRLMP_EXCLUSIVE_MODE = $00000014;
  IRLMP_IRLPT_MODE     = $00000015;
  IRLMP_9WIRE_MODE     = $00000016;
  IRLMP_TINYTP_MODE    = $00000017;
  IRLMP_PARAMETERS     = $00000018;
  IRLMP_DISCOVERY_MODE = $00000019;

  IAS_ATTRIB_NO_CLASS  = $00000010;
  IAS_ATTRIB_NO_ATTRIB = $00000000;
  IAS_ATTRIB_INT       = $00000001;
  IAS_ATTRIB_OCTETSEQ  = $00000002;
  IAS_ATTRIB_STR       = $00000003;

  IAS_MAX_USER_STRING  = 256;
  IAS_MAX_OCTET_STRING = 1024;
  IAS_MAX_CLASSNAME    = 64;
  IAS_MAX_ATTRIBNAME   = 256;

type
  //:IrDA device ID. Should be treated as four characters, not as PChar.
  TIrdaDeviceID = array [1..4] of char;

  //:Socket-level IrDA device 'address' descriptor.
  TIrdaSockAddr = packed record
    irdaAddressFamily: u_short;
    irdaDeviceID     : TIrdaDeviceID;
    irdaServiceName  : array [0..24] of char;
  end; { TIrdaSockAddr }

  //:Information on one IrDA device.
  TIrdaDeviceInfo = packed record
    irdaDeviceID    : TIrdaDeviceID;
    irdaDeviceName  : array [0..21] of char;
    irdaDeviceHints1: byte;
    irdaDeviceHints2: byte;
    irdaCharSet     : byte;
  end; { TIrdaDeviceInfo }
  PIrdaDeviceInfo = ^TIrdaDeviceInfo;

  TIrdaAttribOctetSeq = packed record
    len     : longint;
    octetSeq: array [0..IAS_MAX_OCTET_STRING-1] of byte;
  end; { TIrdaAttribOctetSeq }

  TIrdaAttribUsrStr = packed record
    len    : longint;
    charSet: longint;
    usrStr : array [0..IAS_MAX_USER_STRING] of char;
  end; { TIrdaAttribUsrStr }

  //:IAS query
  TIrdaIASQuery = packed record
    irdaDeviceID  : TIrdaDeviceID;
    irdaClassName : array [0..IAS_MAX_CLASSNAME-1] of char;
    irdaAttribName: array [0..IAS_MAX_ATTRIBNAME-1] of char;
    irdaAttribType: longint;
    case integer of // irdaAttribute
      0: (irdaAttribInt: longint);
      1: (irdaAttribOctetSeq: TIrdaAttribOctetSeq);
      2: (irdaAttribUsrStr: TIrdaAttribUsrStr);
  end; { TIrdaIASQuery }
  PIrdaIASQuery = ^TIrdaIASQuery;

{ WIrCOMMSocket classes }

  {:Information on all connected IrDA devices, returned from
    TWIrCOMMSocket.GetConnectedDevices.
  }
  TIrdaDevicesInfo = class
  private
    idiDeviceList: TList; 
  protected
    procedure AddDeviceInfo(di: TIrdaDeviceInfo); virtual;
    function  GetDeviceInfo(index: integer): TIrdaDeviceInfo; virtual;
  public
    constructor Create;
    destructor  Destroy; override;
    function    Count: integer;
    property    Items[index: integer]: TIrdaDeviceInfo read GetDeviceInfo; default;
  end; { TIrdaDevicesInfo }

  {:IrCOMM over WinSock - currently only supports client side in 9 Wire mode
    (because Windows 2000 supports 9 Wire mode only).
  }
  TWIrCOMMSocket = class(TCustomSyncWSocket)
  protected
    procedure AssignDefaultValue; override;
    function  InitializeSocket: boolean; virtual;
    function  Set9WireMode: boolean; virtual;
  public
    irDeviceID: TIrdaDeviceID;
    procedure Connect; override;
    function  GetConnectedDevices: TIrdaDevicesInfo;
    property Handle;
    property HSocket;
    property BufSize;
    property Text;
    property AllSent;
    property OnDisplay;
    property DeviceID: TIrdaDeviceID read irDeviceID write irDeviceID;
  published
    property State;
    property ReadCount;
    property RcvdCount;
    property LastError;
    property MultiThreaded;
    property ComponentOptions;
    property OnDataAvailable;
    property OnDataSent;
    property OnSendData;
    property OnSessionClosed;
    property OnSessionAvailable;
    property OnSessionConnected;
    property OnChangeState;
    property OnLineTooLong;
    property OnError;
    property OnBgException;
    property FlushTimeout;
    property SendFlags;
    property LingerOnOff;
    property LingerTimeout;
  end; { TWIrCOMMSocket }

{IrDA helper functions}
  function IrdaIDToString(id: TIrdaDeviceID): string;
  function StringToIrDAID(id: string): TIrdaDeviceID;

{Component registration}
  procedure Register;
  
implementation

uses
  SysUtils;

  {:Component registration.
  }
  procedure Register;
  begin
    RegisterComponents('IRDSOCK', [TWIrCOMMSocket]);
  end; { Register }
  
  {:Converts IrDA ID to textual representation.
  }
  function IrdaIDToString(id: TIrdaDeviceID): string;

    function GetLastNonzero: integer;
    var
      iCh: integer;
    begin
      Result := Low(id)-1;
      for iCh := High(id) downto Low(id) do begin
        if id[iCh] <> #0 then begin
          Result := iCh;
          break;
        end;
      end; //for
    end; { GetLastNonzero }

  var
    hiCh: integer;
    iCh : integer;

  begin { IrdaIDToString }
    Result := '';
    hiCh := GetLastNonzero;
    for iCh := Low(id) to hiCh do begin
      if id[iCh] in ([#33..#126]-['#']) then
        Result := Result + id[iCh]
      else
        Result := Result + '#' + Format('%.3d',[Ord(id[iCh])]);
    end; //for
  end; { IrdaIDToString }

  {:Converts textual representation of IrDA ID back to TIrdaDeviceID.
  }
  function StringToIrDAID(id: string): TIrdaDeviceID;

    function ExtractChar: char;
    begin
      if id = '' then
        Result := #0
      else if  id[1] <> '#' then begin
        Result := id[1];
        Delete(id,1,1);
      end
      else begin
        Result := Chr(StrToIntDef(Copy(id,2,3),0));
        Delete(id,1,4);
      end;
    end; { ExtractChar }

  var
    iCh: integer;

  begin { StringToIrDAID }
    for iCh := Low(TIrdaDeviceID) to High(TIrdaDeviceID) do
      Result[iCh] := ExtractChar;
  end; { StringToIrDAID }

{ TIrdaDevicesInfo }

type
  //:Wrapper for IrDA device info record.
  TIrdaDeviceWrapper = class
    idwInfo: TIrdaDeviceInfo;
  end; { TIrdaDeviceWrapper }

{:Adds device info to the list.
}
procedure TIrdaDevicesInfo.AddDeviceInfo(di: TIrdaDeviceInfo);
begin
  idiDeviceList.Add(TIrdaDeviceWrapper.Create);
  TIrdaDeviceWrapper(idiDeviceList[idiDeviceList.Count-1]).idwInfo := di;
end; { TIrdaDevicesInfo.AddDeviceInfo }

{:Returns number of devices in list.
}
function TIrdaDevicesInfo.Count: integer;
begin
  Result := idiDeviceList.Count;
end; { TIrdaDevicesInfo.Count }

{:TIrdaDeviceInfo constructor. Creates internal storage.
}
constructor TIrdaDevicesInfo.Create;
begin
  inherited Create;
  idiDeviceList := TList.Create;
end; { TIrdaDevicesInfo.Create }

{:TIrdaDeviceInfo destructor. Cleanup.
}
destructor TIrdaDevicesInfo.Destroy;
var
  iDev: integer;
begin
  for iDev := 0 to idiDeviceList.Count-1 do begin
    TIrdaDeviceWrapper(idiDeviceList[iDev]).Free;
    idiDeviceList[iDev] := nil;
  end;
  idiDeviceList.Free;
  inherited Destroy;
end; { TIrdaDevicesInfo.Destroy }

{:Returns index-th device info.
}
function TIrdaDevicesInfo.GetDeviceInfo(index: integer): TIrdaDeviceInfo;
begin
  Result := TIrdaDeviceWrapper(idiDeviceList[index]).idwInfo;
end; { TIrdaDevicesInfo.GetDeviceInfo }

{ TWIrCOMMSocket }

{:Assigns default socket values for IrDA communication.
}
procedure TWIrCOMMSocket.AssignDefaultValue;
begin
  inherited AssignDefaultValue;
  FAddrFormat := PF_IRDA;
end; { TWIrCOMMSocket.AssignDefaultValue }

{:Connects to IrCOMM device.
}
procedure TWIrCommSocket.Connect;
var
  iStatus: integer;
  sin    : TIrdaSockAddr;
begin
  if (FHSocket <> INVALID_SOCKET) and (FState <> wsClosed) then begin
    RaiseException('Connect: Socket already in use');
    Exit;
  end;
  if not InitializeSocket then
    Exit;
  sin.irdaAddressFamily := AF_IRDA;
  sin.irdaDeviceID      := DeviceID;
  sin.irdaServiceName   := 'IrDA:IrCOMM';
  iStatus := WSocket_connect(FHSocket, TSockAddr((@sin)^), sizeof(sin));
  if iStatus = 0 then
    ChangeState(wsConnected)
  else begin
    iStatus := WSocket_WSAGetLastError;
    if iStatus = WSAEWOULDBLOCK then
      ChangeState(wsConnecting)
    else begin
      SocketError('Connect');
      Exit;
    end;
  end;
end; { TWIrCommSocket.Connect }

{:Returns list of connected IrDA devices. List is created inside this routine
  and must be destroyed by the caller.
  Mostly copied from MSDN (IrDA: Background and Overview;
  http://msdn.microsoft.com/library/backgrnd/html/irdawp.htm).
}
function TWIrCOMMSocket.GetConnectedDevices: TIrdaDevicesInfo;
// TODO 2 -oPrimoz Gabrijelcic: Implement lazy discovery (http://www.cswl.com/cswl/whiteppr/white/infrared.html)
const
  IAS_QUERY_ATTRIB_MAX_LEN = 32;
var
  IASQueryBuf: PIrdaIASQuery;
  IASQueryLen: integer;

  {:Checks if device supports 9 Wire protocol.
    @param   dev IrDA device.
    @returns True if device supports 9 Wire protocol.
  }
  function Supports9Wire(dev: PIrdaDeviceInfo): boolean;
  var
    PI, PL, PV: integer;
  begin
    Result := false;
    IASQueryBuf^.irdaDeviceID   := dev^.irdaDeviceID;
    IASQueryBuf^.irdaClassName  := 'IrDA:IrCOMM';
    IASQueryBuf^.irdaAttribName := 'Parameters';
    if WSocket_getsockopt(FHSocket, SOL_IRLMP, IRLMP_IAS_QUERY,
         PChar(IASQueryBuf), IASQueryLen) = SOCKET_ERROR then
    begin
      SocketError('Supports9Wire');
      Exit;
    end;
    if IASQueryBuf^.irdaAttribType <> IAS_ATTRIB_OCTETSEQ then
      Exit; // Peer's IAS database entry for IrCOMM is bad.
    if IASQueryBuf^.irdaAttribOctetSeq.len < 3 then
      Exit; // Peer's IAS database entry for IrCOMM is bad.
    // Search for the PI value 0x00 and check 9 Wire, see IrCOMM spec.
    PI := 0;
    PL := PI + 1;
    PV := PL + 1;
    repeat
      if (IASQueryBuf^.irdaAttribOctetSeq.OctetSeq[PI] = 0) and
         ((IASQueryBuf^.irdaAttribOctetSeq.OctetSeq[PV] AND $04) <> 0) then begin
        Result := true;
        break; //repeat
      end;
      if (PL + IASQueryBuf^.irdaAttribOctetSeq.OctetSeq[PL]) >=
         IASQueryBuf.irdaAttribOctetSeq.Len then
        break; //repeat
      PI := PL + IASQueryBuf.irdaAttribOctetSeq.OctetSeq[PL];
      PL := PI + 1;
      PV := PL + 1;
    until false;
  end; { Supports9Wire }

var
  deviceListBuf  : pointer;
  deviceListLen  : integer;
  iDevice        : integer;
  maxDevices     : integer;
  mustCloseSocket: boolean;
  pDevice        : PIrdaDeviceInfo;

begin { TWIrCOMMSocket.GetConnectedDevices }
  Result := nil;
  if FHSocket = INVALID_SOCKET then begin
    if not InitializeSocket then
      Exit
    else
      mustCloseSocket := true;
  end
  else
    mustCloseSocket := false;
  try
    deviceListBuf := nil;
    maxDevices := 5; // more than 10 irda devices on the same irda receiver? unlikely! but we'll adapt in repeat..until if this happens anyway
    try
      repeat
        maxDevices := 2*maxDevices;
        if assigned(deviceListBuf) then
          FreeMem(deviceListBuf);
        //deviceListBuf^ = record
        //  numDevices: longint
        //  deviceData: array [] of TIrdaDeviceInfo
        deviceListLen := SizeOf(longint)+maxDevices*SizeOf(TIrdaDeviceInfo);
        GetMem(deviceListBuf,deviceListLen);
        longint(deviceListBuf^) := 0;
        if WSocket_getsockopt(FHSocket, SOL_IRLMP, IRLMP_ENUMDEVICES,
             deviceListBuf, deviceListLen) = SOCKET_ERROR then
        begin
          SocketError('Device enumeration failed');
          Exit;
        end;
      until longint(deviceListBuf^) < maxDevices;
      Result := TIrdaDevicesInfo.Create;
      pDevice := PIrdaDeviceInfo(integer(deviceListBuf)+SizeOf(longint));
      //IASQueryBuf is used in all calls to Supports9Wire
      IASQueryLen := SizeOf(TIrdaIASQuery) - 3 + IAS_QUERY_ATTRIB_MAX_LEN;
      IASQueryBuf := AllocMem(IASQueryLen);
      try
        for iDevice := 1 to longint(deviceListBuf^) do begin
          if Supports9Wire(pDevice) then // Report only devices supporting 9 wire mode
            Result.AddDeviceInfo(pDevice^);
          Inc(pDevice);
        end; //for
      finally FreeMem(IASQueryBuf); end;
    finally FreeMem(deviceListBuf); end;
  finally
    if mustCloseSocket then
      Close;
  end;
end; { TWIrCOMMSocket.GetConnectedDevices }

{:Initializes IrDA socket and puts it into 9 Wire mode.
}
function TWIrCOMMSocket.InitializeSocket: boolean;
var
  iStatus: integer;
begin
  Result := false;
  FProto := 0;
  FType  := SOCK_STREAM;
  FProtoResolved := true;
  { Remove any data from the internal output buffer }
  { (should already be empty !)                     }
  DeleteBufferedData;
  FHSocket := WSocket_socket(FAddrFormat, FType, FProto);
  if FHSocket = INVALID_SOCKET then begin
    SocketError('Connect (socket)');
    Exit;
  end;
  ChangeState(wsOpened);
  if not Set9WireMode then
    Exit;
  SetLingerOption;
  FSelectEvent := FD_READ or FD_WRITE or FD_CLOSE or FD_ACCEPT or FD_CONNECT;
  iStatus := WSocket_WSAASyncSelect(FHSocket, Handle, WM_ASYNCSELECT, FSelectEvent);
  if iStatus <> 0 then begin
    SocketError('WSAAsyncSelect');
    Exit;
  end;
  Result := true;
end; { TWIrCOMMSocket.InitializeSocket }

{:Sets 9 Wire mode for DeviceID device.
  @return False on error.
}
function TWIrCOMMSocket.Set9WireMode: boolean;
var
  Enable9WireMode: integer;
begin
  Result := false;
  Enable9WireMode := 1;
  if WSocket_setsockopt(FHSocket, SOL_IRLMP, IRLMP_9WIRE_MODE,
       @Enable9WireMode, SizeOf(integer)) = SOCKET_ERROR then
  begin
    SocketError('Set9WireMode');
    Exit;
  end;
  Result := true;
end; { TWIrCOMMSocket.Set9WireMode }

end.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕字幕中文在线中不卡视频| 日韩美女一区二区三区| 国产成人亚洲综合a∨婷婷图片| 午夜精品久久久久久久久久| 亚洲成人激情社区| 午夜精品久久久久久久久| 日韩av不卡一区二区| 亚洲成人先锋电影| 奇米影视一区二区三区小说| 日韩成人av影视| 日本不卡一区二区三区| 麻豆91在线看| 国产久卡久卡久卡久卡视频精品| 黄网站免费久久| 国产精品自在欧美一区| 99久久久久免费精品国产 | 午夜激情综合网| 亚洲午夜精品网| 日韩国产欧美在线观看| 国产一区在线视频| 成人av在线看| 91精品国产综合久久久久久久 | 亚洲一区二区三区中文字幕| 亚洲国产美国国产综合一区二区| 午夜精品一区二区三区免费视频| 蓝色福利精品导航| 成人黄色在线网站| 欧美日韩成人综合天天影院| 久久久亚洲精品一区二区三区| 一区二区中文视频| 五月婷婷综合在线| 国产高清精品久久久久| 色婷婷综合久久久中文一区二区 | 欧美久久久影院| 日韩免费高清av| 中文字幕一区二区三区av| 亚洲r级在线视频| 成人高清伦理免费影院在线观看| 欧美日韩国产片| 欧美激情资源网| 日韩国产精品久久久| 成人av资源在线| 日韩欧美电影一区| 一区二区三区在线观看动漫| 国产伦精品一区二区三区在线观看 | 欧美三区在线视频| 国产网站一区二区| 裸体在线国模精品偷拍| 日本高清成人免费播放| 国产偷国产偷精品高清尤物| 三级影片在线观看欧美日韩一区二区| 国产呦萝稀缺另类资源| 4438x亚洲最大成人网| 亚洲免费观看高清完整版在线观看| 精品在线观看视频| 欧美日本精品一区二区三区| 日韩伦理av电影| 国产精品99久久久久| 日韩免费看的电影| 日本伊人午夜精品| 欧美日韩一级二级| 亚洲综合视频网| 99国产麻豆精品| 国产精品久久久一区麻豆最新章节| 精品一区二区在线播放| 日韩视频一区二区三区| 日韩不卡免费视频| 欧美性淫爽ww久久久久无| 亚洲精品国久久99热| 不卡一卡二卡三乱码免费网站| 国产午夜精品一区二区| 国产酒店精品激情| 国产亚洲va综合人人澡精品| 激情亚洲综合在线| 欧美精品一区二区蜜臀亚洲| 九色porny丨国产精品| 精品国产乱码久久久久久蜜臀| 日韩电影在线观看电影| 91麻豆精品国产自产在线| 同产精品九九九| 欧美日韩国产一级片| 日日摸夜夜添夜夜添精品视频| 欧美日韩在线直播| 天天综合色天天综合色h| 7777精品久久久大香线蕉| 五月天亚洲精品| 欧美一区二区在线免费观看| 美女在线视频一区| 国产喷白浆一区二区三区| 国产传媒欧美日韩成人| 中文字幕一区二区三区乱码在线| 99re这里只有精品6| 午夜成人免费电影| 精品国精品自拍自在线| 国产精品亚洲午夜一区二区三区| 中文字幕欧美国产| 欧美亚洲自拍偷拍| 老司机精品视频导航| 国产蜜臀av在线一区二区三区| 成人黄页在线观看| 亚州成人在线电影| 久久久精品2019中文字幕之3| 成人免费va视频| 亚洲一区二区三区小说| 26uuu精品一区二区在线观看| 国产mv日韩mv欧美| 亚洲va国产va欧美va观看| 国产午夜亚洲精品羞羞网站| 欧美性感一区二区三区| 国内久久婷婷综合| 亚洲综合色区另类av| 久久久噜噜噜久久人人看 | 欧美日韩一级黄| 国产夫妻精品视频| 天涯成人国产亚洲精品一区av| 国产日韩欧美精品在线| 7799精品视频| 91丨九色丨蝌蚪丨老版| 国模套图日韩精品一区二区| 亚洲一区在线电影| 国产精品美女久久久久久| 欧美一区欧美二区| 色屁屁一区二区| 成人综合婷婷国产精品久久蜜臀| 日韩电影在线观看一区| 一区二区成人在线观看| 国产校园另类小说区| 日韩一区二区三区在线观看 | 亚洲成年人影院| 国产精品久久久久久亚洲毛片 | 成人动漫中文字幕| 久久精品国产一区二区三区免费看| 国产精品理论片| 久久人人97超碰com| 日韩视频一区二区在线观看| 欧洲亚洲国产日韩| 97精品国产97久久久久久久久久久久| 久久国产夜色精品鲁鲁99| 亚洲动漫第一页| 亚洲综合视频在线观看| 亚洲欧美偷拍三级| 国产精品美女一区二区在线观看| 久久一区二区三区国产精品| 欧美一区二区三区男人的天堂| 在线观看成人小视频| 99在线热播精品免费| 成人高清视频免费观看| 成人国产视频在线观看| 成人黄色av网站在线| 成人av网址在线观看| 成人丝袜高跟foot| 豆国产96在线|亚洲| 国产成人免费视频精品含羞草妖精 | 五月天欧美精品| 性感美女久久精品| 午夜欧美视频在线观看| 亚洲国产一区二区视频| 婷婷中文字幕综合| 视频一区二区三区在线| 青青草精品视频| 久久99九九99精品| 国产一区二区三区视频在线播放| 国产在线精品视频| 粉嫩一区二区三区性色av| 大美女一区二区三区| 色噜噜久久综合| 欧美美女网站色| 精品国产一区二区三区久久久蜜月| 精品日韩成人av| 欧美激情中文字幕一区二区| 亚洲欧美综合色| 亚洲午夜免费视频| 久久国产成人午夜av影院| 国产一区二区三区日韩 | 日韩午夜在线播放| 亚洲精品一区二区三区蜜桃下载 | 久久国产夜色精品鲁鲁99| 国产一区二区三区av电影| 国产高清无密码一区二区三区| 成人av动漫网站| 在线观看日韩电影| 精品乱码亚洲一区二区不卡| www国产精品av| 亚洲美女淫视频| 六月婷婷色综合| 一本久道久久综合中文字幕 | 国产一区在线精品| 91在线视频播放| 91精品欧美一区二区三区综合在 | 成人午夜激情视频| 欧美性色黄大片手机版| 久久欧美中文字幕| 亚洲国产成人tv| 精品在线视频一区| 欧美中文字幕不卡| 中文字幕第一区综合| 奇米影视7777精品一区二区| av影院午夜一区| 日韩女优毛片在线| 亚洲资源在线观看|