📄 umc_file_writer.cpp
字号:
/*//// INTEL CORPORATION PROPRIETARY INFORMATION// This software is supplied under the terms of a license agreement or// nondisclosure agreement with Intel Corporation and may not be copied// or disclosed except in accordance with the terms of that agreement.// Copyright(c) 2003-2005 Intel Corporation. All Rights Reserved.//*/#include "umc_defs.h"#if defined (UMC_ENABLE_FILE_WRITER)#include <string.h>#include "umc_file_writer.h"#include "vm_mmap.h"#include "vm_debug.h"UMC::FileWriterParams::FileWriterParams(){ m_portion_size = 0; memset(m_file_name, 0, sizeof(m_file_name));}UMC::FileWriter::FileWriter()#ifdef USE_FILE_MAPPING :m_pbBuffer(NULL), m_uiPortionSize(0), m_stDoneSize(0), m_stPos(0), m_uiPageSize(0), m_bBufferInit(false)#endif{#ifndef USE_FILE_MAPPING m_file = 0;#else vm_mmap_set_invalid(&m_mmap);#endif}UMC::FileWriter::~FileWriter(){ Close();}UMC::StatusUMC::FileWriter::Init(DataWriterParams *pInit){ Status umcRes = UMC_OK; FileWriterParams* initFileExt = DynamicCast<FileWriterParams, DataWriterParams>(pInit); if(!initFileExt) umcRes = UMC_NULL_PTR;#ifndef USE_FILE_MAPPING if (UMC_OK == umcRes) { m_file = vm_file_open(initFileExt->m_file_name,__VM_STRING("wb")); if (NULL == m_file) { umcRes = UMC_OPERATION_FAILED; } }#else m_uiPageSize = vm_mmap_get_alloc_granularity(); if (UMC_OK == umcRes) { m_uiFileSize = vm_mmap_create(&m_mmap, initFileExt->m_file_name, FLAG_ATTRIBUTE_WRITE); } if (UMC_OK == umcRes) { m_uiPortionSize = m_uiPageSize * 1024; vm_sizet csize = m_uiPortionSize; vm_sizet offset = 0; m_bBufferInit = false; m_pbBuffer = (unsigned char *)vm_mmap_set_view(&m_mmap, &offset, &csize); if (!m_pbBuffer) { umcRes = UMC_FAILED_TO_ALLOCATE_BUFFER; vm_debug_trace(4, __VM_STRING("File %s map error\n"), initFileExt->m_file_name); } } if (UMC_OK == umcRes) { m_bBufferInit = true; m_stPos = 0; m_stDoneSize = 0; } else { Close(); }#endif return umcRes;}UMC::StatusUMC::FileWriter::Close(){#ifndef USE_FILE_MAPPING if(m_file) fclose(m_file); m_file = 0;#else m_bBufferInit = false; vm_mmap_close(&m_mmap); m_pbBuffer = 0; m_stPos = 0; m_stDoneSize = 0; m_uiPortionSize = 0;#endif return UMC_OK;}UMC::StatusUMC::FileWriter::Reset(){ return UMC_OK;}#ifdef USE_FILE_MAPPINGUMC::Status UMC::FileWriter::MapCSize(){ vm_sizet tmp_size; if (!vm_mmap_is_valid(&m_mmap)) { return UMC_NOT_INITIALIZED; } m_stDoneSize += m_uiPageSize*1024; m_stPos = 0; m_bBufferInit = false; tmp_size = m_uiPageSize*1024; if(m_uiFileSize < m_stDoneSize) return UMC_FAILED_TO_ALLOCATE_BUFFER; m_pbBuffer = (unsigned char *)vm_mmap_set_view(&m_mmap,&m_stDoneSize,&tmp_size); if (!m_pbBuffer) { return UMC_FAILED_TO_ALLOCATE_BUFFER; } m_bBufferInit = true; return UMC_OK;}#endifUMC::StatusUMC::FileWriter::PutData(void *data, int &nsize){#ifndef USE_FILE_MAPPING if(m_file && data && (nsize > 0)) nsize = static_cast<int> (fwrite(data, 1, nsize, m_file)); return UMC_OK;#else Status ret = UMC_OK; int bufsize = 0; int tmp_size = nsize; if (!vm_mmap_is_valid(&m_mmap)) return UMC_NOT_INITIALIZED; while(tmp_size > 0 || ret != UMC_OK) { if ((m_stPos + tmp_size > m_uiPageSize * 1024) || !m_bBufferInit) { bufsize = m_uiPageSize * 1024 - m_stPos; memcpy(m_pbBuffer + m_stPos, data, bufsize); tmp_size -= bufsize; ret = MapCSize(); } if((UMC_OK == ret) && (tmp_size <= m_uiPageSize * 1024)) { memcpy(m_pbBuffer + m_stPos, (unsigned char*)data + bufsize, tmp_size); m_stPos += tmp_size; break; } } return ret;#endif}#ifndef USE_FILE_MAPPINGUMC::StatusUMC::FileWriter::SetPosition(vm_var32 nPosLow, vm_var32 *lpnPosHight, vm_var32 nMethod){ // check error(s) if (NULL == m_file) return UMC::UMC_NOT_INITIALIZED; // current version isn't support large file(s) if ((NULL != lpnPosHight) && (0 != *lpnPosHight)) return UMC::UMC_UNSUPPORTED; // set new position if (0 != fseek(m_file, nPosLow, nMethod)) return UMC::UMC_OPERATION_FAILED; return UMC::UMC_OK;} //UMC::FileWriter::SetPosition(vm_var32 nPosLow, vm_var32 *lpnPosHight, vm_var32 nMethod)UMC::StatusUMC::FileWriter::GetPosition(vm_var32 *lpnPosLow, vm_var32 *lpnPosHigh){ // check error(s) if (NULL == m_file) return UMC::UMC_NOT_INITIALIZED; if (NULL == lpnPosLow) return UMC::UMC_NULL_PTR; // return value(s) if (lpnPosHigh) *lpnPosHigh = 0; *lpnPosLow = ftell(m_file); return UMC::UMC_OK;} //UMC::FileWriter::GetPosition(vm_var32 *lpnPosLow, vm_var32 *lpnPosHigh)#endif //USE_FILE_MAPPING#endif //(UMC_ENABLE_FILE_WRITER)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -