For installers which follow the Microsoft Installer standard, returns
        a list of patches applied.

        Returns:
            value (list): Long name of the patch.

def list_patches(self):
        '''
        For installers which follow the Microsoft Installer standard, returns
        a list of patches applied.

        Returns:
            value (list): Long name of the patch.
        '''
        if not self.__squid:
            # Must have a valid squid for an upgrade code to exist
            return []

        if self.__patch_list is None:
            # Read in the upgrade codes in this section of the reg.
            try:
                pat_all_handle = win32api.RegOpenKeyEx(getattr(win32con, self.__reg_hive),  # pylint: disable=no-member
                                                       self.__reg_patches_path,
                                                       0,
                                                       win32con.KEY_READ | self.__reg_32bit_access)
            except pywintypes.error as exc:  # pylint: disable=no-member
                if exc.winerror == winerror.ERROR_FILE_NOT_FOUND:
                    # Not Found
                    log.warning(
                        'Not Found %s\\%s 32bit %s',
                        self.__reg_hive,
                        self.__reg_patches_path,
                        self.__reg_32bit
                    )
                    return []
                raise

            pc_sub_key_cnt, _, _ = win32api.RegQueryInfoKey(pat_all_handle)  # pylint: disable=no-member
            if not pc_sub_key_cnt:
                return []
            squid_patch_all, _, _, _ = zip(*win32api.RegEnumKeyEx(pat_all_handle))  # pylint: disable=no-member

            ret = []
            # Scan the patches for the DisplayName of active patches.
            for patch_squid in squid_patch_all:
                try:
                    patch_squid_handle = win32api.RegOpenKeyEx(  # pylint: disable=no-member
                            pat_all_handle,
                            patch_squid,
                            0,
                            win32con.KEY_READ | self.__reg_32bit_access)
                    patch_display_name, patch_display_name_type = \
                        self.__reg_query_value(patch_squid_handle, 'DisplayName')
                    patch_state, patch_state_type = self.__reg_query_value(patch_squid_handle, 'State')
                    if (patch_state_type != win32con.REG_DWORD or
                            not isinstance(patch_state_type, six.integer_types) or
                            patch_state != 1 or   # 1 is Active, 2 is Superseded/Obsolute
                            patch_display_name_type != win32con.REG_SZ):
                        continue
                    win32api.RegCloseKey(patch_squid_handle)  # pylint: disable=no-member
                    ret.append(patch_display_name)
                except pywintypes.error as exc:  # pylint: disable=no-member
                    if exc.winerror == winerror.ERROR_FILE_NOT_FOUND:
                        log.debug('skipped patch, not found %s', patch_squid)
                        continue
                    raise

        return ret