query,
size,
data,
+ -2, 1,
+ GNUNET_CONSTANTS_SERVICE_TIMEOUT,
&process_cont,
- uc,
- GNUNET_CONSTANTS_SERVICE_TIMEOUT);
+ uc);
}
GNUNET_FS_tree_encoder_finish (uc->tc,
&uri,
&emsg);
+ uc->tc = NULL;
if (uri != NULL)
GNUNET_FS_uri_destroy (uri);
GNUNET_DISK_file_close (uc->fh);
uc->dsh = NULL;
if (emsg != NULL)
{
+ uc->state = UNINDEX_STATE_ERROR;
uc->emsg = emsg;
signal_unindex_error (uc);
}
- else
+ else
{
+ uc->state = UNINDEX_STATE_COMPLETE;
pi.status = GNUNET_FS_STATUS_UNINDEX_COMPLETED;
pi.value.unindex.eta = GNUNET_TIME_UNIT_ZERO;
GNUNET_FS_unindex_make_status_ (&pi, uc, uc->file_size);
}
if (uc->state != UNINDEX_STATE_FS_NOTIFY)
{
- GNUNET_FS_unindex_stop (uc);
+ uc->state = UNINDEX_STATE_ERROR;
+ uc->emsg = GNUNET_strdup (_("Unexpected time for a response from `fs' service."));
+ GNUNET_FS_unindex_sync_ (uc);
+ signal_unindex_error (uc);
return;
}
if (NULL == msg)
struct GNUNET_FS_UnindexContext *uc = cls;
struct UnindexMessage req;
+ uc->fhc = NULL;
if (uc->state != UNINDEX_STATE_HASHING)
{
GNUNET_FS_unindex_stop (uc);
*
* @param cls the 'struct GNUNET_FS_UnindexContext' to signal for
*/
-static void
-unindex_signal_suspend (void *cls)
+void
+GNUNET_FS_unindex_signal_suspend_ (void *cls)
{
struct GNUNET_FS_UnindexContext *uc = cls;
struct GNUNET_FS_ProgressInfo pi;
+ if (uc->fhc != NULL)
+ {
+ GNUNET_CRYPTO_hash_file_cancel (uc->fhc);
+ uc->fhc = NULL;
+ }
+ if (uc->client != NULL)
+ {
+ GNUNET_CLIENT_disconnect (uc->client, GNUNET_NO);
+ uc->client = NULL;
+ }
+ if (NULL != uc->dsh)
+ {
+ GNUNET_DATASTORE_disconnect (uc->dsh, GNUNET_NO);
+ uc->dsh = NULL;
+ }
+ if (NULL != uc->tc)
+ {
+ GNUNET_FS_tree_encoder_finish (uc->tc,
+ NULL,
+ NULL);
+ uc->tc = NULL;
+ }
+ if (uc->fh != NULL)
+ {
+ GNUNET_DISK_file_close (uc->fh);
+ uc->fh = NULL;
+ }
GNUNET_FS_end_top (uc->h, uc->top);
pi.status = GNUNET_FS_STATUS_UNINDEX_SUSPEND;
GNUNET_FS_unindex_make_status_ (&pi, uc,
pi.status = GNUNET_FS_STATUS_UNINDEX_START;
pi.value.unindex.eta = GNUNET_TIME_UNIT_FOREVER_REL;
GNUNET_FS_unindex_make_status_ (&pi, ret, 0);
- /* FIXME: must be able to abort hashing here! */
- GNUNET_CRYPTO_hash_file (h->sched,
- GNUNET_SCHEDULER_PRIORITY_IDLE,
- filename,
- HASHING_BLOCKSIZE,
- &GNUNET_FS_unindex_process_hash_,
- ret);
+ ret->fhc = GNUNET_CRYPTO_hash_file (h->sched,
+ GNUNET_SCHEDULER_PRIORITY_IDLE,
+ filename,
+ HASHING_BLOCKSIZE,
+ &GNUNET_FS_unindex_process_hash_,
+ ret);
ret->top = GNUNET_FS_make_top (h,
- &unindex_signal_suspend,
+ &GNUNET_FS_unindex_signal_suspend_,
ret);
return ret;
}
{
struct GNUNET_FS_ProgressInfo pi;
- /* FIXME: stop hashing (if still ongoing) */
- /* FIXME: disconnect uc->client (if still connected) */
- /* FIXME: disconnect from datastore (if still connected) */
- /* FIXME: other termination operations? */
- /* FIXME: must do same cleanup in 'unindex_signal_suspend'! */
- GNUNET_FS_end_top (uc->h, uc->top);
- if ( (uc->state != UNINDEX_STATE_COMPLETE) &&
- (uc->state != UNINDEX_STATE_ERROR) )
+ if (uc->fhc != NULL)
{
- uc->state = UNINDEX_STATE_ABORTED;
- return;
+ GNUNET_CRYPTO_hash_file_cancel (uc->fhc);
+ uc->fhc = NULL;
+ }
+ if (uc->client != NULL)
+ {
+ GNUNET_CLIENT_disconnect (uc->client, GNUNET_NO);
+ uc->client = NULL;
}
+ if (NULL != uc->dsh)
+ {
+ GNUNET_DATASTORE_disconnect (uc->dsh, GNUNET_NO);
+ uc->dsh = NULL;
+ }
+ if (NULL != uc->tc)
+ {
+ GNUNET_FS_tree_encoder_finish (uc->tc,
+ NULL,
+ NULL);
+ uc->tc = NULL;
+ }
+ if (uc->fh != NULL)
+ {
+ GNUNET_DISK_file_close (uc->fh);
+ uc->fh = NULL;
+ }
+ GNUNET_FS_end_top (uc->h, uc->top);
if (uc->serialization != NULL)
{
GNUNET_FS_remove_sync_file_ (uc->h, GNUNET_FS_SYNC_PATH_MASTER_UNINDEX, uc->serialization);