蔡军生先生第二人生的源码分析(四十四)虚拟文件系统的请求处理
2008-05-17 16:21
716 查看
在虚拟文件系统的消息队列里,主要就是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的操作,这样就非常方便系统的更新,容易增加新的功能。
下面是类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的操作,这样就非常方便系统的更新,容易增加新的功能。
相关文章推荐
- 第二人生的源码分析(四十四)虚拟文件系统的请求处理
- 第二人生的源码分析(四十四)虚拟文件系统的请求处理
- 第二人生的源码分析(四十四)虚拟文件系统的请求处理
- 蔡军生先生第二人生的源码分析(四十二)实现消息处理的线程类
- 蔡军生先生第二人生的源码分析(六十三)类Multi实现多请求
- 蔡军生先生第二人生的源码分析(三十七)消息处理的完整流程
- 蔡军生先生第二人生的源码分析(二十三)人物行走的键盘消息处理
- 蔡军生先生第二人生的源码分析(二十四)人物向前走的键盘消息处理
- 蔡军生先生第二人生的源码分析(四十七)发送下载纹理图片请求
- 蔡军生先生第二人生的源码分析(五十三) 纹理图片的格式之LLImageJ2C类
- 蔡军生先生第二人生的源码分析(六十)多协议文件传送库libcurl的介绍
- 蔡军生先生第二人生的源码分析(六十八)LLXMLNode使用Expat库分析XML文件
- 蔡军生先生第二人生的源码分析(7)应用程序实例类
- 蔡军生先生第二人生的源码分析(13)树显示的实现
- 蔡军生先生第二人生的源码分析(二十六)底层网络协议
- 蔡军生先生第二人生的源码分析(三十三)消息解包的实现
- 蔡军生先生第二人生的源码分析(四十一)使用Apache运行库线程
- 蔡军生先生第二人生的源码分析(四十九)接收服务器回应的纹理图片数据
- 蔡军生先生第二人生的源码分析(106)脚本的词法分析(4)
- 蔡军生先生第二人生的源码分析(七十九)UI控制的类工厂