Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 2013 - Не реализована функция в mlang   Make a simular bug
Summary: Не реализована функция в mlang
Status: CLOSED FIXED
Alias: None
Product: WINE@Etersoft
Classification: Продукты (Products)
Component: Обработка текста и локали; Буфер (show other bugs)
Version: 1.0.10
Hardware: PC All
: P4 minor
Target Milestone: ---
Assignee: Виталий Перов
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 42
  Show dependency treegraph
 
In work:
Reported: 2008-06-27 22:19 MSD by Vitaly Lipatov
Modified: 2010-03-22 13:02 MSK (History)
2 users (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Vitaly Lipatov 2008-06-27 22:19:18 MSD
Надо реализовать функцию в mlang:
fixme:mlang:fnIMLangFontLink_GetStrCodePages (pszSrc=L"до нашей эры", cchSrc=12, dwPriorityCodePages=0) stub

Это при запуске программы из состава КМ-Школы
[test@euclid Client]$ wine ArchitectureTimeline.exe
Comment 1 Виталий Перов 2008-06-28 18:33:49 MSD
для начала требуется реализовать fnIMLangFontLink_GetCharCodePages для полученя codePages, к которым относится данный символ.
Думаю, надо проверять принадлежность символа к различным диапазонам, в соответствии с http://msdn.microsoft.com/en-us/library/ms776439(VS.85).aspx
Comment 2 Виталий Перов 2008-06-28 19:28:22 MSD
Думаю, подойдёт структура типа:

typedef struct
{
DWORD From;
DWORD To;
DWORD CodePage;
} CHARSET_BYTERANGES;

#define MAXCHBRNDEX 2
static const CHARSET_BYTERANGES CH_BR[MAXCHBRNDEX] = {
{0x0000, 0x007F, 0},   /* Basic Latin */
{0x0080, 0x00FF, 1}    /* Latin-1 Supplement */
};

Для начала надо заполнить только для основных используемых кодовых страниц (русский + английский язык)
Comment 3 Виталий Перов 2008-06-29 14:50:29 MSD
не всё так просто, как казалось изначально.
надо возвращать codePage из таблицы http://msdn.microsoft.com/en-us/library/ms776441(VS.85).aspx
Такого понятия, как диапазона символов, как я понял, там в принципе не существует.
Ведь есть такие символы, как пробел, содержащиеся почти во всех кодировках.
Comment 4 Виталий Перов 2008-06-30 14:46:29 MSD
ерунда какая-то:
Передаём функции IMLangFontLink_GetCharCodePages посимвольно строку:
static const WCHAR str[] = {'D','.',' ','Р','д',0};

При искользовании виндовой mlang.dll получаем:
[0] returned 2032127 (1f01ff)
[1] returned 2032127 (1f01ff)
[2] returned 2032127 (1f01ff)
[3] returned 0 (0)
[4] returned 0 (0)

При тестировании на win2k3 тест выдаёт тоже самое!

Странно, почему для русских символов возвращается ноль
Comment 5 Анатолий Лютин 2008-06-30 15:42:52 MSD
(In reply to comment #4)
> ерунда какая-то:
> Передаём функции IMLangFontLink_GetCharCodePages
> посимвольно строку:
> static const WCHAR str[] = {'D','.',' ','Р','д',0};
> 
> При искользовании виндовой mlang.dll получаем:
> [0] returned 2032127 (1f01ff)
> [1] returned 2032127 (1f01ff)
> [2] returned 2032127 (1f01ff)
> [3] returned 0 (0)
> [4] returned 0 (0)
> 
> При тестировании на win2k3 тест выдаёт тоже
> самое!
> 
> Странно, почему для русских символов
> возвращается ноль
> 

Это может зависить от установленного LocaleID
Comment 6 Виталий Перов 2008-07-01 13:46:24 MSD
> 
> Это может зависить от установленного LocaleID
> 

Я с этим сталкиваюсь первый раз. И как его изменить?
В качестве параметра LCID не передаётся.

Пробовал WINEDLLOVERRIDES="mlang=n" LANG=ru_RU.UTF-8 ww mlang_test.exe.so - ничего не изменилось.

Искал в коде wine: есть только GetLocaleID. Set нет.

Comment 7 Виталий Перов 2008-07-01 15:49:14 MSD
Для двухбайтных юникодных символов, таких как U+9D5D, функция fnIMLangFontLink_GetCharCodePages выдаёт не нулевое значение.
А для однобайтных символов всегда выдаёт 0.
Comment 8 Виталий Перов 2008-07-01 16:01:36 MSD
Если временно не обращать внимания на проблему с возвращаемым нулём, то можно реализовать GetCharCodePages следующим образом:
на странице http://www.microsoft.com/globaldev/reference/WinCP.mspx есть список кодировок, и символов, принадлежащей к кадой.
Для каздой кодовой страницы создаём функцию (например IMLangFontLink_Is1251), которая пробегается по своей таблице, и ищет требуемый символ.
функция fnIMLangFontLink_GetCharCodePages должна вызывать каждую такую функцию, и в случае, если символ найден, выставлять в dwCodePages соответствующий бит.
Comment 9 Виталий Перов 2008-07-01 16:06:44 MSD
> 
> А для однобайтных символов всегда выдаёт 0.
> 
Всегда, кроме случая, когда символ латинского алфавита
Comment 10 Vitaly Lipatov 2008-07-01 16:28:33 MSD
Ты просто неправильно задаёшь строку WCHAR.
Для WCHAR не бывает никаких однобайтных символов.
Поэтому если ты хочешь задать русскую букву в WCHAR, не надо писать 'р', пиши её код в юникоде.
Comment 11 Виталий Перов 2008-07-01 18:17:49 MSD
Наконец-то разобрался. В Си юникодные символы указываются как 0x0427.
А так неправильно: '\0427','\u0427','U'+0x0427

При этом возвращается:
[5] returned 917508 (e0004) b'00000000000011100000000000000100'
Comment 12 Анатолий Лютин 2008-07-02 11:50:54 MSD
(In reply to comment #6)
> > 
> > Это может зависить от установленного LocaleID
> > 
> 
> Я с этим сталкиваюсь первый раз. И как его
> изменить?
> В качестве параметра LCID не передаётся.
> 
> Пробовал WINEDLLOVERRIDES="mlang=n" LANG=ru_RU.UTF-8 ww
> mlang_test.exe.so - ничего не изменилось.
> 
> Искал в коде wine: есть только GetLocaleID. Set нет.
> 

Если это ещё актуально, то :
BOOL WINAPI SetLocaleInfoW( LCID lcid, LCTYPE lctype, LPCWSTR data )
Comment 13 Анатолий Лютин 2008-07-02 11:52:45 MSD
(In reply to comment #12)
> Если это ещё актуально, то :
> BOOL WINAPI SetLocaleInfoW( LCID lcid, LCTYPE lctype, LPCWSTR data )
> 

Или, допустим :
BOOL        WINAPI SetThreadLocale(LCID);
Comment 14 Виталий Перов 2008-07-02 19:12:42 MSD
(In reply to comment #12)
> 
> Если это ещё актуально, то :
> BOOL WINAPI SetLocaleInfoW( LCID lcid, LCTYPE lctype, LPCWSTR data )
> 

Спасибо. В будущем пригодится
Comment 15 Виталий Перов 2008-07-02 19:15:38 MSD
IMLangFontLink_GetStrCodePages реализована!

Проверил ArchitectureTimeline.exe - почти ничего не изменилось

Думаю надо ещё рано коммитить в school. Сначала необходимо написать несколько тестов, и убедится, что всё правильно работает
Comment 16 Виталий Перов 2008-07-04 17:29:18 MSD
Полностью переписал IMLangFontLink_GetCharCodePages.
Сделал для неё тесты - проходят
Сделал тесты для IMLangFontLink_GetStrCodePages - некоторые не проходят.
Необходимо ещё немного подправить, и всё будет почти идеально работать.
Comment 17 Виталий Перов 2008-07-14 13:26:33 MSD
В текущей сборке патч приложен.
Comment 18 Виталий Перов 2008-10-29 18:06:57 MSK
Переписал патч и тест. Отправил в wine
Comment 19 Виталий Перов 2008-11-24 21:35:04 MSK
Патч пока не принимают. Нельзя напрямую использовать внутренние структуры даных.

Требуется переписать с использованием функций EnumSystemCodePages/GetCPInfo/MultiByteToWideChar

Переписал с использованием MultiByteToWideChar (используется для определения того принадлежит ли данный символ выбранной кодовой странице)

По-правильному для перечисления кодовых страниц нужно использовать EnumSystemCodePages, но данная функция подразумевает наличие callback функции, которую она каждый раз вызывает чтобы вернуть НАЗВАНИЕ (строка) очередной кодовой страницы.
Но как в функции GetCharCodePages получить данные, которые были переданы в callback - функцию? Единственный способ - глобальные переменные. Но это не совсем хорошо.
Ничего не остаётся, как всё-таки использовать в этом месте внутреннюю функцию wine_cp_enum_table.
Comment 20 Виталий Перов 2008-11-27 17:52:53 MSK
Переписал. Протестировал.
Получается:
1111110000000111111111
Должно быть:
0111110000000111111111

Ставится 1 лишний бит, относящийся к кодировке 1361 Korean (Johab)

Надо ещё проверить на чистом wine, я помню, у нас были какие-то изменения в кодировок.

Можно просто игнорировать данную кодировку, но на каком основании это можно сделать - я не знаю. Если всё же её игнорировать, то все тесты успешно проходятся
Comment 21 Виталий Перов 2008-11-27 17:54:53 MSK
Хотелось бы увидеть исправление в виде принятого в wine патча.
Поэтому открываю повторно.
Comment 22 Виталий Перов 2008-11-27 19:13:15 MSK
Проверил на чистом wine - бит ставится.

Очевидно, что кодировка 1361 не должна проверятся, но как это объяснить?
Comment 23 Виталий Перов 2008-11-27 20:08:45 MSK
Сделал патч с указанными исправлениями. Отправил.
Comment 24 Виталий Перов 2008-11-27 21:40:15 MSK
Переписал патч с учётом:
1) использование локальной структуры mlang_data вместо вызова внутренней функции
wine_cp_enum_table.
2) использование макроса вместо вызова "iface->lpVtbl->...."

В итоге реализация функции получилась намного правильнее, исчез пропуск кодировки 1361.
Comment 25 Виталий Перов 2008-12-01 13:00:29 MSK
Патч на MLangFontLink_GetCharCodePages приняли.
Требуется переделать патч и тест на MLangFontLink_GetStrCodePages
Comment 26 Виталий Перов 2008-12-01 15:16:31 MSK
Переписал тесты.
Добавил тесты на неправильные аргументы.
При текущей реализации проваливаются 3 теста.
Comment 27 Виталий Перов 2008-12-01 16:49:32 MSK
Исправил реализацию. Все тесты проходят.
Comment 28 Виталий Перов 2010-03-06 17:03:21 MSK
В текущей версии eterhack реализация присутствует.