После полугода использования 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 сейчас действительно кроссплатформенный (и как бы так выразиться, кросс-устройственный)! Я понял что могу писать один и тот же код для трех разных платформ, одна из которых вообще КПК. А тут уже большой простор для фантазии! :-)