On Fri, Apr 4, 2014 at 12:19 AM, Dirk Hohndel <[email protected]> wrote:

> On Thu, 2014-04-03 at 23:26 +0530, Venkatesh Shukla IIT BHU wrote:
> >         I think Lubomir's question was about the preference order...
> >         we store
> >
> >         the userid in the settings AND we store it in the XML file. If
> >         both are
> >         present, which one is given preference?
> >
> >
> >
> > In the present implementation, the event which happens later decides.
> > If a new file is loaded, the userid 'a' of the file would take
> > preference. If in this new file, the user opens the download dialog
> > box and downloads dives with another userid 'b' and saves it, b will
> > be stored in the file. Also, as before, b is stored in the subsurface
> > settings.Maybe we should introduce this as a preference for the user?
> >
> >
> > I have few questions regarding this.
> > 1. If a new xml file with different userid is loaded, should
> > subsurface settings be changed to replace the old with the new?
>
> That's an interesting question. I would say no. That's a file specific
> setting that should not override the local setting.
>
> I think the right semantic is this:
>
> - if the user enters a user id in the dialog, that user id is saved in
> the local settings
> - if the user clicks the setting to save it to XML, it's saved to both
> - if the user has a local setting that populates the dialog. If the user
> opens a file that has a per file userid, that is used instead - but it
> doesn't change the local setting
>
> > 2. After the download of dives from subsurface webservice, if the
> > checkbox is ticked, should save-xml be called automatically?
>
> No
>
> >  Currently, the user has to save manually after download for the
> > effect of userid inclusion/exclusion to take place.
>
> A successful download should modify the file (as it adds GPS data and
> possibly dive site names). And because of that the user will be asked to
> save before she quits Subsurface
>
> > Okay Dirk, I'll study libgit2 and try to achieve what you have said.
> > It is indeed a good idea.
>
> Thanks
>
> /D
>
>
>
Added feature of saving subsurface userid in local files (xml as well as
the git repo) as per ticket #473

For git repo, userid is stored in the 00-Subsurface file present in the
repo. For xml files, it is stored under tag userid.

Modified preference and webservice dialog to add these options.
Import, open and save as dialog now show git repo pointer files as well.
For ex /home/subsurface/linus[dives]

Complete patch is attached.

-- 

*Venkatesh Shukla *
From 94e90071a5c9b89c6da0ef06d596f87f0507e289 Mon Sep 17 00:00:00 2001
From: Venkatesh Shukla <[email protected]>
Date: Tue, 8 Apr 2014 15:24:23 +0530
Subject: [PATCH] Adds option of saving userid in local files

Userid of Subsurface Webservice can be included in locally saved xml
files and git repository.
For xml files, it is stored in userid tag. For git repo, it is stored
in 00-Subsurface file present in the repo.
Preference dialog and webservice dialog modified to include option
for saving userid locally.
Git repo pointer files are visible in import, save as and open
dialogs.
In case of difference in default userid and userid in local file,
some semantics are followed. These can be referred to here:
http://lists.hohndel.org/pipermail/subsurface/2014-April/011422.html

Fixes #473

Signed-off-by: Venkatesh Shukla <[email protected]>
---
 dive.h                          |  6 ++++++
 load-git.c                      | 14 ++++++++++++-
 parse-xml.c                     | 25 ++++++++++++++++++++++
 qt-ui/mainwindow.cpp            |  5 +++--
 qt-ui/preferences.cpp           | 13 +++++++++++-
 qt-ui/preferences.ui            | 27 ++++++++++++++++++++++++
 qt-ui/subsurfacewebservices.cpp | 46 +++++++++++++++++++++++++++++++++++++++--
 qt-ui/subsurfacewebservices.h   | 11 ++++++++++
 qt-ui/webservices.ui            |  9 +++++++-
 save-git.c                      | 12 +++++++++++
 save-xml.c                      |  7 ++++++-
 11 files changed, 167 insertions(+), 8 deletions(-)

diff --git a/dive.h b/dive.h
index f62d83d..89497b7 100644
--- a/dive.h
+++ b/dive.h
@@ -887,6 +887,12 @@ extern double strtod_flags(const char *str, const char **ptr, unsigned int flags
 
 #define ascii_strtod(str, ptr) strtod_flags(str, ptr, STRTOD_ASCII)
 
+extern short save_userid_local;
+extern char* userid;
+
+extern void set_save_userid_local(short value);
+extern void set_userid(char* user_id);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/load-git.c b/load-git.c
index 4040c16..641234d 100644
--- a/load-git.c
+++ b/load-git.c
@@ -572,6 +572,16 @@ static void parse_trip_notes(char *line, struct membuffer *str, void *_trip)
 static void parse_settings_autogroup(char *line, struct membuffer *str, void *_unused)
 { set_autogroup(1); }
 
+static void parse_settings_userid(char *line, struct membuffer *str, void *_unused)
+{
+	char *uid = line;
+	if (uid)
+	{
+		set_save_userid_local(true);
+		set_userid(uid);
+	}
+}
+
 /*
  * Our versioning is a joke right now, but this is more of an example of what we
  * *can* do some day. And if we do change the version, this warning will show if
@@ -700,7 +710,7 @@ static void trip_parser(char *line, struct membuffer *str, void *_trip)
 static struct keyword_action settings_action[] = {
 #undef D
 #define D(x) { #x, parse_settings_ ## x }
-	D(autogroup), D(divecomputerid), D(subsurface), D(version),
+	D(autogroup), D(divecomputerid), D(subsurface), D(userid), D(version),
 };
 
 static void settings_parser(char *line, struct membuffer *str, void *_unused)
@@ -1158,6 +1168,8 @@ static int parse_settings_entry(git_repository *repo, const git_tree_entry *entr
 	git_blob *blob = git_tree_entry_blob(repo, entry);
 	if (!blob)
 		return report_error("Unable to read settings file");
+	set_save_userid_local(false);
+	set_userid("");
 	for_each_line(blob, settings_parser, NULL);
 	git_blob_free(blob);
 	return 0;
diff --git a/parse-xml.c b/parse-xml.c
index 483187a..966e567 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -112,6 +112,7 @@ static struct {
 	} dc;
 } cur_settings;
 static bool in_settings = false;
+static bool in_userid = false;
 static struct tm cur_tm;
 static int cur_cylinder_index, cur_ws_index;
 static int lastndl, laststoptime, laststopdepth, lastcns, lastpo2, lastindeco;
@@ -858,6 +859,12 @@ static void try_to_fill_sample(struct sample *sample, const char *name, char *bu
 	nonmatch("sample", name, buf);
 }
 
+void try_to_fill_userid(const char *name, char *buf)
+{
+	if (save_userid_local)
+		set_userid(buf);
+}
+
 static const char *country, *city;
 
 static void divinglog_place(char *place, void *_location)
@@ -1367,8 +1374,23 @@ static void divecomputer_end(void)
 	cur_dc = NULL;
 }
 
+static void userid_start(void)
+{
+	in_userid = true;
+	set_save_userid_local(true); //if the xml contains userid, keep saving it.
+}
+
+static void userid_stop(void)
+{
+	in_userid = false;
+}
+
 static void entry(const char *name, char *buf)
 {
+	if (in_userid) {
+		try_to_fill_userid(name, buf);
+		return;
+	}
 	if (in_settings) {
 		try_to_fill_dc_settings(name, buf);
 		try_to_match_autogroup(name, buf);
@@ -1515,6 +1537,7 @@ static struct nesting {
 	  { "weightsystem", ws_start, ws_end },
 	  { "divecomputer", divecomputer_start, divecomputer_end },
 	  { "P", sample_start, sample_end },
+	  { "userid", userid_start, userid_stop},
 
 	  /* Import type recognition */
 	  { "Divinglog", DivingLog_importer },
@@ -1602,6 +1625,8 @@ void parse_xml_buffer(const char *url, const char *buffer, int size,
 		report_error(translate("gettextFromC", "Failed to parse '%s'"), url);
 		return;
 	}
+	set_save_userid_local(false);
+	set_userid("");
 	reset_all();
 	dive_start();
 	doc = test_xslt_transforms(doc, params);
diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp
index 216f182..e3cbfb8 100644
--- a/qt-ui/mainwindow.cpp
+++ b/qt-ui/mainwindow.cpp
@@ -601,7 +601,8 @@ QString MainWindow::filter()
 	QString f;
 	f += "ALL ( *.ssrf *.xml *.XML *.uddf *.udcf *.UDFC *.jlb *.JLB ";
 	f += "*.sde *.SDE *.dld *.DLD ";
-	f += "*.db";
+	f += "*.db ";
+	f += "*]";
 	f += ");;";
 
 	f += "Subsurface (*.ssrf);;";
@@ -938,7 +939,7 @@ int MainWindow::file_save_as(void)
 	else
 		default_filename = prefs.default_filename;
 	filename = QFileDialog::getSaveFileName(this, tr("Save File as"), default_filename,
-						tr("Subsurface XML files (*.ssrf *.xml *.XML)"));
+						tr("Subsurface XML files (*.ssrf *.xml *.XML *])"));
 	if (filename.isNull() || filename.isEmpty())
 		return report_error("No filename to save into");
 
diff --git a/qt-ui/preferences.cpp b/qt-ui/preferences.cpp
index 27570dc..a32efab 100644
--- a/qt-ui/preferences.cpp
+++ b/qt-ui/preferences.cpp
@@ -100,6 +100,10 @@ void PreferencesDialog::setUiFromPrefs()
 	connect(ui.languageFilter, SIGNAL(textChanged(QString)), filterModel, SLOT(setFilterFixedString(QString)));
 
 	QSettings s;
+
+	ui.save_uid_local->setChecked(s.value("save_uid_local").toBool());
+	ui.default_uid->setText(s.value("subsurface_webservice_uid").toString().toUpper());
+
 	s.beginGroup("Language");
 	ui.languageSystemDefault->setChecked(s.value("UseSystemLanguage", true).toBool());
 	QAbstractItemModel *m = ui.languageView->model();
@@ -170,6 +174,9 @@ void PreferencesDialog::syncSettings()
 {
 	QSettings s;
 
+	s.setValue("subsurface_webservice_uid", ui.default_uid->text().toUpper());
+	set_save_userid_local(ui.save_uid_local->checkState());
+
 	// Graph
 	s.beginGroup("TecDetails");
 
@@ -235,6 +242,10 @@ void PreferencesDialog::loadSettings()
 
 	QSettings s;
 	QVariant v;
+
+	ui.save_uid_local->setChecked(s.value("save_uid_local").toBool());
+	ui.default_uid->setText(s.value("subsurface_webservice_uid").toString().toUpper());
+
 	s.beginGroup("Units");
 	if (s.value("unit_system").toString() == "metric") {
 		prefs.unit_system = METRIC;
@@ -323,7 +334,7 @@ void PreferencesDialog::buttonClicked(QAbstractButton *button)
 void PreferencesDialog::on_chooseFile_clicked()
 {
 	QFileInfo fi(system_default_filename());
-	QString choosenFileName = QFileDialog::getOpenFileName(this, tr("Open Default Log File"), fi.absolutePath(), tr("Subsurface XML files (*.ssrf *.xml *.XML)"));
+	QString choosenFileName = QFileDialog::getOpenFileName(this, tr("Open Default Log File"), fi.absolutePath(), tr("Subsurface XML files (*.ssrf *.xml *.XML *])"));
 
 	if (!choosenFileName.isEmpty())
 		ui.defaultfilename->setText(choosenFileName);
diff --git a/qt-ui/preferences.ui b/qt-ui/preferences.ui
index 502cc29..485577d 100644
--- a/qt-ui/preferences.ui
+++ b/qt-ui/preferences.ui
@@ -265,6 +265,33 @@
           </widget>
          </item>
          <item>
+          <widget class="QGroupBox" name="groupBox_8">
+           <property name="title">
+            <string>Subsurface Webservice</string>
+           </property>
+           <layout class="QVBoxLayout" name="verticalLayout_7">
+            <item>
+             <widget class="QLabel" name="label_16">
+              <property name="text">
+               <string>Default User ID</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLineEdit" name="default_uid">
+             </widget>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="save_uid_local">
+              <property name="text">
+               <string>Save User ID locally?</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
           <spacer name="verticalSpacer_2">
            <property name="orientation">
             <enum>Qt::Vertical</enum>
diff --git a/qt-ui/subsurfacewebservices.cpp b/qt-ui/subsurfacewebservices.cpp
index a8bce4a..c7ef782 100644
--- a/qt-ui/subsurfacewebservices.cpp
+++ b/qt-ui/subsurfacewebservices.cpp
@@ -312,12 +312,16 @@ void WebServices::resetState()
 SubsurfaceWebServices::SubsurfaceWebServices(QWidget *parent, Qt::WindowFlags f) : WebServices(parent, f)
 {
 	QSettings s;
-	ui.userID->setText(s.value("subsurface_webservice_uid").toString().toUpper());
+	if (!save_userid_local || !*userid)
+		ui.userID->setText(s.value("subsurface_webservice_uid").toString().toUpper());
+	else
+		ui.userID->setText(userid);
 	hidePassword();
 	hideUpload();
 	ui.progressBar->setFormat("Enter User ID and click Download");
 	ui.progressBar->setRange(0, 1);
 	ui.progressBar->setValue(-1);
+	ui.saveUidLocal->setChecked(save_userid_local);
 }
 
 void SubsurfaceWebServices::buttonClicked(QAbstractButton *button)
@@ -339,7 +343,20 @@ void SubsurfaceWebServices::buttonClicked(QAbstractButton *button)
 
 		/* store last entered uid in config */
 		QSettings s;
-		s.setValue("subsurface_webservice_uid", ui.userID->text().toUpper());
+		QString qDialogUid = ui.userID->text().toUpper();
+		bool qSaveUid = ui.saveUidLocal->checkState();
+		set_save_userid_local(qSaveUid);
+		if (qSaveUid) {
+			QString qSettingUid = s.value("subsurface_webservice_uid").toString();
+			QString qFileUid = QString::fromStdString(userid);
+			bool s_eq_d = (qSettingUid == qDialogUid);
+			bool d_eq_f = (qFileUid == qDialogUid);
+			if (!d_eq_f || s_eq_d)
+				s.setValue("subsurface_webservice_uid", qDialogUid);
+			set_userid(qDialogUid.toLocal8Bit().data());
+		} else {
+			s.setValue("subsurface_webservice_uid", qDialogUid);
+		}
 		s.sync();
 		hide();
 		close();
@@ -626,6 +643,7 @@ DivelogsDeWebServices::DivelogsDeWebServices(QWidget *parent, Qt::WindowFlags f)
 	QSettings s;
 	ui.userID->setText(s.value("divelogde_user").toString());
 	ui.password->setText(s.value("divelogde_pass").toString());
+	ui.saveUidLocal->hide();
 	hideUpload();
 }
 
@@ -883,3 +901,27 @@ void DivelogsDeWebServices::buttonClicked(QAbstractButton *button)
 		break;
 	}
 }
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define MAX_USERID_SIZE 32
+short save_userid_local = false;
+char *userid = NULL;
+void set_save_userid_local(short value)
+{
+	QSettings s;
+	s.setValue("save_uid_local", value);
+	save_userid_local = value;
+}
+
+void set_userid(char *rUserId)
+{
+	userid = (char *) malloc(MAX_USERID_SIZE);
+	if (userid && rUserId)
+		strcpy(userid, rUserId);
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/qt-ui/subsurfacewebservices.h b/qt-ui/subsurfacewebservices.h
index 175c991..f3fbb5b 100644
--- a/qt-ui/subsurfacewebservices.h
+++ b/qt-ui/subsurfacewebservices.h
@@ -98,4 +98,15 @@ private:
 	bool uploadMode;
 };
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern short save_userid_local;
+extern char *userid;
+extern void set_save_userid_local(short value);
+extern void set_userid(char *user_id);
+#ifdef __cplusplus
+}
+#endif
+
 #endif // SUBSURFACEWEBSERVICES_H
diff --git a/qt-ui/webservices.ui b/qt-ui/webservices.ui
index 295c252..a55b917 100644
--- a/qt-ui/webservices.ui
+++ b/qt-ui/webservices.ui
@@ -45,7 +45,7 @@
      </property>
     </widget>
    </item>
-   <item row="4" column="0" colspan="3">
+   <item row="5" column="0" colspan="3">
     <widget class="QDialogButtonBox" name="buttonBox">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
@@ -79,6 +79,13 @@
      </property>
     </widget>
    </item>
+   <item row="4" column="0" colspan="4">
+    <widget class="QCheckBox" name="saveUidLocal">
+     <property name="text">
+      <string>Save User ID locally?</string>
+     </property>
+    </widget>
+   </item>
    <item row="1" column="0">
     <widget class="QLabel" name="passLabel">
      <property name="text">
diff --git a/save-git.c b/save-git.c
index 634db66..ea068f0 100644
--- a/save-git.c
+++ b/save-git.c
@@ -678,6 +678,17 @@ static struct dir *mktree(struct dir *dir, const char *fmt, ...)
 	return subdir;
 }
 
+static void save_userid(void *_b)
+{
+	struct membuffer *b = _b;
+	if (save_userid_local) {
+		put_format(b, "userid %30s", userid);
+		printf("saving userid as save_userid_local is true : %s\n", userid);
+	} else {
+		printf("not saving userid as save_userid_local is false\n");
+	}
+}
+
 static void save_one_device(void *_b, const char *model, uint32_t deviceid,
 	const char *nickname, const char *serial, const char *firmware)
 {
@@ -706,6 +717,7 @@ static void save_settings(git_repository *repo, struct dir *tree)
 	struct membuffer b = { 0 };
 
 	put_format(&b, "version %d\n", VERSION);
+	save_userid(&b);
 	call_for_each_dc(&b, save_one_device);
 	cond_put_format(autogroup, &b, "autogroup\n");
 
diff --git a/save-xml.c b/save-xml.c
index 61a9300..f9b639c 100644
--- a/save-xml.c
+++ b/save-xml.c
@@ -506,7 +506,12 @@ void save_dives_buffer(struct membuffer *b, const bool select_only)
 	struct dive *dive;
 	dive_trip_t *trip;
 
-	put_format(b, "<divelog program='subsurface' version='%d'>\n<settings>\n", VERSION);
+	put_format(b, "<divelog program='subsurface' version='%d'>\n", VERSION);
+
+	if (save_userid_local)
+		put_format(b, "<userid>%s</userid>\n", userid);
+
+	put_format(b, "<settings>\n");
 
 	/* save the dive computer nicknames, if any */
 	call_for_each_dc(b, save_one_device);
-- 
1.9.0

_______________________________________________
subsurface mailing list
[email protected]
http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to