在虛擬文件系統(tǒng)的消息隊(duì)列里,主要就是LLVFSThread::Request類的請(qǐng)求,Request類是嵌套類,定義在LLVFSThread類里面。它主要實(shí)現(xiàn)對(duì)類LLVFS的封裝訪問,讓操作更加方便一些,當(dāng)然它是繼續(xù)QueuedRequest類的,這樣才可以添加到消息隊(duì)列里去,否則不能添加到這個(gè)消息隊(duì)列容器,也不能實(shí)現(xiàn)請(qǐng)求處理的多態(tài)了。
?
下面是類Request的構(gòu)造函數(shù)。
#001?LLVFSThread::Request::Request(handle_t handle, U32 priority, U32 flags,
#002?
?????????????????????????????????????????????? ??operation_t op, LLVFS* vfs,
#003?
?????????????????????????????????????????????? ??const LLUUID &file_id, const LLAssetType::EType file_type,
#004?
?????????????????????????????????????????????? ??U8* buffer, S32 offset, S32 numbytes) :
#005?
???? QueuedRequest(handle, priority, flags),
#006?
???? mOperation(op),
#007?
???? mVFS(vfs),
#008?
???? mFileID(file_id),
#009?
???? mFileType(file_type),
#010?
???? mBuffer(buffer),
#011?
???? mOffset(offset),
#012?
???? mBytes(numbytes),
#013?
???? mBytesRead(0)
#014?{
#015?
???? llassert(mBuffer);
#016?
?
判斷是否非法出錯(cuò)。
#017?
???? if (numbytes <= 0 && mOperation != FILE_RENAME)
#018?
???? {
#019?
??????????? llwarns << "LLVFSThread: Request with numbytes = " << numbytes
#020?
?????????????????? << " operation = " << op
#021?
?????????????????? << " offset " << offset
#022?
?????????????????? << " file_type " << file_type << llendl;
#023?
???? }
?
寫數(shù)據(jù)到虛擬文件系統(tǒng)。
#024?
???? if (mOperation == FILE_WRITE)
#025?
???? {
#026?
??????????? S32 blocksize =?mVFS->getMaxSize(mFileID, mFileType);
#027?
??????????? if (blocksize < 0)
#028?
??????????? {
#029?
?????????????????? llwarns << "VFS write to temporary block (shouldn't happen)" << llendl;
#030?
??????????? }
#031?
??????????? mVFS->incLock(mFileID, mFileType, VFSLOCK_APPEND);
#032?
???? }
?
重新命名文件名稱。
#033?
???? else if (mOperation == FILE_RENAME)
#034?
???? {
#035?
??????????? mVFS->incLock(mFileID, mFileType, VFSLOCK_APPEND);
#036?
???? }
?
從虛擬文件系統(tǒng)里讀取數(shù)據(jù)。
#037?
???? else // if (mOperation == FILE_READ)
#038?
???? {
#039?
??????????? mVFS->incLock(mFileID, mFileType, VFSLOCK_READ);
#040?
???? }
#041?}
#042?
?
下面的函數(shù)是正式開始操作虛擬文件系統(tǒng),
#001?bool LLVFSThread::Request::processRequest()
#002?{
#003?
???? bool complete = false;
?
如果是讀取操作,就調(diào)用虛擬文件系統(tǒng)的getData函數(shù)來讀取數(shù)據(jù)。
#004?
???? if (mOperation ==?FILE_READ)
#005?
???? {
#006?
??????????? llassert(mOffset >= 0);
#007?
??????????? mBytesRead = mVFS->getData(mFileID, mFileType, mBuffer, mOffset, mBytes);
#008?
??????????? complete = true;
#009?
??????????? //llinfos << llformat("LLVFSThread::READ '%s': %d bytes arg:%d",getFilename(),mBytesRead) << llendl;
#010?
???? }
?
如果是寫數(shù)據(jù),就調(diào)用虛擬文件系統(tǒng)的storeData函數(shù)來寫數(shù)據(jù)。
#011?
???? else if (mOperation ==?FILE_WRITE)
#012?
???? {
#013?
??????????? mBytesRead = mVFS->storeData(mFileID, mFileType, mBuffer, mOffset, mBytes);
#014?
??????????? complete = true;
#015?
??????????? //llinfos << llformat("LLVFSThread::WRITE '%s': %d bytes arg:%d",getFilename(),mBytesRead) << llendl;
#016?
???? }
?
如果是重新命名文件名稱,就調(diào)用虛擬文件系統(tǒng)的函數(shù)renameFile。
#017?
???? else if (mOperation ==?FILE_RENAME)
#018?
???? {
#019?
??????????? LLUUID* new_idp = (LLUUID*)mBuffer;
#020?
??????????? LLAssetType::EType new_type = (LLAssetType::EType)mBytes;
#021?
??????????? mVFS->renameFile(mFileID, mFileType, *new_idp, new_type);
#022?
??????????? mFileID = *new_idp;
#023?
??????????? complete = true;
#024?
??????????? //llinfos << llformat("LLVFSThread::RENAME '%s': %d bytes arg:%d",getFilename(),mBytesRead) << llendl;
#025?
???? }
#026?
???? else
#027?
???? {
#028?
??????????? llerrs << llformat("LLVFSThread::unknown operation: %d", mOperation) << llendl;
#029?
???? }
#030?
???? return complete;
#031?}
?
通過上面函數(shù)調(diào)用,就把其它對(duì)虛擬文件系統(tǒng)的操作轉(zhuǎn)換為對(duì)成員mVFS的操作,這樣就非常方便系統(tǒng)的更新,容易增加新的功能。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
