679 |
xmlFree(prop); |
xmlFree(prop); |
680 |
} |
} |
681 |
|
|
682 |
|
/* new in api 0.6: */ |
683 |
|
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "version"))) { |
684 |
|
node->version = strtoul(prop, NULL, 10); |
685 |
|
xmlFree(prop); |
686 |
|
} |
687 |
|
|
688 |
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "lat"))) { |
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "lat"))) { |
689 |
node->pos.lat = g_ascii_strtod(prop, NULL); |
node->pos.lat = g_ascii_strtod(prop, NULL); |
690 |
xmlFree(prop); |
xmlFree(prop); |
782 |
xmlFree(prop); |
xmlFree(prop); |
783 |
} |
} |
784 |
|
|
785 |
|
/* new in api 0.6: */ |
786 |
|
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "version"))) { |
787 |
|
way->version = strtoul(prop, NULL, 10); |
788 |
|
xmlFree(prop); |
789 |
|
} |
790 |
|
|
791 |
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "user"))) { |
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "user"))) { |
792 |
way->user = osm_user(osm, prop); |
way->user = osm_user(osm, prop); |
793 |
xmlFree(prop); |
xmlFree(prop); |
919 |
xmlFree(prop); |
xmlFree(prop); |
920 |
} |
} |
921 |
|
|
922 |
|
/* new in api 0.6: */ |
923 |
|
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "version"))) { |
924 |
|
relation->version = strtoul(prop, NULL, 10); |
925 |
|
xmlFree(prop); |
926 |
|
} |
927 |
|
|
928 |
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "user"))) { |
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "user"))) { |
929 |
relation->user = osm_user(osm, prop); |
relation->user = osm_user(osm, prop); |
930 |
xmlFree(prop); |
xmlFree(prop); |
1168 |
gboolean osm_node_has_tag(node_t *node) { |
gboolean osm_node_has_tag(node_t *node) { |
1169 |
tag_t *tag = node->tag; |
tag_t *tag = node->tag; |
1170 |
|
|
1171 |
|
/* created_by tags don't count as real tags */ |
1172 |
if(tag && strcasecmp(tag->key, "created_by") == 0) |
if(tag && strcasecmp(tag->key, "created_by") == 0) |
1173 |
tag = tag->next; |
tag = tag->next; |
1174 |
|
|
1191 |
while(tag) { |
while(tag) { |
1192 |
/* make sure "created_by" tag contains our id */ |
/* make sure "created_by" tag contains our id */ |
1193 |
if(strcasecmp(tag->key, "created_by") == 0) { |
if(strcasecmp(tag->key, "created_by") == 0) { |
1194 |
g_free(tag->value); |
if(strcasecmp(tag->value, PACKAGE " v" VERSION) != 0) { |
1195 |
tag->value = g_strdup(PACKAGE " v" VERSION); |
g_free(tag->value); |
1196 |
|
tag->value = g_strdup(PACKAGE " v" VERSION); |
1197 |
|
} |
1198 |
} |
} |
1199 |
|
|
1200 |
xmlNodePtr tag_node = xmlNewChild(node, NULL, BAD_CAST "tag", NULL); |
xmlNodePtr tag_node = xmlNewChild(node, NULL, BAD_CAST "tag", NULL); |
1205 |
} |
} |
1206 |
|
|
1207 |
/* build xml representation for a way */ |
/* build xml representation for a way */ |
1208 |
char *osm_generate_xml(osm_t *osm, type_t type, void *item) { |
static char *osm_generate_xml(osm_t *osm, item_id_t changeset, |
1209 |
|
type_t type, void *item) { |
1210 |
char str[32]; |
char str[32]; |
1211 |
xmlChar *result = NULL; |
xmlChar *result = NULL; |
1212 |
int len = 0; |
int len = 0; |
1215 |
|
|
1216 |
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); |
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); |
1217 |
xmlNodePtr root_node = xmlNewNode(NULL, BAD_CAST "osm"); |
xmlNodePtr root_node = xmlNewNode(NULL, BAD_CAST "osm"); |
1218 |
|
#ifndef API06 |
1219 |
xmlNewProp(root_node, BAD_CAST "version", BAD_CAST "0.5"); |
xmlNewProp(root_node, BAD_CAST "version", BAD_CAST "0.5"); |
1220 |
xmlNewProp(root_node, BAD_CAST "generator", BAD_CAST PACKAGE " V" VERSION); |
xmlNewProp(root_node, BAD_CAST "generator", BAD_CAST PACKAGE " v" VERSION); |
1221 |
|
#endif |
1222 |
xmlDocSetRootElement(doc, root_node); |
xmlDocSetRootElement(doc, root_node); |
1223 |
|
|
1224 |
switch(type) { |
switch(type) { |
1232 |
snprintf(str, sizeof(str), "%u", (unsigned)node->id); |
snprintf(str, sizeof(str), "%u", (unsigned)node->id); |
1233 |
xmlNewProp(node_node, BAD_CAST "id", BAD_CAST str); |
xmlNewProp(node_node, BAD_CAST "id", BAD_CAST str); |
1234 |
} |
} |
1235 |
|
#ifdef API06 |
1236 |
|
snprintf(str, sizeof(str), "%u", (unsigned)node->version); |
1237 |
|
xmlNewProp(node_node, BAD_CAST "version", BAD_CAST str); |
1238 |
|
snprintf(str, sizeof(str), "%u", (unsigned)changeset); |
1239 |
|
xmlNewProp(node_node, BAD_CAST "changeset", BAD_CAST str); |
1240 |
|
#endif |
1241 |
g_ascii_formatd(str, sizeof(str), LL_FORMAT, node->pos.lat); |
g_ascii_formatd(str, sizeof(str), LL_FORMAT, node->pos.lat); |
1242 |
xmlNewProp(node_node, BAD_CAST "lat", BAD_CAST str); |
xmlNewProp(node_node, BAD_CAST "lat", BAD_CAST str); |
1243 |
g_ascii_formatd(str, sizeof(str), LL_FORMAT, node->pos.lon); |
g_ascii_formatd(str, sizeof(str), LL_FORMAT, node->pos.lon); |
1252 |
xmlNodePtr way_node = xmlNewChild(root_node, NULL, BAD_CAST "way", NULL); |
xmlNodePtr way_node = xmlNewChild(root_node, NULL, BAD_CAST "way", NULL); |
1253 |
snprintf(str, sizeof(str), "%u", (unsigned)way->id); |
snprintf(str, sizeof(str), "%u", (unsigned)way->id); |
1254 |
xmlNewProp(way_node, BAD_CAST "id", BAD_CAST str); |
xmlNewProp(way_node, BAD_CAST "id", BAD_CAST str); |
1255 |
|
#ifdef API06 |
1256 |
|
snprintf(str, sizeof(str), "%u", (unsigned)way->version); |
1257 |
|
xmlNewProp(way_node, BAD_CAST "version", BAD_CAST str); |
1258 |
|
snprintf(str, sizeof(str), "%u", (unsigned)changeset); |
1259 |
|
xmlNewProp(way_node, BAD_CAST "changeset", BAD_CAST str); |
1260 |
|
#endif |
1261 |
|
|
1262 |
node_chain_t *node_chain = way->node_chain; |
node_chain_t *node_chain = way->node_chain; |
1263 |
while(node_chain) { |
while(node_chain) { |
1279 |
BAD_CAST "relation", NULL); |
BAD_CAST "relation", NULL); |
1280 |
snprintf(str, sizeof(str), "%u", (unsigned)relation->id); |
snprintf(str, sizeof(str), "%u", (unsigned)relation->id); |
1281 |
xmlNewProp(rel_node, BAD_CAST "id", BAD_CAST str); |
xmlNewProp(rel_node, BAD_CAST "id", BAD_CAST str); |
1282 |
|
#ifdef API06 |
1283 |
|
snprintf(str, sizeof(str), "%u", (unsigned)relation->version); |
1284 |
|
xmlNewProp(rel_node, BAD_CAST "version", BAD_CAST str); |
1285 |
|
snprintf(str, sizeof(str), "%u", (unsigned)changeset); |
1286 |
|
xmlNewProp(rel_node, BAD_CAST "changeset", BAD_CAST str); |
1287 |
|
#endif |
1288 |
|
|
1289 |
member_t *member = relation->member; |
member_t *member = relation->member; |
1290 |
while(member) { |
while(member) { |
1344 |
} |
} |
1345 |
|
|
1346 |
/* build xml representation for a node */ |
/* build xml representation for a node */ |
1347 |
char *osm_generate_xml_node(osm_t *osm, node_t *node) { |
char *osm_generate_xml_node(osm_t *osm, item_id_t changeset, node_t *node) { |
1348 |
return osm_generate_xml(osm, NODE, node); |
return osm_generate_xml(osm, changeset, NODE, node); |
1349 |
} |
} |
1350 |
|
|
1351 |
/* build xml representation for a way */ |
/* build xml representation for a way */ |
1352 |
char *osm_generate_xml_way(osm_t *osm, way_t *way) { |
char *osm_generate_xml_way(osm_t *osm, item_id_t changeset, way_t *way) { |
1353 |
return osm_generate_xml(osm, WAY, way); |
return osm_generate_xml(osm, changeset, WAY, way); |
1354 |
} |
} |
1355 |
|
|
1356 |
/* build xml representation for a relation */ |
/* build xml representation for a relation */ |
1357 |
char *osm_generate_xml_relation(osm_t *osm, relation_t *relation) { |
char *osm_generate_xml_relation(osm_t *osm, item_id_t changeset, |
1358 |
return osm_generate_xml(osm, RELATION, relation); |
relation_t *relation) { |
1359 |
|
return osm_generate_xml(osm, changeset, RELATION, relation); |
1360 |
|
} |
1361 |
|
|
1362 |
|
/* build xml representation for a changeset */ |
1363 |
|
char *osm_generate_xml_changeset(osm_t *osm, char *comment) { |
1364 |
|
xmlChar *result = NULL; |
1365 |
|
int len = 0; |
1366 |
|
|
1367 |
|
/* tags for this changeset */ |
1368 |
|
tag_t tag_comment = { |
1369 |
|
.key = "comment", .value = comment, .next = NULL }; |
1370 |
|
tag_t tag_creator = { |
1371 |
|
.key = "created_by", .value = PACKAGE " v" VERSION, .next = &tag_comment }; |
1372 |
|
|
1373 |
|
LIBXML_TEST_VERSION; |
1374 |
|
|
1375 |
|
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); |
1376 |
|
xmlNodePtr root_node = xmlNewNode(NULL, BAD_CAST "osm"); |
1377 |
|
xmlDocSetRootElement(doc, root_node); |
1378 |
|
|
1379 |
|
xmlNodePtr cs_node = xmlNewChild(root_node, NULL, BAD_CAST "changeset", NULL); |
1380 |
|
osm_generate_tags(&tag_creator, cs_node); |
1381 |
|
|
1382 |
|
xmlDocDumpFormatMemoryEnc(doc, &result, &len, "UTF-8", 1); |
1383 |
|
xmlFreeDoc(doc); |
1384 |
|
xmlCleanupParser(); |
1385 |
|
|
1386 |
|
// puts("xml encoding result:"); |
1387 |
|
// puts((char*)result); |
1388 |
|
|
1389 |
|
return (char*)result; |
1390 |
} |
} |
1391 |
|
|
1392 |
|
|
1393 |
/* the following three functions are eating much CPU power */ |
/* the following three functions are eating much CPU power */ |
1394 |
/* as they search the objects lists. Hashing is supposed to help */ |
/* as they search the objects lists. Hashing is supposed to help */ |
1395 |
node_t *osm_get_node_by_id(osm_t *osm, item_id_t id) { |
node_t *osm_get_node_by_id(osm_t *osm, item_id_t id) { |
1525 |
printf("Creating new node\n"); |
printf("Creating new node\n"); |
1526 |
|
|
1527 |
node_t *node = g_new0(node_t, 1); |
node_t *node = g_new0(node_t, 1); |
1528 |
|
node->version = 1; |
1529 |
node->lpos.x = x; |
node->lpos.x = x; |
1530 |
node->lpos.y = y; |
node->lpos.y = y; |
1531 |
node->visible = TRUE; |
node->visible = TRUE; |
1532 |
node->time = time(NULL); |
node->time = time(NULL); |
1533 |
|
|
1534 |
|
#ifndef API06 |
1535 |
/* add created_by tag */ |
/* add created_by tag */ |
1536 |
node->tag = g_new0(tag_t, 1); |
node->tag = g_new0(tag_t, 1); |
1537 |
node->tag->key = g_strdup("created_by"); |
node->tag->key = g_strdup("created_by"); |
1538 |
node->tag->value = g_strdup(PACKAGE " v" VERSION); |
node->tag->value = g_strdup(PACKAGE " v" VERSION); |
1539 |
|
#endif |
1540 |
|
|
1541 |
/* convert screen position back to ll */ |
/* convert screen position back to ll */ |
1542 |
lpos2pos(osm->bounds, &node->lpos, &node->pos); |
lpos2pos(osm->bounds, &node->lpos, &node->pos); |
1573 |
printf("Creating new way\n"); |
printf("Creating new way\n"); |
1574 |
|
|
1575 |
way_t *way = g_new0(way_t, 1); |
way_t *way = g_new0(way_t, 1); |
1576 |
|
way->version = 1; |
1577 |
way->visible = TRUE; |
way->visible = TRUE; |
1578 |
way->flags = OSM_FLAG_NEW; |
way->flags = OSM_FLAG_NEW; |
1579 |
way->time = time(NULL); |
way->time = time(NULL); |
1580 |
|
|
1581 |
|
#ifndef API06 |
1582 |
/* add created_by tag */ |
/* add created_by tag */ |
1583 |
way->tag = g_new0(tag_t, 1); |
way->tag = g_new0(tag_t, 1); |
1584 |
way->tag->key = g_strdup("created_by"); |
way->tag->key = g_strdup("created_by"); |
1585 |
way->tag->value = g_strdup(PACKAGE " v" VERSION); |
way->tag->value = g_strdup(PACKAGE " v" VERSION); |
1586 |
|
#endif |
1587 |
|
|
1588 |
return way; |
return way; |
1589 |
} |
} |
1852 |
printf("Creating new relation\n"); |
printf("Creating new relation\n"); |
1853 |
|
|
1854 |
relation_t *relation = g_new0(relation_t, 1); |
relation_t *relation = g_new0(relation_t, 1); |
1855 |
|
relation->version = 1; |
1856 |
relation->visible = TRUE; |
relation->visible = TRUE; |
1857 |
relation->flags = OSM_FLAG_NEW; |
relation->flags = OSM_FLAG_NEW; |
1858 |
relation->time = time(NULL); |
relation->time = time(NULL); |
1859 |
|
|
1860 |
|
#ifndef API06 |
1861 |
/* add created_by tag */ |
/* add created_by tag */ |
1862 |
relation->tag = g_new0(tag_t, 1); |
relation->tag = g_new0(tag_t, 1); |
1863 |
relation->tag->key = g_strdup("created_by"); |
relation->tag->key = g_strdup("created_by"); |
1864 |
relation->tag->value = g_strdup(PACKAGE " v" VERSION); |
relation->tag->value = g_strdup(PACKAGE " v" VERSION); |
1865 |
|
#endif |
1866 |
|
|
1867 |
return relation; |
return relation; |
1868 |
} |
} |