Beispiel #1
0
    def Extract(self, fname):
        if self.libstorm is None:
            return None
        elif not self.mpqh:
            return None

        # Open file
        fileh = c_void_p()
        ret = self.libstorm.SFileOpenFileEx(
            self.mpqh,
            u2b(fname),
            0,
            byref(fileh)
        )
        if not ret:
            return None

        # Get file size & allocate buffer
        # Note : this version only supports 32bit mpq file
        fsize = self.libstorm.SFileGetFileSize(fileh, 0)
        fdata = create_string_buffer(fsize)

        # Read file
        pfread = c_int()
        self.libstorm.SFileReadFile(fileh, fdata, fsize, byref(pfread), 0)
        self.libstorm.SFileCloseFile(fileh)

        if pfread.value == fsize:
            return fdata.raw
        else:
            return None
Beispiel #2
0
    def Extract(self, fname):
        if self.libstorm is None:
            return None
        elif not self.mpqh:
            return None

        # Open file
        fileh = c_void_p()
        ret = self.libstorm.SFileOpenFileEx(self.mpqh, u2b(fname), 0,
                                            byref(fileh))
        if not ret:
            return None

        # Get file size & allocate buffer
        # Note : this version only supports 32bit mpq file
        fsize = self.libstorm.SFileGetFileSize(fileh, 0)
        fdata = create_string_buffer(fsize)

        # Read file
        pfread = c_int()
        self.libstorm.SFileReadFile(fileh, fdata, fsize, byref(pfread), 0)
        self.libstorm.SFileCloseFile(fileh)

        if pfread.value == fsize:
            return fdata.raw
        else:
            return None
Beispiel #3
0
    def AddString(self, string):
        string = ut.u2b(string)  # Starcraft uses multibyte encoding.
        if not isinstance(string, bytes):
            raise ut.EPError('Invalid type for string')

        stringindex = len(self._dataindextb)

        # If duplicate text exist -> just proxy it
        try:
            repr_stringid = self._stringmap[string]
            dataindex = self._dataindextb[repr_stringid]
            self._dataindextb.append(dataindex)
            self._capacity += 2  # just string offset

        # Else -> Create new entry
        except KeyError:
            dataindex = len(self._datatb)
            self._stringmap[string] = stringindex
            self._datatb.append(string)
            self._dataindextb.append(dataindex)
            # string + b'\0' + string offset
            self._capacity += len(string) + 1 + 2

        ut.ep_assert(self._capacity < 65536, 'String table overflow')

        return stringindex
Beispiel #4
0
    def AddString(self, string):
        string = ut.u2b(string)  # Starcraft uses multibyte encoding.
        if not isinstance(string, bytes):
            raise ut.EPError('Invalid type for string')

        stringindex = len(self._dataindextb)

        # If duplicate text exist -> just proxy it
        try:
            repr_stringid = self._stringmap[string]
            dataindex = self._dataindextb[repr_stringid]
            self._dataindextb.append(dataindex)
            self._capacity += 2  # just string offset

        # Else -> Create new entry
        except KeyError:
            dataindex = len(self._datatb)
            self._stringmap[string] = stringindex
            self._datatb.append(string)
            self._dataindextb.append(dataindex)
            # string + b'\0' + string offset
            self._capacity += len(string) + 1 + 2

        ut.ep_assert(self._capacity < 65536, 'String table overflow')

        return stringindex
Beispiel #5
0
    def Extract(self, fname):
        if self.libstorm is None:
            return None
        elif not self.mpqh:
            return None

        # Open file
        fileh = ffi.new("HANDLE*")
        ret = self.libstorm.SFileOpenFileEx(
            self.mpqh,
            u2b(fname),
            0,
            fileh
        )
        if not ret:
            return None
        fileh = fileh[0]

        # Get file size & allocate buffer
        # Note : this version only supports 32bit mpq file
        fsize = self.libstorm.SFileGetFileSize(fileh, ffi.NULL)
        fdata = ffi.new("BYTE[]", fsize)

        # Read file
        pfread = ffi.new("DWORD*")
        self.libstorm.SFileReadFile(fileh, fdata, fsize, pfread, ffi.NULL)
        self.libstorm.SFileCloseFile(fileh)

        if pfread[0] == fsize:
            return ffi.buffer(fdata)[:]
        else:
            return None
Beispiel #6
0
    def Extract(self, fname):
        if self.libstorm is None:
            return None
        elif not self.mpqh:
            return None

        # Open file
        fileh = ffi.new("HANDLE*")
        ret = self.libstorm.SFileOpenFileEx(self.mpqh, u2b(fname), 0, fileh)
        if not ret:
            return None
        fileh = fileh[0]

        # Get file size & allocate buffer
        # Note : this version only supports 32bit mpq file
        fsize = self.libstorm.SFileGetFileSize(fileh, ffi.NULL)
        fdata = ffi.new("BYTE[]", fsize)

        # Read file
        pfread = ffi.new("DWORD*")
        self.libstorm.SFileReadFile(fileh, fdata, fsize, pfread, ffi.NULL)
        self.libstorm.SFileCloseFile(fileh)

        if pfread[0] == fsize:
            return ffi.buffer(fdata)[:]
        else:
            return None
Beispiel #7
0
def epsCompile(filename, bCode):
    filename = u2b(filename)
    output = libeps.compileString(filename, bCode)
    if not output or libeps.getErrorCount():
        return None
    outputStr = c_char_p(output).value
    libeps.freeCompiledResult(output)
    return outputStr
Beispiel #8
0
def epsCompile(filename, bCode):
    filename = u2b(filename)
    output = libeps.compileString(filename, bCode)
    if not output or libeps.getErrorCount():
        return None
    outputStr = c_char_p(output).value
    libeps.freeCompiledResult(output)
    return outputStr
Beispiel #9
0
    def PutFile(self, fname, buffer):
        if not self.mpqh:
            return None

        # Create temporary file
        f = NamedTemporaryFile(delete=False)
        f.write(buffer)
        tmpfname = f.name
        f.close()

        # Add to mpq
        ret = self.libstorm.SFileAddFile(
            self.mpqh,
            u2b(tmpfname),
            u2b(fname),
            MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED | MPQ_FILE_FIX_KEY,
        )
        os.unlink(tmpfname)
        return ret
Beispiel #10
0
    def GetStringIndex(self, string):
        string = ut.u2b(string)
        if not isinstance(string, bytes):
            raise ut.EPError('Invalid type for string')

        try:
            return self._stringmap[string] + 1

        except KeyError:
            return self.AddString(string) + 1
Beispiel #11
0
    def GetStringIndex(self, string):
        string = ut.u2b(string)
        if not isinstance(string, bytes):
            raise ut.EPError('Invalid type for string')

        try:
            return self._stringmap[string] + 1

        except KeyError:
            return self.AddString(string) + 1
Beispiel #12
0
    def PutFile(self, fname, buffer):
        if not self.mpqh:
            return None

        # Create temporary file
        f = NamedTemporaryFile(delete=False)
        f.write(buffer)
        tmpfname = f.name
        f.close()

        # Add to mpq
        ret = self.libstorm.SFileAddFile(
            self.mpqh,
            u2b(tmpfname),
            u2b(fname),
            MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED | MPQ_FILE_FIX_KEY,
        )
        os.unlink(tmpfname)
        return ret
Beispiel #13
0
def f_dbstr_print(dst, *args):
    """Print multiple string / number to dst.

    :param dst: Destination address (Not EPD player)
    :param args: Things to print

    """
    if ut.isUnproxyInstance(dst, DBString):
        dst = dst.GetStringMemoryAddr()

    args = ut.FlattenList(args)
    for arg in args:
        if ut.isUnproxyInstance(arg, bytes):
            dst = f_dbstr_addstr(dst, c.Db(arg + b'\0'))
        elif ut.isUnproxyInstance(arg, str):
            dst = f_dbstr_addstr(dst, c.Db(ut.u2b(arg) + b'\0'))
        elif ut.isUnproxyInstance(arg, DBString):
            dst = f_dbstr_addstr(dst, arg.GetStringMemoryAddr())
        elif ut.isUnproxyInstance(arg, int):
            # int and c.EUDVariable should act the same if possible.
            # EUDVariable has a value of 32bit unsigned integer.
            # So we adjust arg to be in the same range.
            dst = f_dbstr_addstr(dst, c.Db(
                ut.u2b(str(arg & 0xFFFFFFFF)) + b'\0'))
        elif ut.isUnproxyInstance(arg, c.EUDVariable):
            dst = f_dbstr_adddw(dst, arg)
        elif c.IsConstExpr(arg):
            dst = f_dbstr_adddw(dst, arg)
        elif ut.isUnproxyInstance(arg, hptr):
            dst = f_dbstr_addptr(dst, arg._value)
        else:
            raise ut.EPError(
                'Object wit unknown parameter type %s given to f_eudprint.'
                % type(arg)
            )

    return dst
Beispiel #14
0
    def __init__(self, content):
        """Constructor for DBString

        :param content: Initial DBString content / capacity. Capacity of
            DBString is determined by size of this. If content is integer, then
            initial capacity and content of DBString will be set to
            content(int) and empty string.

        :type content: str, bytes, int
        """
        super().__init__()
        if isinstance(content, int):
            self.content = bytes(content)
        else:
            self.content = ut.u2b(content)
Beispiel #15
0
    def __init__(self, content):
        """Constructor for DBString

        :param content: Initial DBString content / capacity. Capacity of
            DBString is determined by size of this. If content is integer, then
            initial capacity and content of DBString will be set to
            content(int) and empty string.

        :type content: str, bytes, int
        """
        super().__init__()
        if isinstance(content, int):
            self.content = bytes(content)
        else:
            self.content = ut.u2b(content)
Beispiel #16
0
def EncodeAIScript(ais, issueError=False):
    ais = ut.unProxy(ais)

    if type(ais) is str:
        ais = ut.u2b(ais)

    if type(ais) is bytes:
        ut.ep_assert(len(ais) >= 4, 'AIScript name too short')

        if len(ais) > 4:
            return ut.b2i4(DefAIScriptDict[ais])

        elif len(ais) == 4:
            return ut.b2i4(ais)

    else:
        return ais
Beispiel #17
0
def EncodeAIScript(ais, issueError=False):
    ais = ut.unProxy(ais)

    if type(ais) is str:
        ais = ut.u2b(ais)

    if type(ais) is bytes:
        ut.ep_assert(len(ais) >= 4, 'AIScript name too short')

        if len(ais) > 4:
            return ut.b2i4(DefAIScriptDict[ais])

        elif len(ais) == 4:
            return ut.b2i4(ais)

    else:
        return ais
Beispiel #18
0
def setEpsGlobals(globalList):
    globalList_C = b'\0'.join(u2b(g) for g in globalList) + b'\0'
    libeps.registerPlibConstants(globalList_C)
Beispiel #19
0
def setEpsGlobals(globalList):
    globalList_C = b'\0'.join(u2b(g) for g in globalList) + b'\0'
    libeps.registerPlibConstants(globalList_C)