OSDN Git Service

(none)
[hos/hos-v4a.git] / aplfw / driver / serial / winsock / winsockdrv_constructor.c
1 /** 
2  *  Hyper Operating System  Application Framework
3  *
4  * @file  winsockdrv.h
5  * @brief %jp{WinSockでシリアルを擬似するドライバ}
6  *
7  * Copyright (C) 2006-2007 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12
13 #include "winsockdrv_local.h"
14
15
16
17 /** 仮想関数テーブル */
18 const T_DRVOBJ_METHODS  WinSockDrv_Methods = 
19         {
20                 { WinSockDrv_Delete },
21                 WinSockDrv_Open,
22                 WinSockDrv_Close,
23                 WinSockDrv_IoControl,
24                 WinSockDrv_Seek,
25                 WinSockDrv_Read,
26                 WinSockDrv_Write,
27                 WinSockDrv_Flush,
28         };
29
30
31 /** コンストラクタ */
32 FILE_ERR WinSockDrv_Constructor(C_WINSOCKDRV *self, const T_DRVOBJ_METHODS *pMethods, int iPortNum, int iIntNum, int iBufSize)
33 {
34         DWORD           dwThreadId;
35         FILE_ERR        ErrCode;
36         void            *pRecvMem;
37         void            *pSendMem;
38         
39         /* 仮想関数テーブル */
40         if ( pMethods == NULL )
41         {
42                 pMethods = &WinSockDrv_Methods;
43         }
44
45         /* バッファ用メモリ確保 */
46         if ( (pRecvMem = SysMem_Alloc(iBufSize)) == NULL )
47         {
48                 return FILE_ERR_NG;
49         }
50         if ( (pSendMem = SysMem_Alloc(iBufSize)) == NULL )
51         {
52                 SysMem_Free(pRecvMem);
53                 return FILE_ERR_NG;
54         }
55
56
57         /* 親クラスコンストラクタ呼び出し */
58         if ( (ErrCode = SyncDrv_Constructor(&self->SyncDrv, pMethods, SYNCDRV_FACTOR_NUM)) != FILE_ERR_OK )
59         {
60                 SysMem_Free(pRecvMem);
61                 SysMem_Free(pSendMem);
62                 return ErrCode;
63         }
64         
65         /* メンバ変数初期化 */
66         self->iOpenCount  = 0;
67         self->iPortNum    = iPortNum;
68         self->iIntNum     = iIntNum;
69         self->iConnection = FALSE;
70
71         /* バッファ生成 */
72         StreamBuf_Create(&self->StmBufRecv, iBufSize, pRecvMem);
73         StreamBuf_Create(&self->StmBufSend, iBufSize, pSendMem);
74
75         /* 割込み処理登録 */
76         self->hIsr = SysIsr_Create(self->iIntNum, WinSockDrv_Isr, (VPARAM)self);
77         
78         /* イベント生成 */
79         self->hConnectEvent    = CreateEvent(NULL, FALSE, FALSE, NULL);
80         self->hDisconnectEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
81         self->hSendEvent       = CreateEvent(NULL, FALSE, FALSE, NULL);
82
83         /* %jp{スレッド生成} */
84         self->hRecvThread = CreateThread(NULL, 0, WinSockDrv_Recv, (LPVOID)self, 0, &dwThreadId);
85         self->hSendThread = CreateThread(NULL, 0, WinSockDrv_Send, (LPVOID)self, 0, &dwThreadId);
86
87         return FILE_ERR_OK;
88 }
89
90
91
92 /* end of file */