void VCardFormatImpl::addGeoValue( VCARD::VCard *vcard, const Geo &geo ) { if ( !geo.isValid() ) return; ContentLine cl; cl.setName( EntityTypeToParamName( EntityGeo ) ); GeoValue *v = new GeoValue; v->setLatitude( geo.latitude() ); v->setLongitude( geo.longitude() ); cl.setValue( v ); vcard->add(cl); }
/** * @brief Udaljenost izmedju dvije tocke na kugli (ortodroma) * * Vise na: https://en.wikipedia.org/wiki/Great-circle_distance * * @param g1 sadrzi koordinate prve tocke (phi1, lambda1) * @param g2 sadrzi koordinate druge tocke (phi2, lambda2) * @return udaljenost u metrima */ double Geo::distance(Geo &g1, Geo &g2) { double phi1 = deg2rad(g1.getLatitude()); double lambda1 = deg2rad(g1.getLongitude()); double phi2 = deg2rad(g2.getLatitude()); double lambda2 = deg2rad(g2.getLongitude()); double dphi = abs(phi1 - phi2); double dlambda = abs(lambda1 - lambda2); double a = pow(sin(dphi / 2), 2) + cos(phi1) * cos(phi2) * pow(sin(dlambda / 2), 2); double dsigma = 2 * asin(sqrt(a)); return radius * dsigma; }
bool Geo::operator!=( const Geo &g ) const { if ( !g.isValid() && !isValid() ) return false; if ( !g.isValid() || !isValid() ) return true; if ( g.mLatitude == mLatitude && g.mLongitude == mLongitude ) return false; return true; }
TEST(OpenRTB, GeoTest) { dynamic geoObj = dynamic::object ("country","USA") ("lat",42.355316) ("lon",-87.85189) ("type",1) ("zip","60085"); Geo geo; geo.deserialize(geoObj); EXPECT_EQ(geo.zip.get(), geoObj.at("zip").asString().toStdString()); EXPECT_EQ(geo.country.get(), geoObj.at("country").asString().toStdString()); dynamic serializedObj = dynamic::object ("country","USA") ("zip","60085"); EXPECT_EQ(serializedObj, geo.serialize()); }
// TODO: make list a const& QString VCardTool::createVCards(Addressee::List list, VCard::Version version) { VCard::List vCardList; Addressee::List::ConstIterator addrIt; Addressee::List::ConstIterator listEnd(list.constEnd()); for(addrIt = list.constBegin(); addrIt != listEnd; ++addrIt) { VCard card; QStringList::ConstIterator strIt; // ADR + LABEL const Address::List addresses = (*addrIt).addresses(); for(Address::List::ConstIterator it = addresses.begin(); it != addresses.end(); ++it) { QStringList address; bool isEmpty = ((*it).postOfficeBox().isEmpty() && (*it).extended().isEmpty() && (*it).street().isEmpty() && (*it).locality().isEmpty() && (*it).region().isEmpty() && (*it).postalCode().isEmpty() && (*it).country().isEmpty()); address.append((*it).postOfficeBox().replace(';', "\\;")); address.append((*it).extended().replace(';', "\\;")); address.append((*it).street().replace(';', "\\;")); address.append((*it).locality().replace(';', "\\;")); address.append((*it).region().replace(';', "\\;")); address.append((*it).postalCode().replace(';', "\\;")); address.append((*it).country().replace(';', "\\;")); VCardLine adrLine("ADR", address.join(";")); if(version == VCard::v2_1 && needsEncoding(address.join(";"))) { adrLine.addParameter("charset", "UTF-8"); adrLine.addParameter("encoding", "QUOTED-PRINTABLE"); } VCardLine labelLine("LABEL", (*it).label()); if(version == VCard::v2_1 && needsEncoding((*it).label())) { labelLine.addParameter("charset", "UTF-8"); labelLine.addParameter("encoding", "QUOTED-PRINTABLE"); } bool hasLabel = !(*it).label().isEmpty(); QMap< QString, int >::ConstIterator typeIt; for(typeIt = mAddressTypeMap.constBegin(); typeIt != mAddressTypeMap.constEnd(); ++typeIt) { if(typeIt.data() & (*it).type()) { adrLine.addParameter("TYPE", typeIt.key()); if(hasLabel) labelLine.addParameter("TYPE", typeIt.key()); } } if(!isEmpty) card.addLine(adrLine); if(hasLabel) card.addLine(labelLine); } // AGENT card.addLine(createAgent(version, (*addrIt).agent())); // BDAY card.addLine(VCardLine("BDAY", createDateTime((*addrIt).birthday()))); // CATEGORIES if(version == VCard::v3_0) { QStringList categories = (*addrIt).categories(); QStringList::Iterator catIt; for(catIt = categories.begin(); catIt != categories.end(); ++catIt) (*catIt).replace(',', "\\,"); VCardLine catLine("CATEGORIES", categories.join(",")); if(version == VCard::v2_1 && needsEncoding(categories.join(","))) { catLine.addParameter("charset", "UTF-8"); catLine.addParameter("encoding", "QUOTED-PRINTABLE"); } card.addLine(catLine); } // CLASS if(version == VCard::v3_0) { card.addLine(createSecrecy((*addrIt).secrecy())); } // EMAIL const QStringList emails = (*addrIt).emails(); bool pref = true; for(strIt = emails.begin(); strIt != emails.end(); ++strIt) { VCardLine line("EMAIL", *strIt); if(pref == true && emails.count() > 1) { line.addParameter("TYPE", "PREF"); pref = false; } card.addLine(line); } // FN VCardLine fnLine("FN", (*addrIt).formattedName()); if(version == VCard::v2_1 && needsEncoding((*addrIt).formattedName())) { fnLine.addParameter("charset", "UTF-8"); fnLine.addParameter("encoding", "QUOTED-PRINTABLE"); } card.addLine(fnLine); // GEO Geo geo = (*addrIt).geo(); if(geo.isValid()) { QString str; str.sprintf("%.6f;%.6f", geo.latitude(), geo.longitude()); card.addLine(VCardLine("GEO", str)); } // KEY const Key::List keys = (*addrIt).keys(); Key::List::ConstIterator keyIt; for(keyIt = keys.begin(); keyIt != keys.end(); ++keyIt) card.addLine(createKey(*keyIt)); // LOGO card.addLine(createPicture("LOGO", (*addrIt).logo())); // MAILER VCardLine mailerLine("MAILER", (*addrIt).mailer()); if(version == VCard::v2_1 && needsEncoding((*addrIt).mailer())) { mailerLine.addParameter("charset", "UTF-8"); mailerLine.addParameter("encoding", "QUOTED-PRINTABLE"); } card.addLine(mailerLine); // N QStringList name; name.append((*addrIt).familyName().replace(';', "\\;")); name.append((*addrIt).givenName().replace(';', "\\;")); name.append((*addrIt).additionalName().replace(';', "\\;")); name.append((*addrIt).prefix().replace(';', "\\;")); name.append((*addrIt).suffix().replace(';', "\\;")); VCardLine nLine("N", name.join(";")); if(version == VCard::v2_1 && needsEncoding(name.join(";"))) { nLine.addParameter("charset", "UTF-8"); nLine.addParameter("encoding", "QUOTED-PRINTABLE"); } card.addLine(nLine); // NAME VCardLine nameLine("NAME", (*addrIt).name()); if(version == VCard::v2_1 && needsEncoding((*addrIt).name())) { nameLine.addParameter("charset", "UTF-8"); nameLine.addParameter("encoding", "QUOTED-PRINTABLE"); } card.addLine(nameLine); // NICKNAME if(version == VCard::v3_0) card.addLine(VCardLine("NICKNAME", (*addrIt).nickName())); // NOTE VCardLine noteLine("NOTE", (*addrIt).note()); if(version == VCard::v2_1 && needsEncoding((*addrIt).note())) { noteLine.addParameter("charset", "UTF-8"); noteLine.addParameter("encoding", "QUOTED-PRINTABLE"); } card.addLine(noteLine); // ORG QStringList organization; organization.append((*addrIt).organization().replace(';', "\\;")); if(!(*addrIt).department().isEmpty()) organization.append((*addrIt).department().replace(';', "\\;")); VCardLine orgLine("ORG", organization.join(";")); if(version == VCard::v2_1 && needsEncoding(organization.join(";"))) { orgLine.addParameter("charset", "UTF-8"); orgLine.addParameter("encoding", "QUOTED-PRINTABLE"); } card.addLine(orgLine); // PHOTO card.addLine(createPicture("PHOTO", (*addrIt).photo())); // PROID if(version == VCard::v3_0) card.addLine(VCardLine("PRODID", (*addrIt).productId())); // REV card.addLine(VCardLine("REV", createDateTime((*addrIt).revision()))); // ROLE VCardLine roleLine("ROLE", (*addrIt).role()); if(version == VCard::v2_1 && needsEncoding((*addrIt).role())) { roleLine.addParameter("charset", "UTF-8"); roleLine.addParameter("encoding", "QUOTED-PRINTABLE"); } card.addLine(roleLine); // SORT-STRING if(version == VCard::v3_0) card.addLine(VCardLine("SORT-STRING", (*addrIt).sortString())); // SOUND card.addLine(createSound((*addrIt).sound())); // TEL const PhoneNumber::List phoneNumbers = (*addrIt).phoneNumbers(); PhoneNumber::List::ConstIterator phoneIt; for(phoneIt = phoneNumbers.begin(); phoneIt != phoneNumbers.end(); ++phoneIt) { VCardLine line("TEL", (*phoneIt).number()); QMap< QString, int >::ConstIterator typeIt; for(typeIt = mPhoneTypeMap.constBegin(); typeIt != mPhoneTypeMap.constEnd(); ++typeIt) { if(typeIt.data() & (*phoneIt).type()) line.addParameter("TYPE", typeIt.key()); } card.addLine(line); } // TITLE VCardLine titleLine("TITLE", (*addrIt).title()); if(version == VCard::v2_1 && needsEncoding((*addrIt).title())) { titleLine.addParameter("charset", "UTF-8"); titleLine.addParameter("encoding", "QUOTED-PRINTABLE"); } card.addLine(titleLine); // TZ TimeZone timeZone = (*addrIt).timeZone(); if(timeZone.isValid()) { QString str; int neg = 1; if(timeZone.offset() < 0) neg = -1; str.sprintf("%c%02d:%02d", (timeZone.offset() >= 0 ? '+' : '-'), (timeZone.offset() / 60) * neg, (timeZone.offset() % 60) * neg); card.addLine(VCardLine("TZ", str)); } // UID card.addLine(VCardLine("UID", (*addrIt).uid())); // URL card.addLine(VCardLine("URL", (*addrIt).url().url())); // VERSION if(version == VCard::v2_1) card.addLine(VCardLine("VERSION", "2.1")); if(version == VCard::v3_0) card.addLine(VCardLine("VERSION", "3.0")); // X- const QStringList customs = (*addrIt).customs(); for(strIt = customs.begin(); strIt != customs.end(); ++strIt) { QString identifier = "X-" + (*strIt).left((*strIt).find(":")); QString value = (*strIt).mid((*strIt).find(":") + 1); if(value.isEmpty()) continue; VCardLine line(identifier, value); if(version == VCard::v2_1 && needsEncoding(value)) { line.addParameter("charset", "UTF-8"); line.addParameter("encoding", "QUOTED-PRINTABLE"); } card.addLine(line); } vCardList.append(card); } return VCardParser::createVCards(vCardList); }
Addressee::List VCardTool::parseVCards(const QString &vcard) { static const QChar semicolonSep(';'); static const QChar commaSep(','); QString identifier; Addressee::List addrList; const VCard::List vCardList = VCardParser::parseVCards(vcard); VCard::List::ConstIterator cardIt; VCard::List::ConstIterator listEnd(vCardList.end()); for(cardIt = vCardList.begin(); cardIt != listEnd; ++cardIt) { Addressee addr; const QStringList idents = (*cardIt).identifiers(); QStringList::ConstIterator identIt; QStringList::ConstIterator identEnd(idents.end()); for(identIt = idents.begin(); identIt != identEnd; ++identIt) { const VCardLine::List lines = (*cardIt).lines((*identIt)); VCardLine::List::ConstIterator lineIt; // iterate over the lines for(lineIt = lines.begin(); lineIt != lines.end(); ++lineIt) { identifier = (*lineIt).identifier().lower(); // ADR if(identifier == "adr") { Address address; const QStringList addrParts = splitString(semicolonSep, (*lineIt).value().asString()); if(addrParts.count() > 0) address.setPostOfficeBox(addrParts[0]); if(addrParts.count() > 1) address.setExtended(addrParts[1]); if(addrParts.count() > 2) address.setStreet(addrParts[2]); if(addrParts.count() > 3) address.setLocality(addrParts[3]); if(addrParts.count() > 4) address.setRegion(addrParts[4]); if(addrParts.count() > 5) address.setPostalCode(addrParts[5]); if(addrParts.count() > 6) address.setCountry(addrParts[6]); int type = 0; const QStringList types = (*lineIt).parameters("type"); for(QStringList::ConstIterator it = types.begin(); it != types.end(); ++it) type += mAddressTypeMap[(*it).lower()]; address.setType(type); addr.insertAddress(address); } // AGENT else if(identifier == "agent") addr.setAgent(parseAgent(*lineIt)); // BDAY else if(identifier == "bday") addr.setBirthday(parseDateTime((*lineIt).value().asString())); // CATEGORIES else if(identifier == "categories") { const QStringList categories = splitString(commaSep, (*lineIt).value().asString()); addr.setCategories(categories); } // CLASS else if(identifier == "class") addr.setSecrecy(parseSecrecy(*lineIt)); // EMAIL else if(identifier == "email") { const QStringList types = (*lineIt).parameters("type"); addr.insertEmail((*lineIt).value().asString(), types.findIndex("PREF") != -1); } // FN else if(identifier == "fn") addr.setFormattedName((*lineIt).value().asString()); // GEO else if(identifier == "geo") { Geo geo; const QStringList geoParts = QStringList::split(';', (*lineIt).value().asString(), true); geo.setLatitude(geoParts[0].toFloat()); geo.setLongitude(geoParts[1].toFloat()); addr.setGeo(geo); } // KEY else if(identifier == "key") addr.insertKey(parseKey(*lineIt)); // LABEL else if(identifier == "label") { int type = 0; const QStringList types = (*lineIt).parameters("type"); for(QStringList::ConstIterator it = types.begin(); it != types.end(); ++it) type += mAddressTypeMap[(*it).lower()]; bool available = false; KABC::Address::List addressList = addr.addresses(); KABC::Address::List::Iterator it; for(it = addressList.begin(); it != addressList.end(); ++it) { if((*it).type() == type) { (*it).setLabel((*lineIt).value().asString()); addr.insertAddress(*it); available = true; break; } } if(!available) { // a standalone LABEL tag KABC::Address address(type); address.setLabel((*lineIt).value().asString()); addr.insertAddress(address); } } // LOGO else if(identifier == "logo") addr.setLogo(parsePicture(*lineIt)); // MAILER else if(identifier == "mailer") addr.setMailer((*lineIt).value().asString()); // N else if(identifier == "n") { const QStringList nameParts = splitString(semicolonSep, (*lineIt).value().asString()); if(nameParts.count() > 0) addr.setFamilyName(nameParts[0]); if(nameParts.count() > 1) addr.setGivenName(nameParts[1]); if(nameParts.count() > 2) addr.setAdditionalName(nameParts[2]); if(nameParts.count() > 3) addr.setPrefix(nameParts[3]); if(nameParts.count() > 4) addr.setSuffix(nameParts[4]); } // NAME else if(identifier == "name") addr.setName((*lineIt).value().asString()); // NICKNAME else if(identifier == "nickname") addr.setNickName((*lineIt).value().asString()); // NOTE else if(identifier == "note") addr.setNote((*lineIt).value().asString()); // ORGANIZATION else if(identifier == "org") { const QStringList orgParts = splitString(semicolonSep, (*lineIt).value().asString()); if(orgParts.count() > 0) addr.setOrganization(orgParts[0]); if(orgParts.count() > 1) addr.setDepartment(orgParts[1]); } // PHOTO else if(identifier == "photo") addr.setPhoto(parsePicture(*lineIt)); // PROID else if(identifier == "prodid") addr.setProductId((*lineIt).value().asString()); // REV else if(identifier == "rev") addr.setRevision(parseDateTime((*lineIt).value().asString())); // ROLE else if(identifier == "role") addr.setRole((*lineIt).value().asString()); // SORT-STRING else if(identifier == "sort-string") addr.setSortString((*lineIt).value().asString()); // SOUND else if(identifier == "sound") addr.setSound(parseSound(*lineIt)); // TEL else if(identifier == "tel") { PhoneNumber phone; phone.setNumber((*lineIt).value().asString()); int type = 0; const QStringList types = (*lineIt).parameters("type"); for(QStringList::ConstIterator it = types.begin(); it != types.end(); ++it) type += mPhoneTypeMap[(*it).upper()]; phone.setType(type); addr.insertPhoneNumber(phone); } // TITLE else if(identifier == "title") addr.setTitle((*lineIt).value().asString()); // TZ else if(identifier == "tz") { TimeZone tz; const QString date = (*lineIt).value().asString(); int hours = date.mid(1, 2).toInt(); int minutes = date.mid(4, 2).toInt(); int offset = (hours * 60) + minutes; offset = offset * (date[0] == '+' ? 1 : -1); tz.setOffset(offset); addr.setTimeZone(tz); } // UID else if(identifier == "uid") addr.setUid((*lineIt).value().asString()); // URL else if(identifier == "url") addr.setUrl(KURL((*lineIt).value().asString())); // X- else if(identifier.startsWith("x-")) { const QString key = (*lineIt).identifier().mid(2); int dash = key.find("-"); addr.insertCustom(key.left(dash), key.mid(dash + 1), (*lineIt).value().asString()); } } } addrList.append(addr); } return addrList; }
VRTransformPtr VRFactory::loadVRML(string path) { // wrl filepath ifstream file(path); if (!file.is_open()) { cout << "file " << path << " not found" << endl; return 0; } // get file size file.seekg(0, ios_base::end); size_t fileSize = file.tellg(); file.seekg(0, ios_base::beg); VRProgress prog("load VRML " + path, fileSize); int state = 0; map<int, string> states; states[0] = "Transform "; // 0 states[1] = "diffuseColor "; // 6 states[2] = "coord "; // 21 +2 states[3] = "normal "; // x +2 states[4] = "coordIndex "; // x +1 states[5] = "colorIndex "; // x +1 states[6] = "normalIndex "; // x +1 Vec3f color; Vec3f last_col(-1,-1,-1); Geo geo; Pnt3f v; Vec3f n; int i; //vector<VRGeometryPtr> geos; vector<Geo> geos; map<Vec3f, VRMaterialPtr> mats; bool new_obj = true; bool new_color = true; int li = 0; string line; while ( getline(file, line) ) { prog.update( line.size() ); li++; for (auto d : states) { //if ( line[d.second.size()-1] != ' ') continue; // optimization if ( line.compare(0, d.second.size(), d.second) == 0) { //if (state != d.first) cout << "got on line " << li << ": " << states[d.first] << " instead of: " << states[state] << endl; switch (d.first) { case 0: break; case 1: new_obj = true; if (line.size() > 12) color = toVec3f( line.substr(12) ); if (mats.count(color) == 0) { mats[color] = VRMaterial::create("fmat"); mats[color]->setDiffuse(color); } if (color != last_col) { new_color = true; last_col = color; } break; case 2: geo.updateN(); break; case 3: break; case 4: break; case 5: break; } state = d.first+1; if (state == 7) state = 0; break; } } if (line[0] != ' ') continue; if (state == 6) continue; // skip color indices stringstream ss(line); switch (state) { case 3: while(ss >> v[0] && ss >> v[1] && ss >> v[2] && ss.get()) { if (!new_color && new_obj) new_obj = !geo.inBB(v); // strange artifacts!! geo.updateBB(v); if (new_obj) { new_obj = false; new_color = false; geo.init(geos, mats[color]); } geo.pos->addValue(v); } break; case 4: while(ss >> n[0] && ss >> n[1] && ss >> n[2] && ss.get()) geo.norms->addValue( n ); break; case 5: while(ss >> i && ss.get()) if (i >= 0) geo.inds_p->addValue( geo.Np + i ); break; case 0: while(ss >> i && ss.get()) if (i >= 0) geo.inds_n->addValue( geo.Nn + i ); break; } } file.close(); cout << "\nloaded " << geos.size() << " geometries" << endl; VRTransformPtr res = VRTransform::create("factory"); res->setPersistency(0); for (auto g : geos) { //Vec3f d = g.vmax - g.vmin; //if (d.length() < 0.1) continue; // skip very small objects if (g.inds_n->size() != g.inds_p->size()) { // not happening cout << " wrong indices lengths: " << g.inds_p->size() << " " << g.inds_n->size() << endl; continue; } if (g.inds_p->size() == 0) { // not happening cout << " empty geo: " << g.inds_p->size() << " " << g.inds_n->size() << endl; continue; } res->addChild(g.geo); GeoUInt32PropertyRecPtr Length = GeoUInt32Property::create(); Length->addValue(g.geo->getMesh()->getIndices()->size()); g.geo->setLengths(Length); } cout << "\nloaded2 " << res->getChildrenCount() << " geometries" << endl; return res; }