Open Source
English version
 
Вход для участников
 
Техническое задание 20030430

ТЗ RFC 20030430


Содержание

  1. Термины и определения
  2. Описание клиента
  3. Состав клиента
  4. Виджеты
  5. Содержание UIML форм
  6. Запуск клиента
  7. Поведение клиента
  8. Поведение сервера
  9. Протокол общения

1. Термины и определения

Клиент
Программа, выполняемая на клиентской машине (UIML-клиент или UIML-терминал)
Сервер
Программа, выполняемая на сервере, обслуживающем UIML-клиентов (UIML-сервер или Сервер Клиентов). Не путать с сервером приложений.
Форма
Форма ввода и вывода данных.
Событие
Изменение параметра или значения поля, влияющее на бизнес-логику (?)

2. Описание клиента

Основные принципы работы Клиента с Сервером:

  1. Клиент занимается визуализацией интерфейса с пользователем; только он и только этим
  2. Клиентом выступает или standalone-приложение, или web-сервер, работающий, в свою очередь, с web-терминалами.
  3. Клиент работает только с сервером
  4. Формат обмена - только UIML
  5. Протокол обена - симплекс
  6. Инициатор обмена - клиент
  7. Клиент работает с периферией самостоятельно
  8. Скаждым типом периферии - по-своему
  9. Клиент не вмешивается в бизнес логику и не принимает решений, влияющих на логику приложения.
  10. Всей логикой занимается Сервер
  11. Клиент умеет самостоятельной обработки большей части тривиальных событий (проводить навигацию по форме, редактировать поля, показывать Tips, менять форму курсора мышки, менять размеры изменяемых полей, даже делать быстрый поиск по списку), т.е. событий, не влияющих на бизнес-логику и не зависящих от неё.
  12. Клиентможет высылатьзначения полей как по одному, так и все поля формы сразу.
  13. ...

3. Состав клиента

Клиент, как binary, включает:

  1. Запускающий модуль
  2. Рендерер UIML
  3. * Пачку стандартных методов, вызываемых из Форм, при наступлении События
  4. Модули (plug-ins) поддержки протоколов передачи/приема.

Общая структура системы приведена на рис.1.
Общая структура клиентской части приведена на рис.2.
Структура клиентской части приведена на рис.3.
Структура UIML-терминала приведена на рис.4.
Здесь:

GUI
Собственно графическая подсистема текущей ОС.
Gfx-lib
Мобильная графическая библиотека.
Model
Пакет объектов - модель того, что отображается. Собственно он и работает с пользователем до тех пор, пока не случится Событие.
Parser
Модуль, обрабатывающий UIML.
Logic
Центральное звено Клиента - модуль-диспетчер, связывающий все остальные. Функции:
  • Принятые UIML-формы отдает Parser'у, на основе полученного генерит внутреннюю Model и отдает управление ей.
  • При Событии принимает решение, что делать, какие данные передавать, берет их и передает.
Proto
Часть, занимающаяся разборками с протоколом Simple UIML ... Protocol.
???
Модули разширения клиента. Данные модули принимаю пакеты, приходящие с сервера, приводят его в форму понятную Proto. При отправки пакета происходит обратное действие. Пакеты принятые от Proto "упаковываются" во ..., и уже в таком виде отсылаются серверу.

4. Виджеты

Названия и описание классов виджетов, их свойств и методов,которые поддерживаются клиентским программным обеспечением комплекса 1L.

Применяемые в пользовательском интерфейсе классы можно условно разделить на следующие основные категории: окна, меню и панели инструментов, элементы размещения и группировки, отображение данных, ввод данных и элементы управления. Для каждого класса визуальных элементов будет дана информация о свойствах (или указание на свойства, общие для группы [категории]) и содержимом этого визуального элемента интерфейса.

Название классов элементов, свойств и методов нечувствиетльны к регистру символов, поэтому название классов 'Button' и 'button' будут одинаковы.

4.1. Типы данных

Изначально рассмотрим общие типы данных, которые будут указываться в свойствах элментов интерфейса. Примеры даны в одинарных кавычках, которые не указываются при практическом применении, если это не оговорено явно.

Типы данных:

string (строка)
любая строка символов в кодировке файла XML, например, 'Label';
digit (число)
любое целое или вещественное число, например '-123.45'. Запись числа в научной нотации (например, 1.2e-10) не допускается. Отдельно различают целые (int) и дробные (fixed) числа.
cortege (кортеж)
набор значений, разделенных запятой. Текст, содержащий запятые может быть заключен в двойные или одинарные кавычки или перед запятой должен стоять экранирующий символ '\'. При указании строки в кавычках при нахождении такой же кавычки, как и ограничивающие текст кавычки, она также предваряется экранирующим символом '\'. Например: '"Label", 33, -8, Test, checking...'. Все пробелы как с правой, так и с левой стороны элемента будут удалены. Исключение составляет текст, указанный в кавычках.
matrix (матрица)
многострочный кортеж, строки которого разделены символом перевода строки 'n'. Например,
'"Apple", 3.50
"Orange", 4.80'
URL (ресурс URL)
адрес ресурса Интернета. Должен соответствовать спецификации указания URL (какой?). Например, 'http://www.myhost.com/dir/resource.png'. Указывается не явно, а через константу.
color (цвет)
строка, указывающая на соответствующие величины составляющих красного, зеленого и синего, указанных в шестнадцатеричной системе счисления каждый двумя знаками. Перед такой записью цвета должен стоять символ '#'. Например, '#ffffff' - белый цвет. Альтернативная запись основноых цветов - по их названию на английском языке. Регистр несущественен. Например, тот же белый цвет можно указать как 'white' или 'White'.
boolean (логическое значение)
может принимать тольок два значения. Логическая истина может быть указана одним из следующих слов в любом регистре: True, On, Yes, 1. Логическая ложь - соотвественно: False, Off, No, 0.
enum (перечисление)
указание одной ключевой фразы из определенного набора. Регистр ключевого слова несущественен. Например, в наборе есть элементы: 'normal,bold,italic,bolditalic'. Указать можно только один элемент из перечисления.
keys (комбинация клавиш)
комбинация нажатия одной или нескольких клавиш. Нажимаемые клавиши соответствуют надписям на них и перечисляются через '+'. Например, 'Ctrl+A'.

4.2. Cвойства элементов интерфейса

Сложные свойства разбиты по группам. Это позволяет указать как конкретное свойство посредством перечисления родительских групп, которые разделены точками (например,'active.color.background'), так и все свойства в группе, указывая данные кортежем, например шрифт может быть указан как '"Arial", 10, Bold'.

Если количество элементов в кортеже меньше количества свойств в группе, то свойства группы заполняются в порядке указания их в настоящем приложении.

4.3. Общие свойства

Эти свойства являются общими для всех визуальных элементов интерфейса:

geometry текущее положение и размеры элемента
width ширина в точках. int
height высота в точках. int
x позиция по горизонтали левой стороны элемента в точках. int
y позиция по вертикали верхней стороны элемента в точках. int
grid положение элемента в сетке
row строка сетки. int
col столбец сетки. int
rowspan количество объединенных строк. int
colspan количество объединенных столбцов. int
palette палитра для отрисовки данного элемента
active палитра элементов, имеющих клавиатурный фокус
foreground(fg) цвет рисования color
background(bg) цвет фона color
base цвет фона в полях ввода. обычно белый или светлый color
text цвет текста в полях ввода. обычно черный color
highlight цвет выделения в полях ввода color
highlightedtext цвет выделенного текста в полях ввода color
button цвет фона кнопок. Синоним для 'bg' color
buttontext цвет текста на кнопках. Синоним для 'fg' color
light самый светлый цвет сверху и слева кнопки color
midlight цвет между 'light' и 'bg' сверху и слева кнопки color
dark самый темный цвет снизу и справа кнопки color
mid цвет между 'dark' и 'bg' снизу и справа кнопки color
brighttext текст подсветки текста прри нажатии кнопки color
shadow самый темный цвет. Используется для окантовки color
inactive палитра элементов, не имеющих клавиатурный фокус
foreground(fg) цвет рисования color
background(bg) цвет фона color
base цвет фона в полях ввода. обычно белый или светлый color
text цвет текста в полях ввода. обычно черный color
highlight цвет выделения в полях ввода color
highlightedtext цвет выделенного текста в полях ввода color
button цвет фона кнопок. Синоним для 'bg' color
buttontext цвет текста на кнопках. Синоним для 'fg' color
light самый светлый цвет сверху и слева кнопки color
midlight цвет между 'light' и 'bg' сверху и слева кнопки color
dark самый темный цвет снизу и справа кнопки color
mid цвет между 'dark' и 'bg' снизу и справа кнопки color
brighttext текст подсветки текста прри нажатии кнопки color
shadow самый темный цвет. Используется для окантовки color
disabled палитра элементов, недоступных для модификации
foreground(fg) цвет рисования color
background(bg) цвет фона color
base цвет фона в полях ввода. обычно белый или светлый color
text цвет текста в полях ввода. обычно черный color
highlight цвет выделения в полях ввода color
highlightedtext цвет выделенного текста в полях ввода color
button цвет фона кнопок. Синоним для 'bg' color
buttontext цвет текста на кнопках. Синоним для 'fg' color
light самый светлый цвет сверху и слева кнопки color
midlight цвет между 'light' и 'bg' сверху и слева кнопки color
dark самый темный цвет снизу и справа кнопки color
mid цвет между 'dark' и 'bg' снизу и справа кнопки color
brighttext текст подсветки текста при нажатии кнопки color
shadow самый темный цвет. Используется для окантовки color
font шрифт вывода текста в элементе
family название семейства шрифта. string
size размер шрифта в пунктах. int
bold жирный. boolean
italic наклонный. boolean
underline подчеркивание текста. boolean
strikeout зачеркивание текста. boolean
enabled флаг доступности для модификации boolean
caption заголовок элемента. string
whatsThis подсказка по элементу интерфейса. string
icon изображение, ассоциируемое с элементом URL
minWidth минимальная ширина элемента в точках int
minHeight минимальная высота элемента в точках int
maxWidth максимальная ширина элемента в точках int
maxHeight максимальная высота элемента в точках int

4.4. События

Под Событиями имеются в виду те, которые влияют на бизнес-логику. Остальные обрабатываются самим терминалом. Аргументы события - данные элемента, передаваемые вместе с событиями.
Все события:

highlighted(...)
подсветка (временный выбор) какой-то части сложного элемента (пример - строки в ListView).
selected(...)
Окончательный выбор какой-то части сложного элемента, нажатие кнопки и т.д.
valueChanged(...)
изменение значения переменной, контролируемой виджетом.

4.5. Типы элементов интерфейса

Window
Основное окно формы. Через его слоты осуществляется основное взаимодействие с сервером.
Контейнер:
да.
Доп. параметры:
нет.
События:
?

Dialog
Модальное окно. Наследует все свойства класса Window, однако не позволяет работать с другими окнами приложения, пока не будет закрыто.
Контейнер:
?
Доп. параметры:
нет.
События:
?

MenuBar
Основная полоса меню
Контейнер:
да.
Доп. параметры:
нет.
События:
нет.

PopUpMenu
Выпадающее меню
Контейнер:
да.
Доп. параметры:
нет.
События:
нет.

MenuItem
Элемент меню
Контейнер:
нет.
Доп. параметры:
accel комбинация клавиш keys
События:
  • selected(void) (=activated())

ToolBar
панель инструментов
Контейнер:
да.
Доп. параметры:
нет.
События:
нет.

Grid
сетка
Контейнер:
?
Доп. параметры:
rows количество строк int
cols количество колонок int
События:
нет.

Frame
рамка без надписи
Контейнер:
да.
Доп. параметры:
shape ? enum: ?
shadow ? enum: ?
События:
нет.

GroupBox
рамка с надписью.
Контейнер:
да.
Доп. параметры:
нет.
События:
нет.

ButtonGroup
рамка для отображения групп кнопок (RadioButton, CheckBox)
Контейнер:
да.
Доп. параметры:
нет.
События:
нет.

TabWidget
вкладка диалога
Контейнер:
да.
Доп. параметры:
нет.
События:
  • valueChanged(int) (=currentChanged())

Label
надпись
Контейнер:
нет.
Доп. параметры:
text строка текста string
align enum:
  • none
  • left
  • right
  • center
  • justify
scaledContents ? ?
События:
нет.

PixmapLabel
картинка
Контейнер:
нет.
Доп. параметры:
pixmap картинка ?
События:
нет.

ProgressBar
индикатор процесса выполнения
Контейнер:
нет.
Доп. параметры:
нет.
События:
нет.

Line
вертикальная или горизонтальная линия
Контейнер:
нет.
Доп. параметры:
нет.
События:
нет.

Widget
абстрактный контейнер для отображения рисунков и пр.
Контейнер:
?
Доп. параметры:
нет.
События:
?

LineEdit
односрочное поле ввода
Контейнер:
нет.
Доп. параметры:
value текст в поле ввода string
echoMode enum:
  • echo
  • noecho
  • password
readOnly только для чтения boolean
passwordChar символ, показываемый при вводе буквы пароля string
mask enum:
  • text
  • numbers
  • date
  • time
  • dictionary
События:
  • valueChanged(string) (=textChanged())

MultiLineEdit
многострочное поле ввода
Контейнер:
нет.
Доп. параметры:
value текст в поле ввода string
readOnly только для чтения boolean
События:
  • valueChanged(string) (=textChanged())

SpinBox
поле ввода с кнопками увеличения/уменьшения
Контейнер:
нет.
Доп. параметры:
value текст в поле ввода string
События:
  • valueChanged(int)

RadioButton
переключатель
Контейнер:
нет.
Доп. параметры:
value Выбрано boolean
События:
  • valueChanged(boolean) (=toggled())

CheckBox
флажок
Контейнер:
нет.
Доп. параметры:
value Выбрано boolean
События:
  • valueChanged(boolean) (=toggled())

ListBox
список выбора
Контейнер:
нет.
Доп. параметры:
isMultipleSelection можно выделять несколько строк boolean
items string[]
События:
  • highlighted(int|string|int[]|string[])
  • selected(int|string|int[]|string[]) (=selected())

ComboBox
поле с выпадающим списком выбора
Контейнер:
нет.
Доп. параметры:
items string[]
События:
  • highlighted(int|string)
  • selected(int|string) (=selected())
  • valueChanged(string) (=textChanged())

ListView
иерархический многоколоночный список
Контейнер:
нет.
Доп. параметры:
isMultipleSelection можно выделять несколько строк boolean
items ?
События:
  • highlighted(?)
  • selected(?) (?)
  • valueChanged(?) (=currentChanged())

Table
таблица
Контейнер:
?
Доп. параметры:
rows колонок int
columns строк int
События:
  • highlighted(int, int)
  • selected(int, int)
  • valueChanged(int, int, ?) (=valueChanged())

Slider
бегунок
Контейнер:
нет.
Доп. параметры:
value int
События:
  • valueChanged(int)

PushButton
кнопка
Контейнер:
нет.
Доп. параметры:
text надпись string
default ? ?
События:
  • selected(void) (=clicked())

5. Содержание UIML форм

  1. Версия. Не версия UIML, а версия... состава, что-ли. Если Сервер присылает версию больше, чем умеет обрабатывать Клиент - error
  2. Поля (виджеты), для каждого из которых...
  3. графические параметры
  4. содержимое (значение)
  5. формат содержимого
  6. События, на которые это поле реагирует
  7. Методы Клиента, которые при этом вызываются
  8. Параметры этих методов (чаще всего - ID и текущее содержимое поля)
  9. Tips (всплывающая подсказка)
  10. Форма курсора мышки при наведении на поле
  11. Индекс (для порядка перехода)
  12. Состояние (enabled/disabled)
  13. ? Флаги действий ?
  14. Контекстное меню
  15. ...

UIML-форма состоит из:

<?xml version='1.0'?>
<!DOCTYPE uiml PUBLIC "-//Harmonia//DTD UIML 3.0 Draft//EN" "http://uiml.org/dtds/UIML3_0a.dtd">
<uiml xmlns="http://uiml.org/dtds/UIML3_0a.dtd">
	<head>		...	</head>
	<template>	...	</template>
	<interface>	...	</interface>
	<peers>		...	</peers>
</uiml>

5.1 <head>

Всякая ерунда типа copyleft etc. Обычно - пачка конструкций типа:

<meta name="..." content="...">

5.2 <template>

5.3 <interface>

этот раздел сосотоит из:

	<structure>	...	</structure>
	<style>		...	<style>
	<content>		...	<content>
	<behaviour>	...	<behaviour>

behaviour

	<rule>
	<condition>	...	<condition>
	<action>		...	<action>
	</rule>

5.4 <peers>


6. Запуск клиента

Клиент представляет собой монолитное приложение, не требующее коких-то особых движений для инсталляции. Основное его предназначение - рендеринг UIML-форм и обработка событий.

Порядок запуска:

  1. Пользователь стартует исполняемый файл
  2. И видит окно с ListBox'ом и кнопками OK, Cancel, Настроить. В ListBox'е написано имя и порт Сервера[ов]. Если существует 1LClient.ini, то данные берутся оттуда, если нет - то сразу запускается Настроить.
  3. В диалоге Настроить - строка с именем сервера, выбор протокола (а, может, только TCP/IP?), строка с портом IP. Можно кнопочку Найти, где открывается еще один диалог с уточнением диапазона поиска - localhost, mydomain.com или 192.168.0.0/24 и потом перечисляются найденные Серверы
  4. Закончили настраивать - текущие параметры записываются в 1LClient.ini
  5. Жмем ОК. Делается попытка связаться с Сервером
  6. Если неуспешно - сообщение об ошибке связи с сервером и предложением Настроить (все это - белыми буквами на спокойном голубом фоне во весь экран)
  7. Если успешно - устанавливается соединение
  8. Клиент высылает серверу платформу (Lin/Win) и свою версию (допустим, 0.0.1.pre.alpha.RC0
  9. Сервер сравнивает с версией имеющегося у него Клиента для этой платформы
  10. Если у Сервера - свежее, то Клиенту предлагается выкачать новую версию (0.0.1...RC1)
  11. Клиент делает предложение Пользователю, от которого трудно отказаться (иначе сервер не будет работать со старым клиентом). Новая версия должна быть абсолютно совместима снизу вверх.
  12. Если пользователь согласен - сливается новая версия, Клиент передергивается и восстанавливает соединение. Под передергиванием понимается попытка закрытия соединения, проверка корректности полученного файла, попытка его запуска, попытка восстановления соединения с тем-же сервером и попытка прибить старую версию.
  13. Сервер дает Соединению уникальный ID, фиксируемый с 2-х сторон. (??? - (c) demon)
  14. Дальше Клиент запрашивает у сервера форму Автозапуска (обычно - список доступных конфигураций),...
  15. Получает её,...
  16. И дальше процесс переходит в стандартный режим

7. Поведение Клиента

Основное в характере Клиента - тупость. Зачатки интеллекта ему нужны только для экономии трафика. Клиент НИКОГДА не обрабатывает логику даже формы. Только навигация.

Вот Клиент получил по своему запросу форму. Надо заметить, что основным инициатором общения является именно Клиент посылает информацию - получает ответ ОК|retry|drop.
Клиент обрабатываетс версию.
Если с версией всё ОК - парсит форму.
Рисует форму, организовывает у себя внутри объекты, соответствующие полям формы.
При окончании изменения значения поля данный факт фиксируется сбрасыванием флага Отправлено.
Далее, если надо отправить данные "прям щас" - отправляет сигнал об этом вместе со значением Серверу, устанавливая флаг Отправлено. Иначе - отправка производится вызовом Метода Submit формы
Метод Submit проходит все объекты и отправляет все неотправленные поля одной пачкой.
Submit можно вызвать, например, при нажатии ОК, Принять или при закрытии формы.
Принцип поздней отправки призван обеспечит более мягкую работу с Web-клиентом.

События, которые чаще всего интересны серверу:

  • Группа Button (Button.*) - нажатие (любым способом - пробелом, мышкой, горячей комбинацией)
  • Container.Tab - нажатие (или выбор другой закладки)
  • View.* - потеря фокуса (=выбор), подсвечивание строки
  • Input - потеря фокуса (=окончание редактирования)

Остальные типы полей - для красоты.
Интерес к событию Подсветка строк таблиц, ListBox etc. потому, что бывает необходимость динамически менять содержимое других полей при переборе значений активного поля. Пример - подчиненные таблицы.

Т.о. основные события, к-рые клиент засылает серверу - были изменены данные полей формы. События могут идти пачкой, поэтому необходимо, чтобы сообщения были как можно атомарнее.


8. Поведение Сервера

Со своей стороны сервер тоже умеет управлять поведение Клиента. Как минимум - 1) управлять навигацией ("поставить фокус в поле тратата"), 2) изменить реквизит поля, 3) получить реквизит поля.
Насчет как управлять содержанием (удалить|добавить|изменить поле) - надо дочитать документацию по UIML...
При отсылке обновления Сервер может указать следующим сообщением Клиенту сразу и обновить внешний вид поля.
Обычно же Сервер находится на приеме сообщений от Клиента. При отсылке формы Сервер генерит у себя на основе этой формы виртуальную форму - объекты полей со значениями во внутреннем формате и ID. И всё. В дальнейшем в своей работе Сервер оперирует только своей копией данных.
Сервер не занимается бизнес-логикой. Его задача - обслуживание соединения с Клиентами, предоставление Клиентам нужных форм, а Серверу Приложения - адекватные данные.
Всё вроде...


9. Протокол общения

Simple UIML ... Protocol

Клиент и Сервер общаются между собой только по TCP/IP (?) по выделенному для этой цели порту. Формат сообщений в обе стороны - только UIML.


ОПИСАНИЕ ПРОТОКОЛА UIML Server Access Protocol

©Alexei Tyurenkov 20030604

КОМАНДЫ

Пока в протоколе USAP (UIML Server Access Protocol) есть следующие команды:

HELO n.n.n.n
Знакомство клиента с сервером. n.n.n.n - номер версии клиента. Эта команда в идеале должна передавать номер протокола, а не номер версии. До ее выполнения никакие другие команды выполняться не будут. Будет происходит обрыв. Временно в ней зашита и авторизация по IP, но пока сама авторизация убогая, то и нечего пытаться ее переместить в другое место.
Ответ:
OLEH n.n.n.n FROM ip-адрес
Либо
Error
INDEX
Получить документ по умолчанию(что-то вроде первой странички сайта)
Ответ:
XEDNI (номер документа по умолчанию) SIZE (размер)nn<Содержимое документа>
GET n
Получить документ за нумером N. В принципе это одна из важнейших команда в протоколе, посему синтаксис и орфография должны обсуждаться всей командой, но пока у нас нет приблизительных спецификаций на документы, сложно ввязываться в обсуждения.
Ответ:
TEG (номер документа по умолчанию) SIZE (размер)nn<Содержимое документа>
SETENV <var>=<value>
Задать переменную окружения <var> значением <value>. Пока хранятся один сеанс работы. В будущем планируется создать базу переменных и хранить там значения.
Ответ:
VNETES <var>=<value>
GETENV <var>
Получить значение переменной <var>.
Ответ:
VNETEG <var>=<value>
QUIT
Корректно завершить работу клиента.
Ответ:
QUIT
KILL
Некорректно завершить работу клиента.

Виды Error'ов
102
Неправильный номер версии протокола/версии клиента. Что тут сказать, все ясно.
104
Команда не известна.
105
Неправильный номер документа. В будущем это будет целый класс ошибок, и этот номер станет историей.
107
IP-адрес недопустим. Происходит в том случае, если клиенту не разрешен доступ в конфиг файле
108
Авторизация не пройдена. Невыполнена команда HELO.

Два слова о переменных окружения.

 


1C:TOP-100 Рейтинг ресурсов 1С Информационно-справочный ресурс