Главная              Рефераты - Разное

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

Реферат

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

Основная идея проекта — избавить пользователя от лишних и трудоемких действий, оставив ему самую приятную часть — непосредственно чтение книги. Таким образом, проект призван объединить все стадии подготовки к чтению (поиск, скачивание, открытие файла) в одну.

В данной части проекта реализована клиентская программа, позволяющая пользователю просматривать, искать, скачивать и читать книги с различных северов, поддерживающих определенный формат предоставления информации (OPDS).

Оглавление

1. Введение...................................................................................................................................... 3

1.1 Описание проблемы............................................................................................................... 3

1.2 Обзор существующих решений............................................................................................... 4

1.3 Описание системы в целом.................................................................................................... 7

1.4 Постановка задачи................................................................................................................... 9

2. Интерфейс пользователя. .......................................................................................................... 10

2.1 Поиск книг.............................................................................................................................. 11

2.2 Просмотр каталогов............................................................................................................... 12

2.3 Настройки.............................................................................................................................. 13

2.4 Библиотека............................................................................................................................ 13

3. Архитектура, внутреннее устройство......................................................................................... 14

3.1 Вступление............................................................................................................................ 14

3.2 Общая архитектура. Шаблон MVVM..................................................................................... 14

3.3 Реализация слоя модели....................................................................................................... 16

3.4 Система хранения настроек.................................................................................................. 27

3.5 Слои представления и модели представления..................................................................... 28

3.6 Результат............................................................................................................................... 31

4 Другие клиентские программы................................................................................................... 33

4.1 Stanza..................................................................................................................................... 33

4.2 Lucidor.................................................................................................................................... 33

4.3 Calibre.................................................................................................................................... 34

4.4 Сравнение с ebooksearchtool client........................................................................................ 35

5. Заключение................................................................................................................................. 36

Список литературы:........................................................................................................................ 37


1. Введение

С развитием интернета всё больше сфер жизни человека переходят в виртуальное пространство. Это обусловлено тем, что интернет предоставляет гораздо больше удобства и возможностей для доступа к информации. За последние годы очень многие аспекты жизни человека, такие как коммуникация, финансы, работа и в особенности досуг, глубже погружаются во всемирную сеть.

Не оказалась в стороне от интернета и такая важная часть работы и досуга, как книги.

1.1 Описание проблемы

Двадцать лет назад для того, чтобы найти книгу, человек шел в библиотеку или в книжный магазин. Если он искал определённую книгу —достаточно было назвать фамилию автора и название книги, а порой даже одного названия было достаточно. Если же выбор книги ещё не был сделан, всегда можно было получить помощь от сотрудника магазина или библиотеки. Сегодня ситуация с библиотеками и книжными магазинами изменилась несильно, но наравне с бумажными книгами появилась возможность читать книги в электронном виде.

Большое количество книг оцифровано и хранится в сети Интернет, многие из них находятся в свободном доступе. С одной стороны, это должно упрощать процесс получения книг, теперь они стали доступны из любого места, где есть возможность выхода в Интернет. С другой стороны, перед пользователем встают новые проблемы. Во-первых, теперь ему необходимо самому искать книгу в сети, где количество информации растет с каждым днем. Во-вторых, после того, как он нашел нужную книгу - ее нужно скачать, а затем найти программу, которая позволяет читать файл в найденном формате.

На настоящий момент в Интернете существует множество электронных библиотек, поиск по которым весьма затруднен из-за того, что не существует системы, которая могла бы объединить всю информацию с этих библиотек. Следовательно, пользователям приходится либо искать в каждой из электронных библиотек в отдельности, либо пользоваться существующими поисковыми системами. Есть еще одна проблема, связанная с наличием большого количества электронных библиотек. Она состоит в том, что единый формат для предоставления информации о книгах появился только недавно, поэтому каждая библиотека предоставляет свой формат.

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

Таким образом, выявляются несколько важных проблем, затрудняющие поиск книг. Первая — где искать (обилие электронных библиотек, вынужденное посещение большого количества различных сайтов, чтобы найти всего лишь одну книгу), вторая - существует множество форматов, в которых может быть представлена электронная библиотека, третья — выбор формата книги и программы для его чтения.

1.2 Обзор существующих решений.

Все эти проблемы не новы и попытки их решить уже предпринимались. Например, широко известная поисковая система Google предоставляет свой сервис для поиска книг — Google books [1]. Этот сервис выполняет полнотекстовый поиск по книгам, которые Google сканирует и сохраняет в своей базе данных. В качестве результатов поиска выдается большое количество информации о самой книге, о различных изданиях этой книги и ссылки на ресурсы, где пользователь может приобрести книгу. Благодаря полнотекстовому поиску по содержанию, есть возможность найти книгу, имея сильно ограниченное количество информации о ней. Этот сервис не решает ни проблему унифицированного доступа к информации о книгах, ни проблему различных форматов книг.

Проект eBdb (electronics books data base) [2] — это поисковая система, которая обходит интернет и сохраняет у себя ссылки на те страницы сторонних ресурсов, которые содержат ссылки на книги. В результате поиска выдается список ссылок на страницы, содержащие книги. Для того, чтобы получить книгу пользователь должен перейти по ссылке, и, возможно, зарегистрироваться на ресурсе. Это решает проблему поиска книг, находящихся в свободном доступе, но остаются другие задачи, которые пользователь вынужден выполнять самостоятельно (скачивание книг и поиск подходящей программы для просмотра). Эта поисковая система тоже не решает проблемы унифицированного доступа и проблему различных форматов книг.

Есть большие системы, решающие проблему унифицированного доступа и различных форматов книг, а именно: Amazon Kindle [3], Sony Reader [4] и подобные. Это программно-аппаратные платформы для чтения электронных книг. Они предоставляют устройство, которое имеет доступ к определенному хранилищу. Пользователь может подключить свое устройство к Интернету, найти нужную книгу в этом хранилище и купить её. Дальше устройство само скачает книгу и откроет её. Из минусов у таких систем то, что эти системы платные и зависимые от устройства. Количество доступных книг ограничено теми книгами, которые хранят/продают хранилища, к которым они подключаются. Но это не единственные минусы таких систем. Так, к примеру, у Amazon Kindle за каждый загруженный текст (вне зависимости от источника загрузки) требуется заплатить компании Amazon от 10 центов. Еще Amazon контролирует информацию, содержащуюся на устройствах, находящихся у пользователей, и по своему усмотрению удаляет её (в том числе книги, приобретённые непосредственно у Amazon).

Существует открытая технология, решающая проблему унифицированного доступа, — OPDS (The Open Publication Distribution System) [6]. OPDS — это новый активно развивающийся стандарт, который построен на базе расширяемого языка разметки Atom[5]. OPDS - это новый активно развивающийся стандарт, который построен на базе расширяемого языка разметки Atom. Этот стандарт был специально разработан для предоставления информации об электронных документах. В нем учтены особенности такого рода информации (наличие аннотации, автора, изображения обложки и пр.).

Основная идея существования такого стандарта в том, что если многие сайты будут распространять свою информацию о книгах в таком формате, то клиентские программы могут работать с ними единообразно (см. рис.1). Несмотря на то, что стандарт появился недавно, уже существуют сайты и клиентские программы, использующие этот протокол.

Одним из самых крупных сайтов, предоставляющих информацию по протоколу OPDS, является BookServer[7].

Этот некоммерческий проект является частью проекта Internet Archive (http://archive.org) и является универсальной и открытой системой распространения электронных книг. BookServer это архитектура, объединяющая различные форматы книг, конвертируя их, при необходимости, в нужный формат. Система обеспечивает каталогизацию книг, имеющихся в магазинах, библиотеках или в открытом доступе. Электронный текст можно прочитать на любом конечном устройстве, будь то нетбук, смартфон или специализированное устройство для чтения, наподобие Kindle. Хотя сайтом уже можно пользоваться, он еще находится на стадии разработки, с чем, вероятно, связано отсутствие расширенного поиска по книгам, фильтрации по языкам/жанрам. Также минусом этого проекта для русскоговорящих пользователей является невозможность поиска с использованием русских символов.

Наш проект также использует стандарт OPDS и решает оговоренные выше проблемы.

1.3 Описание системы в целом

Проект направлен на создание комплекса инструментов, облегчающих пользователю поиск и работу с электронными книгами. Он покрывает все этапы работы с электронными книгами, начиная от поиска книг в интернете, заканчивая закачкой на локальный компьютер и открыванием в определенной программе. Он состоит из нескольких частей, выполняющих определённые функции. Часть, называемая «краулер» (поисковый робот), обходит различные интернет-ресурсы в поисках книг. Анализатор разбирает полученные от краулера ссылки, чтобы понять, являются ли они в действительности книгами. А сервер обрабатывает информацию, упорядочивает её, заносит в свою базу данных и представляет собранную информацию для обычных пользователей в виде веб-интерфейса и для клиентских программ — в формате OPDS.

Серверная часть состоит из 3 подпроектов:

1. поисковый робот (java);

2. анализатор найденной информации, разбирающий информацию о книгах (java);

3. собственно веб-сервер, включающий базу данных, поиск по ней, представление информации в веб и opds форматах (python, django).


Рис 2. Общая схема проекта

Клиентская часть представляет собой программу для удобной работы с сервером, предоставляющим по запросам информацию в формате OPDS. Клиент должен работать как с «родным» сервером, так и с другими серверами, поддерживающими OPDS, например, feedbooks [8]. Пользователь устанавливает у себя на машине одну из клиентских программ.

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

1.4 Постановка задачи

В рамках данной дипломной работы была поставлена задача реализовать графический клиент на языке С++ для поиска и работы с книгами, удовлетворяющий следующим требованиям:

  • Работа с форматом OPDS
  • Поиск и закачка книг с различных серверов
  • Фильтрация и пост-обработка результатов поиска
  • Навигация по каталогам книг, расположенным на серверах
  • Наличие библиотеки с возможностью добавления понравившихся книг
  • Модификация списка и настроек используемых серверов
  • Система хранения и модификации общих настроек программы
  • Удобный интерфейс

2 . Интерфейс пользователя.

Программа представляет собой оконное приложение. В окне присутствует главная панель с выбором режима работы. Она позволяет производить переход между четырьмя режимами — поиск книг, управление библиотекой, просмотр каталогов и изменение настроек приложения.


Рис 3. Главное окно приложения

Ниже - панель управления для данного режима. (Для поиска это строка для ввода запроса и кнопка «Начать поиск»)

Белым цветом выделена основная рабочая область. Здесь будут появляться результаты поиска, отображаться каталоги и настройки.

2.1 Поиск книг

После открытия приложения, оно находится в режиме поиска книг. Для начала поиска необходимо ввести одно или несколько слов в строку для поиска и нажать “Enter” или кнопку для поиска.

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

Рис 4. Результаты поиска.


Каждой книге соответствует своя область, где отображается ее название, автор, год издания и сервер, с которого книга скачана.

Если нажать на область, где отображена книга, то она выделяется. И на левой панели появляется вся доступная информация об этой книге: аннотация, содержание, издание, категории, доступные форматы и т. д.

Напротив названия книги три кнопки: скачать, добавить в библиотеку и читать. Если нет ссылок, по которым можно скачать книгу в заданном формате, то кнопки «read» и «download» не активны. По умолчанию книга скачивается в том формате, который указан в настройках. Все доступные форматы для книги можно увидеть в поле информации. При чтении книги она сначала скачивается во временный файл, а затем открывается программой по умолчанию для данного формата.

Результаты отображаются по мере их получения от сервера. Поскольку результатов может быть много, организован их постраничный просмотр. В любой момент можно остановить закачку.

Есть дополнительные возможности манипулирования результатами поиска: сортировка, группировка и фильтрация книг.

2.2 Просмотр каталогов

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

Приложение предоставляет интересную возможность просмотреть новинки и популярные книги со всех серверов разом.


Рис. 5. Режим просмотра каталогов

2.3 Настройки.

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

2.4 Библиотека.

Понравившиеся книги в ходе поиска и просмотра каталогов пользователь может добавить в библиотеку. Сохраняется вся информация о книге, полученная от сервера, а так же локальные ссылки, если книга была скачана.

3. Архитектура, внутреннее устройство

3.1 Вступление

Данный проект построен с использованием шаблона проектирования MVVM.[9] Все классы проекта реализуют необходимую логику работы с данными и графического представления в соответствии со структурой данного шаблона. Рассмотрим его подробнее.

3.2 Общая архитектура. Шаблон MVVM

MVVM – архитектурный шаблон программирования, базирующийся на известном паттерне MVC. Приложения, построенные с использованием данного шаблона делятся на 3 слоя: модель, представление и модель представления.


Рис. 6. Схема паттерна MVVM.

3.2.1 Модель

Слой модели – относится к классам объектной модели приложения и логике доступа к ним. В классах данного слоя производится хранение данных, загрузка данных, преобразования данных, различные операции и алгоритмы. Слой модели не знает ничего о других уровнях приложения и все его элементы существуют и имеют смысл отдельно от остальных слоев. Таким образом, модель отражает лишь реальные объекты и различную логику их обработки.

3.2.2 Модель-представления

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

3.2.3 Представление

Данный слой отвечает за графическое отображение данных слоя модель-представления , описанного выше, и работает исключительно с ним, не зная о существовании слоя модель и не работая с ним напрямую. Здесь собраны все виджеты, составляющие интерфейс программы. Ни один графический виджет не может содержать никакой логики, и является лишь отображением текущего состояния класса модели представления, относящегося к данному виджету.

3.3 Реализация слоя модели

3.3.1 Основные структуры данных

В качестве основных структур данных данного проекта выступают следующие классы:

· Book

· Author

· Catalog

Book

Данный класс содержит в себе структуру данных для книги.

Основные поля данного класса отражают основные характеристики книги, предоставляемые в рамках формата OPDS:

· Имя сервера, где книга была создана

· Заголовок

· Авторы

· Язык

· Краткое описание

· Ссылка на обложку

· Формат книги

· Содержимое книги

· Даты обновления, выпуска, издания

Author

Данный класс содержит является структурой данных для автора книги.

Основные поля данного класса отражают основные характеристики автора книги, предоставляемые форматом OPDS:

· Имя автора

· Идентификатор автора

Catalog

Данный класс содержит в себе структуру данных и логику работы c каталогом. Каталог (исходя из формата OPDS) может содержать в себе другие каталоги или книги, и это содержимое доступно по ссылке, предоставляемой в описании каталога.

Основные поля данного класса отражают основные характеристики каталога:

· Родительский каталог

· Дочерние каталоги\книги

· Имя каталога

· Описание содержимого каталога

· Список URL-ов, используемых для получения содержимого данного каталога.

Изначально, каталог не заполнен данными и в графических виджетах пользователь лишь видит его имя и имеет возможность войти в него. При запросе на вход в каталог – его содержимое извлекается менеджером загрузки из списка URL-ов, относящегося к данному каталогу. О механизмах загрузки и парсинга будет рассказано далее.

Основные методы класса каталога, используемые другими менеджерами модели:

· Добавление книг\каталогов

· Добавление URL-ов, используемых для получения содержимого

3.3.2 Потоки загрузки

Различные менеджеры загрузок, которые будут рассмотрены далее, используют для загрузки данных из сети с использованием специальных классов загрузчиков – наследников класса DownloaderThread. Работа с сетью осуществляется средствами библиотеки Qt – DownloaderThread инкапсулирует объект QHttp [10]. Каждый DownloaderThread открывает новый поток для обращения к серверу.

Рис. 7. Потоки загрузки.

Данный класс предоставляет возможность задать параметры скачивания (ссылка для скачивания, сервер, порт), начать\остановить закачку. Это выполняется при помощи конструктора класса

· DownloaderThread (QString downloadServerUrl, QString downloadBooksRequestUrl)

и следующих методов:

· int startDownloading(QString searchRequest);

· void abort();

При завершении (успешном или нет) закачки, необходимые сигналы обрабатываются и вызываются следующие методы:

· virtual void parseReceivedData(int requestId);

· virtual void parseError(int requestId);

Данные методы – виртуальные и должны перегружаться дочерними классами, наследующимися от данного. Реализация данных методов зависит от того, что загружается при помощи потока загрузки и как это необходимо обработать.

Поток загрузки книг – класс BookDownloader

Данный класс реализует функциональность получения книг при использовании поиска на заданном сервере, обработки и парсинга полученных данных и преобразовании их в экземпляры класса Book для дальнейшего использования приложением. Для разбора полученого OPDS файла используется SAX парсер.

Основные методы класса:

· void startDownloadingBooks(QString searchRequest) – начинает загрузку книг на сервере, заданном при создании данного загрузчика, передавая searchRequest в качестве запроса на данный сервер.

· void getMore() – получает следующий блок книг, если результаты предыдущего запроса содержат несколько таких блоков.

Основной сигнал данного класса:

  • void downloadFinished(bool success, QVector<Book*>* gotBooks) – вызывается при завершении запроса и парсинга. Флаг success говорит об успешности всех операций, а вектор gotBooks содержит полученные книги от сервера, преобразованные в объекты типа Book для дальнейшего использования.

Поток загрузки каталогов – класс CatalogDownloader

Данный класс реализует функциональность получения каталогов на заданном сервере, обработки и парсинга полученных данных и преобразовании их в экземпляры класса Catalog для дальнейшего использования приложением. Его основные методы:

  • void startDownloadingCatalog(QString searchRequest, Catalog* parseCatalog) – начинает загрузку каталога на сервере, заданном при создании данного загрузчика, передавая searchRequest в качестве пути для получения данных данного каталога, а parseCatalog в качестве контейнера для заполнения полученными от сервера результатами.

Основной сигнал данного класса:

  • void downloadFinished(bool success, Catalog* downloadedCatalog) – вызывается при завершении запроса и парсинга. Флаг success говорит об успешности всех операций, а объект Catalog содержит каталог, который был обработан и заполнен (в случае success = true) в результате работы запроса данного потока закачки.

Поток загрузки файлов – класс FileDownloader

Данный класс реализует функциональность загрузки файлов. Его основные методы:

· int startDownloadingFile(QString url, QString filename, bool autoOpen) – начинает загрузку файла на сервере, заданном при создании данного загрузчика, передавая url в качестве пути запроса к файла на данный сервер, filename – в качестве локального пути сохранения файла, а флаг autopen – в качестве флага указания для автоматического открытия после закачки.

Основной сигнал данного класса:

· void downloadFinished(bool success, QString filename, int requestId) – вызывается при завершении запроса и парсинга. Флаг success говорит об успешности всех операций, filename указывает на путь, куда был сохранен файл, а requestId указывает на идентификатор запроса, использующийся для обработки данных операций на уровне вышестоящих менеджеров (например для борьбы с одновременными повторными запросами к одному и тому-же файлу).

3.3.3 Менеджеры работы с сетью

Центральными классами в слое модели – являются менеджеры работы с сетью – BookSearchManager, CatalogManager, FileDownloadManager. Они реализуют паттерн singleton [11]. Менеджеры являются классами, стоящими над уровнем классов загрузчиков и агрегируют в себе их экземпляры, используя их для выполнения логики работы с многими серверами. Каждый менеджер предоставляет интерфейс, позволяющий не заботиться о проблемах подключения, выбора серверов, объединения данных и дающий возможность работать с объединенными коллекциями данных, а также предоставляющий дополнительную функциональность пост-обработки загруженных данных и другие групповые операции, полностью энкапсулируя в себе сетевую логику.

Менеджер загрузки книг – BookSearchManager

Данный менеджер объединяет в себе набор из загрузчиков книг – BookDownloader и предоставляет интерфейс для групповых операций над данными загрузчиками, таким образом давая возможность выполнять такие действия, как например поиск по всем серверам, заданным в системе.

Рис 8. Схема работы класса BookSearchManager.

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

Основные методы данного класса:

· void startSearch(QString searchRequest) – начать групповой поиск книг

· void getMore() – выполнить групповую операцию получения следующего блока книг

· void stop() – остановить получение книг.

Основные сигналы данного класса:

· void booksChanged(QVector<Book*>& books) – вызывается при изменении набора книг (докачке)

· void booksAvailabilityChanged(bool availability) – вызывается при изменении статуса наличия книг (по некоторым запросам может не быть результатов, что вызовет этот сигнал с параметром false)

· void downloadFinished() – вызывается при завершении закачки книг.

Менеджер загрузки каталогов – CatalogManager

Данный менеджер объединяет в себе набор из загрузчиков каталогов – CatalogDownloader и предоставляет интерфейс для групповых операций над данными загрузчиками, давая возможность выполнять такие действия, как, например, получение содержимого похожих каталогов (к примеру, New books) с различных серверов и объединения их в один или же параллельного получения содержимого различных каталогов.

Рис 8. Схема работы класса BookSearchManager.

Данный менеджер выполняет ряд основных задач:

· Предоставляет интерфейс для загрузки содержимого каталога

· Выполняет автоматический поиск групп тематических каталогов (таких, как New\Recent books) и объединение их для последующей обработки

· Предоставляет средства для навигации по дереву каталогов

Основные методы данного класса:

· Catalog* getCatalogRoot() –получение корня дерева каталогов

· void openRoot() – открытие дерева корня каталогов

· void goUpLevel() – навигация «вверх» по дереву каталогов

· void goBack() – навигация «назад» по дереву каталогов

· void goForward() – навигация «вперед» по дереву каталогов

· void openCatalog(Catalog* catalog) – открытие заданного каталога (и получение его содержимого, если оно не было сделано раньше)

· bool goBackAvailable() – флаг наличия возможности навигации «назад»

· bool goForwardAvailable() – флаг наличия возможности навигации «вперед»

· bool goUpAvailable() – флаг наличия возможности навигации «вверх»

Основные сигналы данного класса:

· void catalogRootChanged() – сигнал изменения корневого каталога

· void catalogContentsParsed(Catalog* catalog) – сигнал завершения парсинга содержимого каталога

· void currentCatalogChanged(Catalog* catalog) – сигнал изменения текущего каталога в дереве навигации

· void goUpAvailabilityChanged(bool newValue) – сигнал изменения флага возможности перехода «вверх» по дереву навигации

· void goBackAvailabilityChanged(bool newValue) - сигнал изменения флага возможности перехода «назад» по дереву навигации

· void goForwardAvailabilityChanged(bool newValue) - сигнал изменения флага возможности перехода «вперед» по дереву навигации

Менеджер загрузки файлов – FileDownloadManager

Данный менеджер объединяет в себе набор из загрузчиков файлов – FileDownloader и предоставляет интерфейс для групповых операций над данными загрузчиками, таким образом давая возможность выполнять такие действия, как например независимая параллельная закачка файлов книг или обложек.

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

Основные методы данного класса:

· QString getReadDefaultLocation() – получить стандартный путь сохранения файлов

· QString getCoverDir() – получить путь директории для сохранения обложек

· int downloadCover(QString urlStr, QIODevice* out) – метод скачивания обложки

· int downloadBook(const Book& book, const QString& filename, const QString& format) – метод скачивания книги

· int readBook(const Book& book, const QString& filename, const QString& format) – чтение (открытие стандартной программой по умолчанию) скаченного файла книги

· Основные сигналы данного класса:

· void downloadBookFinished(bool, int) – сигнал завершения закачки книги

· void coverRequestFinished(int, bool) – сигнал завершения закачки обложки

3.3.4 Модуль работы с библиотекой – класс LibraryManager

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

Основные методы класса:

· void addBookToLibrary(Book* newBook) – Добавление книги в библиотеку

· void removeBookFromLibrary(Book* newBook) – Удаление книги из библиотеки

· void openLibrary() – выполняет начальную загрузку библиотеки при старте приложения или же при изменении пути библиотеки (он может выбирать динамически в ходе работы приложения)

Основные сигналы:

· void booksChanged(QVector<Book*>& books) – сигнал изменения состава библиотеки

· void booksAvailabilityChanged(bool availability) – сигнал изменения флага наличия книг в библиотеке

3.4 Система хранения настроек

Данное приложение имеет ряд хранимых настроек, таких как: список серверов, пути закачек, пути парсинга каталогов, предпочтительные форматы для закачки, путь хранения файлов библиотеки, адрес прокси сервера, число выводимых книг на страницу и т.п. Данные настройки хранятся в специальных файлах с использованием стандартного класса QSettings.

На уровне приложения с данным классов работает менеджер SettingsManager, дополняя его необходимой функциональностью по заданию хранимых настроек, представлению интерфейса для их программного изменения (избавляя от необходимости заботиться о нижнем уровне работы непосредственно с файлами и записями – уровне QSettings).

Основные методы данного класса задают и считывают текущие значения основных настроек, такие как:

· void setBooksOnPage(int newValue);

· int getBooksOnPage();

· void setProxy(QString newValue);

· QString getProxy();

· void setProxyPort(int newValue);

· int getProxyPort();

и другие.

3.5 Слои представления и модели представления

В соответствии с идеологией MVVM – классы слоев представления и модели представления обычно работают парами и класс представления обычно имеет соответствующий ему класс модели представления, который подготавливает для него данные. Хотя есть и исключения, ведь в общем случае на один класс модели представления может ссылаться несколько классов представления.

3.5.1 Организация основныч классов представления.

Все виджеты данного слоя – наследуются от класса StandardView, имеющего следующий вид:

class StandardView : public QWidget

{

Q_OBJECT

public:

StandardView(QWidget* parent);

virtual ~StandardView();

protected:

virtual void createComponents();

virtual void layoutComponents();

virtual void setWindowParameters();

virtual void setConnections();

virtual void initialize();

};

Цель данного класса – привести все виджеты и их логику к единообразному виду, разделив их функциональность на 4 блока:

· создание компонент – в этом блоке инициализируются все графические объекты, такие как QLabel, QIcon, и т.п.

· расположение компонент – здесь задаются различные Layout-ы и взаимное расположение всех компонент, созданных на предыдущем этапе

· задание общих параметров окна – в этом блоке задаются общие параметры окна, такие, как ширина, высота, стилевая таблица (будет описано далее)

· задание соединений – здесь задаются соединения сигналов и слотов данного виджета и соответствующего ему класса модели представления

Для создания любого виджета в рамках данной архитектуры выполняется строгий набор действий:

· Задание соответствующего класса модели представления в конструкторе

· Вызов метода initialize в конструкторе

· Переопределение 4-х виртуальных методов, описанных выше, в соответствии с отведенными каждому ролями

· Определение реакции на сигналы от класса модели представления, и визуальное отображение измененных данных (виджет должен только подписываться на сигналы об изменении данных)

При этом класс модели представления для каждого виджета должен реализовать все необходимые методы и сигналы для передачи данных от модели к виджету в нужном преобразованном виде.

3.5.2 Класс стандартного окна контента

Данное приложение имеет единый каркас и все элементы содержимого (форма поиска книг, библиотеки, каталогов, настроек) – имеют схожую структуру и похожий вид. Для этого общая структура расположения и ограничения по содержимому – выделены в отдельный класс StandardContentView.

Данный класс задает общий вид виджета со следующей структурой:

Рис 10. Каркас для внешнего вида основной рабочей области приложения.

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

· virtual void addItemsToLeftBarPartLayout(QHBoxLayout* leftPartLayout);

· virtual void addItemsToRightBarPartLayout(QHBoxLayout* rightPartLayout);

· virtual void addItemsToLeftContentPartLayout(QHBoxLayout* leftPartLayout);

· virtual void addItemsToRightContentPartLayout(QHBoxLayout* rightPartLayout);

3.5.3 Таблицы стилей.

Графическое представление данного приложения в основном задается при помощи внешних каскадных стилевых таблиц. В них задаются цвета, размеры, изображения все компонент приложения во всех возможных состояниях. Это позволяет изменять внешний вид приложения без внесения каких-либо изменений в код программы.

Стилевые таблицы построены с использованием системы Qt Stylesheets[10]. Таблица стилей расположена во внешнем файле с расширением qss, путь к ней хранится в файле ресурсов приложения.

Для загрузки стилевой таблицы виджеты имеют действия подобные данному:

QFile styleSheetFile(":/qss/BookStyle");

styleSheetFile.open(QIODevice::ReadOnly);

this->setStyleSheet(styleSheetFile.readAll());

3.6 Результат.

Благодаря четкому модульному устройству, объектно-ориентированному подходу и использованию архитектрурного патерна получилась хоршо струкрурированная расширяемая программа.

В ходе создания приложения широко использовались возможности библиотеки Qt начиная от рисования интерфейса до сохранения настроек и работы с сетью.

4 Другие клиентские программы.

Проблема распространения в интернете электронных книг не нова. Разумеется существует немало других клиентских программ, работающих с OPDS-каталогами. Все они реализуют примерно один и тот же набор функций и отличаются лишь деталями. У всех есть свои преимущества, недостатки и особенности. Здесь я приведу небольшой обзор трёх популярных клиентов.

4.1 Stanza

Весьма популярный клиент для работы с электронными книгами, созданный под iPhone и iPod. Он позволяет пользователю скачивать и читать книги при помощи своей собственной программы для чтения, используя разнообразные настройки и функции. Данный клиент реализует поиск и навигацию по своему и ещё нескольким каталогам (таким как feedbooks). В программе есть возможность закачивать свои книги, менять языки интерфейса, просматривать информацию о книгах и менять их обложки. В ней встроена библиотека пользователя. Библиотека позволяет пользователю хранить, организовывать и читать книги с наибольшим удобством[13].

4.2 Lucidor

Ещё один клиент для работы с электронными книгами и OPDS-каталогами. Существуют версии для Linux, Windows и Mac OS X. Основными его функциями являются чтение книг в формате EPUB, организация собственной коллекции книг, поиск книг и просмотр online каталогов.

Клиент использует свою программу для чтения книг формата EPUB, которая предоставляет некоторые возможности для работы с книгами – поиск слов в тексте, закладки. Библиотека (Bookcase) позволяет хранить

отобранные пользователем книги. Одна из главных функций программы – просмотр online-каталогов и поиск книг по ним. Пользователь может видеть информацию о названии, авторе книги и ссылки на epub и pdf файлы.[16]

4.3 Calibre

Свободное кроссплатформенное приложение с открытым исходным кодом. Оно предоставляет широкие возможности по управлению личной библиотекой, позволяет:

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

· Поддерживает множество форматов, а так же позволяет конвертировать их друг в друга.(Форматы: CBZ, CBR, CBC, EPUB, FB2, HTML, LIT, LRF, MOBI, ODT, PDF, PDB, PML, RB, RTF, TCR, TXT) .

· Позволяет работу с различными устройствами для чтения книг.

· Содержит встроенные программы для чтения всех поддерживаемых форматов книг.

· Содержит встроенный веб-сервер для удаленного управления библиотекой. Также она может скачивать и высылать книги вам по электронной почте

· позволяет создать opds каталог для локальной коллекции книг. [14, 15]

4.4 Сравнение с ebooksearchtool client

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

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

· Кроссплатформенность

· Одновременная работа со многими серверами

· Просмотр новинок и популярных книг со всех серверов разом

· Работа с книгами в любом формате

· Удобство выборки нужной книги из результатов поиска

· Возможность подключения новых серверов, поддерживающих формат OPDS.

На данный момент рассматриваемая клиентская программа не имеет в полном объёме всех функций, представленных в других подобных приложениях. Можно было бы расширить возможности пользователя по управлению личной библиотекой. Она предоставляет необходимый функционал для работы с книгами и имеет некоторые преимущества перед другими клиентами. И позволяет ее расширять и дополнять для большего удобства и введения новых возможностей.

5. Заключение.

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

Проделанная работа является частью большой системы, разрабатываемой в команде. Исходный код клиентской программы в репозитории google — https://code.google.com/p/ebooksearchtool/client-cpp-qt.

Список литературы:

1. Сервис Google Books: http://books.google.com

2. Сервис electronic books data base: http://ebdb.ru/

3. Описание программно-аппаратной платформы для чтения электронных книг Amazon Kindle: http://ru.wikipedia.org/wiki/Amazon_Kindle

4. Описание электронного устройства для чтения книг Sony Reader: http ://ru.wikipedia.org/wiki/Sony_Reader

5. Описание стандарта Atom: http://atompub.org

6. Спецификация стандарта OPDS http://code.google.com/p/openpub/wiki/CatalogSpecDraft

7. Проект bookserver: http://bookserver.archive.org

8. Популярная электронная библиотека, поддерживающая формат OPDS: http://feedbooks.com

9. Описание архитектурного паттерна MVVM http://en.wikipedia.org/wiki/Model_View_ViewModel

10. Документация к библиотеке Qt http://doc.qt.nokia.com/

11. Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес «Приемы объектно-ориентированного проектирования»

12. Стандарт Opensearch: http://www.opensearch.org

13. Официальный сайт приложения Stanza: http://www.lexcycle.com

14. Описание приложения Calibre одним из пользователей http://habrahabr.ru/blogs/ebooks/86451/

15. О фициальный сайт приложения Calibre: http://calibre-ebook.com/

16. О фициальный сайт приложения Lucidor: http://lucidor.org/lucidor

17. Официальный сайт приложения Aldiko: http://www.aldiko.com

18. Исходный код клиентской программы: http://code.google.com/p/ebooksearchtool/client-cpp-qt

19. Рабочий ресурс проекта ebooksearchtool: http://ebooksearch.webfactional.com/

20. Макс Шлее «QT Профессиональное программирование на C++»

21. Жасмин Бланшет, Марк Саммерфилд «Qt 4. Программирование GUI на C++»