4.1.Протокол взаимодействия BHO части и java
части.
Для того, чтобы управлять браузером через объект Browser Helper Object ,мной был разработан протокол взаимодействия java части и объекта Browser Helper Object.
Протокол работает поверх протокола UDP. Длина каждого пакета, используемого в протоколе, составляет 1024 байт. Пакеты, которыми обмениваются java и C++ части, имеют структуру: <команда(1 байт)><флаг(1 байт)> <параметры(1022 байт)>.
После запуска java части, java часть открывает для приема UDP сообщений порт 8082.Если порт открыть не удается (например, этот порт уже используется другим приложением), в java приложении возникнет ошибка с сообщением, что не удалось открыть данный порт.
Каждый экземпляр Browser helper Object,сразу после запуска, открывает UDP порт со случайным номером. После этого, отправляет пакет с номером команды 0 и последовательностью нулей в параметрах по адресу localhost:8082. В ответ java приложение должно ответить пакетом с номером команды 0 и последовательностью 0 в параметрах. Если ответный пакет с командой 0 не приходит,BHO повторяет попытку соединения ещё 2 раза с интервалами в 10 секунд и завершает работу, если и эти 2 попытки успехом не увенчаются. Если java приложение ответит на запрос,BHO переходит в режим обработки запросов java приложения. (Т.е., java приложение отправляет команды – запросы, а BHO после обработки команд отправляет команды – ответы на запросы). Обобщенная структура протокола взаимодействия приведена на диаграмме последовательности.
Если java часть вовремя не ответила на запрос на подключение (2 попытки отправки команды 0 не привели к тому, что java часть ответила командой 0), то работа модуля Browser Helper Object завершается.
Если ответила, модуль Browser Helper Object переходит в режим исполнения команд java части.
На этапе исполнения команд модулем Browser Helper Object,обмен пакетов осуществляется по следующей схеме:
1.Java часть отправляет пакет с номером команды C++ части.
2.1. Команда требует дополнительных параметров, java часть отправляет параметр 1.
2.2. Если команда требует передачи более 1 параметра,java часть следом отправляет 2 параметр.
2.n. Таким образом, отправка параметров продолжается, пока не будут отправлены все n параметров, требуемых для передачи описанием команды.
3.1. Если команда должна вернуть значение, передается значение 1.
3.n. Если команда требует возвращения более 1 значения, значения передаются последовательно до тех пор, пока все значения не будут переданы.
Протокол обмена пакетами для передачи значений и для передачи параметров одинаковый, и описан в разделе 4.1.1.
Рисунок 4.1.1. Диаграмма последовательности
протокола взамодействия java части и объекта Browser Helper Object.
4.1.1. Передача параметров запросов.
Для обмена параметрами между частями системы мной был разработан отдельный протокол, являющийся частью протокола взаимодействия C++ и java части.
Общая схема передачи параметра изображена на диаграмме последовательности.
Далее, в
описании данного протокола:
принимающая сторона – это сторона, которой пересылается параметр;
отправляющая сторона – это сторона, которая передает параметр.
Рисунок 4.1.1.1. Диаграмма
последовательности протокола передачи параметра.
Если не указано иное, параметры команды являются последовательностью символов юникод в кодировке UTF-16LE. Если длина строки параметров больше 1022байт(511 символов), то строка разбивается на части длиной 511 символов. Если после разделения есть часть, имеющая длину меньше 511 символов, недостающие символы заменяются на 0.
Вначале передачи параметра передающая сторона посылает пакет, в котором указан номер команды 5, и количество пакетов с текстом, которое будет передано. Количество пакетов с текстом указывается в 256-ричной системе счисления, старший байт указывается в поле флаг(1 байт передаваемого пакета (начальный байт пакета имеет номер 0)),младший байт – в нулевом байте параметров.
Далее, производится собственно передача параметра. С каждым пакетом передается часть строки. Передача продолжается, пока параметр не будет передан, или не возникнет ошибка при передаче. Передаваемые для передачи параметра пакеты имеет структуру:<номер команды =51><флаг=2(если передаваемый пакет не последний) или 3(если передаваемый пакет последний) ><очередной кусок строки>.
Для того чтобы избежать переполнения буфера у принимающей стороны, протокол предусматривает синхронизацию сторон.
Синхронизация при передаче обеспечивается отправкой пакета-квитанции принимающей стороной после приема набора пакетов, составляющего фрейм. Длина фрейма составляет 8 пакетов, однако, она может быть меньше, если осталось передать меньше 8 пакетов. В этом случае, длина фрейма составляет количество пакетов, которое осталось передать. После передачи пакетов, составляющих фрейм, передающая сторона переходит в режим ожидания квитанции от принимающей стороны. Время ожидания квитанции составляет 1 минуту. Если за это время квитанция не получена, передача параметра прекращается и считается проваленной.
Квитанция имеет следующую структуру:<номер команды=50><флаг = количество полученных пакетов ><последовательность нулей в параметрах>. После получения квитанции, передающая сторона “передвигает” фрейм на столько частей, сколько было указано в квитанции. Процесс продолжается до тех пор, пока параметр не будет передан полностью.
Время ожидания квитанции передающей стороной составляет 30 секунд. Если за это время квитанция не будет получена, передача параметра будет считаться завершившейся с ошибкой.
Если необходимо передать несколько параметров, то параметры передаются последовательно по одному, используя описанную выше процедуру.
Ряд команд возвращает параметр – булевское значение, содержащее результат обработки запроса. В этом случае, передается строка, длиной 1 символ. Если этот символ-#1,то команда была выполнена успешно. В противном случае, будет возвращен символ #0.
4.1.2.Команды, отправляемые java приложением экземплярам Browser Helper Object.
Для взаимодействия java части и C++ части мною были введены команды, перечисленные в таблице.
Таблица 4.1.2.1. Команды протокола
взаимодейтствия java части и объекта Browser Helper Object.
Команда |
Параметры |
Значение |
1 |
|
Отправляется заголовок(title) текущей открытой страницы |
2 |
|
Отправляется html код текущей открытой страницы |
3 |
Название, указанное для javascript окна (обычно, Microsoft Internet Explorer или Windows Internet Explorer) |
Если диалоговое окно было открыто, будет отправлен в java программу текст в диалоговом окне и текст доступных кнопок в диалоговом окне. В противном случае будет возвращен текст, состоящий из одного символа #0. |
4 |
Текст, содержащий ID нужного html объекта |
BHO попытается найти нужный html элемент по заданному ID и кликнуть по данному html элементу.Java программе будет возвращен результат выполнения этой операции:#1,если кликнуть удалось, и 0 в противном случае |
5 |
Параметры для поиска html элемента.
Параметры передаются в формате <имя параметра>=<значение>[&&
<имя параметра2>=<значение2> и т.д.]. Символы = и && экранируются символом / символ / -удваивается
при передаче.В числе переданных параметров обязательно должен
быть id,имя тега (tagName) или имя html элемента (name).Вместо атрибута class нужно указывать атрибут “className”. Вместо атрибута tag
указывается атрибут “tagName” |
BHO осуществляет поиск элемента по заданным параметрам, и осуществляет клик по найденному элементу. Если html объект найти не удается, или метод click объекта возвращает ошибку, java программе будет передан #0, в случае успешного выполнения операции будет передан #1 |
6 |
В
параметрах должен быть указан путь к элементу,по которому нужно кликнуть. Путь
должен быть указан в формате [<Frame<параметры
для поиска фрейма>>]<Absolute|Relative<Параметры элемента,формат как в команде 5
>><All<параметры>|Clildren<параметры>|Parent>[<All< параметры>|Clildren<параметры>>]. Символы
< и > экранируются символом / .если известен порядковый номер в списке
дочерних объектов,то это свойство
задается свойством с названием index. Ключевое
слово Frame означает,что нужно производить поиск html объекта
в документе заданного фрейма.Параметры
для поиска фрейма,как в команде 5. Ключевое
слово Absolute означает,что поиск будет осуществляться от объекта body или
frameset.(в зависимости от того,какой из объектов есть на html странице). Relative – поиск будет осуществляться от элемента с
заданными параметрами. All –поиск среди
дочерних объектов любого уровня вложенности. Children-поиск только среди объектов, которые являются
непосредственно дочерними для заданного html объекта Например,
<Relative<tagName=TD&&className=login>> -нужно найти TD элемент с именем
класса className. <Relative<tagName=TD&&className=login>><All<tagName=INPUT&&name=Login>>
- поиск объекта TD с именем
класса login, среди всех его дочерних
объектов осуществляется поиск html объекта
с именем тега INPUT и
свойством name=Login |
BHO осуществляет поиск html объекта по заданному пути и делает “клик” на заданном в пути html объекте. Если в результате поиска на любом этапе поиска найдено несколько объектов, удовлетворяющих условию запроса, выбирается первый из найденных. Если операция выполнена успешно, Возвращается #1, в противном случае #0. |
7 |
2
параметра. 1)Путь
для поиска html объекта,синтаксис,как в команде 6. 2)Значение,которое
должно быть присвоено html объекту. |
Осуществляется поиск html объекта по заданному пути, и, если объект найден, устанавливается у него свойство value.Данная операция применима к объектам: - input type=text; - input type=pass; -input <тип не указан> -select; -textarea; Java программе возвращается результат обработки запроса: #1 –если ввести значение удалось, #0- если операция закончилась неудачей |
8 |
Путь
для поиска html объекта,синтаксис,как в команде 6. |
Осуществляет поиск html объекта по заданному пути и возвращает значение, которое хранится в свойстве value. Команда применима к объектам: - input type=text; - input type=pass; -input <тип не указан> -select; -textarea; Java программе возвращается текст, хранимый в свойстве value объекта. Если найти объект не удалось, будет возвращен текст с единственным символом #0. |
9 |
|
Отправляется в java клиент XML, содержащая копию DOM модели Internet Explorer.Копируются не все атрибуты, а только основные. Скорость выполнения данной операции невелика, поэтому рекомендуется использовать эту команду только в отладочных целях. |
10 |
2 параметра: 1.Имя заголовка javascript
диалога Internet
Explorer(Microsoft Internet Explorer или Windows Internet Explorer) 2.Текст
кнопки диалогового окна,по которой енужно кликнуть |
Если диалоговое окно найдено и кликнуть удалось, возвращается #1. В противном случае - #0 |
11 |
Путь
для поиска фрейма.Формат запроса,как
для команды 5. |
Возвращается html код, содержащийся во фрейме. Если фрейм не найден, будет возвращен #0. |
12 |
Путь
для поиска фрейма.Формат запроса,как для команды 5 |
Возвращает XML с копией дом модели Internet Explorer.Ограничения, как у команды 9.Если фрейм не найден, будет возвращен #0 |
13 |
Путь
к html элементу,по
которому нужно кликнуть.Формат,как у команды 6 |
Находит указанный в параметре элемент, и генерирует событие “click”.От команды 6 отличается тем, что клик будет совершен в новом потоке, это необходимо для случаев, когда после отправки события появляется javascript окно с сообщением или диалогом подтверждения. Возвращает #1,если html элемент был найден и #0 в противном случае |
14 |
2
параметра. 1)Путь
к html элементу,в
которой будет установлено значение 2)значение,которое
нужно установить |
Находит указанный в параметре элемент и устанавливает значение свойства value.Установка значения производится в новом потоке. Возвращает #1,если html элемент был найден и #0 в противном случае |
15 |
|
Возвращает текущее состоянии браузера (оно отображается в строке статуса). |
16 |
url,который должен быть загружен браузером. |
Загружает в Internet Explorer страницу, находящуюся по адресу, указанному в url. |
17 |
|
Начать логирование действий пользователя.BHO начинает сохранять в памяти действий, совершенные в окне Internet Explorer. |
18 |
|
Отправляется лог действий пользователя. Данные, которые передает C++ часть java части: 1.Количество xml файлов, которые будут переданы. 2.Первый xml документ с описанием действия пользователя. ………………………. N+1.Последний N-ный xml документ с описанием действия пользователя в браузере. |
19 |
|
Завершает работу текущего браузера. |
20 |
Путь
к html элементу,событие
на котором нужно сгенерировать.Формат пути,как в команде 6. |
Генерирует событие “навели курсор на html объект”. Возвращаемое значение: #1 –если сгенерировать событие удалось. #0 –если возникла ошибка |
21 |
|
Возвращает URL документа, загруженного в браузер. |
Время выполнения команды C++ частью команды и отправки результата обработки не должны превышать 600 секунд. Если время ожидания будет превышено, в java части возникнет ошибка ”превышено время ожидания ”.