36 |
/* |
/* |
37 |
* file fields |
* file fields |
38 |
*/ |
*/ |
39 |
const gint old_log_fields[] = { DATE, GMT, CALL, BAND, MODE, RST, MYRST, |
const gint old_log_fields[] = { DATE, GMT, CALL, BAND, MODE, RST, MYRST, |
40 |
QSLOUT, QSLIN, REMARKS }; |
QSLOUT, QSLIN, REMARKS |
41 |
|
}; |
42 |
const gint old_log_widths[] = { 15, 15, 15, 15, 15, 15, 15, 15, 15, 80 }; |
const gint old_log_widths[] = { 15, 15, 15, 15, 15, 15, 15, 15, 15, 80 }; |
43 |
const gint old_log_field_nr = 10; |
const gint old_log_field_nr = 10; |
44 |
|
|
45 |
static gint old_log_open(LOGDB*); |
static gint old_log_open (LOGDB *); |
46 |
static void old_log_close(LOGDB*); |
static void old_log_close (LOGDB *); |
47 |
static gint old_log_create(LOGDB*); |
static gint old_log_create (LOGDB *); |
48 |
static gint old_log_qso_append(LOGDB*, const qso_t*); |
static gint old_log_qso_append (LOGDB *, const qso_t *); |
49 |
static gint old_log_qso_foreach(LOGDB*, gint (*fn)(LOGDB*, qso_t*, gpointer arg), gpointer arg); |
static gint old_log_qso_foreach (LOGDB *, |
50 |
|
gint (*fn) (LOGDB *, qso_t *, gpointer arg), |
51 |
|
gpointer arg); |
52 |
|
|
53 |
const struct log_ops old_log_ops = { |
const struct log_ops old_log_ops = { |
54 |
open: old_log_open, |
open:old_log_open, |
55 |
close: old_log_close, |
close:old_log_close, |
56 |
create: old_log_create, |
create:old_log_create, |
57 |
qso_append: old_log_qso_append, |
qso_append:old_log_qso_append, |
58 |
qso_foreach: old_log_qso_foreach, |
qso_foreach:old_log_qso_foreach, |
59 |
type: TYPE_OLD_LOG, |
type:TYPE_OLD_LOG, |
60 |
name: "Oldlog", |
name:"Oldlog", |
61 |
extension: ".log", |
extension:".log", |
62 |
}; |
}; |
63 |
|
|
64 |
/* |
/* |
65 |
* open for read |
* open for read |
66 |
*/ |
*/ |
67 |
gint old_log_open(LOGDB *handle) |
gint |
68 |
|
old_log_open (LOGDB * handle) |
69 |
{ |
{ |
70 |
FILE *fp; |
FILE *fp; |
71 |
|
|
72 |
fp = fopen(handle->path, "r"); |
fp = fopen (handle->path, "r"); |
73 |
if (!fp) return -1; |
if (!fp) |
74 |
handle->priv = (gpointer)fp; |
return -1; |
75 |
|
handle->priv = (gpointer) fp; |
76 |
|
|
77 |
/* TODO: read first line, and determine whether v0.4 and v0.5 */ |
/* TODO: read first line, and determine whether v0.4 and v0.5 */ |
78 |
|
|
79 |
handle->column_nr = old_log_field_nr; |
handle->column_nr = old_log_field_nr; |
80 |
memcpy(handle->column_fields, old_log_fields, sizeof(old_log_fields)); |
memcpy (handle->column_fields, old_log_fields, sizeof (old_log_fields)); |
81 |
memcpy(handle->column_widths, old_log_widths, sizeof(old_log_widths)); |
memcpy (handle->column_widths, old_log_widths, sizeof (old_log_widths)); |
82 |
|
|
83 |
return 0; |
return 0; |
84 |
} |
} |
85 |
|
|
86 |
/* |
/* |
87 |
* open for write |
* open for write |
88 |
*/ |
*/ |
89 |
gint old_log_create(LOGDB *handle) |
gint |
90 |
|
old_log_create (LOGDB * handle) |
91 |
{ |
{ |
92 |
FILE *fp; |
FILE *fp; |
93 |
|
|
94 |
fp = fopen(handle->path, "w"); |
fp = fopen (handle->path, "w"); |
95 |
if (!fp) return -1; |
if (!fp) |
96 |
handle->priv = (gpointer)fp; |
return -1; |
97 |
return 0; |
handle->priv = (gpointer) fp; |
98 |
|
return 0; |
99 |
} |
} |
100 |
|
|
101 |
void old_log_close(LOGDB *handle) |
void |
102 |
|
old_log_close (LOGDB * handle) |
103 |
{ |
{ |
104 |
FILE *fp = (FILE*)handle->priv; |
FILE *fp = (FILE *) handle->priv; |
105 |
fclose(fp); |
fclose (fp); |
106 |
} |
} |
107 |
|
|
108 |
/* |
/* |
109 |
* version 0.5 format. |
* version 0.5 format. |
110 |
* each field 15 positions, remarks on a separate line, 80 wide |
* each field 15 positions, remarks on a separate line, 80 wide |
111 |
*/ |
*/ |
112 |
gint old_log_qso_append(LOGDB *handle, const qso_t *q) |
gint |
113 |
|
old_log_qso_append (LOGDB * handle, const qso_t * q) |
114 |
{ |
{ |
115 |
FILE *fp = (FILE *)handle->priv; |
FILE *fp = (FILE *) handle->priv; |
116 |
|
|
117 |
fprintf(fp, "%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s\n%-80s\n", |
fprintf (fp, "%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s\n%-80s\n", |
118 |
q[DATE], q[GMT], q[CALL], q[BAND], q[MODE], |
q[DATE], q[GMT], q[CALL], q[BAND], q[MODE], |
119 |
q[RST], q[MYRST], q[QSLOUT], q[QSLIN], q[REMARKS]); |
q[RST], q[MYRST], q[QSLOUT], q[QSLIN], q[REMARKS]); |
120 |
return 0; |
return 0; |
121 |
} |
} |
122 |
|
|
123 |
gint old_log_qso_foreach(LOGDB *handle, gint (*fn)(LOGDB*, qso_t*, gpointer arg), gpointer arg) |
gint |
124 |
|
old_log_qso_foreach (LOGDB * handle, |
125 |
|
gint (*fn) (LOGDB *, qso_t *, gpointer arg), |
126 |
|
gpointer arg) |
127 |
{ |
{ |
128 |
FILE *fp = (FILE*)handle->priv; |
FILE *fp = (FILE *) handle->priv; |
129 |
gint i, ret; |
gint i, ret; |
130 |
qso_t q[QSO_FIELDS]; |
qso_t q[QSO_FIELDS]; |
131 |
gchar buffer[81]; |
gchar buffer[81]; |
132 |
|
|
133 |
while (!feof(fp)) { |
while (!feof (fp)) |
134 |
memset(q, 0, sizeof(q)); |
{ |
135 |
for (i = 0; i < 7; i++) { |
memset (q, 0, sizeof (q)); |
136 |
fgets(buffer, 16, fp); |
for (i = 0; i < 7; i++) |
137 |
|
{ |
138 |
if (strlen(buffer) != 15 || feof(fp)) { |
fgets (buffer, 16, fp); |
139 |
return 0; |
|
140 |
} |
if (strlen (buffer) != 15 || feof (fp)) |
141 |
q[old_log_fields[i]] = g_strdup(g_strstrip(buffer)); |
{ |
142 |
} |
return 0; |
143 |
|
} |
144 |
/* QSLOUT and QSLIN are not present in version 0.4 */ |
q[old_log_fields[i]] = g_strdup (g_strstrip (buffer)); |
145 |
fgets(buffer, 16, fp); /*QSL out? */ |
} |
|
if (strlen(buffer) == 15) { |
|
|
q[QSLOUT] = g_strdup(g_strstrip(buffer)); |
|
|
fgets(buffer, 16, fp); /*QSL in*/ |
|
|
q[QSLIN] = g_strdup(g_strstrip(buffer)); |
|
|
fgets(buffer, 3, fp); /*EOL*/ |
|
|
} else { |
|
|
q[QSLOUT] = g_strdup(""); |
|
|
q[QSLIN] = g_strdup(""); |
|
|
/* EOL already eaten by previous fgets */ |
|
|
} |
|
|
|
|
|
/* line with remarks */ |
|
|
fgets(buffer, 80, fp); |
|
|
q[REMARKS] = g_strdup(g_strstrip(buffer)); |
|
|
fgets(buffer, 3, fp); /*EOL*/ |
|
146 |
|
|
147 |
ret = (*fn)(handle, q, arg); |
/* QSLOUT and QSLIN are not present in version 0.4 */ |
148 |
if (ret) return ret; |
fgets (buffer, 16, fp); /*QSL out? */ |
149 |
|
if (strlen (buffer) == 15) |
150 |
|
{ |
151 |
|
q[QSLOUT] = g_strdup (g_strstrip (buffer)); |
152 |
|
fgets (buffer, 16, fp); /*QSL in */ |
153 |
|
q[QSLIN] = g_strdup (g_strstrip (buffer)); |
154 |
|
fgets (buffer, 3, fp); |
155 |
|
/*EOL*/} |
156 |
|
else |
157 |
|
{ |
158 |
|
q[QSLOUT] = g_strdup (""); |
159 |
|
q[QSLIN] = g_strdup (""); |
160 |
|
/* EOL already eaten by previous fgets */ |
161 |
} |
} |
162 |
return 0; |
|
163 |
|
/* line with remarks */ |
164 |
|
fgets (buffer, 80, fp); |
165 |
|
q[REMARKS] = g_strdup (g_strstrip (buffer)); |
166 |
|
fgets (buffer, 3, fp); |
167 |
|
/*EOL*/ ret = (*fn) (handle, q, arg); |
168 |
|
if (ret) |
169 |
|
return ret; |
170 |
|
} |
171 |
|
return 0; |
172 |
} |
} |