+void session_state_free(ObSessionState *state)
+{
+ if (state) {
+ g_free(state->id);
+ g_free(state->name);
+ g_free(state->class);
+ g_free(state->role);
+
+ g_free(state);
+ }
+}
+
+static gboolean session_state_cmp(ObSessionState *s, ObClient *c)
+{
+ gchar *client_id;
+
+ if (!(client_id = client_get_sm_client_id(c)))
+ return FALSE;
+ g_print("\nsaved %s\nnow %s\n", s->id, client_id);
+ if (strcmp(s->id, client_id)) {
+ g_free(client_id);
+ return FALSE;
+ }
+ g_free(client_id);
+ g_print("saved %s\nnow %s\n", s->name, c->name);
+ if (strcmp(s->name, c->name))
+ return FALSE;
+ g_print("saved %s\nnow %s\n", s->class, c->class);
+ if (strcmp(s->class, c->class))
+ return FALSE;
+ g_print("saved %s\nnow %s\n\n", s->role, c->role);
+ if (strcmp(s->role, c->role))
+ return FALSE;
+ return TRUE;
+}
+
+ObSessionState* session_state_find(ObClient *c)
+{
+ GSList *it;
+
+ for (it = sm_saved_state; it; it = g_slist_next(it))
+ if (session_state_cmp(it->data, c)) {
+ ObSessionState *s = it->data;
+ sm_saved_state = g_slist_remove(sm_saved_state, s);
+ return s;
+ }
+ return NULL;
+}
+