types
[oweals/gnunet.git] / src / fs / fs_unindex.c
index 1416667f37bc80df942ec7353bb26210ac53a234..977344b98d8ab5ceedda9f1053d77ee279b4f8f5 100644 (file)
@@ -79,28 +79,29 @@ unindex_reader (void *cls,
 
 
 /**
- * Function called asking for the current (encoded)
- * block to be processed.  After processing the
- * client should either call "GNUNET_FS_tree_encode_next"
- * or (on error) "GNUNET_FS_tree_encode_finish".
+ * Fill in all of the generic fields for 
+ * an unindex event.
  *
- * @param cls closure
- * @param query the query for the block (key for lookup in the datastore)
- * @param offset offset of the block
- * @param type type of the block (IBLOCK or DBLOCK)
- * @param block the (encrypted) block
- * @param block_size size of block (in bytes)
+ * @param pc structure to fill in
+ * @param sc overall unindex context
  */
-static void 
-unindex_process (void *cls,
-                const GNUNET_HashCode *query,
-                uint64_t offset,
-                unsigned int type,
-                const void *block,
-                uint16_t block_size)
+static void
+make_unindex_status (struct GNUNET_FS_ProgressInfo *pi,
+                    struct GNUNET_FS_UnindexContext *uc,
+                    uint64_t offset)
 {
+  pi->value.unindex.uc = uc;
+  pi->value.unindex.cctx = uc->client_info;
+  pi->value.unindex.filename = uc->filename;
+  pi->value.unindex.size = uc->file_size;
+  pi->value.unindex.eta 
+    = GNUNET_TIME_calculate_eta (uc->start_time,
+                                offset,
+                                uc->file_size);
+  pi->value.publish.duration = GNUNET_TIME_absolute_get_duration (uc->start_time);
+  pi->value.publish.completed = offset;
 }
-                                            
+
 
 /**
  * Function called with information about our
@@ -119,35 +120,20 @@ unindex_progress (void *cls,
                  size_t pt_size,
                  unsigned int depth)
 {
-  // FIXME
-}
-                                              
-
+  struct GNUNET_FS_UnindexContext *uc = cls;
+  struct GNUNET_FS_ProgressInfo pi;
 
-/**
- * Fill in all of the generic fields for 
- * an unindex event.
- *
- * @param pc structure to fill in
- * @param sc overall unindex context
- */
-static void
-make_unindex_status (struct GNUNET_FS_ProgressInfo *pi,
-                    struct GNUNET_FS_UnindexContext *uc,
-                    uint64_t offset)
-{
-  pi->value.unindex.uc = uc;
-  pi->value.unindex.cctx = uc->client_info;
-  pi->value.unindex.filename = uc->filename;
-  pi->value.unindex.size = uc->file_size;
-  pi->value.unindex.eta 
-    = GNUNET_TIME_calculate_eta (uc->start_time,
-                                offset,
-                                uc->file_size);
-  pi->value.publish.duration = GNUNET_TIME_absolute_get_duration (uc->start_time);
-  pi->value.publish.completed = offset;
+  pi.status = GNUNET_FS_STATUS_UNINDEX_PROGRESS;
+  make_unindex_status (&pi, uc, offset);
+  pi.value.unindex.specifics.progress.data = pt_block;
+  pi.value.unindex.specifics.progress.offset = offset;
+  pi.value.unindex.specifics.progress.data_len = pt_size;
+  pi.value.unindex.specifics.progress.depth = depth;
+  uc->client_info 
+    = uc->h->upcb (uc->h->upcb_cls,
+                  &pi);
 }
-
+                                              
 
 /**
  * We've encountered an error during
@@ -172,10 +158,118 @@ signal_unindex_error (struct GNUNET_FS_UnindexContext *uc,
 }
 
 
+/**
+ * Continuation called to notify client about result of the
+ * datastore removal operation.
+ *
+ * @param cls closure
+ * @param success GNUNET_SYSERR on failure
+ * @param msg NULL on success, otherwise an error message
+ */
+static void
+process_cont (void *cls,
+             int success,
+             const char *msg)
+{
+  struct GNUNET_FS_UnindexContext *uc = cls;
+  if (success == GNUNET_SYSERR)
+    {
+      signal_unindex_error (uc,
+                           msg);
+      return;
+    }
+  
+  GNUNET_FS_tree_encoder_next (uc->tc);
+}
+
+
+/**
+ * Function called asking for the current (encoded)
+ * block to be processed.  After processing the
+ * client should either call "GNUNET_FS_tree_encode_next"
+ * or (on error) "GNUNET_FS_tree_encode_finish".
+ *
+ * @param cls closure
+ * @param query the query for the block (key for lookup in the datastore)
+ * @param offset offset of the block
+ * @param type type of the block (IBLOCK or DBLOCK)
+ * @param block the (encrypted) block
+ * @param block_size size of block (in bytes)
+ */
+static void 
+unindex_process (void *cls,
+                const GNUNET_HashCode *query,
+                uint64_t offset,
+                uint32_t type,
+                const void *block,
+                uint16_t block_size)
+{
+  struct GNUNET_FS_UnindexContext *uc = cls;
+  uint32_t size;
+  const void *data;
+  struct OnDemandBlock odb;
+
+  if (type != GNUNET_DATASTORE_BLOCKTYPE_DBLOCK)
+    {
+      size = block_size;
+      data = block;
+    }
+  else /* on-demand encoded DBLOCK */
+    {
+      size = sizeof(struct OnDemandBlock);
+      odb.offset = offset;
+      odb.file_id = uc->file_id;
+      data = &odb;
+    }
+  GNUNET_DATASTORE_remove (uc->dsh,
+                          query,
+                          size,
+                          data,
+                          &process_cont,
+                          uc,
+                          GNUNET_CONSTANTS_SERVICE_TIMEOUT);
+}
+
+
+/**
+ * Function called when the tree encoder has
+ * processed all blocks.  Clean up.
+ *
+ * @param cls our unindexing context
+ * @param tc not used
+ */
 static void
 unindex_finish (void *cls,
                const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
+  struct GNUNET_FS_UnindexContext *uc = cls;
+  char *emsg;
+  struct GNUNET_FS_Uri *uri;
+  struct GNUNET_FS_ProgressInfo pi;
+
+  GNUNET_FS_tree_encoder_finish (uc->tc,
+                                &uri,
+                                &emsg);
+  if (uri != NULL)
+    GNUNET_FS_uri_destroy (uri);
+  GNUNET_DISK_file_close (uc->fh);
+  uc->fh = NULL;
+  GNUNET_DATASTORE_disconnect (uc->dsh, GNUNET_NO);
+  uc->dsh = NULL;
+  if (emsg != NULL)
+    {
+      signal_unindex_error (uc, emsg);
+      GNUNET_free (emsg);
+    }
+  else
+    {   
+      pi.status = GNUNET_FS_STATUS_UNINDEX_COMPLETED;
+      make_unindex_status (&pi, uc, uc->file_size);
+      pi.value.unindex.eta = GNUNET_TIME_UNIT_ZERO;
+      uc->client_info
+       = uc->h->upcb (uc->h->upcb_cls,
+                      &pi);
+    }
 }