-more convenient API to lookup egos
[oweals/gnunet.git] / src / identity / identity_api_lookup.c
diff --git a/src/identity/identity_api_lookup.c b/src/identity/identity_api_lookup.c
new file mode 100644 (file)
index 0000000..1d45136
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+     This file is part of GNUnet.
+     (C) 2013 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public Liceidentity as published
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public Liceidentity for more details.
+
+     You should have received a copy of the GNU General Public Liceidentity
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file identity/identity_api_lookup.c
+ * @brief api to lookup an ego
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_identity_service.h"
+
+#define LOG(kind,...) GNUNET_log_from (kind, "identity-api",__VA_ARGS__)
+
+
+/**
+ * Handle for ego lookup.
+ */ 
+struct GNUNET_IDENTITY_EgoLookup
+{
+  
+  /**
+   * Handle to the identity service.
+   */
+  struct GNUNET_IDENTITY_Handle *identity;
+  
+  /**
+   * Name of the ego we are looking up.
+   */
+  char *name;
+  
+  /**
+   * Function to call with the result.
+   */
+  GNUNET_IDENTITY_EgoCallback cb;
+  
+  /**
+   * Closure for @e cb
+   */
+  void *cb_cls;
+};
+
+
+/** 
+ * Method called to inform about the egos of this peer.
+ *
+ * When used with #GNUNET_IDENTITY_connect, this function is
+ * initially called for all egos and then again whenever a
+ * ego's name changes or if it is deleted.  At the end of
+ * the initial pass over all egos, the function is once called
+ * with 'NULL' for @a ego. That does NOT mean that the callback won't
+ * be invoked in the future or that there was an error.
+ *
+ * If the @a name matches the name from @a cls, we found the zone
+ * for our computation and will invoke the callback.
+ * If we have iterated over all egos and not found the name, we
+ * invoke the callback with NULL.
+ *
+ * @param cls closure with the `struct GNUNET_IDENTITY_EgoLookup`
+ * @param ego ego handle
+ * @param ego_ctx context for application to store data for this ego
+ *                 (during the lifetime of this process, initially NULL)
+ * @param name name assigned by the user for this ego,
+ *                   NULL if the user just deleted the ego and it
+ *                   must thus no longer be used
+ */
+static void 
+identity_cb (void *cls,
+            struct GNUNET_IDENTITY_Ego *ego,
+            void **ctx,
+            const char *name)
+{
+  struct GNUNET_IDENTITY_EgoLookup *el = cls;
+
+  if ( (NULL != name) &&
+       (0 == strcmp (name,
+                    el->name)) )
+  {
+    el->cb (el->cb_cls,
+           ego);
+    GNUNET_IDENTITY_ego_lookup_cancel (el);
+    return;
+  }
+  if (NULL == ego) 
+  {
+    /* not found */
+    el->cb (el->cb_cls,
+           NULL);
+    GNUNET_IDENTITY_ego_lookup_cancel (el);
+    return;
+  }
+}
+
+
+/**
+ * Lookup an ego by name.
+ *
+ * @param cfg configuration to use
+ * @param name name to look up
+ * @param cb callback to invoke with the result
+ * @param cb_cls closure for @a cb
+ * @return NULL on error
+ */
+struct GNUNET_IDENTITY_EgoLookup *
+GNUNET_IDENTITY_ego_lookup (const struct GNUNET_CONFIGURATION_Handle *cfg,
+                           const char *name,
+                           GNUNET_IDENTITY_EgoCallback cb,
+                           void *cb_cls)
+{
+  struct GNUNET_IDENTITY_EgoLookup *el;
+
+  el = GNUNET_new (struct GNUNET_IDENTITY_EgoLookup);
+  el->name = GNUNET_strdup (name);
+  el->cb = cb;
+  el->cb_cls = cb_cls;
+  el->identity = GNUNET_IDENTITY_connect (cfg,
+                                         &identity_cb,
+                                         el);
+  return el;
+}
+
+
+/**
+ * Abort ego lookup attempt.
+ *
+ * @param el handle for lookup to abort
+ */
+void
+GNUNET_IDENTITY_ego_lookup_cancel (struct GNUNET_IDENTITY_EgoLookup *el)
+{
+  GNUNET_IDENTITY_disconnect (el->identity);
+  GNUNET_free (el->name);
+  GNUNET_free (el);
+}
+
+
+/* end of identity_api_lookup.c */