'Return stream object for file data.'

def open(self, inf, psw):

    if inf.file_redir:
        if (inf.file_redir[0] in (RAR5_XREDIR_FILE_COPY, RAR5_XREDIR_HARD_LINK)):
            inf = self.getinfo(inf.file_redir[2])
            if (not inf):
                raise BadRarFile('cannot    find    copied    file')
    if (inf.flags & RAR_FILE_SPLIT_BEFORE):
        raise NeedFirstVolume(('Partial    file,    please    start    from    first    volume:    ' + inf.filename))
    use_hack = 1
    if (not self._main):
        use_hack = 0
    elif self._main._must_disable_hack():
        use_hack = 0
    elif inf._must_disable_hack():
        use_hack = 0
    elif is_filelike(self._rarfile):
        pass
    elif (inf.file_size > HACK_SIZE_LIMIT):
        use_hack = 0
    elif (not USE_EXTRACT_HACK):
        use_hack = 0
    if ((inf.compress_type == RAR_M0) and ((inf.flags & RAR_FILE_PASSWORD) == 0) and (inf.file_redir is None)):
        return self._open_clear(inf)
    elif use_hack:
        return self._open_hack(inf, psw)
    elif is_filelike(self._rarfile):
        return self._open_unrar_membuf(self._rarfile, inf, psw)
    else:
        return self._open_unrar(self._rarfile, inf, psw)
