You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
5.7 KiB
C++
179 lines
5.7 KiB
C++
/*
|
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
|
* its licensors.
|
|
*
|
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
|
* distribution (the "License"). All use of this software is governed by the License,
|
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
*
|
|
*/
|
|
// Original file Copyright Crytek GMBH or its affiliates, used under license.
|
|
|
|
// Description : Streaming Engine
|
|
|
|
|
|
#ifndef CRYINCLUDE_CRYSYSTEM_STREAMENGINE_STREAMREADSTREAM_H
|
|
#define CRYINCLUDE_CRYSYSTEM_STREAMENGINE_STREAMREADSTREAM_H
|
|
#pragma once
|
|
|
|
|
|
#include "IStreamEngine.h"
|
|
#include "StreamAsyncFileRequest.h"
|
|
|
|
class CStreamEngine;
|
|
|
|
class CReadStream
|
|
: public IReadStream
|
|
{
|
|
friend class CStreamEngine;
|
|
|
|
public:
|
|
static CReadStream* Allocate(CStreamEngine* pEngine, const EStreamTaskType tSource, const char* szFilename, IStreamCallback* pCallback, const StreamReadParams* pParams);
|
|
static void Flush();
|
|
|
|
public:
|
|
CReadStream();
|
|
virtual ~CReadStream ();
|
|
|
|
virtual int AddRef();
|
|
virtual int Release();
|
|
|
|
virtual DWORD_PTR GetUserData() {return m_Params.dwUserData; }
|
|
|
|
// set user defined data into stream's params
|
|
virtual void SetUserData(DWORD_PTR dwUserData);
|
|
|
|
// returns true if the file read was not successful.
|
|
virtual bool IsError() { return m_bError; };
|
|
|
|
// returns true if the file read was completed (successfully or unsuccessfully)
|
|
// check IsError to check if the whole requested file (piece) was read
|
|
virtual bool IsFinished();
|
|
|
|
// returns the number of bytes read so far (the whole buffer size if IsFinished())
|
|
virtual unsigned int GetBytesRead (bool bWait);
|
|
|
|
// returns the buffer into which the data has been or will be read
|
|
// at least GetBytesRead() bytes in this buffer are guaranteed to be already read
|
|
virtual const void* GetBuffer ();
|
|
|
|
void AbortShutdown();
|
|
|
|
// tries to stop reading the stream; this is advisory and may have no effect
|
|
// but the callback will not be called after this. If you just destructing object,
|
|
// dereference this object and it will automatically abort and release all associated resources.
|
|
virtual void Abort();
|
|
virtual bool TryAbort();
|
|
|
|
// tries to raise the priority of the read; this is advisory and may have no effect
|
|
virtual void SetPriority (EStreamTaskPriority EPriority);
|
|
|
|
// unconditionally waits until the callback is called
|
|
// i.e. if the stream hasn't yet finish, it's guaranteed that the user-supplied callback
|
|
// is called before return from this function (unless no callback was specified)
|
|
virtual void Wait(int nMaxWaitMillis = -1);
|
|
|
|
virtual uint64 GetPriority() const;
|
|
|
|
virtual const StreamReadParams& GetParams() const {return m_Params; }
|
|
|
|
virtual const EStreamTaskType GetCallerType() const { return m_Type; }
|
|
|
|
virtual EStreamSourceMediaType GetMediaType() const { return m_MediaType; }
|
|
|
|
// return pointer to callback routine(can be NULL)
|
|
virtual IStreamCallback* GetCallback() const;
|
|
|
|
// return IO error #
|
|
virtual unsigned GetError() const;
|
|
|
|
// Returns IO error name
|
|
virtual const char* GetErrorName() const;
|
|
|
|
// return stream name
|
|
virtual const char* GetName() const { return m_strFileName.c_str(); };
|
|
|
|
virtual void FreeTemporaryMemory();
|
|
|
|
// this gets called upon the IO has been executed to call the callbacks
|
|
void MainThread_Finalize();
|
|
|
|
bool IsReqReading();
|
|
|
|
#ifdef STREAMENGINE_ENABLE_STATS
|
|
void SetRequestTime(CTimeValue& time) { m_requestTime = time; }
|
|
const CTimeValue& GetRequestTime() { return m_requestTime; }
|
|
#endif
|
|
|
|
// decompression of zip-compressed files with default behavior
|
|
CAsyncIOFileRequest* CreateFileRequest();
|
|
void ComputedMediaType(EStreamSourceMediaType eMT) { m_MediaType = eMT; }
|
|
void* OnNeedStorage(size_t size, bool& bAbortOnFailToAlloc);
|
|
void OnAsyncFileRequestComplete();
|
|
CAsyncIOFileRequest* GetFileRequest() { return m_pFileRequest; }
|
|
|
|
private:
|
|
void Reset();
|
|
|
|
// call the async callback
|
|
void ExecuteAsyncCallback_CBLocked();
|
|
|
|
// call the sync callback
|
|
void ExecuteSyncCallback_CBLocked();
|
|
|
|
private:
|
|
void* operator new (size_t sz);
|
|
void operator delete(void* p);
|
|
|
|
private:
|
|
static SLockFreeSingleLinkedListHeader s_freeRequests;
|
|
|
|
private:
|
|
STREAMENGINE_LL_ALIGN SLockFreeSingleLinkedListEntry m_nextFree;
|
|
|
|
CryStringLocal m_strFileName;
|
|
CryCriticalSection m_callbackLock;
|
|
CAsyncIOFileRequest_AutoPtr m_pFileRequest;
|
|
|
|
StreamReadParams m_Params;
|
|
|
|
// Only POD types must exist below here. They will be memset!
|
|
|
|
volatile int m_nRefCount;
|
|
CStreamEngine* m_pEngine;
|
|
|
|
// the type of the task
|
|
EStreamTaskType m_Type;
|
|
EStreamSourceMediaType m_MediaType;
|
|
// the initial data from the user
|
|
// the callback; may be NULL
|
|
IStreamCallback* m_pCallback;
|
|
|
|
// Bytes actually read from media.
|
|
uint32 m_nBytesRead;
|
|
|
|
volatile bool m_bIsAsyncCallbackExecuted;
|
|
volatile bool m_bIsSyncCallbackExecuted;
|
|
volatile bool m_bFileRequestComplete;
|
|
|
|
// the actual buffer to read to
|
|
void* m_pBuffer;
|
|
|
|
volatile bool m_bError;
|
|
volatile bool m_bFinished;
|
|
unsigned int m_nIOError;
|
|
|
|
#ifdef STREAMENGINE_ENABLE_STATS
|
|
// time when request was made
|
|
CTimeValue m_requestTime;
|
|
// Time for actual reading
|
|
CTimeValue m_ReadTime;
|
|
#endif
|
|
};
|
|
|
|
TYPEDEF_AUTOPTR(CReadStream);
|
|
|
|
#endif // CRYINCLUDE_CRYSYSTEM_STREAMENGINE_STREAMREADSTREAM_H
|