Design » History » Revision 13
Revision 12 (Александр Шитнев, 03/29/2012 11:18 AM) → Revision 13/25 (Александр Шитнев, 03/29/2012 11:20 AM)
h1. Проект архитектуры {{TOC}} Модель архитектуры представлена на следующей схеме: !https://redmine.cs.karelia.ru/attachments/download/83/850px-MS_Arch_mods.png! h2. Описание уровней архитектуры *Сетевой уровень (Network layer)* объединяет используемые социальные сервисы и среду передачи данных. В архитектуре представлены сервисы ВКонтакте, Facebook и Flickr. Каждый сервис предоставляет доступ к данным посредством собственного протокола. В настоящий момент в проекте MySocials реализована поддержка протоколов на основе XML и JSON. *Транспортный уровень (Transport layer)* представляет собой набор библиотек доступа к социальным сервисам (драйверов). Основная задача драйвера - выполнять запросы к сервису для получения или отправки данных. Один запрос к драйверу может быть реализован в виде серии запросов к сервису. *Промежуточный уровень (Middleware layer)* обеспечивает единый программный интерфейс (MySocials API) доступа к социальным сервисам. API реализован на основе XML. Для более удобной реализации приложений с использованием социальных сервисов реализована Qt библиотека (Core). Библиотека предоставляет набор базовых классов, средства кэширования для автономной работы и объединяет составные запросы. *Пользовательский уровень (User layer*) объединяет разработанные приложения и плагины. * Плагины для Qt Messaging Framework (QMF plugins) предоставляют доступ к социальным сервисам аналогично доступу к почтовым сервисам. * Плагины приложений (Application plugins) реализуют работу с социальными сервисами в различных приложениях. В настоящий момент реализован плагин для Telepathy framework и плагин импорта контактов в адресную книгу Maemo. * Консольное тестовое приложение (Console application) позволяет проверить работоспособность драйверов и выполнять запросы на основе MySocials API. * Приложение для просмотра изображений социальных сервисов (Gallery) * Приложение для работы с социальными сервисами (MySocials) h2. Описание подсистем *Ядро (Core)* – Подпрограмма, отвечающая за перенаправление запросов от других модулей к драйверам и наоборот, контроль использования оперативной памяти программой, выполнение повторяющихся задач(проверка сообщений, проверка друзей и т.д.) Включает в себя: * Менеджер Событий - модуль, выполняющий через определенный промежуток времени повторяющиеся задача (проверка на новые сообщения и т.д.) * Модуль перенаправления запросов - модуль, который перенаправляет запросы, полученные от подпрограмм к драйверам *Драйвер (Driver)* - подпрограмма реализующая взаимодействие с определенным сервисом или их группой Включает в себя: * Модуль получения запросов от ядра * Отправка запросов и получение ответов от сервиса * Обработка ответа от сервиса * Модуль отправки ответа ядру *Интерфейс пользователя (UI)* - Подпрограмма содержащая графический интерфейс пользователя. Содержит функции по выводу информации пользователю, вызывает функции из виджетов. Включает в себя: Включает в себя: * Формы с компонентами из виджетов *Виджеты (Widgets)* - Набор компнентов, содержащих логику работу интерфейса. Виджеты располагаются на уровне конечного приложения. Включают в себя: * модули(менеджеры) для соединения графического интерфейса и ядра * модели данных полученные от ядра и методы доступа к ним * функции обработки событий, поступающих от графического интерфейса h1. Ядро !https://redmine.cs.karelia.ru/attachments/download/84/850px-MSCore_Arch.png! Архитектура ядра *Структуры данных* В проекте MySocials для хранения данных используются специальные классы-хранилища. Каждому объекту социальной сети соответствует свой класс. Все классы должны наследоваться от базового класса (Base object), содержащего общие для всех объектов поля и методы. Поля класса @baseobject@: <pre> QString serviceId; // Id сервиса. QString accountId; // Id аккаунта. QString ownerId; // Id владельца объекта. QString objectId; // Id объекта. QString icon_url; // Путь до иконки объекта. bool isPrivate; // True если объект имеет ограниченный доступ и не может быть загружен с сервиса. bool isEmpty; // True если в объекте ничего нет, иначе - false. </pre> Методы класса @baseobject@: <pre> /* Генерирует имя файла на основе пути и ссылки на объект. */ const QString generateFileName(const QString &path, const QString &obj) const; </pre> Поля класса @event@: <pre> QString title; // Название события. QString description; // Описание события. QString startTime; // Время начала события. QString endTime; // Время завершения события. QString updateTime; // Время последнего обновления информации о событии. QString location; // Географическое место расположения. QString privacy; // Приватность. QString creator; // Идентификатор пользователя создавшего событие. QString icon; // URL иконки события. QString rsvpStatus; // Статус участия. </pre> Методы класса @event@: <pre> /* "Упаковать" данные в XML формат. */ QDomElement toQDomElement(QDomDocument& doc) const; </pre> <pre> /* Переопределение предыдущего метода. Во входных параметрах добавлен источник данных. */ static QDomElement toQDomElement(QDomDocument& doc, const Event& src); </pre> <pre> /* Загрузить данные из XML. */ static Event fromQDomElement(const QDomElement& fr, const QString& srvcId, const QString& accountId, const QString& friendId); </pre> h1. Функции ядра h2. Получение списка событий *Описание:* Функция, на основе полученных параметров, формирует и отправляет запрос к драйверу и затем получает ответ. После из ответа извлекаются данные и помещаются во внутреннюю структуру данных. После заполнения структура добавляется к списку. По окончании разбора посылается сигнал о том, что сообщения получены. *Параметры:* @userId@ - id пользователя чей список нужно получить. @startTime@ - дата, начиная с которой нужно получить события (строка даты в формате UNIX_timestamp или ISO_8601). @alsoLoadIcons@ - также загрузить иконки. *Прототип:* <pre> void getEvents(QString userId, QString startTime, bool alsoLoadIcons) </pre> h2. Создание события *Описание:* Функция, на основе полученных параметров, формирует и отправляет запрос к драйверу и затем получает ответ. После из ответа извлекается eventId (id созданного события) и функция возвращает его. *Параметры:* @title@ - название события. @description@ - описание события. @startTime@ - время начала (строка даты в формате UNIX_timestamp или ISO_8601). @endTime@ - время завершения (строка даты в формате UNIX_timestamp или ISO_8601). @location@ - место проведения. @privacy@ - приватность. *Прототип:* <pre> QString createEvent(QString title, QString description, QString startTime, QString endTime, QString location, QString privacy) </pre> h2. Редактирование события *Описание:* Функция, на основе полученных параметров, формирует и отправляет запрос к драйверу и затем получает ответ. Ответ должен содержать информацию об успехе редактирования (true/false) и эта информация возвращается из функции. *Параметры:* @eventId@ - id события которое требуется редактировать. @title@ - название события. @description@ - описание события. @startTime@ - время начала (строка даты в формате UNIX_timestamp или ISO_8601). @endTime@ - время завершения (строка даты в формате UNIX_timestamp или ISO_8601). @location@ - место проведения. @privacy@ - приватность. *Прототип:* <pre> bool editEvent(QString eventId, QString title, QString description, QString startTime, QString endTime, QString location, QString privacy) </pre> h2. Удаление события *Описание:* Функция, на основе полученных параметров, формирует и отправляет запрос к драйверу и затем получает ответ. Ответ должен содержать информацию об успехе удаления (true/false) и эта информация возвращается из функции. Также функция удаляет информацию о событии из кэша. *Параметры:* @eventId@ - id события которое требуется удалить. *Прототип:* <pre> bool deleteEvent(QString eventId) </pre> h2. Драйвер !https://redmine.cs.karelia.ru/attachments/download/85/850px-MSDriver_Arch.png! Архитектура драйвера Общий формат запросов и ответов Формат запроса: <pre> <Request class="" function = "" noAuthorize="true"> <Params> </Params> </Request> </pre> noAuthorize - флаг, запрещающий библиотеке вызывать webauth (необязательный параметр, по умолчанию false) class - класс, к которому относится вызываемая функция function - имя функции Params - набор параметров, строго определенный для каждой функции Формат ответа: <pre> <Response class="..." function = "..." authorized="true" upload="..." download="..."> <Params> </Params> </Response> </pre> authorized - флаг, показывающий происходила ли авторизация при выполнении запроса, не устанавливается, если при выполнении запроса возникла ошибка upload - количество байт отправленных на сервер download - количество байт полученных с сервера * "settings":http://oss.fruct.org/wiki/Libvkontakte/xml-data/settings: класс для работы с настройками * "places":http://oss.fruct.org/wiki/Libvkontakte/xml-data/places: класс для получения данных о местах * "events":http://oss.fruct.org/wiki/Libvkontakte/xml-data/events: класс для получения данных о событиях h2. Трассируемость требований