StreamTask(MediumIO *pMediumIO, DataStream *pDataStream, Progress *pProgress, const char *pszFormat, MediumVariant_T fMediumVariant) : ThreadTask("StreamTask"), mMediumIO(pMediumIO), mMediumCaller(pMediumIO->m->ptrMedium), m_pDataStream(pDataStream), m_fMediumVariant(fMediumVariant), m_strFormat(pszFormat), mProgress(pProgress), mVirtualBoxCaller(NULL) { AssertReturnVoidStmt(pMediumIO, mRC = E_FAIL); AssertReturnVoidStmt(pDataStream, mRC = E_FAIL); mRC = mMediumCaller.rc(); if (FAILED(mRC)) return; /* Get strong VirtualBox reference, see below. */ VirtualBox *pVirtualBox = pMediumIO->m->ptrVirtualBox; mVirtualBox = pVirtualBox; mVirtualBoxCaller.attach(pVirtualBox); mRC = mVirtualBoxCaller.rc(); if (FAILED(mRC)) return; }
static void PNGAPI png_write_data_fn(png_structp png_ptr, png_bytep p, png_size_t cb) { PNGWriteCtx *pCtx = (PNGWriteCtx *)png_get_io_ptr(png_ptr); LogFlowFunc(("png_ptr %p, p %p, cb %d, pCtx %p\n", png_ptr, p, cb, pCtx)); if (pCtx && RT_SUCCESS(pCtx->rc)) { if (pCtx->cbAllocated - pCtx->cbPNG < cb) { uint32_t cbNew = pCtx->cbPNG + (uint32_t)cb; AssertReturnVoidStmt(cbNew > pCtx->cbPNG && cbNew <= _1G, pCtx->rc = VERR_TOO_MUCH_DATA); cbNew = RT_ALIGN_32(cbNew, 4096) + 4096; void *pNew = RTMemRealloc(pCtx->pu8PNG, cbNew); if (!pNew) { pCtx->rc = VERR_NO_MEMORY; return; } pCtx->pu8PNG = (uint8_t *)pNew; pCtx->cbAllocated = cbNew; } memcpy(pCtx->pu8PNG + pCtx->cbPNG, p, cb); pCtx->cbPNG += (uint32_t)cb; } }