mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Merge branch 'qtHelper'
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
		
						commit
						0773172f66
					
				
					 19 changed files with 302 additions and 252 deletions
				
			
		
							
								
								
									
										1
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -69,6 +69,7 @@ SOURCES = \
 | 
			
		|||
	time.c \
 | 
			
		||||
	libdivecomputer.c \
 | 
			
		||||
	qt-gui.cpp \
 | 
			
		||||
	qthelper.cpp \
 | 
			
		||||
	qt-ui/divelistview.cpp \
 | 
			
		||||
	qt-ui/maintab.cpp \
 | 
			
		||||
	qt-ui/mainwindow.cpp \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										113
									
								
								device.c
									
										
									
									
									
								
							
							
						
						
									
										113
									
								
								device.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -2,119 +2,6 @@
 | 
			
		|||
#include "dive.h"
 | 
			
		||||
#include "device.h"
 | 
			
		||||
 | 
			
		||||
static struct device_info *device_info_list;
 | 
			
		||||
 | 
			
		||||
struct device_info *head_of_device_info_list(void)
 | 
			
		||||
{
 | 
			
		||||
	return device_info_list;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void remove_dive_computer(const char *model, uint32_t deviceid)
 | 
			
		||||
{
 | 
			
		||||
	free(remove_device_info(model, deviceid));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int match_device_info(struct device_info *entry, const char *model, uint32_t deviceid)
 | 
			
		||||
{
 | 
			
		||||
	return !strcmp(entry->model, model) && entry->deviceid == deviceid;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* just find the entry for this divecomputer */
 | 
			
		||||
struct device_info *get_device_info(const char *model, uint32_t deviceid)
 | 
			
		||||
{
 | 
			
		||||
	struct device_info *known = device_info_list;
 | 
			
		||||
 | 
			
		||||
	/* a 0 deviceid doesn't get a nickname - those come from development
 | 
			
		||||
	 * versions of Subsurface that didn't store the deviceid in the divecomputer entries */
 | 
			
		||||
	if (!deviceid || !model)
 | 
			
		||||
		return NULL;
 | 
			
		||||
	while (known) {
 | 
			
		||||
		if (match_device_info(known, model, deviceid))
 | 
			
		||||
			return known;
 | 
			
		||||
		known = known->next;
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Sort the device_info list, so that we write it out
 | 
			
		||||
 * in a stable order. Otherwise we'll end up having the
 | 
			
		||||
 * XML file have the devices listed in some arbitrary
 | 
			
		||||
 * order, which is annoying.
 | 
			
		||||
 */
 | 
			
		||||
static void add_entry_sorted(struct device_info *entry)
 | 
			
		||||
{
 | 
			
		||||
	struct device_info *p, **pp = &device_info_list;
 | 
			
		||||
 | 
			
		||||
	while ((p = *pp) != NULL) {
 | 
			
		||||
		int cmp = strcmp(p->model, entry->model);
 | 
			
		||||
		if (cmp > 0)
 | 
			
		||||
			break;
 | 
			
		||||
		if (!cmp && p->deviceid > entry->deviceid)
 | 
			
		||||
			break;
 | 
			
		||||
		pp = &p->next;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	entry->next = p;
 | 
			
		||||
	*pp = entry;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Get an existing device info model or create a new one if valid */
 | 
			
		||||
struct device_info *create_device_info(const char *model, uint32_t deviceid)
 | 
			
		||||
{
 | 
			
		||||
	struct device_info *entry;
 | 
			
		||||
 | 
			
		||||
	if (!deviceid || !model || !*model)
 | 
			
		||||
		return NULL;
 | 
			
		||||
	entry = get_device_info(model, deviceid);
 | 
			
		||||
	if (entry)
 | 
			
		||||
		return entry;
 | 
			
		||||
	entry = calloc(1, sizeof(*entry));
 | 
			
		||||
	if (entry) {
 | 
			
		||||
		entry->model = strdup(model);
 | 
			
		||||
		entry->deviceid = deviceid;
 | 
			
		||||
		add_entry_sorted(entry);
 | 
			
		||||
	}
 | 
			
		||||
	return entry;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* do we have a DIFFERENT divecomputer of the same model? */
 | 
			
		||||
struct device_info *get_different_device_info(const char *model, uint32_t deviceid)
 | 
			
		||||
{
 | 
			
		||||
	struct device_info *known = device_info_list;
 | 
			
		||||
 | 
			
		||||
	/* a 0 deviceid matches any DC of the same model - those come from development
 | 
			
		||||
	 * versions of Subsurface that didn't store the deviceid in the divecomputer entries */
 | 
			
		||||
	if (!deviceid)
 | 
			
		||||
		return NULL;
 | 
			
		||||
	if (!model)
 | 
			
		||||
		model = "";
 | 
			
		||||
	while (known) {
 | 
			
		||||
		if (known->model && !strcmp(known->model, model) &&
 | 
			
		||||
		    known->deviceid != deviceid)
 | 
			
		||||
			return known;
 | 
			
		||||
		known = known->next;
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct device_info *remove_device_info(const char *model, uint32_t deviceid)
 | 
			
		||||
{
 | 
			
		||||
	struct device_info *entry, **p;
 | 
			
		||||
 | 
			
		||||
	if (!deviceid || !model || !*model)
 | 
			
		||||
		return NULL;
 | 
			
		||||
	p = &device_info_list;
 | 
			
		||||
	while ((entry = *p) != NULL) {
 | 
			
		||||
		if (match_device_info(entry, model, deviceid)) {
 | 
			
		||||
			*p = entry->next;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		p = &entry->next;
 | 
			
		||||
	}
 | 
			
		||||
	return entry;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct divecomputer* fake_dc(struct divecomputer* dc)
 | 
			
		||||
{
 | 
			
		||||
	static struct sample fake[4];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										19
									
								
								device.h
									
										
									
									
									
								
							
							
						
						
									
										19
									
								
								device.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -6,23 +6,10 @@
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct device_info {
 | 
			
		||||
	const char *model;
 | 
			
		||||
	uint32_t deviceid;
 | 
			
		||||
 | 
			
		||||
	const char *serial_nr;
 | 
			
		||||
	const char *firmware;
 | 
			
		||||
	const char *nickname;
 | 
			
		||||
	struct device_info *next;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern struct device_info *get_device_info(const char *model, uint32_t deviceid);
 | 
			
		||||
extern struct device_info *get_different_device_info(const char *model, uint32_t deviceid);
 | 
			
		||||
extern struct device_info *create_device_info(const char *model, uint32_t deviceid);
 | 
			
		||||
extern struct device_info *remove_device_info(const char *model, uint32_t deviceid);
 | 
			
		||||
extern struct device_info *head_of_device_info_list(void);
 | 
			
		||||
extern struct divecomputer *fake_dc(struct divecomputer* dc);
 | 
			
		||||
extern void remove_dive_computer(const char *model, uint32_t deviceid);
 | 
			
		||||
extern void create_device_node(const char *model, uint32_t deviceid, const char *serial, const char *firmware, const char *nickname);
 | 
			
		||||
extern void call_for_each_dc(FILE *f, void (*callback)(FILE *, const char *, uint32_t,
 | 
			
		||||
						const char *, const char *, const char *));
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								dive.h
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								dive.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -653,7 +653,6 @@ extern void dive_list_update_dives(void);
 | 
			
		|||
extern void flush_divelist(struct dive *dive);
 | 
			
		||||
 | 
			
		||||
extern void set_dc_nickname(struct dive *dive);
 | 
			
		||||
extern const char *get_dc_nickname(const char *model, uint32_t deviceid);
 | 
			
		||||
extern void set_autogroup(gboolean value);
 | 
			
		||||
extern int total_weight(struct dive *);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1059,7 +1059,7 @@ static void try_to_renumber(struct dive *last, int preexisting)
 | 
			
		|||
 | 
			
		||||
void process_dives(bool is_imported, bool prefer_imported)
 | 
			
		||||
{
 | 
			
		||||
		int i;
 | 
			
		||||
	int i;
 | 
			
		||||
	int preexisting = dive_table.preexisting;
 | 
			
		||||
	struct dive *last;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,6 +9,7 @@
 | 
			
		|||
 | 
			
		||||
#include <QString>
 | 
			
		||||
#include "dive.h"
 | 
			
		||||
#include "qthelper.h"
 | 
			
		||||
 | 
			
		||||
QString get_depth_string(depth_t depth, bool showunit);
 | 
			
		||||
QString get_weight_string(weight_t weight, bool showunit);
 | 
			
		||||
| 
						 | 
				
			
			@ -18,5 +19,8 @@ QString get_pressure_string(pressure_t pressure, bool showunit);
 | 
			
		|||
void set_default_dive_computer(const char *vendor, const char *product);
 | 
			
		||||
void set_default_dive_computer_device(const char *name);
 | 
			
		||||
QString getSubsurfaceDataPath(QString folderToFind);
 | 
			
		||||
extern const QString get_dc_nickname(const char *model, uint32_t deviceid);
 | 
			
		||||
 | 
			
		||||
extern DiveComputerList dcList;
 | 
			
		||||
 | 
			
		||||
#endif /* HELPER_H */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -578,36 +578,29 @@ static unsigned int undo_libdivecomputer_suunto_nr_changes(unsigned int serial)
 | 
			
		|||
 | 
			
		||||
static unsigned int fixup_suunto_versions(device_data_t *devdata, const dc_event_devinfo_t *devinfo)
 | 
			
		||||
{
 | 
			
		||||
	struct device_info *info;
 | 
			
		||||
	unsigned int serial = devinfo->serial;
 | 
			
		||||
	char serial_nr[13] = "";
 | 
			
		||||
	char firmware[13] = "";
 | 
			
		||||
 | 
			
		||||
	first_temp_is_air = 1;
 | 
			
		||||
 | 
			
		||||
	serial = undo_libdivecomputer_suunto_nr_changes(serial);
 | 
			
		||||
 | 
			
		||||
	info = create_device_info(devdata->model, devdata->deviceid);
 | 
			
		||||
	if (!info)
 | 
			
		||||
		return serial;
 | 
			
		||||
 | 
			
		||||
	if (!info->serial_nr && serial) {
 | 
			
		||||
		char serial_nr[13];
 | 
			
		||||
 | 
			
		||||
	if (serial) {
 | 
			
		||||
		snprintf(serial_nr, sizeof(serial_nr), "%02d%02d%02d%02d",
 | 
			
		||||
			(devinfo->serial >> 24) & 0xff,
 | 
			
		||||
			(devinfo->serial >> 16) & 0xff,
 | 
			
		||||
			(devinfo->serial >> 8)  & 0xff,
 | 
			
		||||
			(devinfo->serial >> 0)  & 0xff);
 | 
			
		||||
		info->serial_nr = strdup(serial_nr);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!info->firmware && devinfo->firmware) {
 | 
			
		||||
		char firmware[13];
 | 
			
		||||
	if (devinfo->firmware) {
 | 
			
		||||
		snprintf(firmware, sizeof(firmware), "%d.%d.%d",
 | 
			
		||||
			(devinfo->firmware >> 16) & 0xff,
 | 
			
		||||
			(devinfo->firmware >> 8)  & 0xff,
 | 
			
		||||
			(devinfo->firmware >> 0)  & 0xff);
 | 
			
		||||
		info->firmware = strdup(firmware);
 | 
			
		||||
	}
 | 
			
		||||
	create_device_node(devdata->model, devdata->deviceid, serial_nr, firmware, "");
 | 
			
		||||
 | 
			
		||||
	return serial;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										13
									
								
								parse-xml.c
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								parse-xml.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1222,17 +1222,8 @@ static void dc_settings_start(void)
 | 
			
		|||
 | 
			
		||||
static void dc_settings_end(void)
 | 
			
		||||
{
 | 
			
		||||
	struct device_info *info;
 | 
			
		||||
 | 
			
		||||
	info = create_device_info(cur_settings.dc.model, cur_settings.dc.deviceid);
 | 
			
		||||
	if (info) {
 | 
			
		||||
		if (!info->serial_nr && cur_settings.dc.serial_nr)
 | 
			
		||||
			info->serial_nr = strdup(cur_settings.dc.serial_nr);
 | 
			
		||||
		if (!info->firmware && cur_settings.dc.firmware)
 | 
			
		||||
			info->firmware = strdup(cur_settings.dc.firmware);
 | 
			
		||||
		if (!info->nickname && cur_settings.dc.nickname)
 | 
			
		||||
			info->nickname = strdup(cur_settings.dc.nickname);
 | 
			
		||||
	}
 | 
			
		||||
	create_device_node(cur_settings.dc.model, cur_settings.dc.deviceid, cur_settings.dc.serial_nr,
 | 
			
		||||
			   cur_settings.dc.firmware, cur_settings.dc.nickname);
 | 
			
		||||
	reset_dc_settings();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										67
									
								
								qt-gui.cpp
									
										
									
									
									
								
							
							
						
						
									
										67
									
								
								qt-gui.cpp
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -21,6 +21,7 @@
 | 
			
		|||
#include "libdivecomputer.h"
 | 
			
		||||
#include "qt-ui/mainwindow.h"
 | 
			
		||||
#include "helpers.h"
 | 
			
		||||
#include "qthelper.h"
 | 
			
		||||
 | 
			
		||||
#include <QApplication>
 | 
			
		||||
#include <QFileDialog>
 | 
			
		||||
| 
						 | 
				
			
			@ -32,10 +33,13 @@
 | 
			
		|||
#include <QDesktopWidget>
 | 
			
		||||
#include <QStyle>
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
#include <QMap>
 | 
			
		||||
#include <QMultiMap>
 | 
			
		||||
 | 
			
		||||
const char *default_dive_computer_vendor;
 | 
			
		||||
const char *default_dive_computer_product;
 | 
			
		||||
const char *default_dive_computer_device;
 | 
			
		||||
DiveComputerList dcList;
 | 
			
		||||
 | 
			
		||||
class Translator: public QTranslator
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -142,30 +146,15 @@ void set_filename(const char *filename, gboolean force)
 | 
			
		|||
		existing_filename = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char *get_dc_nickname(const char *model, uint32_t deviceid)
 | 
			
		||||
const QString get_dc_nickname(const char *model, uint32_t deviceid)
 | 
			
		||||
{
 | 
			
		||||
	struct device_info *known = get_device_info(model, deviceid);
 | 
			
		||||
	if (known) {
 | 
			
		||||
		if (known->nickname && *known->nickname)
 | 
			
		||||
			return known->nickname;
 | 
			
		||||
		else
 | 
			
		||||
			return known->model;
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void remember_dc(const char *model, uint32_t deviceid, const char *nickname)
 | 
			
		||||
{
 | 
			
		||||
	struct device_info *nn_entry;
 | 
			
		||||
 | 
			
		||||
	nn_entry = create_device_info(model, deviceid);
 | 
			
		||||
	if (!nn_entry)
 | 
			
		||||
		return;
 | 
			
		||||
	if (!nickname || !*nickname) {
 | 
			
		||||
		nn_entry->nickname = NULL;
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	nn_entry->nickname = strdup(nickname);
 | 
			
		||||
	const DiveComputerNode *existNode = dcList.getExact(model, deviceid);
 | 
			
		||||
	if (!existNode)
 | 
			
		||||
		return QString("");
 | 
			
		||||
	if (existNode->nickName != "")
 | 
			
		||||
		return existNode->nickName;
 | 
			
		||||
	else
 | 
			
		||||
		return model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void set_dc_nickname(struct dive *dive)
 | 
			
		||||
| 
						 | 
				
			
			@ -176,16 +165,20 @@ void set_dc_nickname(struct dive *dive)
 | 
			
		|||
	struct divecomputer *dc = &dive->dc;
 | 
			
		||||
 | 
			
		||||
	while (dc) {
 | 
			
		||||
		if (get_dc_nickname(dc->model, dc->deviceid) == NULL) {
 | 
			
		||||
		if (dc->model && *dc->model && dc->deviceid &&
 | 
			
		||||
		    !dcList.getExact(dc->model, dc->deviceid)) {
 | 
			
		||||
			// we don't have this one, yet
 | 
			
		||||
			struct device_info *nn_entry = get_different_device_info(dc->model, dc->deviceid);
 | 
			
		||||
			if (nn_entry) {
 | 
			
		||||
			const DiveComputerNode *existNode = dcList.get(dc->model);
 | 
			
		||||
			if (existNode) {
 | 
			
		||||
				// we already have this model but a different deviceid
 | 
			
		||||
				QString simpleNick(dc->model);
 | 
			
		||||
				simpleNick.append(" (").append(QString::number(dc->deviceid, 16)).append(")");
 | 
			
		||||
				remember_dc(dc->model, dc->deviceid, simpleNick.toUtf8().data());
 | 
			
		||||
				if (dc->deviceid == 0)
 | 
			
		||||
					simpleNick.append(" (unknown deviceid)");
 | 
			
		||||
				else
 | 
			
		||||
					simpleNick.append(" (").append(QString::number(dc->deviceid, 16)).append(")");
 | 
			
		||||
				dcList.addDC(dc->model, dc->deviceid, simpleNick);
 | 
			
		||||
			} else {
 | 
			
		||||
				remember_dc(dc->model, dc->deviceid, NULL);
 | 
			
		||||
				dcList.addDC(dc->model, dc->deviceid);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		dc = dc->next;
 | 
			
		||||
| 
						 | 
				
			
			@ -330,4 +323,20 @@ QString getSubsurfaceDataPath(QString folderToFind)
 | 
			
		|||
	return QString("");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void create_device_node(const char *model, uint32_t deviceid, const char *serial, const char *firmware, const char *nickname)
 | 
			
		||||
{
 | 
			
		||||
	dcList.addDC(model, deviceid, nickname, serial, firmware);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void call_for_each_dc(FILE *f, void (*callback)(FILE *, const char *, uint32_t,
 | 
			
		||||
						const char *, const char *, const char *))
 | 
			
		||||
{
 | 
			
		||||
	QList<DiveComputerNode> values = dcList.dcMap.values();
 | 
			
		||||
	for (int i = 0; i < values.size(); i++) {
 | 
			
		||||
		const DiveComputerNode *node = &values.at(i);
 | 
			
		||||
		callback(f, node->model.toUtf8().data(), node->deviceId, node->nickName.toUtf8().data(),
 | 
			
		||||
			 node->serialNumber.toUtf8().data(), node->firmware.toUtf8().data());
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#include "qt-gui.moc"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,16 +3,26 @@
 | 
			
		|||
#include "ui_divecomputermanagementdialog.h"
 | 
			
		||||
#include "mainwindow.h"
 | 
			
		||||
#include <QMessageBox>
 | 
			
		||||
#include "../qthelper.h"
 | 
			
		||||
#include "../helpers.h"
 | 
			
		||||
 | 
			
		||||
DiveComputerManagementDialog::DiveComputerManagementDialog(QWidget* parent, Qt::WindowFlags f): QDialog(parent, f)
 | 
			
		||||
, ui( new Ui::DiveComputerManagementDialog())
 | 
			
		||||
DiveComputerManagementDialog::DiveComputerManagementDialog(QWidget* parent, Qt::WindowFlags f): QDialog(parent, f),
 | 
			
		||||
	ui( new Ui::DiveComputerManagementDialog()),
 | 
			
		||||
	model(0)
 | 
			
		||||
{
 | 
			
		||||
	ui->setupUi(this);
 | 
			
		||||
	model = new DiveComputerModel();
 | 
			
		||||
	ui->tableView->setModel(model);
 | 
			
		||||
	init();
 | 
			
		||||
	connect(ui->tableView, SIGNAL(clicked(QModelIndex)), this, SLOT(tryRemove(QModelIndex)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DiveComputerManagementDialog::init()
 | 
			
		||||
{
 | 
			
		||||
	if (model)
 | 
			
		||||
		delete model;
 | 
			
		||||
	model = new DiveComputerModel(dcList.dcMap);
 | 
			
		||||
	ui->tableView->setModel(model);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DiveComputerManagementDialog* DiveComputerManagementDialog::instance()
 | 
			
		||||
{
 | 
			
		||||
	static DiveComputerManagementDialog *self = new DiveComputerManagementDialog();
 | 
			
		||||
| 
						 | 
				
			
			@ -44,3 +54,17 @@ void DiveComputerManagementDialog::tryRemove(const QModelIndex& index)
 | 
			
		|||
		model->remove(index);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DiveComputerManagementDialog::accept()
 | 
			
		||||
{
 | 
			
		||||
	model->keepWorkingList();
 | 
			
		||||
	hide();
 | 
			
		||||
	close();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DiveComputerManagementDialog::reject()
 | 
			
		||||
{
 | 
			
		||||
	model->dropWorkingList();
 | 
			
		||||
	hide();
 | 
			
		||||
	close();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,9 +14,12 @@ Q_OBJECT
 | 
			
		|||
public:
 | 
			
		||||
    static DiveComputerManagementDialog *instance();
 | 
			
		||||
	void update();
 | 
			
		||||
	void init();
 | 
			
		||||
 | 
			
		||||
public  slots:
 | 
			
		||||
	void tryRemove(const QModelIndex& index);
 | 
			
		||||
	void accept();
 | 
			
		||||
	void reject();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    explicit DiveComputerManagementDialog(QWidget* parent = 0, Qt::WindowFlags f = 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -24,4 +27,4 @@ private:
 | 
			
		|||
	DiveComputerModel *model;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,7 @@
 | 
			
		|||
   </rect>
 | 
			
		||||
  </property>
 | 
			
		||||
  <property name="windowTitle">
 | 
			
		||||
   <string>Dialog</string>
 | 
			
		||||
   <string>Edit Dive Computer Nicknames</string>
 | 
			
		||||
  </property>
 | 
			
		||||
  <layout class="QVBoxLayout" name="verticalLayout">
 | 
			
		||||
   <item>
 | 
			
		||||
| 
						 | 
				
			
			@ -21,8 +21,51 @@
 | 
			
		|||
     </attribute>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item>
 | 
			
		||||
    <widget class="QDialogButtonBox" name="buttonBox">
 | 
			
		||||
     <property name="orientation">
 | 
			
		||||
      <enum>Qt::Horizontal</enum>
 | 
			
		||||
     </property>
 | 
			
		||||
     <property name="standardButtons">
 | 
			
		||||
      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
  </layout>
 | 
			
		||||
 </widget>
 | 
			
		||||
 <resources/>
 | 
			
		||||
 <connections/>
 | 
			
		||||
 <connections>
 | 
			
		||||
  <connection>
 | 
			
		||||
   <sender>buttonBox</sender>
 | 
			
		||||
   <signal>accepted()</signal>
 | 
			
		||||
   <receiver>DiveComputerManagementDialog</receiver>
 | 
			
		||||
   <slot>accept()</slot>
 | 
			
		||||
   <hints>
 | 
			
		||||
    <hint type="sourcelabel">
 | 
			
		||||
     <x>248</x>
 | 
			
		||||
     <y>254</y>
 | 
			
		||||
    </hint>
 | 
			
		||||
    <hint type="destinationlabel">
 | 
			
		||||
     <x>157</x>
 | 
			
		||||
     <y>274</y>
 | 
			
		||||
    </hint>
 | 
			
		||||
   </hints>
 | 
			
		||||
  </connection>
 | 
			
		||||
  <connection>
 | 
			
		||||
   <sender>buttonBox</sender>
 | 
			
		||||
   <signal>rejected()</signal>
 | 
			
		||||
   <receiver>DiveComputerManagementDialog</receiver>
 | 
			
		||||
   <slot>reject()</slot>
 | 
			
		||||
   <hints>
 | 
			
		||||
    <hint type="sourcelabel">
 | 
			
		||||
     <x>316</x>
 | 
			
		||||
     <y>260</y>
 | 
			
		||||
    </hint>
 | 
			
		||||
    <hint type="destinationlabel">
 | 
			
		||||
     <x>286</x>
 | 
			
		||||
     <y>274</y>
 | 
			
		||||
    </hint>
 | 
			
		||||
   </hints>
 | 
			
		||||
  </connection>
 | 
			
		||||
 </connections>
 | 
			
		||||
</ui>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -207,6 +207,7 @@ void MainWindow::on_actionDownloadWeb_triggered()
 | 
			
		|||
 | 
			
		||||
void MainWindow::on_actionEditDeviceNames_triggered()
 | 
			
		||||
{
 | 
			
		||||
	DiveComputerManagementDialog::instance()->init();
 | 
			
		||||
	DiveComputerManagementDialog::instance()->update();
 | 
			
		||||
	DiveComputerManagementDialog::instance()->show();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,8 +8,8 @@
 | 
			
		|||
#include "../helpers.h"
 | 
			
		||||
#include "../dive.h"
 | 
			
		||||
#include "../device.h"
 | 
			
		||||
#include  "../statistics.h"
 | 
			
		||||
 | 
			
		||||
#include "../statistics.h"
 | 
			
		||||
#include "../qthelper.h"
 | 
			
		||||
 | 
			
		||||
#include <QCoreApplication>
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
| 
						 | 
				
			
			@ -1172,9 +1172,10 @@ void DiveTripModel::setLayout(DiveTripModel::Layout layout)
 | 
			
		|||
 *####################################################################
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
DiveComputerModel::DiveComputerModel(QObject* parent): QAbstractTableModel(parent)
 | 
			
		||||
DiveComputerModel::DiveComputerModel(QMultiMap<QString, DiveComputerNode> &dcMap, QObject* parent): QAbstractTableModel(parent)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	dcWorkingMap = dcMap;
 | 
			
		||||
	numRows = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int DiveComputerModel::columnCount(const QModelIndex& parent) const
 | 
			
		||||
| 
						 | 
				
			
			@ -1198,17 +1199,15 @@ QVariant DiveComputerModel::headerData(int section, Qt::Orientation orientation,
 | 
			
		|||
 | 
			
		||||
QVariant DiveComputerModel::data(const QModelIndex& index, int role) const
 | 
			
		||||
{
 | 
			
		||||
	struct device_info *device = head_of_device_info_list();
 | 
			
		||||
	for(int i = 0; i < index.row(); i++){
 | 
			
		||||
		device = device->next;
 | 
			
		||||
	}
 | 
			
		||||
	QList<DiveComputerNode> values = dcWorkingMap.values();
 | 
			
		||||
	DiveComputerNode node = values.at(index.row());
 | 
			
		||||
 | 
			
		||||
	QVariant ret;
 | 
			
		||||
	if (role == Qt::DisplayRole || role == Qt::EditRole){
 | 
			
		||||
		switch(index.column()){
 | 
			
		||||
			case ID:	ret = QString("0x").append(QString::number(device->deviceid, 16)); break;
 | 
			
		||||
			case MODEL:	ret = device->model; break;
 | 
			
		||||
			case NICKNAME:	ret = device->nickname; break;
 | 
			
		||||
			case ID:	ret = QString("0x").append(QString::number(node.deviceId, 16)); break;
 | 
			
		||||
			case MODEL:	ret = node.model; break;
 | 
			
		||||
			case NICKNAME:	ret = node.nickName; break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1225,12 +1224,8 @@ int DiveComputerModel::rowCount(const QModelIndex& parent) const
 | 
			
		|||
 | 
			
		||||
void DiveComputerModel::update()
 | 
			
		||||
{
 | 
			
		||||
	int count = 0;
 | 
			
		||||
	struct device_info *nnl = head_of_device_info_list();
 | 
			
		||||
	while (nnl) {
 | 
			
		||||
		nnl = nnl->next;
 | 
			
		||||
		count++;
 | 
			
		||||
	}
 | 
			
		||||
	QList<DiveComputerNode> values = dcWorkingMap.values();
 | 
			
		||||
	int count = values.count();
 | 
			
		||||
 | 
			
		||||
	if(numRows){
 | 
			
		||||
		beginRemoveRows(QModelIndex(), 0, numRows-1);
 | 
			
		||||
| 
						 | 
				
			
			@ -1255,25 +1250,19 @@ Qt::ItemFlags DiveComputerModel::flags(const QModelIndex& index) const
 | 
			
		|||
 | 
			
		||||
bool DiveComputerModel::setData(const QModelIndex& index, const QVariant& value, int role)
 | 
			
		||||
{
 | 
			
		||||
	struct device_info *nnl = head_of_device_info_list();
 | 
			
		||||
 | 
			
		||||
	for(int i = 0; i < index.row(); i++){
 | 
			
		||||
		nnl = nnl->next;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	QByteArray v = value.toByteArray();
 | 
			
		||||
	nnl->nickname = strdup(v.data()); // how should I free this before setting a new one?
 | 
			
		||||
	// set_dc_nickname(dive);  -> should this be used instead?
 | 
			
		||||
 | 
			
		||||
	QList<DiveComputerNode> values = dcWorkingMap.values();
 | 
			
		||||
	DiveComputerNode node = values.at(index.row());
 | 
			
		||||
	dcWorkingMap.remove(node.model, node);
 | 
			
		||||
	node.nickName = value.toString();
 | 
			
		||||
	dcWorkingMap.insert(node.model, node);
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DiveComputerModel::remove(const QModelIndex& i)
 | 
			
		||||
void DiveComputerModel::remove(const QModelIndex& index)
 | 
			
		||||
{
 | 
			
		||||
	QByteArray model = data(index(i.row(), (int)MODEL)).toByteArray();
 | 
			
		||||
	uint32_t deviceid = data(index(i.row(), (int) ID)).toUInt();
 | 
			
		||||
	remove_dive_computer(model.data(),  deviceid);
 | 
			
		||||
	QList<DiveComputerNode> values = dcWorkingMap.values();
 | 
			
		||||
	DiveComputerNode node = values.at(index.row());
 | 
			
		||||
	dcWorkingMap.remove(node.model, node);
 | 
			
		||||
	update();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1396,3 +1385,15 @@ void YearlyStatisticsModel::update_yearly_stats()
 | 
			
		|||
		rootItem->children.append(item);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DiveComputerModel::dropWorkingList()
 | 
			
		||||
{
 | 
			
		||||
	// how do I prevent the memory leak ?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DiveComputerModel::keepWorkingList()
 | 
			
		||||
{
 | 
			
		||||
	if (dcList.dcMap != dcWorkingMap)
 | 
			
		||||
		mark_divelist_changed(TRUE);
 | 
			
		||||
	dcList.dcMap = dcWorkingMap;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,7 @@
 | 
			
		|||
 | 
			
		||||
#include "../dive.h"
 | 
			
		||||
#include "../divelist.h"
 | 
			
		||||
#include "../qthelper.h"
 | 
			
		||||
 | 
			
		||||
QFont defaultModelFont();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -181,19 +182,22 @@ class DiveComputerModel : public QAbstractTableModel
 | 
			
		|||
	Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
	enum {REMOVE, MODEL, ID, NICKNAME, COLUMNS};
 | 
			
		||||
    explicit DiveComputerModel(QObject* parent = 0);
 | 
			
		||||
    virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
 | 
			
		||||
    virtual int columnCount(const QModelIndex& parent = QModelIndex()) const;
 | 
			
		||||
    virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
 | 
			
		||||
    virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
 | 
			
		||||
    virtual Qt::ItemFlags flags(const QModelIndex& index) const;
 | 
			
		||||
    virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);
 | 
			
		||||
	DiveComputerModel(QMultiMap<QString, DiveComputerNode> &dcMap, QObject *parent = 0);
 | 
			
		||||
	virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
 | 
			
		||||
	virtual int columnCount(const QModelIndex& parent = QModelIndex()) const;
 | 
			
		||||
	virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
 | 
			
		||||
	virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
 | 
			
		||||
	virtual Qt::ItemFlags flags(const QModelIndex& index) const;
 | 
			
		||||
	virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);
 | 
			
		||||
	void update();
 | 
			
		||||
	void keepWorkingList();
 | 
			
		||||
	void dropWorkingList();
 | 
			
		||||
 | 
			
		||||
public slots:
 | 
			
		||||
	void remove(const QModelIndex& index);
 | 
			
		||||
private:
 | 
			
		||||
	int numRows;
 | 
			
		||||
	QMultiMap<QString, DiveComputerNode> dcWorkingMap;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class YearlyStatisticsModel : public TreeModel {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,6 +21,7 @@
 | 
			
		|||
#include "../dive.h"
 | 
			
		||||
#include "../profile.h"
 | 
			
		||||
#include "../device.h"
 | 
			
		||||
#include "../helpers.h"
 | 
			
		||||
 | 
			
		||||
#include <libdivecomputer/parser.h>
 | 
			
		||||
#include <libdivecomputer/version.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -273,7 +274,7 @@ void ProfileGraphicsView::plot(struct dive *d, bool forceRedraw)
 | 
			
		|||
		dc = fake_dc(dc);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	QString nick(get_dc_nickname(dc->model, dc->deviceid));
 | 
			
		||||
	QString nick = get_dc_nickname(dc->model, dc->deviceid);
 | 
			
		||||
	if (nick.isEmpty())
 | 
			
		||||
		nick = QString(dc->model);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										82
									
								
								qthelper.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								qthelper.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,82 @@
 | 
			
		|||
#include "qthelper.h"
 | 
			
		||||
 | 
			
		||||
DiveComputerList::DiveComputerList()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DiveComputerList::~DiveComputerList()
 | 
			
		||||
{
 | 
			
		||||
	dcMap.~QMap();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool DiveComputerNode::operator == (const DiveComputerNode &a) const {
 | 
			
		||||
	return this->model == a.model &&
 | 
			
		||||
			this->deviceId == a.deviceId &&
 | 
			
		||||
			this->firmware == a.firmware &&
 | 
			
		||||
			this->serialNumber == a.serialNumber &&
 | 
			
		||||
			this->nickName == a.nickName;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool DiveComputerNode::operator !=(const DiveComputerNode &a) const {
 | 
			
		||||
	return !(*this == a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool DiveComputerNode::changesValues(const DiveComputerNode &b) const
 | 
			
		||||
{
 | 
			
		||||
	if (this->model != b.model || this->deviceId != b.deviceId) {
 | 
			
		||||
		qDebug("DiveComputerNodes were not for the same DC");
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	return (b.firmware != "" && this->firmware != b.firmware) ||
 | 
			
		||||
			(b.serialNumber != "" && this->serialNumber != b.serialNumber) ||
 | 
			
		||||
			(b.nickName != "" && this->nickName != b.nickName);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const DiveComputerNode *DiveComputerList::getExact(QString m, uint32_t d)
 | 
			
		||||
{
 | 
			
		||||
	if (dcMap.contains(m)) {
 | 
			
		||||
		QList<DiveComputerNode> values = dcMap.values(m);
 | 
			
		||||
		for (int i = 0; i < values.size(); i++)
 | 
			
		||||
			if (values.at(i).deviceId == d)
 | 
			
		||||
				return &values.at(i);
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const DiveComputerNode *DiveComputerList::get(QString m)
 | 
			
		||||
{
 | 
			
		||||
	if (dcMap.contains(m)) {
 | 
			
		||||
		QList<DiveComputerNode> values = dcMap.values(m);
 | 
			
		||||
		return &values.at(0);
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DiveComputerList::addDC(QString m, uint32_t d, QString n, QString s, QString f)
 | 
			
		||||
{
 | 
			
		||||
	if (m == "" || d == 0)
 | 
			
		||||
		return;
 | 
			
		||||
	const DiveComputerNode *existNode = this->getExact(m, d);
 | 
			
		||||
	DiveComputerNode newNode(m, d, s, f, n);
 | 
			
		||||
	if (existNode) {
 | 
			
		||||
		if (newNode.changesValues(*existNode)) {
 | 
			
		||||
			if (n != "" && existNode->nickName != n)
 | 
			
		||||
				qDebug("new nickname %s for DC model %s deviceId 0x%x", n.toUtf8().data(), m.toUtf8().data(), d);
 | 
			
		||||
			if (f != "" && existNode->firmware != f)
 | 
			
		||||
				qDebug("new firmware version %s for DC model %s deviceId 0x%x", f.toUtf8().data(), m.toUtf8().data(), d);
 | 
			
		||||
			if (s != "" && existNode->serialNumber != s)
 | 
			
		||||
				qDebug("new serial number %s for DC model %s deviceId 0x%x", s.toUtf8().data(), m.toUtf8().data(), d);
 | 
			
		||||
		} else {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		dcMap.remove(m, *existNode);
 | 
			
		||||
	}
 | 
			
		||||
	dcMap.insert(m, newNode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DiveComputerList::rmDC(QString m, uint32_t d)
 | 
			
		||||
{
 | 
			
		||||
	const DiveComputerNode *existNode = this->getExact(m, d);
 | 
			
		||||
	dcMap.remove(m, *existNode);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								qthelper.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								qthelper.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,35 @@
 | 
			
		|||
#ifndef QTHELPER_H
 | 
			
		||||
#define QTHELPER_H
 | 
			
		||||
 | 
			
		||||
#include <QMultiMap>
 | 
			
		||||
#include <QString>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
class DiveComputerNode {
 | 
			
		||||
public:
 | 
			
		||||
	DiveComputerNode(QString m, uint32_t d, QString s, QString f, QString n) : model(m), deviceId(d), serialNumber(s), firmware(f), nickName(n) {};
 | 
			
		||||
	bool operator ==(const DiveComputerNode &a) const;
 | 
			
		||||
	bool operator !=(const DiveComputerNode &a) const;
 | 
			
		||||
	bool changesValues(const DiveComputerNode &b) const;
 | 
			
		||||
	QString model;
 | 
			
		||||
	uint32_t deviceId;
 | 
			
		||||
	QString serialNumber;
 | 
			
		||||
	QString firmware;
 | 
			
		||||
	QString nickName;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class DiveComputerList {
 | 
			
		||||
public:
 | 
			
		||||
	DiveComputerList();
 | 
			
		||||
	~DiveComputerList();
 | 
			
		||||
	const DiveComputerNode *getExact(QString m, uint32_t d);
 | 
			
		||||
	const DiveComputerNode *get(QString m);
 | 
			
		||||
	void addDC(QString m, uint32_t d, QString n = "", QString s = "", QString f = "");
 | 
			
		||||
	void rmDC(QString m, uint32_t d);
 | 
			
		||||
	DiveComputerNode matchDC(QString m, uint32_t d);
 | 
			
		||||
	DiveComputerNode matchModel(QString m);
 | 
			
		||||
	QMultiMap<QString, struct DiveComputerNode> dcMap;
 | 
			
		||||
	QMultiMap<QString, struct DiveComputerNode> dcWorkingMap;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // QTHELPER_H
 | 
			
		||||
							
								
								
									
										27
									
								
								save-xml.c
									
										
									
									
									
								
							
							
						
						
									
										27
									
								
								save-xml.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -512,24 +512,20 @@ static void save_trip(FILE *f, dive_trip_t *trip)
 | 
			
		|||
	fprintf(f, "</trip>\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void save_one_device(FILE *f, struct device_info *info)
 | 
			
		||||
static void save_one_device(FILE *f, const char * model, uint32_t deviceid,
 | 
			
		||||
			    const char *nickname, const char *serial_nr, const char *firmware)
 | 
			
		||||
{
 | 
			
		||||
	const char *nickname, *serial_nr, *firmware;
 | 
			
		||||
 | 
			
		||||
	/* Nicknames that are empty or the same as the device model are not interesting */
 | 
			
		||||
	nickname = info->nickname;
 | 
			
		||||
	if (nickname) {
 | 
			
		||||
		if (!*nickname || !strcmp(info->model, nickname))
 | 
			
		||||
		if (!*nickname || !strcmp(model, nickname))
 | 
			
		||||
			nickname = NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Serial numbers that are empty are not interesting */
 | 
			
		||||
	serial_nr = info->serial_nr;
 | 
			
		||||
	if (serial_nr && !*serial_nr)
 | 
			
		||||
		serial_nr = NULL;
 | 
			
		||||
 | 
			
		||||
	/* Firmware strings that are empty are not interesting */
 | 
			
		||||
	firmware = info->firmware;
 | 
			
		||||
	if (firmware && !*firmware)
 | 
			
		||||
		firmware = NULL;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -538,25 +534,14 @@ static void save_one_device(FILE *f, struct device_info *info)
 | 
			
		|||
		return;
 | 
			
		||||
 | 
			
		||||
	fprintf(f, "<divecomputerid");
 | 
			
		||||
	show_utf8(f, info->model, " model='", "'", 1);
 | 
			
		||||
	fprintf(f, " deviceid='%08x'", info->deviceid);
 | 
			
		||||
	show_utf8(f, model, " model='", "'", 1);
 | 
			
		||||
	fprintf(f, " deviceid='%08x'", deviceid);
 | 
			
		||||
	show_utf8(f, serial_nr, " serial='", "'", 1);
 | 
			
		||||
	show_utf8(f, firmware, " firmware='", "'", 1);
 | 
			
		||||
	show_utf8(f, nickname, " nickname='", "'", 1);
 | 
			
		||||
	fprintf(f, "/>\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void save_device_info(FILE *f)
 | 
			
		||||
{
 | 
			
		||||
	struct device_info *info;
 | 
			
		||||
 | 
			
		||||
	info = head_of_device_info_list();
 | 
			
		||||
	while (info) {
 | 
			
		||||
		save_one_device(f, info);
 | 
			
		||||
		info = info->next;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define VERSION 2
 | 
			
		||||
 | 
			
		||||
void save_dives(const char *filename)
 | 
			
		||||
| 
						 | 
				
			
			@ -578,7 +563,7 @@ void save_dives_logic(const char *filename, const gboolean select_only)
 | 
			
		|||
	fprintf(f, "<divelog program='subsurface' version='%d'>\n<settings>\n", VERSION);
 | 
			
		||||
 | 
			
		||||
	/* save the dive computer nicknames, if any */
 | 
			
		||||
	save_device_info(f);
 | 
			
		||||
	call_for_each_dc(f, save_one_device);
 | 
			
		||||
	if (autogroup)
 | 
			
		||||
		fprintf(f, "<autogroup state='1' />\n");
 | 
			
		||||
	fprintf(f, "</settings>\n<dives>\n");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue