[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r3909 - in gnunet-gtk: . src/plugins/fs
From: |
grothoff |
Subject: |
[GNUnet-SVN] r3909 - in gnunet-gtk: . src/plugins/fs |
Date: |
Sat, 9 Dec 2006 22:27:58 -0800 (PST) |
Author: grothoff
Date: 2006-12-09 22:27:55 -0800 (Sat, 09 Dec 2006)
New Revision: 3909
Modified:
gnunet-gtk/TODO
gnunet-gtk/src/plugins/fs/download.c
gnunet-gtk/src/plugins/fs/search.c
gnunet-gtk/src/plugins/fs/upload.c
Log:
fixing deadlocks
Modified: gnunet-gtk/TODO
===================================================================
--- gnunet-gtk/TODO 2006-12-10 05:58:37 UTC (rev 3908)
+++ gnunet-gtk/TODO 2006-12-10 06:27:55 UTC (rev 3909)
@@ -1,6 +1,4 @@
0.7.1:
-- deadlock: FSUI_startDownload/Upload
- must NOT be done in main thread [pre2]
- fix addition of previews for uploads [pre2]
- create directory from known file IDs [ medium ] [pre2]
in Assemble Directory's Files Available/Selected
Modified: gnunet-gtk/src/plugins/fs/download.c
===================================================================
--- gnunet-gtk/src/plugins/fs/download.c 2006-12-10 05:58:37 UTC (rev
3908)
+++ gnunet-gtk/src/plugins/fs/download.c 2006-12-10 06:27:55 UTC (rev
3909)
@@ -388,7 +388,7 @@
* possibly refresh directory listing.
*/
void fs_download_aborted(DownloadList * downloadContext) {
- /* FIXME: update summary? / search list status entry (once added) */
+ /* FIXME: update summary? / search list status entry! */
downloadContext->has_terminated = YES;
refreshDirectoryViewFromDisk(downloadContext);
}
@@ -479,6 +479,31 @@
return OK;
}
+typedef struct {
+ char * uri_name;
+ struct ECRS_URI * idc_uri;
+ struct ECRS_MetaData * idc_meta;
+ char * idc_final_download_destination;
+ SearchList * searchContext;
+ DownloadList * parentContext;
+ unsigned int anonymity;
+ int recursive;
+} SDC;
+
+static void * init_download_helper(void * cls) {
+ SDC * sdc = cls;
+
+ FSUI_startDownload(ctx,
+ sdc->anonymity,
+ sdc->recursive,
+ sdc->idc_uri,
+ sdc->idc_meta,
+ sdc->idc_final_download_destination,
+ sdc->searchContext->fsui_list,
+ (sdc->parentContext != NULL) ?
sdc->parentContext->fsui_list : NULL);
+ return NULL;
+}
+
/**
* The user clicked the download button.
* Start the download of the selected entry.
@@ -488,7 +513,7 @@
GtkTreePath * path,
GtkTreeIter * iter,
gpointer unused) {
- char * uri_name;
+ SDC sdc;
char * final_download_dir;
GtkTreeIter iiter;
char * tmp;
@@ -497,43 +522,38 @@
GtkTreePath *dirTreePath;
char *dirPath;
unsigned int dirPathLen;
- struct ECRS_URI * idc_uri;
- struct ECRS_MetaData * idc_meta;
char * idc_name;
char * idc_mime;
- char * idc_final_download_destination;
- SearchList * searchContext;
- DownloadList * parentContext;
- idc_uri = NULL;
- idc_meta = NULL;
+ sdc.idc_uri = NULL;
+ sdc.idc_meta = NULL;
idc_name = NULL;
idc_mime = NULL;
- searchContext = NULL;
- parentContext = NULL;
+ sdc.searchContext = NULL;
+ sdc.parentContext = NULL;
gtk_tree_model_get(model,
iter,
SEARCH_NAME, &idc_name,
- SEARCH_URI, &idc_uri,
- SEARCH_META, &idc_meta,
+ SEARCH_URI, &sdc.idc_uri,
+ SEARCH_META, &sdc.idc_meta,
SEARCH_MIME, &idc_mime,
- SEARCH_INTERNAL, &searchContext,
- SEARCH_INTERNAL_PARENT, &parentContext,
+ SEARCH_INTERNAL, &sdc.searchContext,
+ SEARCH_INTERNAL_PARENT, &sdc.parentContext,
-1);
- if ( (idc_uri == NULL) ||
- (! ECRS_isFileUri(idc_uri)) ) {
+ if ( (sdc.idc_uri == NULL) ||
+ (! ECRS_isFileUri(sdc.idc_uri)) ) {
GE_BREAK(ectx, 0);
FREENONNULL(idc_name);
FREENONNULL(idc_mime);
return;
}
- uri_name = ECRS_uriToString(idc_uri);
- if ( (uri_name == NULL) ||
- (strlen(uri_name) <
+ sdc.uri_name = ECRS_uriToString(sdc.idc_uri);
+ if ( (sdc.uri_name == NULL) ||
+ (strlen(sdc.uri_name) <
strlen(ECRS_URI_PREFIX) +
strlen(ECRS_FILE_INFIX)) ) {
GE_BREAK(ectx, 0);
- FREENONNULL(uri_name);
+ FREENONNULL(sdc.uri_name);
FREENONNULL(idc_name);
FREENONNULL(idc_mime);
return;
@@ -542,12 +562,12 @@
#ifdef WINDOWS
char * filehash;
- filehash = STRDUP(uri_name);
+ filehash = STRDUP(sdc.uri_name);
filehash[16] = 0;
idc_name = STRDUP(filehash);
FREENONNULL(filehash);
#else
- idc_name = STRDUP(uri_name);
+ idc_name = STRDUP(sdc.uri_name);
#endif
}
@@ -620,41 +640,35 @@
gtk_tree_path_free(dirTreePath);
/* construct completed/directory/real-filename */
- idc_final_download_destination = MALLOC(strlen(final_download_dir) + 2 +
- strlen(idc_name) +
strlen(GNUNET_DIRECTORY_EXT) +
- strlen(dirPath));
- strcpy(idc_final_download_destination,
+ sdc.idc_final_download_destination = MALLOC(strlen(final_download_dir) + 2 +
+ strlen(idc_name) +
strlen(GNUNET_DIRECTORY_EXT) +
+ strlen(dirPath));
+ strcpy(sdc.idc_final_download_destination,
final_download_dir);
- if (idc_final_download_destination[strlen(idc_final_download_destination)-1]
!= DIR_SEPARATOR)
- strcat(idc_final_download_destination,
+ if
(sdc.idc_final_download_destination[strlen(sdc.idc_final_download_destination)-1]
!= DIR_SEPARATOR)
+ strcat(sdc.idc_final_download_destination,
DIR_SEPARATOR_STR);
- strcat(idc_final_download_destination,
+ strcat(sdc.idc_final_download_destination,
dirPath);
- strcat(idc_final_download_destination,
+ strcat(sdc.idc_final_download_destination,
idc_name);
- /* FIXME: check that there is no pending download for idc_name! */
+ sdc.anonymity = getSpinButtonValue(sdc.searchContext->searchXML,
+ "downloadAnonymitySpinButton");
+ sdc.recursive = getToggleButtonValue(sdc.searchContext->searchXML,
+ "downloadRecursiveCheckButton");
if (OK == check_pending(idc_name,
NULL)) {
addLogEntry(_("Downloading `%s'"),
idc_name);
- /* FIXME! DEADLOCK! */
- FSUI_startDownload(ctx,
- getSpinButtonValue(searchContext->searchXML,
- "downloadAnonymitySpinButton"),
- getToggleButtonValue(searchContext->searchXML,
- "downloadRecursiveCheckButton"),
- idc_uri,
- idc_meta,
- idc_final_download_destination,
- searchContext->fsui_list,
- (parentContext != NULL) ? parentContext->fsui_list :
NULL);
+ run_with_save_calls(&init_download_helper,
+ &sdc);
} else {
addLogEntry(_("ERROR: already downloading `%s'"),
idc_name);
}
- FREE(uri_name);
+ FREE(sdc.uri_name);
FREE(dirPath);
- FREE(idc_final_download_destination);
+ FREE(sdc.idc_final_download_destination);
FREENONNULL(final_download_dir);
FREENONNULL(idc_name);
FREENONNULL(idc_mime);
@@ -683,36 +697,35 @@
* TODO:
* - support for recursive downloads
* - support for user-specified filename
+ * - enable button only if valid URI is entered
*/
void on_statusDownloadURIEntry_editing_done_fs(GtkWidget * entry,
GtkWidget * downloadButton) {
- struct ECRS_URI * idc_uri;
- struct ECRS_MetaData * idc_meta;
- char * idc_final_download_destination;
const char * uris;
char * urid;
char * final_download_dir;
const char * dname;
+ SDC sdc;
uris = gtk_entry_get_text(GTK_ENTRY(entry));
urid = STRDUP(uris);
gtk_entry_set_text(GTK_ENTRY(entry),
ECRS_URI_PREFIX);
- idc_uri = ECRS_stringToUri(ectx, urid);
- if (idc_uri == NULL) {
+ sdc.idc_uri = ECRS_stringToUri(ectx, urid);
+ if (sdc.idc_uri == NULL) {
addLogEntry(_("Invalid URI `%s'"), urid);
FREE(urid);
return;
}
- if (ECRS_isKeywordUri(idc_uri)) {
+ if (ECRS_isKeywordUri(sdc.idc_uri)) {
addLogEntry(_("Please use the search function for keyword (KSK) URIs!"));
FREE(urid);
- ECRS_freeUri(idc_uri);
+ ECRS_freeUri(sdc.idc_uri);
return;
- } else if (ECRS_isLocationUri(idc_uri)) {
+ } else if (ECRS_isLocationUri(sdc.idc_uri)) {
addLogEntry(_("Location URIs are not yet supported"));
FREE(urid);
- ECRS_freeUri(idc_uri);
+ ECRS_freeUri(sdc.idc_uri);
return;
}
GC_get_configuration_value_filename(cfg,
@@ -722,26 +735,28 @@
&final_download_dir);
disk_directory_create(ectx, final_download_dir);
dname = &uris[strlen(ECRS_URI_PREFIX) + strlen(ECRS_FILE_INFIX)];
- idc_final_download_destination = MALLOC(strlen(final_download_dir) +
strlen(dname) + 2);
- strcpy(idc_final_download_destination, final_download_dir);
+ sdc.idc_final_download_destination = MALLOC(strlen(final_download_dir) +
strlen(dname) + 2);
+ strcpy(sdc.idc_final_download_destination,
+ final_download_dir);
FREE(final_download_dir);
- if (idc_final_download_destination[strlen(idc_final_download_destination)]
!= DIR_SEPARATOR)
- strcat(idc_final_download_destination, DIR_SEPARATOR_STR);
- strcat(idc_final_download_destination, dname);
+ if
(sdc.idc_final_download_destination[strlen(sdc.idc_final_download_destination)]
!= DIR_SEPARATOR)
+ strcat(sdc.idc_final_download_destination,
+ DIR_SEPARATOR_STR);
+ strcat(sdc.idc_final_download_destination,
+ dname);
addLogEntry(_("Downloading `%s'"),
uris);
- idc_meta = ECRS_createMetaData();
- FSUI_startDownload(ctx,
- getSpinButtonValue(getMainXML(),
- "fsstatusAnonymitySpin"),
- NO, /* FIXME: isRecursive */
- idc_uri,
- idc_meta,
- idc_final_download_destination,
- NULL,
- NULL);
- ECRS_freeMetaData(idc_meta);
+ sdc.idc_meta = ECRS_createMetaData();
+ sdc.anonymity = getSpinButtonValue(getMainXML(),
+ "fsstatusAnonymitySpin");
+ sdc.recursive = NO;
+ sdc.searchContext = NULL;
+ sdc.parentContext = NULL;
+ run_with_save_calls(&init_download_helper,
+ &sdc);
+ ECRS_freeMetaData(sdc.idc_meta);
+ FREE(sdc.idc_final_download_destination);
FREE(urid);
}
Modified: gnunet-gtk/src/plugins/fs/search.c
===================================================================
--- gnunet-gtk/src/plugins/fs/search.c 2006-12-10 05:58:37 UTC (rev 3908)
+++ gnunet-gtk/src/plugins/fs/search.c 2006-12-10 06:27:55 UTC (rev 3909)
@@ -511,14 +511,30 @@
strlen(searchString) > 0);
}
+typedef struct {
+ unsigned int anonymity;
+ unsigned int max;
+ cron_t delay;
+ struct ECRS_URI * uri;
+} FSSS;
+static void * search_start_helper(void * cls) {
+ FSSS * fsss;
+ FSUI_startSearch(ctx,
+ fsss->anonymity,
+ fsss->max,
+ fsss->delay,
+ fsss->uri);
+ return NULL;
+}
+
/**
* The user has clicked the "SEARCH" button.
* Initiate a search.
*/
void on_fssearchbutton_clicked_fs(gpointer dummy2,
GtkWidget * searchButton) {
- struct ECRS_URI * uri;
+ FSSS fsss;
const char * searchString;
gint pages;
gint i;
@@ -554,7 +570,7 @@
0, searchString,
-1);
}
- uri = NULL;
+ fsss.uri = NULL;
/* check for namespace search */
searchNamespaceGtkCB
= glade_xml_get_widget(getMainXML(),
@@ -593,8 +609,8 @@
strcat(ustring, ns);
strcat(ustring, "/");
strcat(ustring, searchString);
- uri = ECRS_stringToUri(ectx, ustring);
- if (uri == NULL) {
+ fsss.uri = ECRS_stringToUri(ectx, ustring);
+ if (fsss.uri == NULL) {
GE_LOG(ectx,
GE_ERROR | GE_BULK | GE_USER,
_("Failed to create namespace URI from `%s'.\n"),
@@ -607,9 +623,9 @@
if (ns != NULL)
free(ns);
}
- if (uri == NULL)
- uri = ECRS_parseCharKeywordURI(ectx, searchString);
- if (uri == NULL) {
+ if (fsss.uri == NULL)
+ fsss.uri = ECRS_parseCharKeywordURI(ectx, searchString);
+ if (fsss.uri == NULL) {
GE_BREAK(ectx, 0);
return;
}
@@ -621,14 +637,14 @@
list = search_head;
while (list != NULL) {
if (ECRS_equalsUri(list->uri,
- uri)) {
+ fsss.uri)) {
for (i=0;i<pages;i++) {
if (gtk_notebook_get_nth_page(notebook,
i)
== list->searchpage) {
gtk_notebook_set_current_page(notebook,
i);
- ECRS_freeUri(uri);
+ ECRS_freeUri(fsss.uri);
return;
}
}
@@ -636,16 +652,15 @@
}
list = list->next;
}
- /* FIXME: deadlock! */
- FSUI_startSearch(ctx,
- getSpinButtonValue(getMainXML(),
- "searchAnonymitySelectionSpinButton"),
- getSpinButtonValue(getMainXML(),
- "maxResultsSpinButton"),
- getSpinButtonValue(getMainXML(),
- "searchDelaySpinButton") * cronSECONDS,
- uri);
- ECRS_freeUri(uri);
+ fsss.anonymity = getSpinButtonValue(getMainXML(),
+ "searchAnonymitySelectionSpinButton");
+ fsss.max = getSpinButtonValue(getMainXML(),
+ "maxResultsSpinButton");
+ fsss.delay = getSpinButtonValue(getMainXML(),
+ "searchDelaySpinButton") * cronSECONDS;
+ run_with_save_calls(search_start_helper,
+ &fsss);
+ ECRS_freeUri(fsss.uri);
}
struct FCBC {
Modified: gnunet-gtk/src/plugins/fs/upload.c
===================================================================
--- gnunet-gtk/src/plugins/fs/upload.c 2006-12-10 05:58:37 UTC (rev 3908)
+++ gnunet-gtk/src/plugins/fs/upload.c 2006-12-10 06:27:55 UTC (rev 3909)
@@ -316,16 +316,48 @@
strlen(input) > 0);
}
+typedef struct {
+ const char * filename;
+ unsigned int anonymity;
+ unsigned int priority;
+ int index;
+ int extract;
+ int deep_index;
+ cron_t expire;
+ struct ECRS_MetaData * meta;
+ struct ECRS_URI * gkeywordURI;
+ struct ECRS_URI * keywordURI;
+} FSUC;
+
+static void * start_upload_helper(void * cls) {
+ FSUC * fsuc = cls;
+
+ FSUI_startUpload(ctx,
+ fsuc->filename,
+ (DirectoryScanCallback) &disk_directory_scan,
+ ectx,
+ fsuc->anonymity,
+ fsuc->priority,
+ fsuc->index,
+ fsuc->extract,
+ fsuc->deep_index,
+ fsuc->expire,
+ fsuc->meta,
+ fsuc->gkeywordURI,
+ fsuc->keywordURI);
+ return NULL;
+}
+
+
void on_fsinsertuploadbutton_clicked_fs(gpointer dummy,
GtkWidget * uploadButton) {
+ FSUC fsuc;
const char * filenamerest;
- const char * filename;
GtkWidget * dialog;
EXTRACTOR_ExtractorList * extractors;
char * config;
+ struct ECRS_MetaData * meta;
struct ECRS_URI * keywordURI;
- struct ECRS_URI * gkeywordURI;
- struct ECRS_MetaData * meta;
extractors = EXTRACTOR_loadDefaultLibraries();
config = NULL;
@@ -340,8 +372,8 @@
FREE(config);
}
- filename = getEntryLineValue(getMainXML(),
- "uploadFilenameComboBoxEntry");
+ fsuc.filename = getEntryLineValue(getMainXML(),
+ "uploadFilenameComboBoxEntry");
metaXML
= glade_xml_new(getGladeFileName(),
"metaDataDialog",
@@ -352,11 +384,11 @@
meta = ECRS_createMetaData();
ECRS_extractMetaData(ectx,
meta,
- filename,
+ fsuc.filename,
extractors);
EXTRACTOR_removeAll(extractors);
- filenamerest = &filename[strlen(filename)-1];
- while ( (filenamerest > filename) &&
+ filenamerest = &fsuc.filename[strlen(fsuc.filename)-1];
+ while ( (filenamerest > fsuc.filename) &&
(filenamerest[-1] != DIR_SEPARATOR) )
filenamerest--;
ECRS_addToMetaData(meta,
@@ -397,36 +429,30 @@
gtk_dialog_set_default_response(GTK_DIALOG(dialog),
GTK_RESPONSE_OK);
if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_CANCEL) {
- meta = getMetaDataFromList(metaXML,
- "metaDataDialogMetaDataList",
- "previewImage");
- keywordURI = getKeywordURIFromList(metaXML,
+ fsuc.anonymity = getSpinButtonValue(getMainXML(),
+ "uploadAnonymityLevelSpinButton");
+ fsuc.priority = getSpinButtonValue(getMainXML(),
+ "contentPrioritySpinButton");
+ fsuc.index = getToggleButtonValue(getMainXML(),
+ "indexbutton");
+ fsuc.extract = getToggleButtonValue(getMainXML(),
+ "doExtractCheckButton");
+ fsuc.deep_index = getToggleButtonValue(getMainXML(),
+ "deepIndexCheckButton");
+ fsuc.expire = get_time() + 2 * cronYEARS;
+ fsuc.meta = getMetaDataFromList(metaXML,
+ "metaDataDialogMetaDataList",
+ "previewImage");
+ fsuc.keywordURI = getKeywordURIFromList(metaXML,
"metaDataDialogKeywordList");
- gkeywordURI = ECRS_stringToUri(ectx,
+ fsuc.gkeywordURI = ECRS_stringToUri(ectx,
ECRS_URI_PREFIX
ECRS_SEARCH_INFIX);
- /* FIXME: DEADLOCK! */
- FSUI_startUpload(ctx,
- filename,
- (DirectoryScanCallback) &disk_directory_scan,
- ectx,
- getSpinButtonValue(getMainXML(),
- "uploadAnonymityLevelSpinButton"),
- getSpinButtonValue(getMainXML(),
- "contentPrioritySpinButton"),
- getToggleButtonValue(getMainXML(),
- "indexbutton"),
- getToggleButtonValue(getMainXML(),
- "doExtractCheckButton"),
- getToggleButtonValue(getMainXML(),
- "deepIndexCheckButton"),
- get_time() + 2 * cronYEARS,
- meta,
- gkeywordURI,
- keywordURI);
- ECRS_freeMetaData(meta);
- ECRS_freeUri(gkeywordURI);
- ECRS_freeUri(keywordURI);
+ run_with_save_calls(&start_upload_helper,
+ &fsuc);
+ ECRS_freeMetaData(fsuc.meta);
+ ECRS_freeUri(fsuc.gkeywordURI);
+ ECRS_freeUri(fsuc.keywordURI);
}
gtk_widget_destroy (dialog);
UNREF(metaXML);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r3909 - in gnunet-gtk: . src/plugins/fs,
grothoff <=