Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Гаряка Асмик
Статус: Профессор
Рейтинг: 5526
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2544
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2033
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1600
Дата выхода:28.11.2010, 20:00
Администратор рассылки:Verena (Профессионал)
Подписчиков / экспертов:334 / 176
Вопросов / ответов:1 / 1

Вопрос № 180911: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Прокоментируйте пожалуйста вот этот код.

Код:

Вопрос № 180911:

Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
Прокоментируйте пожалуйста вот этот код.

Код:
STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
Int32 testMode, IArchiveExtractCallback *extractCallback)
{
COM_TRY_BEGIN
if (numItems == 0)
return S_OK;
if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
return E_INVALIDARG;

extractCallback->SetTotal(_packSize);
UInt64 currentTotalPacked = 0;
RINOK(extractCallback->SetCompleted(¤tTotalPacked));
CMyComPtr<ISequentialOutStream> realOutStream;
Int32 askMode = testMode ?
NExtract::NAskMode::k Test :
NExtract::NAskMode::kExtract;

RINOK(extractCallback->GetStream(0, &realOutStream, askMode));

if (!testMode && !realOutStream)
return S_OK;

extractCallback->PrepareOperation(askMode);

if (_stream)
{
RINOK(_stream->Seek(_startPosition, STREAM_SEEK_SET, NULL));
}

CLocalProgress *lps = new CLocalProgress;
CMyComPtr<ICompressProgressInfo> progress = lps;
lps->Init(extractCallback, true);

CCompressProgressWrap progressWrap(progress);

SRes res;

const UInt32 kInBufSize = 1 << 15;
const UInt32 kOutBufSize = 1 << 21;

UInt32 inPos = 0;
UInt32 inSize = 0;
UInt32 outPos = 0;
CXzUnpackerCPP xzu;
res = XzUnpacker_Create(&xzu.p, &g_Alloc);
if (res == SZ_OK)
{
xzu.InBuf = (Byte *)MyAlloc(kInBufSize);
xzu.OutBuf = (Byte *)MyAlloc(kOutBufSize);
if (xzu.InBuf == 0 || xzu.OutBuf == 0)
res = SZ_ERROR_MEM;
}
if (res == SZ_OK)
for (;;)
{
if (inPos == inSize)
{
inPos = inSize = 0;
RINOK(_seqStream->Read(xzu.InBuf, kInBufSize, &inSize));
}

SizeT inLen = inSize - inPos;
SizeT outLen = kOutBufSize - outPos;
ECoderStatus status;
res = XzUnpacker_Code(&xzu.p,
xzu.OutBuf + outPos, &outLen,
xzu.InBuf + inPos, &inLen,
(inSize == 0 ? CODER_FINISH_END : CODER_FINISH_ANY), &status);

// printf("\n_inPos = %6d inLen = %5d, outLen = %5d", inPos, inLen, outLen);

inPos += (UInt32)inLen;
outPos += (UInt32)outLen;
lps->InSize += inLen;
lps->OutSize += outLen;

bool finished = (((inLen == 0) && (outLen == 0)) || res != SZ_OK);

if (outPos == kOutBufSize || finished)
{
if (realOutStream && outPos > 0)
{
RINOK(WriteStream( realOutStream, xzu.OutBuf, outPos));
}
outPos = 0;
}
if (finished)
{
_packSize = lps->InSize;
_unpackSize = lps->OutSize;
_packSizeDefined = _unpackSizeDefined = true;
if (res == SZ_OK)
{
if (status == CODER_STATUS_NEEDS_MORE_INPUT)
{
if (XzUnpacker_IsStreamWasFinished(&xzu.p))
_packSize -= xzu.p.padSize;
else
res = SZ_ERROR_DATA;
}
else
res = SZ_ERROR_DATA;
}
break;
}
RINOK(lps->SetCur());
}

Int32 opRes;
switch(res)
{
case SZ_OK:
opRes = NExtract::NOperationResult::kOK; break;
case SZ_ERROR_UNSUPPORTED:
opRes = NExtract::NOperationResult::kUnSupportedMethod; break;
case SZ_ERROR_CRC:
opRes = NExtract::NOperationResult::kCRCError; break;
case SZ_ERROR_DATA:
case SZ_ERROR_ARCHIVE:
case SZ_ERROR_NO_ARCHIVE:
opRes = NExtract::NOperationResult::kDataError; break;
default: return SResToHRESULT(res);
}
realOutStream.Release();
RINOK(extractCallback->SetOperationResult(opRes));
return S_OK;
COM_TRY_END
}

Отправлен: 23.11.2010, 19:33
Вопрос задал: Roland Deschain (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Гаряка Асмик (Профессор) :
Здравствуйте, Roland Deschain!

Данная функция - реализация интерфейса COM по извлечению архива.
STDMETHODIMP определяется как функция, возвращающая HRESULT.

#define STDMETHODIMP HRESULT STDMETHODCALLTYPE
HRESULT - это тип, который в COM используется для возврата результата работы функции
STDMETHODCALLTYPE определяется как __stdcall - стандартный для С способ вызова аргументов
CHandler - класс, метод которого разбирается
IArchiveExtractCallback - это указатель на интерфейс, функции из которого реализуют непосредственно архивацию
Интерфейс - это определение набора функций, в языке С++ в синтаксисе его нет, поэтому интерфейс в нем - абстрактный класс
COM_TRY_BEGIN определяется как try {
В начале функции проверяются аргументы и возвращается E_INVALIDARG при некорректных данных
extractCallback->SetTotal(_packSize); вызывается функция IArchiveExtractCallback
_packSize - член класса CHandler
CMyComPtr<ISequentialOutStr eam> realOutStream; - создается выходной поток
Макрос RINOK определяется как
#define RINOK(x) { HRESULT __result_ = (x); if(__result_ != S_OK) return __result_; }
CXzUnpackerCPP - структура с двумя буферами Byte *InBuf; Byte *OutBuf;

-----
Я ни от чего, ни от кого не завишу.

Ответ отправил: Гаряка Асмик (Профессор)
Ответ отправлен: 28.11.2010, 01:01
Номер ответа: 264364

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264364 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.23 от 23.11.2010

    В избранное