OSDN Git Service

(none)
[hos/hos-v4a.git] / aplfw / driver / serial / winsock / winsockdrv.c
1
2
3
4 #include "winsockdrv_local.h"
5
6
7 const T_DRVOBJ_METHODS  WinSockDrv_Methods = 
8         {
9                 WinSockDrv_Delete,
10                 WinSockDrv_Open,
11                 WinSockDrv_Close,
12                 WinSockDrv_IoControl,
13                 WinSockDrv_Seek,
14                 WinSockDrv_Read,
15                 WinSockDrv_Write,
16                 WinSockDrv_Flush,
17         };
18
19
20 /** コンストラクタ */
21 void WinSockDrv_Create(C_WINSOCKDRV *self, int iPortNum, int iIntNum, int iBufSize)
22 {
23         WSADATA wsaData;
24         struct sockaddr_in addr;
25         
26         /* 親クラス初期化 */
27         DrvObj_Create(&self->DrvObj, &WinSockDrv_Methods);
28
29         WSAStartup(MAKEWORD(2,0), &wsaData);
30         
31         self->sock0 = socket(AF_INET, SOCK_STREAM, 0);
32         
33         addr.sin_family = AF_INET;
34         addr.sin_port = htons((u_short)iPortNum);
35         addr.sin_addr.S_un.S_addr = INADDR_ANY;
36         
37         bind(self->sock0, (struct sockaddr *)&addr, sizeof(addr));
38         
39         listen(self->sock0, 5);
40 }
41
42
43 /** デストラクタ */
44 void WinSockDrv_Delete(C_DRVOBJ *pDrvObj)
45 {
46         WSACleanup();
47 }
48
49
50 /** オープン */
51 HANDLE WinSockDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
52 {
53         C_WINSOCKDRV            *self;
54         C_FILEOBJ                       *pFileObj;
55         struct sockaddr_in      client;
56         int                                     len;
57
58         /* upper cast */
59         self = (C_WINSOCKDRV *)pDrvObj;
60
61         /* create file descriptor */
62         if ( (pFileObj = SysMem_Alloc(sizeof(*pFileObj))) == NULL )
63         {
64                 return HANDLE_NULL;
65         }
66         FileObj_Create(pFileObj, pDrvObj, NULL);
67
68         /* オープン処理 */
69         if ( self->iOpenCount++ == 0 )
70         {
71                 len = sizeof(client);
72                 self->sock = accept(self->sock0, (struct sockaddr *)&client, &len);
73         }
74
75         return (HANDLE)pFileObj;
76 }
77
78
79 /** クローズ */
80 FILE_ERR WinSockDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
81 {
82         C_WINSOCKDRV *self;
83
84         /* upper cast */
85         self = (C_WINSOCKDRV *)pDrvObj;
86
87         if ( --self->iOpenCount == 0 )
88         {
89                 closesocket(self->sock);
90         }
91
92         return FILE_ERR_OK;
93 }
94
95
96 FILE_ERR  WinSockDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize)
97 {
98         return FILE_ERR_NG;
99 }
100
101
102 FILE_POS  WinSockDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign)
103 {
104         return FILE_ERR_NG;
105 }
106
107
108 /** 読み出し */
109 FILE_SIZE WinSockDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
110 {
111         C_WINSOCKDRV *self;
112
113         /* upper cast */
114         self = (C_WINSOCKDRV *)pDrvObj;
115
116         return recv(self->sock, pBuf, Size, 0);
117 }
118
119
120 /** 書き込み */
121 FILE_SIZE WinSockDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
122 {
123         C_WINSOCKDRV *self;
124
125         /* upper cast */
126         self = (C_WINSOCKDRV *)pDrvObj;
127
128         return send(self->sock, pData, Size, 0);
129 }
130
131
132 FILE_ERR  WinSockDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
133 {
134         return FILE_ERR_OK;
135 }
136