void Node::updateMeta() { QMutexLocker mutlock(&featMutex); if (MetaUpToDate) return; Feature::updateMeta(); IsWaypoint = (findKey("_waypoint_") != -1); IsPOI = false; for (int i=0; i<tagSize(); ++i) { if (!M_PREFS->getTechnicalTags().contains(tagKey(i))) { IsPOI = true; break; } } if (!IsPOI && !IsWaypoint) { int i=0; int prtReadonly=0, prtWritable=0; for (; i<sizeParents(); ++i) { if (getParent(i)->isReadonly()) ++prtReadonly; else ++prtWritable; } if (!ReadOnly) { if (prtReadonly && !prtWritable) setReadonly(true); } } MetaUpToDate = true; }
bool Node::isInteresting() const { // does its id look like one from osm if (hasOSMId()) return true; // if the user has added special tags, that's fine also if (tagSize()) return true; // if it is part of a road, then too if (sizeParents()) return true; return false; }
void CSearchList::KademliaSearchKeyword(uint32 searchID, const Kademlia::CUInt128* fileID, LPCTSTR name, uint32 size, LPCTSTR type, UINT numProperties, ...) { va_list args; va_start(args, numProperties); EUtf8Str eStrEncode = utf8strRaw; CSafeMemFile* temp = new CSafeMemFile(250); uchar fileid[16]; fileID->toByteArray(fileid); temp->WriteHash16(fileid); temp->WriteUInt32(0); // client IP temp->WriteUInt16(0); // client port // write tag list UINT uFilePosTagCount = (UINT)temp->GetPosition(); uint32 tagcount = 0; temp->WriteUInt32(tagcount); // dummy tag count, will be filled later // standard tags CTag tagName(FT_FILENAME, name); tagName.WriteTagToFile(temp, eStrEncode); tagcount++; CTag tagSize(FT_FILESIZE, size); tagSize.WriteTagToFile(temp, eStrEncode); tagcount++; if (type != NULL && type[0] != _T('\0')) { CTag tagType(FT_FILETYPE, type); tagType.WriteTagToFile(temp, eStrEncode); tagcount++; } // additional tags while (numProperties-- > 0) { UINT uPropType = va_arg(args, UINT); LPCSTR pszPropName = va_arg(args, LPCSTR); LPVOID pvPropValue = va_arg(args, LPVOID); if (uPropType == 2 /*TAGTYPE_STRING*/) { if ((LPCTSTR)pvPropValue != NULL && ((LPCTSTR)pvPropValue)[0] != _T('\0')) { if (strlen(pszPropName) == 1) { CTag tagProp((uint8)*pszPropName, (LPCTSTR)pvPropValue); tagProp.WriteTagToFile(temp, eStrEncode); } else { CTag tagProp(pszPropName, (LPCTSTR)pvPropValue); tagProp.WriteTagToFile(temp, eStrEncode); } tagcount++; } } else if (uPropType == 3 /*TAGTYPE_UINT32*/) { if ((uint32)pvPropValue != 0) { CTag tagProp(pszPropName, (uint32)pvPropValue); tagProp.WriteTagToFile(temp, eStrEncode); tagcount++; } } else { ASSERT(0); } } va_end(args); temp->Seek(uFilePosTagCount, SEEK_SET); temp->WriteUInt32(tagcount); temp->SeekToBegin(); CSearchFile* tempFile = new CSearchFile(temp, eStrEncode == utf8strRaw, searchID, 0, 0, 0, true); AddToList(tempFile); delete temp; }