⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 warfiledriverfilewin32.cpp

📁 ftpserver very good sample
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    mCurrentFileOffset += dwBytesWritten;}voidWarFileDriverFileWin32::Flush() throw(WarException){    Validate();    ::FlushFileBuffers(mFileHandle);}war_flen_t WarFileDriverFileWin32::GetLength() throw(WarException){    Validate();    DWORD dwSizeLow = 0, dwSizeHigh = 0;    dwSizeLow = GetFileSize(mFileHandle, &dwSizeHigh);    if (dwSizeLow == 0xffffffff)    {        WarError system_error;        system_error.Capture();        if (system_error.SystemError() != NO_ERROR)            WarThrow(system_error, NULL);    }        LARGE_INTEGER li;    li.LowPart = dwSizeLow;    li.HighPart = dwSizeHigh;    return li.QuadPart;}war_flen_tWarFileDriverFileWin32::Seek(war_flen_t fileOffset,                              SeekModes seekMode)                             throw(WarException){    Validate();    war_flen_t new_offset = mCurrentFileOffset;    switch(seekMode)    {    case WAR_SEEK_BEGIN:        new_offset = fileOffset;        break;    case WAR_SEEK_CURRENT:        new_offset += fileOffset;        break;    case WAR_SEEK_END:        new_offset = GetLength() + fileOffset;        break;    default:        WarThrow(WarError(WAR_ERR_INVALID_ARGUMENT), NULL);    }    if (new_offset < 0)        WarThrow(WarError(WAR_ERR_INVALID_ARGUMENT), NULL);    LARGE_INTEGER li;        li.QuadPart = new_offset;    li.LowPart = ::SetFilePointer(mFileHandle, li.LowPart,         &li.HighPart, FILE_BEGIN);        WarSystemError sys_err(WAR_FERR_SEEK_FAILED);    if (li.LowPart == 0xFFFFFFFF         && (sys_err.SystemError() != NO_ERROR))        WarThrow(sys_err, NULL);        return mCurrentFileOffset = li.QuadPart;}void WarFileDriverFileWin32::WriteWithCallback(    war_transfer_buffer_ptr_t& outBuffer)    throw(WarException){    WAR_PROFILE_FUNC(WAR_FP_WarFileDriverFileWin32_WriteWithCallback);    DWORD dwBytes = 0;    ol_result_t *pResult = AllocResult(OP_WRITE);    pResult->mBufferPtr = outBuffer;    LARGE_INTEGER li;    li.QuadPart = mCurrentFileOffset;    pResult->mOverlappedData.Offset = li.LowPart;    pResult->mOverlappedData.OffsetHigh  = li.HighPart ;    if (!WriteFile(mFileHandle,         pResult->mBufferPtr->GetBuffer(),        pResult->mBufferPtr->mBytesUsed,        &dwBytes,        &pResult->mOverlappedData))    {        WarSystemError system_error;                switch(system_error.SystemError())        {        case ERROR_IO_PENDING:            break; // No action        case ERROR_HANDLE_EOF:            DeleteResult(pResult);            WarThrow(WarError(WAR_FERR_END_OF_FILE, ERROR_HANDLE_EOF), NULL);            break;        default:            DeleteResult(pResult);            WarThrow(system_error, NULL);        }    }    // May move the internal file-offset off the physical size!    mCurrentFileOffset += outBuffer->GetLength();        WAR_DB_PERFMON_INC(WAR_PRFDEBUG_NUM_FILEPENDINGIO);}void WarFileDriverFileWin32::ReadWithCallback(    war_transfer_buffer_ptr_t& inBuffer)    throw(WarException){    WAR_PROFILE_FUNC(WAR_FP_WarFileDriverFileWin32_ReadWithCallback);    DWORD dwBytes = 0;    ol_result_t *pResult;    {        WAR_PROFILE_FUNC(WAR_FP_WarFileDriverFileWin32_ReadWithCallback_ALLOC);        pResult = AllocResult(OP_READ);    }    {        WAR_PROFILE_FUNC(WAR_FP_WarFileDriverFileWin32_ReadWithCallback_PREP);                pResult->mBufferPtr = inBuffer;        LARGE_INTEGER li;        li.QuadPart = mCurrentFileOffset;        pResult->mOverlappedData.Offset = li.LowPart;        pResult->mOverlappedData.OffsetHigh  = li.HighPart ;    }    BOOL result;        {        WAR_PROFILE_FUNC(WAR_FP_WarFileDriverFileWin32_ReadWithCallback_READFILE);        result = ReadFile(mFileHandle,             pResult->mBufferPtr->GetBuffer(),            pResult->mBufferPtr->GetLength(),            &dwBytes,            &pResult->mOverlappedData);    }    {        WAR_PROFILE_FUNC(WAR_FP_WarFileDriverFileWin32_ReadWithCallback_POSTPRC);                if (!result)        {            WarSystemError system_error;            WarError throw_error;                        switch(system_error.SystemError())            {            case ERROR_IO_PENDING:                break; // No action            case ERROR_HANDLE_EOF:                throw_error = WarError(WAR_FERR_END_OF_FILE, ERROR_HANDLE_EOF);                break;            default:                throw_error = system_error;                break;            }                        if (throw_error.LocalError() != WAR_ERR_OK)            {                DeleteResult(pResult);                WarThrow(throw_error, NULL);            }        }                // May move the internal file-offset off the physical size!        mCurrentFileOffset += inBuffer->GetLength();    }    WAR_DB_PERFMON_INC(WAR_PRFDEBUG_NUM_FILEPENDINGIO);}//============================= ACCESS     ===================================//============================= INQUIRY    ===================================bool WarFileDriverFileWin32::IsOpen(){    return (mFileHandle != INVALID_HANDLE_VALUE);}/////////////////////////////// PROTECTED  ///////////////////////////////////WarFileDriverFileWin32::ol_result_def *WarFileDriverFileWin32::AllocResult(WarFileDriverFileWin32::IoOperationE operation){    WarAutoLock my_lock(msBufferLock);    ol_result_t *p;    if (mspBufferList)    {        p = mspBufferList;        mspBufferList = mspBufferList->mpNext;    }    else    {        WAR_PROFILE_FUNC(WAR_FP_WarFileDriverFileWin32_AllocResult_NEW);        p = new ol_result_t;    }            WAR_PROFILE_FUNC(WAR_FP_WarFileDriverFileWin32_AllocResult_ASSIGN);        p->mpThis = this;    p->mFilePtr = mpCompanion;    memset(&(p->mOverlappedData), 0, sizeof(OVERLAPPED));    p->mOperation = operation;            return p;}VOID CALLBACK WarFileDriverFileWin32::FileIOCompletionRoutine(        DWORD dwErrorCode,                // completion code        DWORD dwNumberOfBytesTransfered,  // number of bytes transferred        LPOVERLAPPED lpOverlapped         // I/O information buffer        ){    WarLog err_log(WARLOG_ERROR, "WarFileDriverFileWin32::FileIOCompletionRoutine()");    ol_result_t *pResult = (ol_result_def *)lpOverlapped;    WarError err((dwErrorCode != WAR_ERR_OK)         ? WAR_ERR_SYSTEM_ERROR : WAR_ERR_OK, (int)dwErrorCode);    try    {        pResult->mBufferPtr->mBytesUsed             = dwNumberOfBytesTransfered;        if (err && (err.SystemError() == ERROR_HANDLE_EOF))            err = WAR_FERR_END_OF_FILE;        switch(pResult->mOperation)        {        case OP_READ:            WAR_DB_PERFMON_DEC(WAR_PRFDEBUG_NUM_FILEPENDINGIO);            pResult->mpThis->OnRead(err, pResult->mBufferPtr);            break;        case OP_WRITE:            WAR_DB_PERFMON_DEC(WAR_PRFDEBUG_NUM_FILEPENDINGIO);            pResult->mpThis->OnWritten(err, pResult->mBufferPtr);            break;        }    }        catch(WarException& ex)    {        err_log << "Caught unexcpected exception. Operation was "            << pResult->mOperation            << ' '            << ex.Explain();            war_endl;    }#if WAR_CATCH_ALL    catch(...)    {         err_log << "Caught unhandled exception. Operation was "            << pResult->mOperation            << war_endl;    }#endif        DeleteResult(pResult);}void WarFileDriverFileWin32::DeleteResult(ol_result_def *presult){    WarAutoLock my_lock(msBufferLock);    // Prepere for re-use    presult->mpNext = mspBufferList;    mspBufferList = presult;    // Release autopointers    presult->mFilePtr = NULL;    presult->mBufferPtr = NULL;}/////////////////////////////// PRIVATE    ///////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -