Ejemplo n.º 1
0
    def fromvalidatedwalker(cls, w, **kwArgs):
        """
        Like fromwalker(), this method returns a new OS_2. However, it also
        does extensive validation via the logging module (the client should
        have done a logging.basicConfig call prior to calling this method,
        unless a logger is passed in via the 'logger' keyword argument).
        """

        logger = kwArgs.get('logger', None)
        assert logger is not None  # we're only called via factory

        logger.debug(
            ('V0001', (w.length(), ), "Walker has %d remaining bytes."))

        if w.length() < 68:
            logger.error(('E2127', (), "Insufficient bytes"))
            return None

        ver = w.unpack("H")

        if ver != 0:
            logger.error(('V0002', (), "Expected version 0"))
            return None

        v = [ver]
        okToReturn = True
        v.extend(w.unpack("H2h"))
        obj = typeflags_v0.TypeFlags.fromvalidatedwalker(w, **kwArgs)

        if obj is None:
            okToReturn = False

        v.append(obj)
        v.extend(w.unpack("10hH"))
        obj = panose.Panose_validated(w, os2panver=0, **kwArgs)

        if obj is None:
            okToReturn = False

        v.append(obj)
        v.append(w.unpack("16x4s"))
        obj = selection_v0.Selection.fromvalidatedwalker(w, **kwArgs)

        if obj is None:
            okToReturn = False

        v.append(obj)
        v.extend(w.unpack("2H"))
        return (cls(*v) if okToReturn else None)
Ejemplo n.º 2
0
    def fromvalidatedwalker(cls, w, **kwArgs):
        """
        Like fromwalker(), this method returns a new OS_2. However, it also
        does extensive validation via the logging module (the client should
        have done a logging.basicConfig call prior to calling this method,
        unless a logger is passed in via the 'logger' keyword argument).
        """

        logger = kwArgs.get('logger', None)
        assert logger is not None  # we're only called via factory

        logger.debug(
            ('V0001', (w.length(), ), "Walker has %d remaining bytes."))

        if w.length() < 100:
            logger.error(('E2127', (), "Insufficient bytes"))
            return None

        ver = w.unpack("H")

        if ver != 5:
            logger.error(('V0002', (), "Expected version 5"))
            return None

        v = [ver]
        okToReturn = True
        v.extend(w.unpack("H2h"))
        v.append(typeflags_v3.TypeFlags.fromvalidatedwalker(w, **kwArgs))

        if v[-1] is None:
            okToReturn = False

        v.extend(w.unpack("10hH"))
        v.append(panose.Panose_validated(w, **kwArgs))

        if v[-1] is None:
            okToReturn = False

        v.append(
            unicoderanges_v4.UnicodeRanges.fromvalidatedwalker(w, **kwArgs))

        if v[-1] is None:
            okToReturn = False

        v.append(w.unpack("4s"))
        v.append(selection_v4.Selection.fromvalidatedwalker(w, **kwArgs))

        if v[-1] is None:
            okToReturn = False

        v.extend(w.unpack("2H3h2H"))

        v.append(
            codepageranges_v2.CodePageRanges.fromvalidatedwalker(w, **kwArgs))

        if v[-1] is None:
            okToReturn = False

        v.extend(w.unpack("2h3H"))
        v.extend(n / 20 for n in w.unpack("2H"))
        return (cls(*v) if okToReturn else None)
Ejemplo n.º 3
0
    def fromvalidatedwalker(cls, w, **kwArgs):
        r"""
        Like fromwalker(), this method returns a new OS_2. However, it also
        does extensive validation via the logging module (the client should
        have done a logging.basicConfig call prior to calling this method,
        unless a logger is passed in via the 'logger' keyword argument).
        
        >>> fvw = OS_2.fromvalidatedbytes
        >>> logger = utilities.makeDoctestLogger("OS/2")
        >>> s = _testingValues[1].binaryString()
        >>> obj = fvw(s, logger=logger)
        OS/2 - DEBUG - Walker has 96 remaining bytes.
        >>> sbad = s[0:62] + b'\x12\x02' + s[64:]  # bad fsSelection
        >>> obj = fvw(sbad, logger=logger)
        OS/2 - DEBUG - Walker has 96 remaining bytes.
        OS/2.fsselection - ERROR - All reserved bits should be set to 0, but some are 1.
        """

        logger = kwArgs.get('logger', None)
        assert logger is not None  # we're only called via factory

        logger.debug(
            ('V0001', (w.length(), ), "Walker has %d remaining bytes."))

        if w.length() < 96:
            logger.error(('E2127', (), "Insufficient bytes"))
            return None

        ver = w.unpack("H")

        if ver != 4:
            logger.error(('V0002', (), "Expected version 4"))
            return None

        v = [ver]
        okToReturn = True
        v.extend(w.unpack("H2h"))
        v.append(typeflags_v3.TypeFlags.fromvalidatedwalker(w, **kwArgs))

        if v[-1] is None:
            okToReturn = False

        v.extend(w.unpack("10hH"))
        v.append(panose.Panose_validated(w, **kwArgs))

        if v[-1] is None:
            okToReturn = False

        v.append(
            unicoderanges_v4.UnicodeRanges.fromvalidatedwalker(w, **kwArgs))

        if v[-1] is None:
            okToReturn = False

        v.append(w.unpack("4s"))
        v.append(selection_v4.Selection.fromvalidatedwalker(w, **kwArgs))

        if v[-1] is None:
            okToReturn = False

        v.extend(w.unpack("2H3h2H"))

        v.append(
            codepageranges_v2.CodePageRanges.fromvalidatedwalker(w, **kwArgs))

        if v[-1] is None:
            okToReturn = False

        v.extend(w.unpack("2h3H"))
        return (cls(*v) if okToReturn else None)