在虚拟文件系统的消息队列里,主要就是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的操作,这样就非常方便系统的更新,容易增加新的功能。 
  
  
  


 
					 
					