VirtualBox

Ignore:
Timestamp:
Jun 14, 2017 12:13:48 PM (8 years ago)
Author:
vboxsync
Message:

IPRT: More ISO maker code.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/fs/iso9660vfs.cpp

    r67334 r67391  
    16571657}
    16581658
     1659/** Logging helper. */
     1660static char *rtFsIso9660VolGetMaybeUtf16Be(const char *pachField, size_t cchField, char *pszDst, size_t cbDst)
     1661{
     1662    /* Check the format by looking for zero bytes.  ISO-9660 doesn't allow zeros.
     1663       This doesn't have to be a UTF-16BE string.  */
     1664    size_t cFirstZeros  = 0;
     1665    size_t cSecondZeros = 0;
     1666    for (size_t off = 0; off < cchField; off += 2)
     1667    {
     1668        cFirstZeros  += pachField[off]     == '\0';
     1669        cSecondZeros += pachField[off + 1] == '\0';
     1670    }
     1671
     1672    int    rc     = VINF_SUCCESS;
     1673    char  *pszTmp = &pszDst[10];
     1674    size_t cchRet = 0;
     1675    if (cFirstZeros > cSecondZeros)
     1676    {
     1677        /* UTF-16BE / UTC-2BE: */
     1678        if (cchField & 1)
     1679        {
     1680            if (pachField[cchField - 1] == '\0' || pachField[cchField - 1] == ' ')
     1681                cchField--;
     1682            else
     1683                rc = VERR_INVALID_UTF16_ENCODING;
     1684        }
     1685        if (RT_SUCCESS(rc))
     1686        {
     1687            while (   cchField >= 2
     1688                   && pachField[cchField - 1] == ' '
     1689                   && pachField[cchField - 2] == '\0')
     1690                cchField -= 2;
     1691
     1692            rc = RTUtf16BigToUtf8Ex((PCRTUTF16)pachField, cchField / sizeof(RTUTF16), &pszTmp, cbDst - 10 - 1, &cchRet);
     1693        }
     1694        if (RT_SUCCESS(rc))
     1695        {
     1696            pszDst[0] = 'U';
     1697            pszDst[1] = 'T';
     1698            pszDst[2] = 'F';
     1699            pszDst[3] = '-';
     1700            pszDst[4] = '1';
     1701            pszDst[5] = '6';
     1702            pszDst[6] = 'B';
     1703            pszDst[7] = 'E';
     1704            pszDst[8] = ':';
     1705            pszDst[9] = '\'';
     1706            pszDst[10 + cchRet] = '\'';
     1707            pszDst[10 + cchRet + 1] = '\0';
     1708        }
     1709        else
     1710            RTStrPrintf(pszDst, cbDst, "UTF-16BE: %.*Rhxs", cchField, pachField);
     1711    }
     1712    else if (cSecondZeros > 0)
     1713    {
     1714        /* Little endian UTF-16 / UCS-2 (ASSUMES host is little endian, sorry) */
     1715        if (cchField & 1)
     1716        {
     1717            if (pachField[cchField - 1] == '\0' || pachField[cchField - 1] == ' ')
     1718                cchField--;
     1719            else
     1720                rc = VERR_INVALID_UTF16_ENCODING;
     1721        }
     1722        if (RT_SUCCESS(rc))
     1723        {
     1724            while (   cchField >= 2
     1725                   && pachField[cchField - 1] == '\0'
     1726                   && pachField[cchField - 2] == ' ')
     1727                cchField -= 2;
     1728
     1729            rc = RTUtf16ToUtf8Ex((PCRTUTF16)pachField, cchField / sizeof(RTUTF16), &pszTmp, cbDst - 10 - 1, &cchRet);
     1730        }
     1731        if (RT_SUCCESS(rc))
     1732        {
     1733            pszDst[0] = 'U';
     1734            pszDst[1] = 'T';
     1735            pszDst[2] = 'F';
     1736            pszDst[3] = '-';
     1737            pszDst[4] = '1';
     1738            pszDst[5] = '6';
     1739            pszDst[6] = 'L';
     1740            pszDst[7] = 'E';
     1741            pszDst[8] = ':';
     1742            pszDst[9] = '\'';
     1743            pszDst[10 + cchRet] = '\'';
     1744            pszDst[10 + cchRet + 1] = '\0';
     1745        }
     1746        else
     1747            RTStrPrintf(pszDst, cbDst, "UTF-16LE: %.*Rhxs", cchField, pachField);
     1748    }
     1749    else
     1750    {
     1751        /* ASSUME UTF-8/ASCII. */
     1752        while (   cchField > 0
     1753               && pachField[cchField - 1] == ' ')
     1754            cchField--;
     1755        int rc = RTStrValidateEncodingEx(pachField, cchField, RTSTR_VALIDATE_ENCODING_EXACT_LENGTH);
     1756        if (RT_SUCCESS(rc))
     1757            RTStrPrintf(pszDst, cbDst, "UTF-8: '%.*s'", cchField, pachField);
     1758        else
     1759            RTStrPrintf(pszDst, cbDst, "UNK-8: %.*Rhxs", cchField, pachField);
     1760    }
     1761    return pszDst;
     1762}
     1763
    16591764
    16601765/**
     
    16671772    if (LogIs2Enabled())
    16681773    {
     1774        char szTmp[384];
    16691775        Log2(("ISO9660:  fVolumeFlags:              %#RX8\n", pVolDesc->fVolumeFlags));
    1670         Log2(("ISO9660:  achSystemId:               '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achSystemId, sizeof(pVolDesc->achSystemId)), pVolDesc->achSystemId));
    1671         Log2(("ISO9660:  achVolumeId:               '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achVolumeId, sizeof(pVolDesc->achVolumeId)), pVolDesc->achVolumeId));
     1776        Log2(("ISO9660:  achSystemId:               %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achSystemId, sizeof(pVolDesc->achSystemId), szTmp, sizeof(szTmp)) ));
     1777        Log2(("ISO9660:  achVolumeId:               %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achVolumeId, sizeof(pVolDesc->achVolumeId), szTmp, sizeof(szTmp)) ));
    16721778        Log2(("ISO9660:  Unused73:                  {%#RX32,%#RX32}\n", RT_BE2H_U32(pVolDesc->Unused73.be), RT_LE2H_U32(pVolDesc->Unused73.le)));
    16731779        Log2(("ISO9660:  VolumeSpaceSize:           {%#RX32,%#RX32}\n", RT_BE2H_U32(pVolDesc->VolumeSpaceSize.be), RT_LE2H_U32(pVolDesc->VolumeSpaceSize.le)));
     
    16811787        Log2(("ISO9660:  offTypeMPathTable:         %#RX32\n", RT_BE2H_U32(pVolDesc->offTypeMPathTable)));
    16821788        Log2(("ISO9660:  offOptionalTypeMPathTable: %#RX32\n", RT_BE2H_U32(pVolDesc->offOptionalTypeMPathTable)));
    1683         Log2(("ISO9660:  achVolumeSetId:            '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achVolumeSetId, sizeof(pVolDesc->achVolumeSetId)), pVolDesc->achVolumeSetId));
    1684         Log2(("ISO9660:  achPublisherId:            '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achPublisherId, sizeof(pVolDesc->achPublisherId)), pVolDesc->achPublisherId));
    1685         Log2(("ISO9660:  achDataPreparerId:         '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achDataPreparerId, sizeof(pVolDesc->achDataPreparerId)), pVolDesc->achDataPreparerId));
    1686         Log2(("ISO9660:  achApplicationId:          '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achApplicationId, sizeof(pVolDesc->achApplicationId)), pVolDesc->achApplicationId));
    1687         Log2(("ISO9660:  achCopyrightFileId:        '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achCopyrightFileId, sizeof(pVolDesc->achCopyrightFileId)), pVolDesc->achCopyrightFileId));
    1688         Log2(("ISO9660:  achAbstractFileId:         '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achAbstractFileId, sizeof(pVolDesc->achAbstractFileId)), pVolDesc->achAbstractFileId));
    1689         Log2(("ISO9660:  achBibliographicFileId:    '%.*s'\n", rtFsIso9660VolGetStrippedLength(pVolDesc->achBibliographicFileId, sizeof(pVolDesc->achBibliographicFileId)), pVolDesc->achBibliographicFileId));
     1789        Log2(("ISO9660:  achVolumeSetId:            %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achVolumeSetId, sizeof(pVolDesc->achVolumeSetId), szTmp, sizeof(szTmp)) ));
     1790        Log2(("ISO9660:  achPublisherId:            %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achPublisherId, sizeof(pVolDesc->achPublisherId), szTmp, sizeof(szTmp)) ));
     1791        Log2(("ISO9660:  achDataPreparerId:         %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achDataPreparerId, sizeof(pVolDesc->achDataPreparerId), szTmp, sizeof(szTmp)) ));
     1792        Log2(("ISO9660:  achApplicationId:          %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achApplicationId, sizeof(pVolDesc->achApplicationId), szTmp, sizeof(szTmp)) ));
     1793        Log2(("ISO9660:  achCopyrightFileId:        %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achCopyrightFileId, sizeof(pVolDesc->achCopyrightFileId), szTmp, sizeof(szTmp)) ));
     1794        Log2(("ISO9660:  achAbstractFileId:         %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achAbstractFileId, sizeof(pVolDesc->achAbstractFileId), szTmp, sizeof(szTmp)) ));
     1795        Log2(("ISO9660:  achBibliographicFileId:    %s\n", rtFsIso9660VolGetMaybeUtf16Be(pVolDesc->achBibliographicFileId, sizeof(pVolDesc->achBibliographicFileId), szTmp, sizeof(szTmp)) ));
    16901796        Log2(("ISO9660:  BirthTime:                 %.4s-%.2s-%.2s %.2s:%.2s:%.2s.%.2s%+03d\n",
    16911797              pVolDesc->BirthTime.achYear,
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette