Java о Fido

в 16:56, , рубрики: Fido, Fidonet, java, ORMLite, tosser, метки: , , ,

В данном посте речь пойдет об OpenSource проекте, призванном сделать жизнь фидошника лучше, а заодно дать возможность пользоваться Fido на мобильных устройствах с Java.

История

Как я уже писал, в 2010 году я получил узловой номер 2:5020/848. Не имея достаточного количества задач на работе, я испытывал «творческий голод», и искал, куда можно было-бы приложить свои силы. И нашел! Менее чем за месяц было написано некоторое количество ПО, которое давало различные дополнительные возможности пользователям моего узла — доступ к Fido через форум или NNTP, трансляция входящей и исходящей почты в email и многое другое.
К тому моменту, как весь этот зоопарк заработал стабильно, интерес к развитию узла я практически потерял и просматривал почту пару раз в месяц.
В 2011 году мне в голову пришла мысль переписать часть своего ПО на Java и запустить как отдельный узел, для чего я даже получил узловой номер 2:5020/849, но дальше проекта дело не пошло.
А буквально месяц назад один человек попросил меня прислать ему исходники ПО, управляющего пользователями на моем узле. Присылать их в сыром виде было бы некрасиво, поэтому код пришлось как следует почистить. И тогда, посматривая весь этот код, я решил что раз уж алгоритмы все придуманы, то почему-бы не переписать это все на Java, как я и планировал год назад? Ну вот и понеслась…

Для нетерпеливых

Для тех, кому не интересны технические подробности, сразу расскажу суть:
На текущий момент jNode представляет собой one-instance приложение, которое выполняет функции мейлера ( принимает и отправляет почту ), тоссера ( управляет сообщениями в эхоконференциях ) и трекера ( управляет netmail-сообщениями ).
Поставив jNode как узловую систему, оператору по большому счету больше ничего и не нужно — система будет автоматически принимать и передавать почту согласно настройкам.
В будущем планируется сделать веб-интерфейс для управления, а пока можно просто писать запросы в выбранную базу данных :)
В ближайшее время планируется сделать форк от проекта для end-user fido клиента.
Если есть желание — присоединяйтесь к разработке.

Технические подробности

Ниже пойдут выборки из кода с кратким описанием что и зачем.
Интересно будет только тем, кто планирует близкое знакомство с FTN или с данным проектом.

Версия Java: 1.7
Библиотеки: ORMLite 4, JBDC-драйвер для выбранной СУБД.
Лицензия: Apache License 2.0
Где взять: github

0. В FTN используются LE-short поля. Переворачиваем:

public static short revShort(short v) {
	return (short) ((short) ((short) (v >> 8) & 0xff) | (short) (v << 8));
}

1. FTN-адрес вида Z:N/F.P@D. Домен мы не используем, считаем стандартным «fidonet».

public class FtnAddress {
	private int zone;
	private int net;
	private int node;
	private int point;
}

2. Пакет — это массив данных, содержащий в себе заголовок и N сообщений.

public class FtnPkt {
	private FtnAddress fromAddr;
	private FtnAddress toAddr;
	private String password;
	private List<FtnMessage> messages;
	private Date date;
}

3. Сообщение — содержит from/to, атрибуты, тему и текст сообщения.

public class FtnMessage {
        private boolean isNetmail;
	private Date date;
	private String fromName;
	private String toName;
	private FtnAddress fromAddr;
	private FtnAddress toAddr;
	private String area;
	private String subject;
	private String text;
	private List<Ftn2D> seenby;
	private List<Ftn2D> path;
}

4. ORMLite — написал синглетон-менеджер для работы и получения Dao.

public class ORMManager {
	private static ORMManager self = new ORMManager();
	private boolean started = false;
	private Dao<X, ?> daoX;

	public static ORMManager getInstanse() {
		return self;
	}

	public void start(Hashtable<String, String> settings) throws SQLException {
		if (!started) {
			ConnectionSource source = new JdbcConnectionSource(JDBC_URL, JDBC_USER, JDBC_PASS);
			daoX = DaoManager.createDao(source, X.class);
			if (!daoX.isTableExists()) {
				TableUtils.createTable(source, X.class);
			}
			started = true;
		}

	}

	public static Dao<X, ?> x() {
		return getInstanse().daoX;
	}
}

5. FtnTosser — тут собраны методы для преобразования пакет->база и база->пакет.
Все методы статические. Может быть это архитектурно неправильно, но я другого варианта не увидел.
Два основных метода:

public class FtnTosser {
	public static void tossIncoming(Message[] received) {
		// разбираем входящие сообщения
	}

	public static List<Message> getMessagesForLink(Link link) {
		// пакуем исходящие сообщения
	}
}

6. ProtocolConnector — интерфейс для протокольного соединения. Пока реализован только binkp, но кто знает — вдруг в будущем появятся другие протоколы для Fido?
На вход получает только InputStream, про сокеты ничего не знает, может так-же читать из файла например.

public interface ProtocolConnector {
	// инициализация для исходящего соединения ( клиент )
	public void initOutgoing(Connector connector);
	// инициализация для входящего соединения ( сервер )
	public void initIncoming(Connector connector);
	// вызывается, когда есть данные для чтения
	public void avalible(InputStream is);
	// Frame - просто интерфейс с byte[] getBytes()
	// Получаем пакеты для отправки в сокет
	public Frame[] getFrames();
	// true если соединения завершено
	public boolean closed();
	// true если можно передавать данные
	public boolean canSend();
	// делает сброс переменных коннектору
	public void reset();
	// Преобразует message во Frame[] согласно протоколу
	public void send(Message message);
	// Вызывается, когда мы отправили все свои сообщения
	public void eob();
	// Возвращает полученные сообщения
	public Message[] getReceived();
}

7. Connector — занимается непосредственно сетью. На вход получает ProtocolConnector и адрес ( если мы клиент ) или сокет после accept'а ( если мы сервер ).
Делает reset init для ProtocolConnector ( далее PC ). Если canSend() то получает сообщения для линка (FtnTosser.getMessagesForLink(Link link)) и делает PC.send(); по окончанию сообщений делает PC.eob().
После того, как PC.closed() вернет true, вызывает обработку полученных сообщения ( FtnTosser.tossIncoming(PC.getReceived());

Заключение

Если вы дочитали до этого места, значит вам чем-то интересно современное Фидо.
Попробуйте присоединиться к этой хоть и старой, но ещё вполне живой сети.
Быть может, вы найдете там кое-что интересное для себя.
Напомню, что доступ можно получить в том числе и у меня.

Автор: kreon

Поделиться

* - обязательные к заполнению поля