Pull to refresh

Практическая кроссплатформенность

Reading time3 min
Views1.7K
После полугода использования Ubuntu Linux я окончательно решил, что это именно та система, которая мне нужна для работы и развлечений. Почту организовал в Evolution и был приятно удивлен тем, что там есть все что мне надо, но ничего лишнего (что особенно удивительно после работы в Microsoft Office Outlook)!

Так сложилось, что я купил себе PocketPC на базе WM6 (Windows Mobile 6).

Все было замечательно до момента, пока у меня не появилось много дел и задач: понадобилась полная синхронизация между тремя продуктами:
  • Evolution
  • Windows Mobile Outlook
  • MS Office Outlook

Поиск решения


После некоторого поиска в интернете я обнаружил то, что через USB-кабель я точно не смогу синхронизовать Evolution с КПК (WM6 еще не поддерживается, а проект по синхронизации с WM5 умер полностью).

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

Задача


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

НО!

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

После определенного обзора я обнаружил:

1. MS Office Outlook предоставляет объектную модель для .NET приложений.
2. Evolution предоставляет объектную модель для mono-приложений.
    Для тех кто не знает: mono — это кроссплатформенная (Win/*nix/Mac) реализация .NET Framework.
3. WM Outlook предоставляет объектную модель для .NET-приложений.

Класс! Значит, я могу на C# все написать!

Решение


Самое главное — хорошо все спроектировать! Я построил некую абстрактную модель:

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

Распределил я эти области ответственности следующим образом:

Программа: Реализация провайдера синхронизации
Библиотека (Sync.dll): Синхронизатор, Менеджер сети, Конфигуратор
Библиотека (Platform.dll): Особенности системы

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

За работу!


Я запустил Visual Studio и на одном дыхании реализовал Sync.dll. После чего занялся WM Outlook и (после определенного секса при настройке отладки на виртуальном устройстве) я написал первый провайдер синхронизации.

Такс… теперь Evolution. Я запустил MonoDevelop, поставил evolution mono bindings (с огромным сексом, так как у пакета не были правильно соблюдены зависимости). И написал второй провайдер синхронизации!

Запустил, и о чудо! Контакты из Evolution скопировались в КПК! Теперь надо обратную передачу тоже доделать и мелочи поправить! :-)

Итоги


Меня удивило то, что .NET сейчас действительно кроссплатформенный (и как бы так выразиться, кросс-устройственный)! Я понял что могу писать один и тот же код для трех разных платформ, одна из которых вообще КПК. А тут уже большой простор для фантазии! :-)
Tags:
Hubs:
+30
Comments46

Articles