+gboolean session_is_running(Session *session)
+{
+ return (session->state == SESSION_READY ||
+ session->state == SESSION_SEND ||
+ session->state == SESSION_RECV);
+}
+
+gboolean session_is_connected(Session *session)
+{
+ return (session->state == SESSION_SEND ||
+ session->state == SESSION_RECV);
+}
+
+void session_set_access_time(Session *session)
+{
+ session->last_access_time = time(NULL);
+}
+
+void session_set_timeout(Session *session, guint interval)
+{
+ if (session->timeout_tag > 0)
+ g_source_remove(session->timeout_tag);
+
+ session->timeout_interval = interval;
+ if (interval > 0) {
+ if (interval % 1000 == 0)
+ session->timeout_tag =
+ g_timeout_add_seconds(interval/1000, session_timeout_cb, session);
+ else
+ session->timeout_tag =
+ g_timeout_add(interval, session_timeout_cb, session);
+ } else
+ session->timeout_tag = 0;
+}
+
+static gboolean session_timeout_cb(gpointer data)
+{
+ Session *session = SESSION(data);
+
+ g_warning("session timeout.\n");
+
+ if (session->io_tag > 0) {
+ g_source_remove(session->io_tag);
+ session->io_tag = 0;
+ }
+
+ session->timeout_tag = 0;
+ session->state = SESSION_TIMEOUT;
+
+ return FALSE;
+}
+