From de6a375730dc60127ddba188058302eba2b2dbd3 Mon Sep 17 00:00:00 2001 From: ryuz Date: Mon, 30 Apr 2007 03:08:56 +0000 Subject: [PATCH] (none) --- aplfw/build/win/win32/vc60/hosaplfw.dsp | 164 ++++-------------------- aplfw/driver/console/vt100/vt100drv.h | 9 +- aplfw/driver/console/vt100/vt100drv_close.c | 22 ++++ aplfw/driver/console/vt100/vt100drv_create.c | 39 ++++++ aplfw/driver/console/vt100/vt100drv_flush.c | 22 ++++ aplfw/driver/console/vt100/vt100drv_getch.c | 6 +- aplfw/driver/console/vt100/vt100drv_iocontrol.c | 34 +++++ aplfw/driver/console/vt100/vt100drv_local.h | 19 +++ aplfw/driver/console/vt100/vt100drv_open.c | 36 ++++++ aplfw/driver/console/vt100/vt100drv_read.c | 6 +- aplfw/driver/console/vt100/vt100drv_seek.c | 22 ++++ aplfw/driver/console/vt100/vt100drv_write.c | 13 +- aplfw/driver/serial/winsock/winsockdrv.c | 88 +++++++++++-- aplfw/driver/serial/winsock/winsockdrv.h | 32 +++-- aplfw/driver/serial/winsock/winsockdrv_local.h | 40 ++++++ aplfw/sample/win/win32/sample.c | 9 +- aplfw/sample/win/win32/vc60/sample.dsp | 4 + aplfw/system/file/console.h | 2 +- aplfw/system/file/console_getch.c | 12 +- aplfw/system/file/drvfile.h | 2 +- aplfw/system/file/drvfile_create.c | 8 +- aplfw/system/file/drvobj.h | 40 +++--- aplfw/system/file/drvobj_create.c | 11 ++ aplfw/system/file/drvobj_local.h | 6 - aplfw/system/file/file.h | 31 +++-- aplfw/system/file/file_iocontrol.c | 10 +- aplfw/system/file/file_local.h | 1 - aplfw/system/file/file_open.c | 1 - aplfw/system/file/file_read.c | 10 +- aplfw/system/file/file_seek.c | 9 +- aplfw/system/file/file_write.c | 9 +- aplfw/system/file/fileobj.h | 25 ++-- aplfw/system/file/fileobj_create.c | 16 ++- aplfw/system/file/fileobj_local.h | 39 ++++++ aplfw/system/file/volume_openfile.c | 6 +- aplfw/system/file/volumeobj.h | 10 +- aplfw/system/file/volumeobj_create.c | 2 +- aplfw/volume/dev/devvol.h | 10 ++ aplfw/volume/dev/devvol_adddevice.c | 2 +- aplfw/volume/dev/devvol_create.c | 3 +- aplfw/volume/dev/devvol_openfile.c | 18 +-- aplfw/volume/fat/fatfile_create.c | 2 +- 42 files changed, 530 insertions(+), 320 deletions(-) create mode 100755 aplfw/driver/console/vt100/vt100drv_close.c create mode 100755 aplfw/driver/console/vt100/vt100drv_create.c create mode 100755 aplfw/driver/console/vt100/vt100drv_flush.c create mode 100755 aplfw/driver/console/vt100/vt100drv_iocontrol.c create mode 100755 aplfw/driver/console/vt100/vt100drv_open.c create mode 100755 aplfw/driver/console/vt100/vt100drv_seek.c create mode 100755 aplfw/driver/serial/winsock/winsockdrv_local.h create mode 100755 aplfw/system/file/drvobj_create.c create mode 100755 aplfw/system/file/fileobj_local.h diff --git a/aplfw/build/win/win32/vc60/hosaplfw.dsp b/aplfw/build/win/win32/vc60/hosaplfw.dsp index 2ceea81..d8ae5f5 100755 --- a/aplfw/build/win/win32/vc60/hosaplfw.dsp +++ b/aplfw/build/win/win32/vc60/hosaplfw.dsp @@ -201,30 +201,6 @@ SOURCE=..\..\..\..\library\container\array\array_setsize.c # Begin Group "renesus" # PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\..\driver\serial\renesas\scidrv.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\serial\renesas\scidrv.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\serial\renesas\scifile.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\serial\renesas\scifile.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\serial\renesas\scihal.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\serial\renesas\scihal.h -# End Source File # End Group # Begin Group "winsock" @@ -239,40 +215,12 @@ SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv.h # End Source File # Begin Source File -SOURCE=..\..\..\..\driver\serial\winsock\winsockfile.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\serial\winsock\winsockfile.h +SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_local.h # End Source File # End Group # Begin Group "pc16550" # PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\..\driver\serial\pc16550\pc16550drv.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\serial\pc16550\pc16550drv.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\serial\pc16550\pc16550file.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\serial\pc16550\pc16550file.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\serial\pc16550\pc16550hal.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\serial\pc16550\pc16550hal.h -# End Source File # End Group # End Group # Begin Group "ether" @@ -281,25 +229,9 @@ SOURCE=..\..\..\..\driver\serial\pc16550\pc16550hal.h # Begin Group "ne2000" # PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\..\driver\ether\ne2000\ne2000drv.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\ether\ne2000\ne2000drv.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\ether\ne2000\ne2000hal.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\ether\ne2000\ne2000hal.h -# End Source File # End Group # End Group -# Begin Group "terminal" +# Begin Group "console" # PROP Default_Filter "" # Begin Group "vt100" @@ -307,31 +239,23 @@ SOURCE=..\..\..\..\driver\ether\ne2000\ne2000hal.h # PROP Default_Filter "" # Begin Source File -SOURCE=..\..\..\..\driver\terminal\vt100\vt100con.h +SOURCE=..\..\..\..\driver\console\vt100\vt100drv.h # End Source File # Begin Source File -SOURCE=..\..\..\..\driver\terminal\vt100\vt100con_create.c +SOURCE=..\..\..\..\driver\console\vt100\vt100drv_getch.c # End Source File # Begin Source File -SOURCE=..\..\..\..\driver\terminal\vt100\vt100drv.h +SOURCE=..\..\..\..\driver\console\vt100\vt100drv_local.h # End Source File # Begin Source File -SOURCE=..\..\..\..\driver\terminal\vt100\vt100drv_getch.c +SOURCE=..\..\..\..\driver\console\vt100\vt100drv_read.c # End Source File # Begin Source File -SOURCE=..\..\..\..\driver\terminal\vt100\vt100drv_local.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\terminal\vt100\vt100drv_read.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\driver\terminal\vt100\vt100drv_write.c +SOURCE=..\..\..\..\driver\console\vt100\vt100drv_write.c # End Source File # End Group # End Group @@ -476,23 +400,27 @@ SOURCE=..\..\..\..\system\sysapi\system_unlock.c # PROP Default_Filter "" # Begin Source File -SOURCE=..\..\..\..\system\file\confile.c +SOURCE=..\..\..\..\system\file\console.h # End Source File # Begin Source File -SOURCE=..\..\..\..\system\file\confile.h +SOURCE=..\..\..\..\system\file\console_getch.c # End Source File # Begin Source File -SOURCE=..\..\..\..\system\file\console.h +SOURCE=..\..\..\..\system\file\consoleobj.h # End Source File # Begin Source File -SOURCE=..\..\..\..\system\file\console_getch.c +SOURCE=..\..\..\..\system\file\drvobj.h # End Source File # Begin Source File -SOURCE=..\..\..\..\system\file\consoleobj.h +SOURCE=..\..\..\..\system\file\drvobj_create.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\system\file\drvobj_local.h # End Source File # Begin Source File @@ -726,75 +654,31 @@ SOURCE=..\..\..\..\volume\dev\devvol_openfile.c # Begin Group "fat" # PROP Default_Filter "" +# End Group +# End Group # Begin Source File -SOURCE=..\..\..\..\volume\fat\fatfile.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\volume\fat\fatfile_create.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\volume\fat\fatfile_local.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\volume\fat\fatfile_read.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\volume\fat\fatvol.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\volume\fat\fatvol_clusterread.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\volume\fat\fatvol_clusterwrite.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\volume\fat\fatvol_create.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\volume\fat\fatvol_createfile.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\volume\fat\fatvol_flushfat.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\volume\fat\fatvol_getclusterbuf.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\..\volume\fat\fatvol_getnextcluster.c +SOURCE=..\..\..\..\hosaplfw.h # End Source File # Begin Source File -SOURCE=..\..\..\..\volume\fat\fatvol_local.h +SOURCE=..\..\..\..\driver\console\vt100\vt100drv_close.c # End Source File # Begin Source File -SOURCE=..\..\..\..\volume\fat\fatvol_open.c +SOURCE=..\..\..\..\driver\console\vt100\vt100drv_create.c # End Source File # Begin Source File -SOURCE=..\..\..\..\volume\fat\fatvol_relclusterbuf.c +SOURCE=..\..\..\..\driver\console\vt100\vt100drv_iocontrol.c # End Source File # Begin Source File -SOURCE=..\..\..\..\volume\fat\fatvol_setnextcluster.c +SOURCE=..\..\..\..\driver\console\vt100\vt100drv_open.c # End Source File -# End Group -# End Group # Begin Source File -SOURCE=..\..\..\..\hosaplfw.h +SOURCE=..\..\..\..\driver\console\vt100\vt100drv_seek.c # End Source File # End Target # End Project diff --git a/aplfw/driver/console/vt100/vt100drv.h b/aplfw/driver/console/vt100/vt100drv.h index 6ef8bcd..163b0a0 100755 --- a/aplfw/driver/console/vt100/vt100drv.h +++ b/aplfw/driver/console/vt100/vt100drv.h @@ -1,12 +1,14 @@ -#include "system/file/consoleobj.h" +#include "system/file/console.h" +#include "system/file/drvobj.h" typedef struct c_vt100drv { - C_CONSOLEOBJ ConObj; + C_DRVOBJ DrvObj; + HANDLE hTty; int iEscState; int iEscNum; @@ -20,9 +22,6 @@ extern "C" { void Vt100Drv_Create(C_VT100DRV *self, HANDLE hTty); /**< コンストラクタ */ void Vt100Drv_Delete(C_VT100DRV *self); /**< デストラクタ */ -FILE_ERR Vt100Drv_IoControl(HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize); -FILE_SIZE Vt100Drv_Read(HANDLE hFile, void *pBuf, FILE_SIZE Size); -FILE_SIZE Vt100Drv_Write(HANDLE hFile, const void *pData, FILE_SIZE Size); #ifdef __cplusplus } diff --git a/aplfw/driver/console/vt100/vt100drv_close.c b/aplfw/driver/console/vt100/vt100drv_close.c new file mode 100755 index 0000000..b18444a --- /dev/null +++ b/aplfw/driver/console/vt100/vt100drv_close.c @@ -0,0 +1,22 @@ +/** + * Hyper Operating System Application Framework + * + * @file vt100drv_open.c + * @brief %jp{VT100 ターミナルドライバ} + * + * Copyright (C) 2006 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#include "vt100drv_local.h" +#include "system/sysapi/sysapi.h" + + +FILE_ERR Vt100Drv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj) +{ + return FILE_ERR_OK; +} + + +/* end of file */ diff --git a/aplfw/driver/console/vt100/vt100drv_create.c b/aplfw/driver/console/vt100/vt100drv_create.c new file mode 100755 index 0000000..5634d2f --- /dev/null +++ b/aplfw/driver/console/vt100/vt100drv_create.c @@ -0,0 +1,39 @@ +/** + * Hyper Operating System Application Framework + * + * @file vt100drv_create.c + * @brief %jp{VT100 ターミナルドライバ} + * + * Copyright (C) 2006 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#include "vt100drv_local.h" +#include "system/sysapi/sysapi.h" + + +const T_DRVOBJ_METHODS Vt100Drv_Methods = + { + Vt100Drv_Open, + Vt100Drv_Close, + Vt100Drv_IoControl, + Vt100Drv_Seek, + Vt100Drv_Read, + Vt100Drv_Write, + Vt100Drv_Flush, + }; + + + +/**< コンストラクタ */ +void Vt100Drv_Create(C_VT100DRV *self, HANDLE hTty) +{ + /* 親クラスコンストラクタ */ + DrvObj_Create(&self->DrvObj, &Vt100Drv_Methods); + + self->hTty = hTty; +} + + +/* end of file */ diff --git a/aplfw/driver/console/vt100/vt100drv_flush.c b/aplfw/driver/console/vt100/vt100drv_flush.c new file mode 100755 index 0000000..030be46 --- /dev/null +++ b/aplfw/driver/console/vt100/vt100drv_flush.c @@ -0,0 +1,22 @@ +/** + * Hyper Operating System Application Framework + * + * @file vt100drv_open.c + * @brief %jp{VT100 ターミナルドライバ} + * + * Copyright (C) 2006 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#include "vt100drv_local.h" +#include "system/sysapi/sysapi.h" + + +FILE_ERR Vt100Drv_Flush(struct c_drvobj *self, C_FILEOBJ *pFileObj) +{ + return FILE_ERR_OK; +} + + +/* end of file */ diff --git a/aplfw/driver/console/vt100/vt100drv_getch.c b/aplfw/driver/console/vt100/vt100drv_getch.c index 7e1d4dc..45e2189 100755 --- a/aplfw/driver/console/vt100/vt100drv_getch.c +++ b/aplfw/driver/console/vt100/vt100drv_getch.c @@ -10,12 +10,8 @@ #include "vt100drv_local.h" +#include "system/sysapi/sysapi.h" -/**< コンストラクタ */ -void Vt100Drv_Create(C_VT100DRV *self, HANDLE hTty) -{ - self->hTty = hTty; -} /* 1文字取得 */ diff --git a/aplfw/driver/console/vt100/vt100drv_iocontrol.c b/aplfw/driver/console/vt100/vt100drv_iocontrol.c new file mode 100755 index 0000000..d60d264 --- /dev/null +++ b/aplfw/driver/console/vt100/vt100drv_iocontrol.c @@ -0,0 +1,34 @@ +/** + * Hyper Operating System Application Framework + * + * @file vt100drv_open.c + * @brief %jp{VT100 ターミナルドライバ} + * + * Copyright (C) 2006 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#include "vt100drv_local.h" +#include "system/sysapi/sysapi.h" + +FILE_ERR Vt100Drv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize) +{ + C_VT100DRV *self; + + /* upper cast */ + self = (C_VT100DRV *)pDrvObj; + + switch ( iFunc ) + { + case FILE_IOCTL_CON_GETCH: + *(int *)pInBuf = Vt100Drv_GetCh(self); + return FILE_ERR_OK; + + default: + return FILE_ERR_NG; + } +} + + +/* end of file */ diff --git a/aplfw/driver/console/vt100/vt100drv_local.h b/aplfw/driver/console/vt100/vt100drv_local.h index aad66f4..0187490 100755 --- a/aplfw/driver/console/vt100/vt100drv_local.h +++ b/aplfw/driver/console/vt100/vt100drv_local.h @@ -10,3 +10,22 @@ #define VT100DRV_ESC_NUM 4 +#ifdef __cplusplus +extern "C" { +#endif + +HANDLE Vt100Drv_Open(struct c_drvobj *self, const char *pszPath, int iMode); +FILE_ERR Vt100Drv_Close(struct c_drvobj *self, C_FILEOBJ *pFileObj); +FILE_ERR Vt100Drv_IoControl(struct c_drvobj *self, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize); +FILE_POS Vt100Drv_Seek(struct c_drvobj *self, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign); +FILE_SIZE Vt100Drv_Read(struct c_drvobj *self, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size); +FILE_SIZE Vt100Drv_Write(struct c_drvobj *self, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size); +FILE_ERR Vt100Drv_Flush(struct c_drvobj *self, C_FILEOBJ *pFileObj); + +int Vt100Drv_GetCh(C_VT100DRV *self); + + +#ifdef __cplusplus +} +#endif + diff --git a/aplfw/driver/console/vt100/vt100drv_open.c b/aplfw/driver/console/vt100/vt100drv_open.c new file mode 100755 index 0000000..9ac8009 --- /dev/null +++ b/aplfw/driver/console/vt100/vt100drv_open.c @@ -0,0 +1,36 @@ +/** + * Hyper Operating System Application Framework + * + * @file vt100drv_open.c + * @brief %jp{VT100 ターミナルドライバ} + * + * Copyright (C) 2006 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#include "vt100drv_local.h" +#include "system/sysapi/sysapi.h" + + + +HANDLE Vt100Drv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode) +{ + C_VT100DRV *self; + C_FILEOBJ *pFileObj; + + /* upper cast */ + self = (C_VT100DRV *)pDrvObj; + + /* create file descriptor */ + if ( (pFileObj = SysMem_Alloc(sizeof(*pFileObj))) == NULL ) + { + return HANDLE_NULL; + } + FileObj_Create(pFileObj, pDrvObj, NULL); + + return (HANDLE)pFileObj; +} + + +/* end of file */ diff --git a/aplfw/driver/console/vt100/vt100drv_read.c b/aplfw/driver/console/vt100/vt100drv_read.c index f89c39e..2c63d1f 100755 --- a/aplfw/driver/console/vt100/vt100drv_read.c +++ b/aplfw/driver/console/vt100/vt100drv_read.c @@ -3,12 +3,16 @@ #include "vt100drv_local.h" -FILE_SIZE Vt100Drv_Read(C_VT100DRV *self, void *pBuf, FILE_SIZE Size) +FILE_SIZE Vt100Drv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size) { + C_VT100DRV *self; char *pcBuf; FILE_SIZE i; int c; + /* upper cast */ + self = (C_VT100DRV *)pDrvObj; + pcBuf = (char *)pBuf; for ( i = 0; i < Size; i++ ) diff --git a/aplfw/driver/console/vt100/vt100drv_seek.c b/aplfw/driver/console/vt100/vt100drv_seek.c new file mode 100755 index 0000000..c1da626 --- /dev/null +++ b/aplfw/driver/console/vt100/vt100drv_seek.c @@ -0,0 +1,22 @@ +/** + * Hyper Operating System Application Framework + * + * @file vt100drv_open.c + * @brief %jp{VT100 ターミナルドライバ} + * + * Copyright (C) 2006 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#include "vt100drv_local.h" +#include "system/sysapi/sysapi.h" + + +FILE_POS Vt100Drv_Seek(struct c_drvobj *self, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign) +{ + return FILE_ERR_NG; +} + + +/* end of file */ diff --git a/aplfw/driver/console/vt100/vt100drv_write.c b/aplfw/driver/console/vt100/vt100drv_write.c index 0516b0f..c79bbea 100755 --- a/aplfw/driver/console/vt100/vt100drv_write.c +++ b/aplfw/driver/console/vt100/vt100drv_write.c @@ -3,11 +3,15 @@ #include "vt100drv_local.h" -FILE_SIZE Vt100Drv_Write(C_VT100DRV *self, const void *pData, FILE_SIZE Size) +FILE_SIZE Vt100Drv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size) { - const char *pcBuf; - FILE_SIZE i; - + C_VT100DRV *self; + const char *pcBuf; + FILE_SIZE i; + + /* upper cast */ + self = (C_VT100DRV *)pDrvObj; + /* '\n' -> '\r\n' へ変換 */ pcBuf = (const char *)pData; for ( i = 0; i < Size; i++ ) @@ -25,4 +29,3 @@ FILE_SIZE Vt100Drv_Write(C_VT100DRV *self, const void *pData, FILE_SIZE Size) return i; } - diff --git a/aplfw/driver/serial/winsock/winsockdrv.c b/aplfw/driver/serial/winsock/winsockdrv.c index e517c0c..99ea390 100755 --- a/aplfw/driver/serial/winsock/winsockdrv.c +++ b/aplfw/driver/serial/winsock/winsockdrv.c @@ -1,7 +1,19 @@ -#include "winsockdrv.h" +#include "winsockdrv_local.h" + + +const T_DRVOBJ_METHODS WinSockDrv_Methods = + { + WinSockDrv_Open, + WinSockDrv_Close, + WinSockDrv_IoControl, + WinSockDrv_Seek, + WinSockDrv_Read, + WinSockDrv_Write, + WinSockDrv_Flush, + }; /** コンストラクタ */ @@ -9,6 +21,9 @@ void WinSockDrv_Create(C_WINSOCKDRV *self, int iPortNum, int iIntNum, int iBufSi { WSADATA wsaData; struct sockaddr_in addr; + + /* 親クラス初期化 */ + DrvObj_Create(&self->DrvObj, &WinSockDrv_Methods); WSAStartup(MAKEWORD(2,0), &wsaData); @@ -32,36 +47,89 @@ void WinSockDrv_Delete(C_WINSOCKDRV *self) /** オープン */ -void WinSockDrv_Open(C_WINSOCKDRV *self) +HANDLE WinSockDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode) { - struct sockaddr_in client; - int len; + C_WINSOCKDRV *self; + C_FILEOBJ *pFileObj; + struct sockaddr_in client; + int len; + + /* upper cast */ + self = (C_WINSOCKDRV *)pDrvObj; + + /* create file descriptor */ + if ( (pFileObj = SysMem_Alloc(sizeof(*pFileObj))) == NULL ) + { + return HANDLE_NULL; + } + FileObj_Create(pFileObj, pDrvObj, NULL); + /* オープン処理 */ if ( self->iOpenCount++ == 0 ) { len = sizeof(client); self->sock = accept(self->sock0, (struct sockaddr *)&client, &len); } + + return (HANDLE)pFileObj; } /** クローズ */ -void WinSockDrv_Close(C_WINSOCKDRV *self) +FILE_ERR WinSockDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj) +{ + C_WINSOCKDRV *self; + + /* upper cast */ + self = (C_WINSOCKDRV *)pDrvObj; + + if ( --self->iOpenCount == 0 ) + { + closesocket(self->sock); + } + + return FILE_ERR_OK; +} + + +FILE_ERR WinSockDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize) +{ + return FILE_ERR_NG; +} + + +FILE_POS WinSockDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign) { - closesocket(self->sock); + return FILE_ERR_NG; } /** 読み出し */ -int WinSockDrv_Read(C_WINSOCKDRV *self, void *pRecvBuf, int iSize) +FILE_SIZE WinSockDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size) { - return recv(self->sock, pRecvBuf, iSize, 0); + C_WINSOCKDRV *self; + + /* upper cast */ + self = (C_WINSOCKDRV *)pDrvObj; + + return recv(self->sock, pBuf, Size, 0); } + /** 書き込み */ -int WinSockDrv_Write(C_WINSOCKDRV *self, const void *pData, int iSize) +FILE_SIZE WinSockDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size) { - return send(self->sock, pData, iSize, 0); + C_WINSOCKDRV *self; + + /* upper cast */ + self = (C_WINSOCKDRV *)pDrvObj; + + return send(self->sock, pData, Size, 0); } +FILE_ERR WinSockDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj) +{ + return FILE_ERR_OK; +} + diff --git a/aplfw/driver/serial/winsock/winsockdrv.h b/aplfw/driver/serial/winsock/winsockdrv.h index bcd054e..16cf2c2 100755 --- a/aplfw/driver/serial/winsock/winsockdrv.h +++ b/aplfw/driver/serial/winsock/winsockdrv.h @@ -15,24 +15,26 @@ #define SIZE WINSIZE #include +#include "system/file/drvobj.h" #include "system/sysapi/sysapi.h" #include "library/container/stmbuf/stmbuf.h" -/* SCI用ドライバ制御部 */ +/* WinSock用ドライバ制御部 */ typedef struct c_winsockdrv { - int iOpenCount; - SYSEVT_HANDLE hEvtSend; - SYSEVT_HANDLE hEvtRecv; - SYSMTX_HANDLE hMtxSend; - SYSMTX_HANDLE hMtxRecv; - - SOCKET sock0; - SOCKET sock; - - - C_STREAMBUF StmBuf; + C_DRVOBJ DrvObj; /* デバイスドライバクラスを継承 */ + + int iOpenCount; + SYSEVT_HANDLE hEvtSend; + SYSEVT_HANDLE hEvtRecv; + SYSMTX_HANDLE hMtxSend; + SYSMTX_HANDLE hMtxRecv; + + SOCKET sock0; + SOCKET sock; + + C_STREAMBUF StmBuf; } C_WINSOCKDRV; @@ -42,17 +44,13 @@ extern "C" { #endif void WinSockDrv_Create(C_WINSOCKDRV *self, int iPortNum, int iIntNum, int iBufSize); /**< コンストラクタ */ -void WinSockDrv_Delete(C_WINSOCKDRV *self); /**< デストラクタ */ -void WinSockDrv_Open(C_WINSOCKDRV *self); /**< オープン初期化 */ -void WinSockDrv_Close(C_WINSOCKDRV *self); /**< クローズ */ -int WinSockDrv_Read(C_WINSOCKDRV *self, void *pRecvBuf, int iSize); /**< 書き込み */ -int WinSockDrv_Write(C_WINSOCKDRV *self, const void *pData, int iSize); /**< 読み出し */ #ifdef __cplusplus } #endif + #endif /* __HOS__winsockdrv_h__ */ diff --git a/aplfw/driver/serial/winsock/winsockdrv_local.h b/aplfw/driver/serial/winsock/winsockdrv_local.h new file mode 100755 index 0000000..f919d3b --- /dev/null +++ b/aplfw/driver/serial/winsock/winsockdrv_local.h @@ -0,0 +1,40 @@ +/** + * Hyper Operating System Application Framework + * + * @file winsockdrv.h + * @brief %jp{WinSockでシリアルを擬似するドライバ} + * + * Copyright (C) 2006 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#ifndef __HOS__winsockdrv_local_h__ +#define __HOS__winsockdrv_local_h__ + + +#include "winsockdrv.h" +#include "system/file/drvobj.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +HANDLE WinSockDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode); +FILE_ERR WinSockDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj); +FILE_ERR WinSockDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize); +FILE_POS WinSockDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign); +FILE_SIZE WinSockDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size); +FILE_SIZE WinSockDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size); +FILE_ERR WinSockDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj); + +#ifdef __cplusplus +} +#endif + + +#endif /* __HOS__winsockdrv_local_h__ */ + + +/* end of file */ diff --git a/aplfw/sample/win/win32/sample.c b/aplfw/sample/win/win32/sample.c index 1d51fa3..016572a 100755 --- a/aplfw/sample/win/win32/sample.c +++ b/aplfw/sample/win/win32/sample.c @@ -65,21 +65,16 @@ void Sample_Startup(VP_INT exinf) /* /dev/com0 に登録 */ strcpy(DevInf.szName, "com0"); - DevInf.pfncCreate = WinSockFile_Create; - DevInf.ObjSize = sizeof(C_WINSOCKFILE); - DevInf.pParam = &g_WinSockDrv[0]; + DevInf.pDrvObj = (C_DRVOBJ *)&g_WinSockDrv[0]; File_AddDevice(&DevInf); - /* /dev/com0 の上に VT100コンソールを形成 */ hTty = File_Open("/dev/com0", FILE_MODE_READ | FILE_MODE_WRITE); Vt100Drv_Create(&g_Vt100Drv[1], hTty); /* /dev/con0 に登録 */ strcpy(DevInf.szName, "con0"); - DevInf.pfncCreate = Vt100Con_Create; - DevInf.ObjSize = sizeof(C_VT100CON); - DevInf.pParam = &g_Vt100Drv[1]; + DevInf.pDrvObj = (C_DRVOBJ *)&g_Vt100Drv[1]; File_AddDevice(&DevInf); hCon = File_Open("/dev/con0", FILE_MODE_READ | FILE_MODE_WRITE); diff --git a/aplfw/sample/win/win32/vc60/sample.dsp b/aplfw/sample/win/win32/vc60/sample.dsp index 88b8762..92a7e0a 100755 --- a/aplfw/sample/win/win32/vc60/sample.dsp +++ b/aplfw/sample/win/win32/vc60/sample.dsp @@ -110,6 +110,10 @@ SOURCE=..\wintimer.c # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File +SOURCE=..\..\..\..\system\file\drvobj.h +# End Source File +# Begin Source File + SOURCE=..\kernel_id.h # End Source File # Begin Source File diff --git a/aplfw/system/file/console.h b/aplfw/system/file/console.h index 1417eb6..b39e53d 100755 --- a/aplfw/system/file/console.h +++ b/aplfw/system/file/console.h @@ -47,7 +47,7 @@ extern "C" { #endif -FILE_ERR Console_GetCh(HANDLE hConsole); /**< コンストラクタ */ +FILE_ERR Console_GetCh(HANDLE hConsole); #ifdef __cplusplus } diff --git a/aplfw/system/file/console_getch.c b/aplfw/system/file/console_getch.c index 002dd19..b1c5316 100755 --- a/aplfw/system/file/console_getch.c +++ b/aplfw/system/file/console_getch.c @@ -2,18 +2,16 @@ -FILE_ERR Console_GetCh(HANDLE hConsole) +int Console_GetCh(HANDLE hFile) { - C_CONSOLEOBJ *self; + int c; - self = (C_CONSOLEOBJ *)hConsole; - - if ( ConsoleObj_GetMethods(self)->pfncGetCh != NULL ) + if ( File_IoControl(hFile, FILE_IOCTL_CON_GETCH, &c, sizeof(c), NULL, 0) != FILE_ERR_OK ) { - return ConsoleObj_GetMethods(self)->pfncGetCh(hConsole); + return FILE_ERR_NG; } - return FILE_ERR_NG; + return c; } diff --git a/aplfw/system/file/drvfile.h b/aplfw/system/file/drvfile.h index c9ad780..db57c3c 100755 --- a/aplfw/system/file/drvfile.h +++ b/aplfw/system/file/drvfile.h @@ -31,7 +31,7 @@ typedef struct c_drvfile extern "C" { #endif -void DrvFile_Create(C_DRVFILE *self, C_DRVOBJ *pDrvObj, int iMode, const T_FILEOBJ_METHODS *pMethods); /**< コンストラクタ */ +void DrvFile_Create(C_DRVFILE *self, C_DRVOBJ *pDrvObj, int iMode); /**< コンストラクタ */ #ifdef __cplusplus } diff --git a/aplfw/system/file/drvfile_create.c b/aplfw/system/file/drvfile_create.c index 9788bb9..4b36aca 100755 --- a/aplfw/system/file/drvfile_create.c +++ b/aplfw/system/file/drvfile_create.c @@ -23,14 +23,10 @@ const T_FILEOBJ_METHODS DrvFile_FileObjMethods = /** コンストラクタ */ -void DrvFile_Create(C_DRVFILE *self, C_DRVOBJ *pDrvObj, int iMode, const T_FILEOBJ_METHODS *pMethods) +void DrvFile_Create(C_DRVFILE *self, C_DRVOBJ *pDrvObj, int iMode) { /* 親クラスの初期化 */ - if ( pMethods == NULL ) - { - pMethods = &DrvFile_FileObjMethods; - } - FileObj_Create(&self->FileObj, pMethods); + FileObj_Create(&self->FileObj, &DrvFile_FileObjMethods); /* メンバ初期化 */ self->pDrvObj = pDrvObj; diff --git a/aplfw/system/file/drvobj.h b/aplfw/system/file/drvobj.h index 40efd8a..2ca7f9e 100755 --- a/aplfw/system/file/drvobj.h +++ b/aplfw/system/file/drvobj.h @@ -13,21 +13,20 @@ #define __HOS__drvobj_h__ -#include "system/file/file.h" - +#include "system/file/fileobj.h" struct c_drvobj; /* デバイスドライバオブジェクト基本クラス メソッドテーブル */ typedef struct t_drvobj_methods { - T_HANDLEOBJ_METHODS HandlObjMethods; - FILE_ERR (*pfncClose)(struct c_drvobj *self, HANDLE hFile); - FILE_ERR (*pfncIoControl)(struct c_drvobj *self, HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize); - FILE_POS (*pfncSeek)(struct c_drvobj *self, HANDLE hFile, FILE_POS Offset, int iOrign); - FILE_SIZE (*pfncRead)(struct c_drvobj *self, HANDLE hFile, void *pBuf, FILE_SIZE Size); - FILE_SIZE (*pfncWrite)(struct c_drvobj *self, HANDLE hFile, const void *pData, FILE_SIZE Size); - FILE_ERR (*pfncFlush)(struct c_drvobj *self, HANDLE hFile); + HANDLE (*pfncOpen)(struct c_drvobj *self, const char *pszPath, int iMode); + FILE_ERR (*pfncClose)(struct c_drvobj *self, C_FILEOBJ *pFileObj); + FILE_ERR (*pfncIoControl)(struct c_drvobj *self, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize); + FILE_POS (*pfncSeek)(struct c_drvobj *self, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign); + FILE_SIZE (*pfncRead)(struct c_drvobj *self, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size); + FILE_SIZE (*pfncWrite)(struct c_drvobj *self, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size); + FILE_ERR (*pfncFlush)(struct c_drvobj *self, C_FILEOBJ *pFileObj); } T_DRVOBJ_METHODS; @@ -42,18 +41,17 @@ typedef struct c_drvobj extern "C" { #endif -void DrvObj_Create(C_DRVOBJ *self, const T_DRVOBJ_METHODS *pMethods); /**< コンストラクタ */ -void DrvObj_Delete(C_DRVOBJ *self); /**< デストラクタ */ - -HANDLE DrvObj_Open(C_DRVOBJ *self, int iMode); -#define DrvObj_Close(self, hFile) (self)->pMethods->pfncClose((self), (hFile)) -#define DrvObj_IoControl(self, hFile, iFunc, pInBuf, InSize, pOutBuf, OutSize) \ - (self)->pMethods->pfncIoControl((self), (hFile), (iFunc), (pInBuf), (InSize), (pOutBuf), (OutSize)) -#define DrvObj_Seek(self, hFile, Offset, iOrign) (self)->pMethods->pfncSeek((self), (hFile), (Offset), (iOrign)) -#define DrvObj_Read(self, hFile, pBuf, Size) (self)->pMethods->pfncRead((self), (hFile), (pBuf), (Size)) -#define DrvObj_Write(self, hFile, pData, Size) (self)->pMethods->pfncWrite((self), (hFile), (pData), (Size)) -#define DrvObj_Flush(self, hFile) (self)->pMethods->pfncFlush((self), (hFile)) - +void DrvObj_Create(C_DRVOBJ *self, const T_DRVOBJ_METHODS *pMethods); /**< コンストラクタ */ +void DrvObj_Delete(C_DRVOBJ *self); /**< デストラクタ */ + +#define DrvObj_Open(self, pszPath, iMode) ((self)->pMethods->pfncOpen((self), (pszPath), (iMode))) +#define DrvObj_Close(self, pFileObj) ((self)->pMethods->pfncClose((self), (pFileObj))) +#define DrvObj_IoControl(self, pFileObj, iFunc, pInBuf, InSize, pOutBuf, OutSize) \ + ((self)->pMethods->pfncIoControl((self), (pFileObj), (iFunc), (pInBuf), (InSize), (pOutBuf), (OutSize))) +#define DrvObj_Seek(self, pFileObj, Offset, iOrign) ((self)->pMethods->pfncSeek((self), (pFileObj), (Offset), (iOrign))) +#define DrvObj_Read(self, pFileObj, pBuf, Size) ((self)->pMethods->pfncRead((self), (pFileObj), (pBuf), (Size))) +#define DrvObj_Write(self, pFileObj, pData, Size) ((self)->pMethods->pfncWrite((self), (pFileObj), (pData), (Size))) +#define DrvObj_Flush(self, pFileObj) ((self)->pMethods->pfncFlush((self), (pFileObj))) #ifdef __cplusplus } diff --git a/aplfw/system/file/drvobj_create.c b/aplfw/system/file/drvobj_create.c new file mode 100755 index 0000000..f1ba952 --- /dev/null +++ b/aplfw/system/file/drvobj_create.c @@ -0,0 +1,11 @@ + +#include "drvobj_local.h" + + +/**< コンストラクタ */ +void DrvObj_Create(C_DRVOBJ *self, const T_DRVOBJ_METHODS *pMethods) +{ + self->pMethods = pMethods; +} + + diff --git a/aplfw/system/file/drvobj_local.h b/aplfw/system/file/drvobj_local.h index a3a651a..4e30b46 100755 --- a/aplfw/system/file/drvobj_local.h +++ b/aplfw/system/file/drvobj_local.h @@ -20,12 +20,6 @@ extern "C" { #endif -FILE_ERR DrvObj_Close(HANDLE hDrv, HANDLE hFile); -FILE_ERR DrvObj_IoControl(HANDLE hDrv, HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize); -FILE_SIZE DrvObj_Read(HANDLE hDrv, HANDLE hFile, void *pBuf, FILE_POS Pos, FILE_SIZE Size); -FILE_SIZE DrvObj_Write(HANDLE hDrv, HANDLE hFile, const void *pData, FILE_POS Pos, FILE_SIZE Size); -FILE_ERR DrvObj_Flush(HANDLE hDrv, HANDLE hFile); - #ifdef __cplusplus } #endif diff --git a/aplfw/system/file/file.h b/aplfw/system/file/file.h index 4a09e0e..451dd47 100755 --- a/aplfw/system/file/file.h +++ b/aplfw/system/file/file.h @@ -43,8 +43,9 @@ #define FILE_SEEK_CUR 1 #define FILE_SEEK_END 2 + /* IoControl機能コード(共通) */ -#define FILE_IOCTL_GETDEVTYPE 0x0000 /* デバイスタイプを得る */ +#define FILE_IOCTL_GETDEVINF 0x0000 /* デバイス情報を得る */ #define FILE_IOCTL_SYNC 0x0001 /* 同期する */ #define FILE_IOCTL_GETSIZE 0x0010 /* ファイルサイズを取得 */ #define FILE_IOCTL_GETREADSIZE 0x0010 /* 読み込み可能サイズ(受信バッファ内のデータ量)を取得 */ @@ -53,7 +54,10 @@ #define FILE_IOCTL_RELREADBUF 0x0021 /* リードバッファ返却(省コピー版Read) */ #define FILE_IOCTL_GETWRITEBUF 0x0030 /* ライトバッファ取得(省コピー版Write) */ #define FILE_IOCTL_SENDWRITEBUF 0x0031 /* ライトバッファ送信(省コピー版Write) */ -#define FILE_IOCTL_RELWRITEBUF 0x0032 /* ライトバッファ破棄(省コピー版Write) */ +#define FILE_IOCTL_CANWRITEBUF 0x0032 /* ライトバッファ破棄(省コピー版Write) */ + +/* IoControl機能コード(コンソール) */ +#define FILE_IOCTL_CON_GETCH 0x0101 /* 文字読込み */ /* IoControl機能コード(シリアル通信) */ #define FILE_IOCTL_COM_GETSPEED 0x2101 /* BPS取得 */ @@ -70,7 +74,8 @@ #define FILE_IOCTL_IP_SETMASK 0x2304 /* IPサブネットマスク設定 */ /* IoControl機能コード(ユーザー定義) */ -#define FILE_IOCTL_USER 0x6000 /* 0x6000〜0x7fff あたりを使ってね */ +#define FILE_IOCTL_USER 0x6000 /* 0x6000〜0x7fff */ + /* 型定義 */ @@ -90,12 +95,11 @@ typedef struct t_file_volinf /* デバイス情報 */ +struct c_drvobj; typedef struct t_file_devinf { - char szName[FILE_MAX_NAME]; /* ファイル名 */ - FILE_ERR (*pfncCreate)(HANDLE hFile, void *pParam, int iMode); /* コンストラクタアドレス */ - int ObjSize; /* オブジェクトのサイズ */ - void *pParam; /* オブジェクトの生成パラメータ */ + char szName[FILE_MAX_NAME]; /* デバイス名 */ + struct c_drvobj *pDrvObj; /* デバイスドライバへの参照 */ } T_FILE_DEVINF; @@ -120,19 +124,19 @@ extern "C" { #endif /* システム */ -void File_Initialize(void); /* ファイルシステムの初期化 */ +void File_Initialize(void); /* ファイルシステムの初期化 */ -FILE_ERR File_AddVolume(const T_FILE_VOLINF *pVolInf); /* ボリュームのマウント */ -FILE_ERR File_RemoveVolume(const T_FILE_VOLINF *pVolInf); /* ボリュームのマウント */ +FILE_ERR File_AddVolume(const T_FILE_VOLINF *pVolInf); /* ボリュームのマウント */ +FILE_ERR File_RemoveVolume(const T_FILE_VOLINF *pVolInf); /* ボリュームのマウント */ -FILE_ERR File_AddDevice(const T_FILE_DEVINF *pDevInf); /* デバイスファイルの追加 */ -FILE_ERR File_RemoveDevice(const char *pszName); /* デバイスファイルの削除 */ +FILE_ERR File_AddDevice(const T_FILE_DEVINF *pDevInf); /* デバイスファイルの追加 */ +FILE_ERR File_RemoveDevice(const char *pszName); /* デバイスファイルの削除 */ /* 基本API */ HANDLE File_Open(const char *pszPatah, int iMode); #define File_Close(hFile) Handle_Close(hFile) -FILE_ERR File_IoControl(HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize); +FILE_ERR File_IoControl(HANDLE hFile, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize); FILE_POS File_Seek(HANDLE hFile, FILE_POS Offset, int iOrign); FILE_SIZE File_Read(HANDLE hFile, void *pBuf, FILE_SIZE Size); FILE_SIZE File_Write(HANDLE hFile, const void *pData, FILE_SIZE Size); @@ -156,7 +160,6 @@ int File_PrintFormatVL(HANDLE hFile, const char *pszFormat, va_list argptr /* 拡張操作 */ -FILE_ERR File_Sync(HANDLE hFile); FILE_POS File_GetFileSize(HANDLE hFile); FILE_SIZE File_GetReadSize(HANDLE hFile); FILE_SIZE File_GetWriteSize(HANDLE hFile); diff --git a/aplfw/system/file/file_iocontrol.c b/aplfw/system/file/file_iocontrol.c index b2ba135..72ad5a8 100755 --- a/aplfw/system/file/file_iocontrol.c +++ b/aplfw/system/file/file_iocontrol.c @@ -9,23 +9,17 @@ */ -#include #include "file_local.h" #include "fileobj.h" -FILE_ERR File_IoControl(HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize) +FILE_ERR File_IoControl(HANDLE hFile, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize) { C_FILEOBJ *self; self = FILE_HANDLE2OBJ(hFile); - if ( FileObj_GetMethods(self)->pfncIoControl != NULL ) - { - return FileObj_GetMethods(self)->pfncIoControl(hFile, iFunc, pInBuf, InSize, pOutBuf, OutSize); - } - - return FILE_ERR_NG; + return DrvObj_IoControl(self->pDrvObj, self, iFunc, pInBuf, InSize, pOutBuf, OutSize); } diff --git a/aplfw/system/file/file_local.h b/aplfw/system/file/file_local.h index c90d977..ea5b6eb 100755 --- a/aplfw/system/file/file_local.h +++ b/aplfw/system/file/file_local.h @@ -28,7 +28,6 @@ typedef struct c_file extern C_FILE g_File; - #endif /* __HOS__file_local_h__ */ diff --git a/aplfw/system/file/file_open.c b/aplfw/system/file/file_open.c index 53eb90f..aada22c 100755 --- a/aplfw/system/file/file_open.c +++ b/aplfw/system/file/file_open.c @@ -18,7 +18,6 @@ HANDLE File_Open(const char *pszPatah, int iMode) { C_FILE *self; - HANDLE hFile; int iNameLen; int i; diff --git a/aplfw/system/file/file_read.c b/aplfw/system/file/file_read.c index 4201df5..1c92f70 100755 --- a/aplfw/system/file/file_read.c +++ b/aplfw/system/file/file_read.c @@ -20,13 +20,9 @@ FILE_SIZE File_Read(HANDLE hFile, void *pBuf, FILE_SIZE Size) C_FILEOBJ *self; self = FILE_HANDLE2OBJ(hFile); - - if ( FileObj_GetMethods(self)->pfncRead != NULL ) - { - return FileObj_GetMethods(self)->pfncRead(hFile, pBuf, Size); - } - - return FILE_ERR_NG; + self->pDrvObj; + + return DrvObj_Read(self->pDrvObj, self, pBuf, Size); } diff --git a/aplfw/system/file/file_seek.c b/aplfw/system/file/file_seek.c index 8887b29..e22f0af 100755 --- a/aplfw/system/file/file_seek.c +++ b/aplfw/system/file/file_seek.c @@ -19,13 +19,8 @@ FILE_POS File_Seek(HANDLE hFile, FILE_POS Offset, int iOrign) C_FILEOBJ *self; self = FILE_HANDLE2OBJ(hFile); - - if ( FileObj_GetMethods(self)->pfncSeek != NULL ) - { - return FileObj_GetMethods(self)->pfncSeek(hFile, Offset, iOrign); - } - - return FILE_ERR_NG; + + return DrvObj_Seek(self->pDrvObj, self, Offset, iOrign); } diff --git a/aplfw/system/file/file_write.c b/aplfw/system/file/file_write.c index fdacc36..e940672 100755 --- a/aplfw/system/file/file_write.c +++ b/aplfw/system/file/file_write.c @@ -19,13 +19,8 @@ FILE_SIZE File_Write(HANDLE hFile, const void *pData, FILE_SIZE Size) C_FILEOBJ *self; self = FILE_HANDLE2OBJ(hFile); - - if ( FileObj_GetMethods(self)->pfncWrite != NULL ) - { - return FileObj_GetMethods(self)->pfncWrite(hFile, pData, Size); - } - - return FILE_ERR_NG; + + return DrvObj_Write(self->pDrvObj, self, pData, Size); } diff --git a/aplfw/system/file/fileobj.h b/aplfw/system/file/fileobj.h index 1838fa5..a5316e9 100755 --- a/aplfw/system/file/fileobj.h +++ b/aplfw/system/file/fileobj.h @@ -4,6 +4,8 @@ * @file fileobj.h * @brief %jp{ファイルオブジェクト} * + * %jp{ファイルディスクリプタとして機能するクラス} + * * Copyright (C) 2006 by Project HOS * http://sourceforge.jp/projects/hos/ */ @@ -15,29 +17,27 @@ #include "system/handle/handleobj.h" #include "system/file/file.h" -#include "system/file/drvobj.h" +struct c_drvobj; /* ファイルオブジェクトクラス基本メソッドテーブル */ typedef struct t_fileobj_methods { - T_HANDLEOBJ_METHODS HandlObjMethods; - FILE_ERR (*pfncIoControl)(HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize); - FILE_POS (*pfncSeek)(HANDLE hFile, FILE_POS Offset, int iOrign); - FILE_SIZE (*pfncRead)(HANDLE hFile, void *pBuf, FILE_SIZE Size); - FILE_SIZE (*pfncWrite)(HANDLE hFile, const void *pData, FILE_SIZE Size); - FILE_ERR (*pfncFlush)(HANDLE hFile); + T_HANDLEOBJ_METHODS HandlObjMethods; /* ハンドルオブジェクトを継承 */ } T_FILEOBJ_METHODS; /* ファイルブジェクト基本クラス定義 */ typedef struct c_fileobj { - C_HANDLEOBJ HandleObj; /* ハンドルオブジェクトを継承 */ - C_DRVOBJ *pDrvObj; /* デバイスドライバ本体への参照 */ + C_HANDLEOBJ HandleObj; /* ハンドルオブジェクトを継承 */ + struct c_drvobj *pDrvObj; /* デバイスドライバへの参照 */ } C_FILEOBJ; +#include "drvobj.h" + + /* ハンドル変換 */ #define FILE_HANDLE2OBJ(hFile) ((C_FILEOBJ *)(hFile)) @@ -46,15 +46,16 @@ typedef struct c_fileobj extern "C" { #endif -void FileObj_Create(C_FILEOBJ *self, const T_FILEOBJ_METHODS* pMethods); -void FileObj_Delete(C_FILEOBJ *self); -#define FileObj_GetMethods(self) ((T_FILEOBJ_METHODS *)HandleObj_GetMethods(&(self)->HandleObj)) +void FileObj_Create(C_FILEOBJ *self, struct c_drvobj *pDrvObj, const T_FILEOBJ_METHODS *pMethods); +void FileObj_Delete(HANDLE self); #ifdef __cplusplus } #endif + + #endif /* __HOS__file_h__ */ diff --git a/aplfw/system/file/fileobj_create.c b/aplfw/system/file/fileobj_create.c index e742c74..b6130db 100755 --- a/aplfw/system/file/fileobj_create.c +++ b/aplfw/system/file/fileobj_create.c @@ -12,9 +12,23 @@ #include "fileobj.h" -void FileObj_Create(C_FILEOBJ *self, const T_FILEOBJ_METHODS* pMethods) +static const T_FILEOBJ_METHODS FileObj_FileObjMethods = + { + {FileObj_Delete}, /* デストラクタ */ + }; + + +void FileObj_Create(C_FILEOBJ *self, C_DRVOBJ *pDrvObj, const T_FILEOBJ_METHODS *pMethods) { + if ( pMethods == NULL ) /* オーバーライド無しなら */ + { + pMethods = &FileObj_FileObjMethods; + } + + /* 親クラスコンストラクタ */ HandleObj_Create(&self->HandleObj, &pMethods->HandlObjMethods); + + self->pDrvObj = pDrvObj; } diff --git a/aplfw/system/file/fileobj_local.h b/aplfw/system/file/fileobj_local.h new file mode 100755 index 0000000..43437e7 --- /dev/null +++ b/aplfw/system/file/fileobj_local.h @@ -0,0 +1,39 @@ +/** + * Hyper Operating System Application Framework + * + * @file fileobj_local.h + * @brief %jp{ファイルオブジェクト ローカルヘッダファイル} + * + * %jp{ファイルディスクリプタとして機能するクラス} + * + * Copyright (C) 2006 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#ifndef __HOS__fileobj_local_h__ +#define __HOS__fileobj_local_h__ + + +#include "fileobj.h" + + +/* ハンドル変換 */ +#define FILE_HANDLE2OBJ(hFile) ((C_FILEOBJ *)(hFile)) + + +#ifdef __cplusplus +extern "C" { +#endif + +void FileObj_Delete(C_FILEOBJ *self); /**< デストラクタ */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __HOS__fileobj_local_h__ */ + + +/* end of file */ diff --git a/aplfw/system/file/volume_openfile.c b/aplfw/system/file/volume_openfile.c index 6bcafac..2c2b3bf 100755 --- a/aplfw/system/file/volume_openfile.c +++ b/aplfw/system/file/volume_openfile.c @@ -10,11 +10,11 @@ HANDLE Volume_OpenFile(HANDLE hVolume, const char *pszPath, int iMode) self = (C_VOLUMEOBJ *)hVolume; - if ( VolumeObj_GetMethods(self)->pfncOpenFile != NULL ) + if ( self->pMethods->pfncOpenFile == NULL ) { - return VolumeObj_GetMethods(self)->pfncOpenFile(hVolume, pszPath, iMode); + return HANDLE_NULL; } - return HANDLE_NULL; + return self->pMethods->pfncOpenFile(hVolume, pszPath, iMode); } diff --git a/aplfw/system/file/volumeobj.h b/aplfw/system/file/volumeobj.h index 85e595e..2ee85a4 100755 --- a/aplfw/system/file/volumeobj.h +++ b/aplfw/system/file/volumeobj.h @@ -20,8 +20,6 @@ /* ボリューム操作オブジェクトクラス基本メソッドテーブル */ typedef struct t_volumeobj_methods { - T_HANDLEOBJ_METHODS HandlObjMethods; - HANDLE (*pfncOpenFile)(HANDLE hVolume, const char *pszPath, int iMode); /* ファイルを開く */ FILE_ERR (*pfncMakeDir)(HANDLE hVolume, const char *pszPath); /* サブディレクトリを作成 */ FILE_ERR (*pfncRemove)(HANDLE hVolume, const char *pszPath); /* ファイルを削除 */ @@ -29,21 +27,21 @@ typedef struct t_volumeobj_methods typedef struct c_volumeobj { - C_HANDLEOBJ HandleObj; /* ハンドルオブジェクトを継承 */ + const T_VOLUMEOBJ_METHODS *pMethods; } C_VOLUMEOBJ; + /* ハンドル変換 */ #define VOLUME_HANDLE2OBJ(hVolume) ((C_VOLUMEOBJ *)hVolume) - - - #ifdef __cplusplus extern "C" { #endif void VolumeObj_Create(C_VOLUMEOBJ *self, const T_VOLUMEOBJ_METHODS *pVolumeObjMethods); +void VolumeObj_Delete(C_VOLUMEOBJ *self); + #define VolumeObj_GetMethods(self) ((T_VOLUMEOBJ_METHODS *)HandleObj_GetMethods(&(self)->HandleObj)) diff --git a/aplfw/system/file/volumeobj_create.c b/aplfw/system/file/volumeobj_create.c index c7afbfe..3bb6f06 100755 --- a/aplfw/system/file/volumeobj_create.c +++ b/aplfw/system/file/volumeobj_create.c @@ -4,7 +4,7 @@ void VolumeObj_Create(C_VOLUMEOBJ *self, const T_VOLUMEOBJ_METHODS *pVolumeObjMethods) { - HandleObj_Create(&self->HandleObj, &pVolumeObjMethods->HandlObjMethods); + self->pMethods = pVolumeObjMethods; } diff --git a/aplfw/volume/dev/devvol.h b/aplfw/volume/dev/devvol.h index fda5d46..80219a2 100755 --- a/aplfw/volume/dev/devvol.h +++ b/aplfw/volume/dev/devvol.h @@ -1,3 +1,13 @@ +/** + * Hyper Operating System Application Framework + * + * @file devvol.h + * @brief %jp{デバイスドライバをファイルとして管理するボリューム} + * + * Copyright (C) 2006-2007 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + #ifndef __HOS__devvol_h__ #define __HOS__devvol_h__ diff --git a/aplfw/volume/dev/devvol_adddevice.c b/aplfw/volume/dev/devvol_adddevice.c index 2de350b..7e0bd1a 100755 --- a/aplfw/volume/dev/devvol_adddevice.c +++ b/aplfw/volume/dev/devvol_adddevice.c @@ -9,7 +9,7 @@ FILE_ERR DevVol_AddDevice(C_DEVVOL *self, const T_FILE_DEVINF *pDevInf) /* テーブルの空きを検索 */ for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ ) { - if ( self->DevTable[i].ObjSize == 0 ) + if ( self->DevTable[i].pDrvObj == NULL ) { self->DevTable[i] = *pDevInf; return FILE_ERR_OK; diff --git a/aplfw/volume/dev/devvol_create.c b/aplfw/volume/dev/devvol_create.c index 6804c44..da81334 100755 --- a/aplfw/volume/dev/devvol_create.c +++ b/aplfw/volume/dev/devvol_create.c @@ -5,7 +5,6 @@ const T_VOLUMEOBJ_METHODS DevVol_VolumeObjMethods = { - { DevVol_Delete }, /* デストラクタ */ DevVol_OpenFile, NULL, NULL, @@ -22,7 +21,7 @@ void DevVol_Create(C_DEVVOL *self) /* 初期化 */ for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ ) { - self->DevTable[i].ObjSize = 0; + self->DevTable[i].pDrvObj = NULL; } } diff --git a/aplfw/volume/dev/devvol_openfile.c b/aplfw/volume/dev/devvol_openfile.c index fc4d9e6..0931f6a 100755 --- a/aplfw/volume/dev/devvol_openfile.c +++ b/aplfw/volume/dev/devvol_openfile.c @@ -2,13 +2,13 @@ #include #include "devvol_local.h" #include "system/sysapi/sysapi.h" +#include "system/file/drvobj.h" /* ファイルを開く */ HANDLE DevVol_OpenFile(HANDLE hVolume, const char *pszPath, int iMode) { C_DEVVOL *self; - HANDLE hFile; int i; self = (C_DEVVOL *)hVolume; @@ -30,21 +30,7 @@ HANDLE DevVol_OpenFile(HANDLE hVolume, const char *pszPath, int iMode) return HANDLE_NULL; } - /* メモリ確保 */ - hFile = (HANDLE)SysMem_Alloc(self->DevTable[i].ObjSize); - if ( hFile == 0 ) - { - return HANDLE_NULL; - } - - /* ファイルハンドル生成 */ - if ( self->DevTable[i].pfncCreate(hFile, self->DevTable[i].pParam, iMode) != FILE_ERR_OK ) - { - SysMem_Free((void *)hFile); - return HANDLE_NULL; - } - - return hFile; + return DrvObj_Open(self->DevTable[i].pDrvObj, pszPath, iMode); } diff --git a/aplfw/volume/fat/fatfile_create.c b/aplfw/volume/fat/fatfile_create.c index f7d43e7..46dbd85 100755 --- a/aplfw/volume/fat/fatfile_create.c +++ b/aplfw/volume/fat/fatfile_create.c @@ -5,7 +5,7 @@ const T_FILEOBJ_METHODS FatFile_FileObjMethods = { - { FatFile_Delete }, /* デストラクタ */ +/* { FatFile_Delete }, */ /* デストラクタ */ FatFile_IoControl, /* IoControl */ FatFile_Seek, /* Seek */ FatFile_Read, /* Read */ -- 2.11.0