Bug 2501

Summary: Компас10: Неправильное значение в реестре при установке
Product: [Поддержка проектов] КОМПАС 3D Reporter: Виталий Перов <vitperov>
Component: ТестированиеAssignee: Andrey Vusik <night>
Status: CLOSED FIXED QA Contact: Денис Баранов <baraka>
Severity: minor    
Priority: P2 CC: lav, mais, mx
Version: v10   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания: 2011-02-10
Bug Depends on: 5157    
Bug Blocks: 42, 753, 2482, 5101, 7073    

Description Виталий Перов 2008-09-23 20:40:20 MSD
После установки компаса в реестре по ключу
HKEY_LOCAL_MACHINE\Software\Classes\Installer\Products\F1E4273BF20F3D9449BD8C51932AD7F9\SourceList
значение LastUsedSource должно указывать на директорию, в которой находился источник для установки.
Проверил на винде: путь не содержит имени файла.
В wine - содержит.

Запись туда данного значения скорее всего осуществляется во внутренней функции msi_publish_sourcelist.
Comment 1 Виталий Перов 2008-10-04 16:46:17 MSD
Для записи в реестр пути к последнему источнику msi_publish_sourcelist вызывает функцию msi_set_last_used_source. Туда уже передаётся неправильное значение:
C:\\Kompas3DV10_Demo\\Data1.cab
Comment 2 Виталий Перов 2008-10-04 17:43:26 MSD
Информация берётся из &package->sourcelist_info. А конкретно значение последнего пути находится в sourcelist_info->value

Структуры MSISOURCELISTINFO в MSDN нету. Остаётся только догадываться где же всё-таки должно урезаться имя файла: в функции msi_set_last_used_source или уже в структуре MSISOURCELISTINFO путь не содержит имени файла

package->sourcelist_info это список. Информация туда добавляется с помощью внутренней функции msi_package_add_info. А функция эта вызывается из msi_load_media_info (тоже внутренняя)

Там source берётся из:
source_dir = msi_dup_property(package, cszSourceDir);
Получается, что уже здесь должна быть именно директория, а не путь к файлу

Далее стек вызова функций выглядит следующим образом:
msi_dup_property (внутр)
MSI_GetPropertyW (внутр)
MSI_GetPropertyRow (внутр) она формирует SQL запрос и вызывает:
MSI_QueryGetRecord( package->db, query, name ) (внутр)
далее, думаю копаться бесполезно. Очевидно, что в БД уже содержится неправильное значение
Comment 3 Виталий Перов 2008-10-04 17:54:24 MSD
Вставка значения в БД скорее всего выполняется в функции msi_set_sourcedir_props

в качестве source_dir из БД запрашивается szOriginalDatabase
Далеее оттуда урезается имя файла.
В принципе всё должно работать правильно!
Comment 4 Виталий Перов 2008-10-04 18:32:41 MSD
Провоерил, в БД содержится всё-таки правильное значение:
msi_load_media_info
запрашивает директорию с помощью source_dir = msi_dup_property(package, cszSourceDir);
и получает вполне нормальное значение

Ошибка находится в:

if (file->IsCompressed && mi->cabinet)
    {
        if (mi->cabinet[0] == '#')
        {
            r = writeout_cabinet_stream(package, &mi->cabinet[1], mi->source);
            if (r != ERROR_SUCCESS)
            {
                ERR("Failed to extract cabinet stream\n");
                return ERROR_FUNCTION_FAILED;
            }
        }
        else
            lstrcatW(mi->source, mi->cabinet);
    }

Не знаю должна ли переменная mi->source содержать ещё имя файла в этом случае. По всей видимости должна. Как это проверить в винде - не знаю. Здесь все функции внутренние.

Думаю не стоит трогать mi->source, а брать запись непосредственно из БД.
Comment 5 Виталий Перов 2008-10-04 19:30:05 MSD
Внёс исправления.
При обновлении уже существующей установки всё проходит нормально.
При установке из чистой бутылки программа падает.
Comment 6 Виталий Перов 2008-10-04 20:31:40 MSD
это была моя ошибка. Неправильно выделял память. 

Исправил.
Создал патч.
Протестировал.
Всё работает. В реестр записывается нужное значение
Comment 7 Виталий Перов 2010-03-27 14:31:14 MSK
Откатил патч:

commit 7f67f75d4bb34fb9190aea45acb2edfbae48627f
Author: Vitaly Perov <vitperov@etersoft.ru>
Date:   Sat Oct 24 15:57:40 2009 +0400

    fix eterbug #2501: msi.dll: Fix writting incorrect value to the registry


Думаю он уже не нужен.
Необходимо проверить проявляется ли бага
Comment 8 Виталий Перов 2010-03-27 14:34:35 MSK
Важное замечание: 
сейчас изменение есть только в eterwine, нужно тестировать в eterwine или дождаться пока оно попадёт в eterhack.
Изменение должно появится в eterhack 1.1.42
Comment 9 Денис Баранов 2011-01-05 19:17:56 MSK
Откладываю до работ над 2.0.
Comment 10 Денис Баранов 2011-02-25 20:02:54 MSK
Проверил на WINE@Etersoft School 1.7.0 (который является текущим eterhack) путь содержится без имени файла, т.е. правильный.
Закрываю.