2 * Hyper Operating System Application Framework
5 * @brief %jp{FATボリューム用デバイスドライバ}
7 * Copyright (C) 2006-2007 by Project HOS
8 * http://sourceforge.jp/projects/hos/
13 #include "fatvol_local.h"
17 FILE_SIZE FatVol_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
23 const unsigned char *pubData;
24 FATVOL_UINT uiNextCluster;
25 FATVOL_UINT uiCluster;
31 self = (C_FATVOL *)pDrvObj;
32 pFile = (C_FATFILE *)pFileObj;
35 pubData = (const unsigned char *)pData;
44 SysMtx_Lock(self->hMtx);
47 if ( !(pFile->iMode & FILE_OPEN_WRITE) || (pFile->iMode & FILE_OPEN_DIR) )
49 SysMtx_Unlock(self->hMtx);
56 /* ファイルポインタ位置のクラスタを検索 */
57 uiCluster = pFile->uiStartCluster;
58 for ( i = 0; pFile->FilePos >= (i + 1) * self->BytesPerCluster; i++ )
61 uiNextCluster = FatVol_GetNextCluster(self, uiCluster);
62 if ( uiNextCluster == FATVOL_CLUSTER_ENDMARKER )
65 uiNextCluster = FatVol_GetNewCluster(self);
66 if ( uiNextCluster == FATVOL_CLUSTER_ENDMARKER )
68 return 0; /* ディスクフル */
70 FatVol_SetNextCluster(self, uiCluster, uiNextCluster);
72 uiCluster = uiNextCluster;
81 T_FATVOL_CLUSTERBUF *pClusterBuf;
84 WriteStart = (pFile->FilePos & (self->BytesPerCluster - 1));
85 WriteSize = self->BytesPerCluster - WriteStart;
86 if ( WriteSize > Size )
92 if ( WriteStart == 0 && pFile->FilePos == pFile->FileSize )
94 pClusterBuf = FatVol_GetClusterBuf(self, uiCluster, 1); /* 完全新規の場合 */
98 pClusterBuf = FatVol_GetClusterBuf(self, uiCluster, 0); /* 部分更新の場合 */
100 if ( pClusterBuf == NULL )
106 memcpy(&pClusterBuf->pubBuf[WriteStart], pubData, WriteSize);
109 FatVol_RelClusterBuf(self, pClusterBuf, 1);
113 pFile->FilePos += WriteSize;
114 pubData += WriteSize;
118 if ( pFile->FileSize < pFile->FilePos )
120 pFile->FileSize = pFile->FilePos;
131 uiNextCluster = FatVol_GetNextCluster(self, uiCluster);
132 if ( uiNextCluster == FATVOL_CLUSTER_ENDMARKER )
135 uiNextCluster = FatVol_GetNewCluster(self);
136 if ( uiNextCluster == FATVOL_CLUSTER_ENDMARKER )
140 FatVol_SetNextCluster(self, uiCluster, uiNextCluster);
142 uiCluster = uiNextCluster;
145 SysMtx_Unlock(self->hMtx);
146 SysMtx_Lock(self->hMtx);
149 /* ディレクトリテーブルのサイズ更新 */
150 if ( iResizeFlag && !(pFile->iMode & FILE_OPEN_DIR) )
152 FatVol_SyncFileSize(self, pFile);
156 SysMtx_Unlock(self->hMtx);
158 return ReqSize - Size;