NS_IMETHODIMP morkStdioFile::Seek(nsIMdbEnv* mdbev, mork_pos inPos, mork_pos *aOutPos) { mork_pos outPos = 0; nsresult rv = NS_OK; morkEnv *ev = morkEnv::FromMdbEnv(mdbev); if ( this->IsOpenOrClosingNode() && this->FileActive() ) { FILE* file = (FILE*) mStdioFile_File; if ( file ) { long where = MORK_FILESEEK(file, inPos, SEEK_SET); if ( where >= 0 ) outPos = inPos; else this->new_stdio_file_fault(ev); } else if ( mFile_Thief ) mFile_Thief->Seek(mdbev, inPos, aOutPos); else this->NewMissingIoError(ev); } else this->NewFileDownError(ev); *aOutPos = outPos; return rv; }
mork_pos morkStdioFile::Length(morkEnv * ev) const { mork_pos outPos = 0; if ( this->IsOpenAndActiveFile() ) { FILE* file = (FILE*) mStdioFile_File; if ( file ) { long start = MORK_FILETELL(file); if ( start >= 0 ) { long fore = MORK_FILESEEK(file, 0, SEEK_END); if ( fore >= 0 ) { long eof = MORK_FILETELL(file); if ( eof >= 0 ) { long back = MORK_FILESEEK(file, start, SEEK_SET); if ( back >= 0 ) outPos = eof; else this->new_stdio_file_fault(ev); } else this->new_stdio_file_fault(ev); } else this->new_stdio_file_fault(ev); } else this->new_stdio_file_fault(ev); } else if ( mFile_Thief ) mFile_Thief->Eof(ev->AsMdbEnv(), &outPos); else this->NewMissingIoError(ev); } else this->NewFileDownError(ev); return outPos; }