bool fatFile::Write(Bit8u * data, Bit16u *size) { /* TODO: Check for read-only bit */ direntry tmpentry; Bit16u sizedec, sizecount; sizedec = *size; sizecount = 0; while(sizedec != 0) { /* Increase filesize if necessary */ if(seekpos >= filelength) { if(filelength == 0) { firstCluster = myDrive->getFirstFreeClust(); myDrive->allocateCluster(firstCluster, 0); currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); loadedSector = true; } filelength = seekpos+1; } sectorBuffer[curSectOff] = data[sizecount]; curSectOff++; seekpos++; if(curSectOff >= myDrive->getSectorSize()) { if(loadedSector) myDrive->loadedDisk->Write_AbsoluteSector(currentSector, sectorBuffer); currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); if(currentSector == 0) { /* EOC reached before EOF - try to increase file allocation */ myDrive->appendCluster(firstCluster); /* Try getting sector again */ currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); if(currentSector == 0) { /* No can do. lets give up and go home. We must be out of room */ goto finalizeWrite; } } curSectOff = 0; myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); loadedSector = true; } --sizedec; sizecount++; } finalizeWrite: myDrive->directoryBrowse(dirCluster, &tmpentry, dirIndex); tmpentry.entrysize = filelength; tmpentry.loFirstClust = firstCluster; myDrive->directoryChange(dirCluster, &tmpentry, dirIndex); *size =sizecount; return true; }
bool fatFile::Read(Bit8u * data, Bit16u *size) { if ((this->flags & 0xf) == OPEN_WRITE) { // check if file opened in write-only mode DOS_SetError(DOSERR_ACCESS_DENIED); return false; } Bit16u sizedec, sizecount; if(seekpos >= filelength) { *size = 0; return true; } if (!loadedSector) { currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); if(currentSector == 0) { /* EOC reached before EOF */ *size = 0; loadedSector = false; return true; } curSectOff = 0; myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); loadedSector = true; } sizedec = *size; sizecount = 0; while(sizedec != 0) { if(seekpos >= filelength) { *size = sizecount; return true; } data[sizecount++] = sectorBuffer[curSectOff++]; seekpos++; if(curSectOff >= myDrive->getSectorSize()) { currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); if(currentSector == 0) { /* EOC reached before EOF */ //LOG_MSG("EOC reached before EOF, seekpos %d, filelen %d", seekpos, filelength); *size = sizecount; loadedSector = false; return true; } curSectOff = 0; myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); loadedSector = true; //LOG_MSG("Reading absolute sector at %d for seekpos %d", currentSector, seekpos); } --sizedec; } *size =sizecount; return true; }
bool fatFile::Seek(Bit32u *pos, Bit32u type) { Bit32s seekto=0; switch(type) { case DOS_SEEK_SET: seekto = (Bit32s)*pos; break; case DOS_SEEK_CUR: /* Is this relative seek signed? */ seekto = (Bit32s)*pos + (Bit32s)seekpos; break; case DOS_SEEK_END: seekto = (Bit32s)filelength + (Bit32s)*pos; break; } // LOG_MSG("Seek to %d with type %d (absolute value %d)", *pos, type, seekto); if((Bit32u)seekto > filelength) seekto = (Bit32s)filelength; if(seekto<0) seekto = 0; seekpos = (Bit32u)seekto; currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); if (currentSector == 0) { /* not within file size, thus no sector is available */ loadedSector = false; } else { curSectOff = seekpos % myDrive->getSectorSize(); myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); } *pos = seekpos; return true; }
bool fatFile::Read(Bit8u * data, Bit16u *size) { Bit16u sizedec, sizecount; if(seekpos >= filelength) { *size = 0; return true; } sizedec = *size; sizecount = 0; while(sizedec != 0) { if(seekpos >= filelength) { *size = sizecount; return true; } data[sizecount] = sectorBuffer[curSectOff]; curSectOff++; seekpos++; if(curSectOff >= myDrive->getSectorSize()) { currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); if(currentSector == 0) { /* EOC reached before EOF */ //LOG_MSG("EOC reached before EOF, seekpos %d, filelen %d", seekpos, filelength); *size = sizecount; return true; } curSectOff = 0; myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); //LOG_MSG("Reading absolute sector at %d for seekpos %d", currentSector, seekpos); } --sizedec; sizecount++; } *size =sizecount; return true; }
bool fatFile::Write(Bit8u * data, Bit16u *size) { /* TODO: Check for read-only bit */ if ((this->flags & 0xf) == OPEN_READ) { // check if file opened in read-only mode DOS_SetError(DOSERR_ACCESS_DENIED); return false; } direntry tmpentry; Bit16u sizedec, sizecount; sizedec = *size; sizecount = 0; while(sizedec != 0) { /* Increase filesize if necessary */ if(seekpos >= filelength) { if(filelength == 0) { firstCluster = myDrive->getFirstFreeClust(); myDrive->allocateCluster(firstCluster, 0); currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); loadedSector = true; } filelength = seekpos+1; if (!loadedSector) { currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); if(currentSector == 0) { /* EOC reached before EOF - try to increase file allocation */ myDrive->appendCluster(firstCluster); /* Try getting sector again */ currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); if(currentSector == 0) { /* No can do. lets give up and go home. We must be out of room */ goto finalizeWrite; } } curSectOff = 0; myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); loadedSector = true; } } sectorBuffer[curSectOff++] = data[sizecount++]; seekpos++; if(curSectOff >= myDrive->getSectorSize()) { if(loadedSector) myDrive->loadedDisk->Write_AbsoluteSector(currentSector, sectorBuffer); currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); if(currentSector == 0) { /* EOC reached before EOF - try to increase file allocation */ myDrive->appendCluster(firstCluster); /* Try getting sector again */ currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); if(currentSector == 0) { /* No can do. lets give up and go home. We must be out of room */ loadedSector = false; goto finalizeWrite; } } curSectOff = 0; myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); loadedSector = true; } --sizedec; } if(curSectOff>0 && loadedSector) myDrive->loadedDisk->Write_AbsoluteSector(currentSector, sectorBuffer); finalizeWrite: myDrive->directoryBrowse(dirCluster, &tmpentry, dirIndex); tmpentry.entrysize = filelength; tmpentry.loFirstClust = (Bit16u)firstCluster; myDrive->directoryChange(dirCluster, &tmpentry, dirIndex); *size =sizecount; return true; }