mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Divelogs.de: add code for zipping up all dives
prepare_dives_for_divelogs() comes from the GTK version, originally. The upload seems to fail at this point with an error. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
This commit is contained in:
parent
5869712569
commit
0905e4f0ab
1 changed files with 106 additions and 0 deletions
|
@ -98,6 +98,81 @@ static void clear_table(struct dive_table *table)
|
||||||
table->nr = 0;
|
table->nr = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *prepare_dives_for_divelogs(const bool selected)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct dive *dive;
|
||||||
|
FILE *f;
|
||||||
|
char filename[PATH_MAX], *tempfile;
|
||||||
|
size_t streamsize;
|
||||||
|
char *membuf;
|
||||||
|
xmlDoc *doc;
|
||||||
|
xsltStylesheetPtr xslt = NULL;
|
||||||
|
xmlDoc *transformed;
|
||||||
|
struct zip_source *s[dive_table.nr];
|
||||||
|
struct zip *zip;
|
||||||
|
char *error = NULL;
|
||||||
|
char *parsed = NULL, *endat = NULL;
|
||||||
|
|
||||||
|
QTemporaryFile zipFile;
|
||||||
|
zipFile.setFileTemplate(QDir::tempPath() + "/import-XXXXXX.dld");
|
||||||
|
tempfile = zipFile.fileName().toLocal8Bit().data();
|
||||||
|
zip = zip_open(tempfile, ZIP_CREATE, NULL);
|
||||||
|
|
||||||
|
if (!zip || !amount_selected)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* walk the dive list in chronological order */
|
||||||
|
for (i = 0; i < dive_table.nr; i++) {
|
||||||
|
dive = get_dive(i);
|
||||||
|
if (!dive)
|
||||||
|
continue;
|
||||||
|
if (selected && !dive->selected)
|
||||||
|
continue;
|
||||||
|
f = tmpfile();
|
||||||
|
if (!f)
|
||||||
|
return NULL;
|
||||||
|
save_dive(f, dive);
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
streamsize = ftell(f);
|
||||||
|
rewind(f);
|
||||||
|
membuf = (char *)malloc(streamsize + 1);
|
||||||
|
if (!membuf || !fread(membuf, streamsize, 1, f))
|
||||||
|
return NULL;
|
||||||
|
membuf[streamsize] = 0;
|
||||||
|
fclose(f);
|
||||||
|
/*
|
||||||
|
* Parse the memory buffer into XML document and
|
||||||
|
* transform it to divelogs.de format, finally dumping
|
||||||
|
* the XML into a character buffer.
|
||||||
|
*/
|
||||||
|
doc = xmlReadMemory(membuf, strlen(membuf), "divelog", NULL, 0);
|
||||||
|
if (!doc)
|
||||||
|
continue;
|
||||||
|
free((void *)membuf);
|
||||||
|
xslt = get_stylesheet("divelogs-export.xslt");
|
||||||
|
if (!xslt)
|
||||||
|
return NULL;
|
||||||
|
transformed = xsltApplyStylesheet(xslt, doc, NULL);
|
||||||
|
xsltFreeStylesheet(xslt);
|
||||||
|
xmlDocDumpMemory(transformed, (xmlChar **) &membuf, (int *)&streamsize);
|
||||||
|
xmlFreeDoc(doc);
|
||||||
|
xmlFreeDoc(transformed);
|
||||||
|
/*
|
||||||
|
* Save the XML document into a zip file.
|
||||||
|
*/
|
||||||
|
snprintf(filename, PATH_MAX, "%d.xml", i + 1);
|
||||||
|
s[i] = zip_source_buffer(zip, membuf, streamsize, 1);
|
||||||
|
if (s[i]) {
|
||||||
|
int64_t ret = zip_add(zip, filename, s[i]);
|
||||||
|
if (ret == -1)
|
||||||
|
fprintf(stderr, "failed to include dive %d\n", i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
zip_close(zip);
|
||||||
|
return tempfile;
|
||||||
|
}
|
||||||
|
|
||||||
WebServices::WebServices(QWidget* parent, Qt::WindowFlags f): QDialog(parent, f)
|
WebServices::WebServices(QWidget* parent, Qt::WindowFlags f): QDialog(parent, f)
|
||||||
, reply(0)
|
, reply(0)
|
||||||
{
|
{
|
||||||
|
@ -446,6 +521,18 @@ void DivelogsDeWebServices::downloadDives()
|
||||||
exec();
|
exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DivelogsDeWebServices::prepareDivesForUpload()
|
||||||
|
{
|
||||||
|
char *file = prepare_dives_for_divelogs(true);
|
||||||
|
if (file) {
|
||||||
|
QFile f(file);
|
||||||
|
free(file);
|
||||||
|
uploadDives((QIODevice *)&f);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// FIXME: show error
|
||||||
|
}
|
||||||
|
|
||||||
void DivelogsDeWebServices::uploadDives(QIODevice *dldContent)
|
void DivelogsDeWebServices::uploadDives(QIODevice *dldContent)
|
||||||
{
|
{
|
||||||
QHttpMultiPart mp(QHttpMultiPart::FormDataType);
|
QHttpMultiPart mp(QHttpMultiPart::FormDataType);
|
||||||
|
@ -639,6 +726,25 @@ void DivelogsDeWebServices::uploadFinished()
|
||||||
QByteArray xmlData = reply->readAll();
|
QByteArray xmlData = reply->readAll();
|
||||||
|
|
||||||
// ### FIXME: what's the format?
|
// ### FIXME: what's the format?
|
||||||
|
/*
|
||||||
|
// char *error;
|
||||||
|
if (error) {
|
||||||
|
parsed = strstr(error, "<Login>");
|
||||||
|
endat = strstr(error, "</divelogsDataImport>");
|
||||||
|
if (parsed && endat)
|
||||||
|
*endat = '\0';
|
||||||
|
}
|
||||||
|
if (error && strstr(error, "failed"))
|
||||||
|
type = GTK_MESSAGE_ERROR;
|
||||||
|
else
|
||||||
|
type = GTK_MESSAGE_INFO;
|
||||||
|
}
|
||||||
|
if (parsed)
|
||||||
|
divelogs_status_dialog(parsed, type);
|
||||||
|
else if (error)
|
||||||
|
divelogs_status_dialog(error, type);
|
||||||
|
free(error);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivelogsDeWebServices::setStatusText(int status)
|
void DivelogsDeWebServices::setStatusText(int status)
|
||||||
|
|
Loading…
Add table
Reference in a new issue