コード例 #1
0
ファイル: bulk.c プロジェクト: davidleake/FreeRDP
int bulk_compress(rdpBulk* bulk, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize, UINT32* pFlags)
{
    int status = -1;
    rdpMetrics* metrics;
    UINT32 CompressedBytes;
    UINT32 UncompressedBytes;
    double CompressionRatio;
    metrics = bulk->context->metrics;

    if ((SrcSize <= 50) || (SrcSize >= 16384))
    {
        *ppDstData = pSrcData;
        *pDstSize = SrcSize;
        return 0;
    }

    *ppDstData = bulk->OutputBuffer;
    *pDstSize = sizeof(bulk->OutputBuffer);
    bulk_compression_level(bulk);
    bulk_compression_max_size(bulk);

    if ((bulk->CompressionLevel == PACKET_COMPR_TYPE_8K) ||
            (bulk->CompressionLevel == PACKET_COMPR_TYPE_64K))
    {
        mppc_set_compression_level(bulk->mppcSend, bulk->CompressionLevel);
        status = mppc_compress(bulk->mppcSend, pSrcData, SrcSize, ppDstData, pDstSize, pFlags);
    }
    else if (bulk->CompressionLevel == PACKET_COMPR_TYPE_RDP6)
    {
        status = ncrush_compress(bulk->ncrushSend, pSrcData, SrcSize, ppDstData, pDstSize, pFlags);
    }
    else if (bulk->CompressionLevel == PACKET_COMPR_TYPE_RDP61)
    {
        status = xcrush_compress(bulk->xcrushSend, pSrcData, SrcSize, ppDstData, pDstSize, pFlags);
    }
    else
    {
        status = -1;
    }

    if (status >= 0)
    {
        CompressedBytes = *pDstSize;
        UncompressedBytes = SrcSize;
        CompressionRatio = metrics_write_bytes(metrics, UncompressedBytes, CompressedBytes);
#ifdef WITH_BULK_DEBUG
        {
            DEBUG_MSG("Compress Type: %d Flags: %s (0x%04X) Compression Ratio: %f (%d / %d), Total: %f (%u / %u)\n",
                      bulk->CompressionLevel, bulk_get_compression_flags_string(*pFlags), *pFlags,
                      CompressionRatio, CompressedBytes, UncompressedBytes,
                      metrics->TotalCompressionRatio, (UINT32) metrics->TotalCompressedBytes,
                      (UINT32) metrics->TotalUncompressedBytes);
        }
#endif
    }

#if 0

    if (bulk_compress_validate(bulk, pSrcData, SrcSize, ppDstData, pDstSize, pFlags) < 0)
        status = -1;

#endif
    return status;
}
コード例 #2
0
ファイル: xcrush.c プロジェクト: BrianChangchien/FiWoRDC
int xcrush_compress(XCRUSH_CONTEXT* xcrush, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize, UINT32* pFlags)
{
	int status = 0;
	UINT32 DstSize = 0;
	BYTE* pDstData = NULL;
	BYTE* CompressedData = NULL;
	UINT32 CompressedDataSize = 0;
	BYTE* OriginalData = NULL;
	UINT32 OriginalDataSize = 0;
	UINT32 Level1ComprFlags = 0;
	UINT32 Level2ComprFlags = 0;
	UINT32 CompressionLevel = 3;

	if (SrcSize > 16384)
		return -1001;

	if ((SrcSize + 2) > *pDstSize)
		return -1002;

	OriginalData = *ppDstData;
	OriginalDataSize = SrcSize;

	pDstData = xcrush->BlockBuffer;
	CompressedDataSize = SrcSize;

	status = xcrush_compress_l1(xcrush, pSrcData, SrcSize, &pDstData, &CompressedDataSize, &Level1ComprFlags);

	if (status < 0)
		return status;

	if (Level1ComprFlags & L1_COMPRESSED)
	{
		CompressedData = pDstData;

		if (CompressedDataSize > SrcSize)
			return -1003;
	}
	else
	{
		CompressedData = pSrcData;

		if (CompressedDataSize != SrcSize)
			return -1004;
	}

	status = 0;

	pDstData = &OriginalData[2];
	DstSize = OriginalDataSize - 2;

	if (CompressedDataSize > 50)
	{
		status = mppc_compress(xcrush->mppc, CompressedData, CompressedDataSize, &pDstData, &DstSize, &Level2ComprFlags);
	}

	if (status < 0)
		return status;

	if (!status || (Level2ComprFlags & PACKET_FLUSHED))
	{
		if (CompressedDataSize > DstSize)
		{
			xcrush_context_reset(xcrush, TRUE);
			*ppDstData = pSrcData;
			*pDstSize = SrcSize;
			*pFlags = 0;
			return 1;
		}

		DstSize = CompressedDataSize;
		CopyMemory(&OriginalData[2], CompressedData, CompressedDataSize);
	}

	if (Level2ComprFlags & PACKET_COMPRESSED)
	{
		Level2ComprFlags |= xcrush->CompressionFlags;
		xcrush->CompressionFlags = 0;
	}
	else if (Level2ComprFlags & PACKET_FLUSHED)
	{
		xcrush->CompressionFlags = PACKET_FLUSHED;
	}

	Level1ComprFlags |= L1_INNER_COMPRESSION;

	OriginalData[0] = (BYTE) Level1ComprFlags;
	OriginalData[1] = (BYTE) Level2ComprFlags;

#if 0
	WLog_DBG(TAG, "XCrushCompress: Level1ComprFlags: %s Level2ComprFlags: %s",
			xcrush_get_level_1_compression_flags_string(Level1ComprFlags),
			xcrush_get_level_2_compression_flags_string(Level2ComprFlags));
#endif

	if (*pDstSize < (DstSize + 2))
		return -1006;

	*pDstSize = DstSize + 2;
	*pFlags = PACKET_COMPRESSED | CompressionLevel;

	return 1;
}
コード例 #3
0
ファイル: bulk.c プロジェクト: ryancalhoun/FreeRDP
int bulk_compress(rdpBulk* bulk, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize, UINT32* pFlags)
{
    int status = -1;
    UINT32 CompressedBytes;
    UINT32 UncompressedBytes;

    if ((SrcSize <= 50) || (SrcSize >= 16384))
    {
        *ppDstData = pSrcData;
        *pDstSize = SrcSize;
        return 0;
    }

    *ppDstData = bulk->OutputBuffer;
    *pDstSize = sizeof(bulk->OutputBuffer);

    bulk_compression_level(bulk);
    bulk_compression_max_size(bulk);

    if (bulk->CompressionLevel < PACKET_COMPR_TYPE_RDP6)
    {
        mppc_set_compression_level(bulk->mppcSend, bulk->CompressionLevel);
        status = mppc_compress(bulk->mppcSend, pSrcData, SrcSize, ppDstData, pDstSize, pFlags);
    }
    else
    {
        status = ncrush_compress(bulk->ncrushSend, pSrcData, SrcSize, ppDstData, pDstSize, pFlags);
    }

    if (status >= 0)
    {
        CompressedBytes = *pDstSize;
        UncompressedBytes = SrcSize;

        bulk->TotalUncompressedBytes += UncompressedBytes;
        bulk->TotalCompressedBytes += CompressedBytes;

#ifdef WITH_BULK_DEBUG
        {
            UINT32 type;
            double CompressionRatio;
            double TotalCompressionRatio;

            type = bulk->CompressionLevel;

            CompressionRatio = ((double) CompressedBytes) / ((double) UncompressedBytes);
            TotalCompressionRatio = ((double) bulk->TotalCompressedBytes) / ((double) bulk->TotalUncompressedBytes);

            printf("Compress Type: %d Flags: %s (0x%04X) Compression Ratio: %f (%d / %d), Total: %f (%d / %d)\n",
                   type, bulk_get_compression_flags_string(*pFlags), *pFlags,
                   CompressionRatio, CompressedBytes, UncompressedBytes,
                   TotalCompressionRatio, bulk->TotalCompressedBytes, bulk->TotalUncompressedBytes);
        }
#endif
    }

#if 0
    if (bulk_compress_validate(bulk, pSrcData, SrcSize, ppDstData, pDstSize, pFlags) < 0)
        status = -1;
#endif

    return status;
}