在虛擬文件系統的消息隊列里,主要就是LLVFSThread::Request類的請求,Request類是嵌套類,定義在LLVFSThread類里面。它主要實現對類LLVFS的封裝訪問,讓操作更加方便一些,當然它是繼續QueuedRequest類的,這樣才可以添加到消息隊列里去,否則不能添加到這個消息隊列容器,也不能實現請求處理的多態了。
?
下面是類Request的構造函數。
#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?
?
判斷是否非法出錯。
#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?
???? }
?
寫數據到虛擬文件系統。
#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?
???? }
?
從虛擬文件系統里讀取數據。
#037?
???? else // if (mOperation == FILE_READ)
#038?
???? {
#039?
??????????? mVFS->incLock(mFileID, mFileType, VFSLOCK_READ);
#040?
???? }
#041?}
#042?
?
下面的函數是正式開始操作虛擬文件系統,
#001?bool LLVFSThread::Request::processRequest()
#002?{
#003?
???? bool complete = false;
?
如果是讀取操作,就調用虛擬文件系統的getData函數來讀取數據。
#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?
???? }
?
如果是寫數據,就調用虛擬文件系統的storeData函數來寫數據。
#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?
???? }
?
如果是重新命名文件名稱,就調用虛擬文件系統的函數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?}
?
通過上面函數調用,就把其它對虛擬文件系統的操作轉換為對成員mVFS的操作,這樣就非常方便系統的更新,容易增加新的功能。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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