mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-06 15:14:59 -06:00
17.00
This commit is contained in:
@@ -8,27 +8,7 @@
|
||||
|
||||
#include "StreamUtils.h"
|
||||
|
||||
#define PROGRESS_UNKNOWN_VALUE ((UInt64)(Int64)-1)
|
||||
|
||||
#define CONVERT_PR_VAL(x) (x == PROGRESS_UNKNOWN_VALUE ? NULL : &x)
|
||||
|
||||
static SRes CompressProgress(void *pp, UInt64 inSize, UInt64 outSize) throw()
|
||||
{
|
||||
CCompressProgressWrap *p = (CCompressProgressWrap *)pp;
|
||||
p->Res = p->Progress->SetRatioInfo(CONVERT_PR_VAL(inSize), CONVERT_PR_VAL(outSize));
|
||||
return (SRes)p->Res;
|
||||
}
|
||||
|
||||
CCompressProgressWrap::CCompressProgressWrap(ICompressProgressInfo *progress) throw()
|
||||
{
|
||||
p.Progress = CompressProgress;
|
||||
Progress = progress;
|
||||
Res = SZ_OK;
|
||||
}
|
||||
|
||||
static const UInt32 kStreamStepSize = (UInt32)1 << 31;
|
||||
|
||||
SRes HRESULT_To_SRes(HRESULT res, SRes defaultRes)
|
||||
SRes HRESULT_To_SRes(HRESULT res, SRes defaultRes) throw()
|
||||
{
|
||||
switch (res)
|
||||
{
|
||||
@@ -42,9 +22,47 @@ SRes HRESULT_To_SRes(HRESULT res, SRes defaultRes)
|
||||
return defaultRes;
|
||||
}
|
||||
|
||||
static SRes MyRead(void *object, void *data, size_t *size) throw()
|
||||
|
||||
HRESULT SResToHRESULT(SRes res) throw()
|
||||
{
|
||||
CSeqInStreamWrap *p = (CSeqInStreamWrap *)object;
|
||||
switch (res)
|
||||
{
|
||||
case SZ_OK: return S_OK;
|
||||
case SZ_ERROR_MEM: return E_OUTOFMEMORY;
|
||||
case SZ_ERROR_PARAM: return E_INVALIDARG;
|
||||
case SZ_ERROR_PROGRESS: return E_ABORT;
|
||||
case SZ_ERROR_DATA: return S_FALSE;
|
||||
case SZ_ERROR_UNSUPPORTED: return E_NOTIMPL;
|
||||
// case SZ_ERROR_READ: return E_NOTIMPL;
|
||||
}
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
|
||||
#define PROGRESS_UNKNOWN_VALUE ((UInt64)(Int64)-1)
|
||||
|
||||
#define CONVERT_PR_VAL(x) (x == PROGRESS_UNKNOWN_VALUE ? NULL : &x)
|
||||
|
||||
|
||||
static SRes CompressProgress(const ICompressProgress *pp, UInt64 inSize, UInt64 outSize) throw()
|
||||
{
|
||||
CCompressProgressWrap *p = CONTAINER_FROM_VTBL(pp, CCompressProgressWrap, vt);
|
||||
p->Res = p->Progress->SetRatioInfo(CONVERT_PR_VAL(inSize), CONVERT_PR_VAL(outSize));
|
||||
return HRESULT_To_SRes(p->Res, SZ_ERROR_PROGRESS);
|
||||
}
|
||||
|
||||
void CCompressProgressWrap::Init(ICompressProgressInfo *progress) throw()
|
||||
{
|
||||
vt.Progress = CompressProgress;
|
||||
Progress = progress;
|
||||
Res = SZ_OK;
|
||||
}
|
||||
|
||||
static const UInt32 kStreamStepSize = (UInt32)1 << 31;
|
||||
|
||||
static SRes MyRead(const ISeqInStream *pp, void *data, size_t *size) throw()
|
||||
{
|
||||
CSeqInStreamWrap *p = CONTAINER_FROM_VTBL(pp, CSeqInStreamWrap, vt);
|
||||
UInt32 curSize = ((*size < kStreamStepSize) ? (UInt32)*size : kStreamStepSize);
|
||||
p->Res = (p->Stream->Read(data, curSize, &curSize));
|
||||
*size = curSize;
|
||||
@@ -54,9 +72,9 @@ static SRes MyRead(void *object, void *data, size_t *size) throw()
|
||||
return HRESULT_To_SRes(p->Res, SZ_ERROR_READ);
|
||||
}
|
||||
|
||||
static size_t MyWrite(void *object, const void *data, size_t size) throw()
|
||||
static size_t MyWrite(const ISeqOutStream *pp, const void *data, size_t size) throw()
|
||||
{
|
||||
CSeqOutStreamWrap *p = (CSeqOutStreamWrap *)object;
|
||||
CSeqOutStreamWrap *p = CONTAINER_FROM_VTBL(pp, CSeqOutStreamWrap, vt);
|
||||
if (p->Stream)
|
||||
{
|
||||
p->Res = WriteStream(p->Stream, data, size);
|
||||
@@ -69,47 +87,36 @@ static size_t MyWrite(void *object, const void *data, size_t size) throw()
|
||||
return size;
|
||||
}
|
||||
|
||||
CSeqInStreamWrap::CSeqInStreamWrap(ISequentialInStream *stream) throw()
|
||||
|
||||
void CSeqInStreamWrap::Init(ISequentialInStream *stream) throw()
|
||||
{
|
||||
p.Read = MyRead;
|
||||
vt.Read = MyRead;
|
||||
Stream = stream;
|
||||
Processed = 0;
|
||||
Res = S_OK;
|
||||
}
|
||||
|
||||
CSeqOutStreamWrap::CSeqOutStreamWrap(ISequentialOutStream *stream) throw()
|
||||
void CSeqOutStreamWrap::Init(ISequentialOutStream *stream) throw()
|
||||
{
|
||||
p.Write = MyWrite;
|
||||
vt.Write = MyWrite;
|
||||
Stream = stream;
|
||||
Res = SZ_OK;
|
||||
Processed = 0;
|
||||
}
|
||||
|
||||
HRESULT SResToHRESULT(SRes res) throw()
|
||||
{
|
||||
switch (res)
|
||||
{
|
||||
case SZ_OK: return S_OK;
|
||||
case SZ_ERROR_MEM: return E_OUTOFMEMORY;
|
||||
case SZ_ERROR_PARAM: return E_INVALIDARG;
|
||||
case SZ_ERROR_PROGRESS: return E_ABORT;
|
||||
case SZ_ERROR_DATA: return S_FALSE;
|
||||
case SZ_ERROR_UNSUPPORTED: return E_NOTIMPL;
|
||||
}
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
static SRes InStreamWrap_Read(void *pp, void *data, size_t *size) throw()
|
||||
static SRes InStreamWrap_Read(const ISeekInStream *pp, void *data, size_t *size) throw()
|
||||
{
|
||||
CSeekInStreamWrap *p = (CSeekInStreamWrap *)pp;
|
||||
CSeekInStreamWrap *p = CONTAINER_FROM_VTBL(pp, CSeekInStreamWrap, vt);
|
||||
UInt32 curSize = ((*size < kStreamStepSize) ? (UInt32)*size : kStreamStepSize);
|
||||
p->Res = p->Stream->Read(data, curSize, &curSize);
|
||||
*size = curSize;
|
||||
return (p->Res == S_OK) ? SZ_OK : SZ_ERROR_READ;
|
||||
}
|
||||
|
||||
static SRes InStreamWrap_Seek(void *pp, Int64 *offset, ESzSeek origin) throw()
|
||||
static SRes InStreamWrap_Seek(const ISeekInStream *pp, Int64 *offset, ESzSeek origin) throw()
|
||||
{
|
||||
CSeekInStreamWrap *p = (CSeekInStreamWrap *)pp;
|
||||
CSeekInStreamWrap *p = CONTAINER_FROM_VTBL(pp, CSeekInStreamWrap, vt);
|
||||
UInt32 moveMethod;
|
||||
switch (origin)
|
||||
{
|
||||
@@ -124,11 +131,11 @@ static SRes InStreamWrap_Seek(void *pp, Int64 *offset, ESzSeek origin) throw()
|
||||
return (p->Res == S_OK) ? SZ_OK : SZ_ERROR_READ;
|
||||
}
|
||||
|
||||
CSeekInStreamWrap::CSeekInStreamWrap(IInStream *stream) throw()
|
||||
void CSeekInStreamWrap::Init(IInStream *stream) throw()
|
||||
{
|
||||
Stream = stream;
|
||||
p.Read = InStreamWrap_Read;
|
||||
p.Seek = InStreamWrap_Seek;
|
||||
vt.Read = InStreamWrap_Read;
|
||||
vt.Seek = InStreamWrap_Seek;
|
||||
Res = S_OK;
|
||||
}
|
||||
|
||||
@@ -168,9 +175,9 @@ Byte CByteInBufWrap::ReadByteFromNewBlock() throw()
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Byte Wrap_ReadByte(void *pp) throw()
|
||||
static Byte Wrap_ReadByte(const IByteIn *pp) throw()
|
||||
{
|
||||
CByteInBufWrap *p = (CByteInBufWrap *)pp;
|
||||
CByteInBufWrap *p = CONTAINER_FROM_VTBL_CLS(pp, CByteInBufWrap, vt);
|
||||
if (p->Cur != p->Lim)
|
||||
return *p->Cur++;
|
||||
return p->ReadByteFromNewBlock();
|
||||
@@ -178,7 +185,7 @@ static Byte Wrap_ReadByte(void *pp) throw()
|
||||
|
||||
CByteInBufWrap::CByteInBufWrap(): Buf(0)
|
||||
{
|
||||
p.Read = Wrap_ReadByte;
|
||||
vt.Read = Wrap_ReadByte;
|
||||
}
|
||||
|
||||
|
||||
@@ -214,9 +221,9 @@ HRESULT CByteOutBufWrap::Flush() throw()
|
||||
return Res;
|
||||
}
|
||||
|
||||
static void Wrap_WriteByte(void *pp, Byte b) throw()
|
||||
static void Wrap_WriteByte(const IByteOut *pp, Byte b) throw()
|
||||
{
|
||||
CByteOutBufWrap *p = (CByteOutBufWrap *)pp;
|
||||
CByteOutBufWrap *p = CONTAINER_FROM_VTBL_CLS(pp, CByteOutBufWrap, vt);
|
||||
Byte *dest = p->Cur;
|
||||
*dest = b;
|
||||
p->Cur = ++dest;
|
||||
@@ -226,5 +233,5 @@ static void Wrap_WriteByte(void *pp, Byte b) throw()
|
||||
|
||||
CByteOutBufWrap::CByteOutBufWrap() throw(): Buf(0)
|
||||
{
|
||||
p.Write = Wrap_WriteByte;
|
||||
vt.Write = Wrap_WriteByte;
|
||||
}
|
||||
|
||||
@@ -6,49 +6,54 @@
|
||||
#include "../ICoder.h"
|
||||
#include "../../Common/MyCom.h"
|
||||
|
||||
SRes HRESULT_To_SRes(HRESULT res, SRes defaultRes) throw();
|
||||
HRESULT SResToHRESULT(SRes res) throw();
|
||||
|
||||
struct CCompressProgressWrap
|
||||
{
|
||||
ICompressProgress p;
|
||||
ICompressProgress vt;
|
||||
ICompressProgressInfo *Progress;
|
||||
HRESULT Res;
|
||||
|
||||
CCompressProgressWrap(ICompressProgressInfo *progress) throw();
|
||||
void Init(ICompressProgressInfo *progress) throw();
|
||||
};
|
||||
|
||||
|
||||
struct CSeqInStreamWrap
|
||||
{
|
||||
ISeqInStream p;
|
||||
ISeqInStream vt;
|
||||
ISequentialInStream *Stream;
|
||||
HRESULT Res;
|
||||
UInt64 Processed;
|
||||
|
||||
CSeqInStreamWrap(ISequentialInStream *stream) throw();
|
||||
void Init(ISequentialInStream *stream) throw();
|
||||
};
|
||||
|
||||
|
||||
struct CSeekInStreamWrap
|
||||
{
|
||||
ISeekInStream p;
|
||||
ISeekInStream vt;
|
||||
IInStream *Stream;
|
||||
HRESULT Res;
|
||||
|
||||
CSeekInStreamWrap(IInStream *stream) throw();
|
||||
void Init(IInStream *stream) throw();
|
||||
};
|
||||
|
||||
|
||||
struct CSeqOutStreamWrap
|
||||
{
|
||||
ISeqOutStream p;
|
||||
ISeqOutStream vt;
|
||||
ISequentialOutStream *Stream;
|
||||
HRESULT Res;
|
||||
UInt64 Processed;
|
||||
|
||||
CSeqOutStreamWrap(ISequentialOutStream *stream) throw();
|
||||
void Init(ISequentialOutStream *stream) throw();
|
||||
};
|
||||
|
||||
HRESULT SResToHRESULT(SRes res) throw();
|
||||
|
||||
struct CByteInBufWrap
|
||||
{
|
||||
IByteIn p;
|
||||
IByteIn vt;
|
||||
const Byte *Cur;
|
||||
const Byte *Lim;
|
||||
Byte *Buf;
|
||||
@@ -79,9 +84,10 @@ struct CByteInBufWrap
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct CByteOutBufWrap
|
||||
{
|
||||
IByteOut p;
|
||||
IByteOut vt;
|
||||
Byte *Cur;
|
||||
const Byte *Lim;
|
||||
Byte *Buf;
|
||||
|
||||
@@ -2,9 +2,6 @@
|
||||
|
||||
#include "StdAfx.h"
|
||||
|
||||
#include "../../Common/Defs.h"
|
||||
#include "../../Common/IntToString.h"
|
||||
|
||||
#include "../../Windows/FileFind.h"
|
||||
|
||||
#include "FilePathAutoRename.h"
|
||||
@@ -14,10 +11,8 @@ using namespace NWindows;
|
||||
static bool MakeAutoName(const FString &name,
|
||||
const FString &extension, UInt32 value, FString &path)
|
||||
{
|
||||
char temp[16];
|
||||
ConvertUInt32ToString(value, temp);
|
||||
path = name;
|
||||
path.AddAscii(temp);
|
||||
path.Add_UInt32(value);
|
||||
path += extension;
|
||||
return NFile::NFind::DoesFileOrDirExist(path);
|
||||
}
|
||||
@@ -34,7 +29,7 @@ bool AutoRenamePath(FString &path)
|
||||
name.DeleteFrom(dotPos);
|
||||
extension = path.Ptr(dotPos);
|
||||
}
|
||||
name += FTEXT('_');
|
||||
name += '_';
|
||||
|
||||
FString temp;
|
||||
|
||||
|
||||
@@ -153,6 +153,15 @@ public:
|
||||
~C_OutStream_Releaser() { if (FilterCoder) FilterCoder->ReleaseOutStream(); }
|
||||
};
|
||||
|
||||
class C_Filter_Releaser
|
||||
{
|
||||
public:
|
||||
CFilterCoder *FilterCoder;
|
||||
C_Filter_Releaser(): FilterCoder(NULL) {}
|
||||
~C_Filter_Releaser() { if (FilterCoder) FilterCoder->Filter.Release(); }
|
||||
};
|
||||
|
||||
|
||||
MY_QUERYINTERFACE_BEGIN2(ICompressCoder)
|
||||
|
||||
MY_QUERYINTERFACE_ENTRY(ICompressSetOutStreamSize)
|
||||
|
||||
@@ -59,7 +59,8 @@ public:
|
||||
}
|
||||
|
||||
void Init() throw();
|
||||
|
||||
|
||||
MY_FORCE_INLINE
|
||||
bool ReadByte(Byte &b)
|
||||
{
|
||||
if (_buf >= _bufLim)
|
||||
@@ -68,6 +69,7 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
MY_FORCE_INLINE
|
||||
Byte ReadByte()
|
||||
{
|
||||
if (_buf >= _bufLim)
|
||||
|
||||
@@ -15,7 +15,7 @@ using namespace NDir;
|
||||
|
||||
static const size_t kTempBufSize = (1 << 20);
|
||||
|
||||
static CFSTR kTempFilePrefixString = FTEXT("7zt");
|
||||
#define kTempFilePrefixString FTEXT("7zt")
|
||||
|
||||
CInOutTempBuffer::CInOutTempBuffer(): _buf(NULL) { }
|
||||
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
|
||||
using namespace NWindows;
|
||||
|
||||
bool StringToBool(const UString &s, bool &res)
|
||||
bool StringToBool(const wchar_t *s, bool &res)
|
||||
{
|
||||
if (s.IsEmpty() || (s[0] == '+' && s[1] == 0) || StringsAreEqualNoCase_Ascii(s, "ON"))
|
||||
if (s[0] == 0 || (s[0] == '+' && s[1] == 0) || StringsAreEqualNoCase_Ascii(s, "ON"))
|
||||
{
|
||||
res = true;
|
||||
return true;
|
||||
@@ -95,7 +95,7 @@ static HRESULT StringToDictSize(const UString &s, NCOM::CPropVariant &destProp)
|
||||
{
|
||||
const wchar_t *end;
|
||||
UInt32 number = ConvertStringToUInt32(s, &end);
|
||||
unsigned numDigits = (unsigned)(end - s);
|
||||
unsigned numDigits = (unsigned)(end - s.Ptr());
|
||||
if (numDigits == 0 || s.Len() > numDigits + 1)
|
||||
return E_INVALIDARG;
|
||||
|
||||
@@ -144,17 +144,29 @@ static HRESULT PROPVARIANT_to_DictSize(const PROPVARIANT &prop, NCOM::CPropVaria
|
||||
return S_OK;
|
||||
}
|
||||
if (prop.vt == VT_BSTR)
|
||||
return StringToDictSize(prop.bstrVal, destProp);
|
||||
{
|
||||
UString s;
|
||||
s = prop.bstrVal;
|
||||
return StringToDictSize(s, destProp);
|
||||
}
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
|
||||
void CProps::AddProp32(PROPID propid, UInt32 level)
|
||||
void CProps::AddProp32(PROPID propid, UInt32 val)
|
||||
{
|
||||
CProp &prop = Props.AddNew();
|
||||
prop.IsOptional = true;
|
||||
prop.Id = propid;
|
||||
prop.Value = (UInt32)level;
|
||||
prop.Value = (UInt32)val;
|
||||
}
|
||||
|
||||
void CProps::AddPropBool(PROPID propid, bool val)
|
||||
{
|
||||
CProp &prop = Props.AddNew();
|
||||
prop.IsOptional = true;
|
||||
prop.Id = propid;
|
||||
prop.Value = val;
|
||||
}
|
||||
|
||||
class CCoderProps
|
||||
@@ -454,5 +466,7 @@ HRESULT COneMethodInfo::ParseMethodFromPROPVARIANT(const UString &realName, cons
|
||||
// -m{N}=method
|
||||
if (value.vt != VT_BSTR)
|
||||
return E_INVALIDARG;
|
||||
return ParseMethodFromString(value.bstrVal);
|
||||
UString s;
|
||||
s = value.bstrVal;
|
||||
return ParseMethodFromString(s);
|
||||
}
|
||||
|
||||
@@ -5,11 +5,13 @@
|
||||
|
||||
#include "../../Common/MyString.h"
|
||||
|
||||
#include "../../Windows/Defs.h"
|
||||
|
||||
#include "../../Windows/PropVariant.h"
|
||||
|
||||
#include "../ICoder.h"
|
||||
|
||||
bool StringToBool(const UString &s, bool &res);
|
||||
bool StringToBool(const wchar_t *s, bool &res);
|
||||
HRESULT PROPVARIANT_to_bool(const PROPVARIANT &prop, bool &dest);
|
||||
unsigned ParseStringToUInt32(const UString &srcString, UInt32 &number);
|
||||
HRESULT ParsePropToUInt32(const UString &name, const PROPVARIANT &prop, UInt32 &resValue);
|
||||
@@ -38,7 +40,9 @@ struct CProps
|
||||
return false;
|
||||
}
|
||||
|
||||
void AddProp32(PROPID propid, UInt32 level);
|
||||
void AddProp32(PROPID propid, UInt32 val);
|
||||
|
||||
void AddPropBool(PROPID propid, bool val);
|
||||
|
||||
void AddProp_Ascii(PROPID propid, const char *s)
|
||||
{
|
||||
@@ -99,6 +103,18 @@ public:
|
||||
return level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26));
|
||||
}
|
||||
|
||||
bool Get_Lzma_Eos() const
|
||||
{
|
||||
int i = FindProp(NCoderPropID::kEndMarker);
|
||||
if (i >= 0)
|
||||
{
|
||||
const NWindows::NCOM::CPropVariant &val = Props[i].Value;
|
||||
if (val.vt == VT_BOOL)
|
||||
return VARIANT_BOOLToBool(val.boolVal);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Are_Lzma_Model_Props_Defined() const
|
||||
{
|
||||
if (FindProp(NCoderPropID::kPosStateBits) >= 0) return true;
|
||||
@@ -107,18 +123,52 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
UInt32 Get_Lzma_NumThreads(bool &fixedNumber) const
|
||||
UInt32 Get_Lzma_NumThreads() const
|
||||
{
|
||||
if (Get_Lzma_Algo() == 0)
|
||||
return 1;
|
||||
int numThreads = Get_NumThreads();
|
||||
if (numThreads >= 0)
|
||||
return numThreads < 2 ? 1 : 2;
|
||||
return 2;
|
||||
}
|
||||
|
||||
UInt32 Get_Lzma2_NumThreads(bool &fixedNumber) const
|
||||
{
|
||||
fixedNumber = false;
|
||||
int numThreads = Get_NumThreads();
|
||||
if (numThreads >= 0)
|
||||
{
|
||||
fixedNumber = true;
|
||||
return numThreads < 2 ? 1 : 2;
|
||||
if (numThreads < 1) return 1;
|
||||
const unsigned kNumLzma2ThreadsMax = 32;
|
||||
if (numThreads > kNumLzma2ThreadsMax) return kNumLzma2ThreadsMax;
|
||||
return numThreads;
|
||||
}
|
||||
return Get_Lzma_Algo() == 0 ? 1 : 2;
|
||||
return 1;
|
||||
}
|
||||
|
||||
UInt64 Get_Lzma2_BlockSize() const
|
||||
{
|
||||
int i = FindProp(NCoderPropID::kBlockSize);
|
||||
if (i >= 0)
|
||||
{
|
||||
const NWindows::NCOM::CPropVariant &val = Props[i].Value;
|
||||
if (val.vt == VT_UI4) return val.ulVal;
|
||||
if (val.vt == VT_UI8) return val.uhVal.QuadPart;
|
||||
}
|
||||
|
||||
UInt32 dictSize = Get_Lzma_DicSize();
|
||||
UInt64 blockSize = (UInt64)dictSize << 2;
|
||||
const UInt32 kMinSize = (UInt32)1 << 20;
|
||||
const UInt32 kMaxSize = (UInt32)1 << 28;
|
||||
if (blockSize < kMinSize) blockSize = kMinSize;
|
||||
if (blockSize > kMaxSize) blockSize = kMaxSize;
|
||||
if (blockSize < dictSize) blockSize = dictSize;
|
||||
return blockSize;
|
||||
}
|
||||
|
||||
|
||||
UInt32 Get_BZip2_NumThreads(bool &fixedNumber) const
|
||||
{
|
||||
fixedNumber = false;
|
||||
@@ -127,7 +177,8 @@ public:
|
||||
{
|
||||
fixedNumber = true;
|
||||
if (numThreads < 1) return 1;
|
||||
if (numThreads > 64) return 64;
|
||||
const unsigned kNumBZip2ThreadsMax = 64;
|
||||
if (numThreads > kNumBZip2ThreadsMax) return kNumBZip2ThreadsMax;
|
||||
return numThreads;
|
||||
}
|
||||
return 1;
|
||||
@@ -170,6 +221,12 @@ public:
|
||||
AddProp32(NCoderPropID::kNumThreads, numThreads);
|
||||
}
|
||||
|
||||
void AddProp_EndMarker_if_NotFound(bool eos)
|
||||
{
|
||||
if (FindProp(NCoderPropID::kEndMarker) < 0)
|
||||
AddPropBool(NCoderPropID::kEndMarker, eos);
|
||||
}
|
||||
|
||||
HRESULT ParseParamsFromString(const UString &srcString);
|
||||
HRESULT ParseParamsFromPROPVARIANT(const UString &realName, const PROPVARIANT &value);
|
||||
};
|
||||
|
||||
@@ -47,8 +47,11 @@ public:
|
||||
|
||||
void WriteByte(Byte b)
|
||||
{
|
||||
_buf[_pos++] = b;
|
||||
if (_pos == _limitPos)
|
||||
UInt32 pos = _pos;
|
||||
_buf[pos] = b;
|
||||
pos++;
|
||||
_pos = pos;
|
||||
if (pos == _limitPos)
|
||||
FlushWithCheck();
|
||||
}
|
||||
void WriteBytes(const void *data, size_t size)
|
||||
|
||||
Reference in New Issue
Block a user