void Address::Resolve(const char *name) { if (!name || name[0] == 0) { if (m_addr_family == AF_INET) { setAddress((u32) 0); } else if (m_addr_family == AF_INET6) { setAddress((IPv6AddressBytes*) 0); } return; } struct addrinfo *resolved, hints; memset(&hints, 0, sizeof(hints)); // Setup hints hints.ai_socktype = 0; hints.ai_protocol = 0; hints.ai_flags = 0; if(g_settings->getBool("enable_ipv6")) { // AF_UNSPEC allows both IPv6 and IPv4 addresses to be returned hints.ai_family = AF_UNSPEC; } else { hints.ai_family = AF_INET; } // Do getaddrinfo() int e = getaddrinfo(name, NULL, &hints, &resolved); if(e != 0) throw ResolveError(gai_strerror(e)); // Copy data if(resolved->ai_family == AF_INET) { struct sockaddr_in *t = (struct sockaddr_in *) resolved->ai_addr; m_addr_family = AF_INET; m_address.ipv4 = *t; } else if(resolved->ai_family == AF_INET6) { struct sockaddr_in6 *t = (struct sockaddr_in6 *) resolved->ai_addr; m_addr_family = AF_INET6; m_address.ipv6 = *t; } else { freeaddrinfo(resolved); throw ResolveError(""); } freeaddrinfo(resolved); }
void Address::Resolve(const char *name) { struct addrinfo *resolved; int e = getaddrinfo(name, NULL, NULL, &resolved); if(e != 0) throw ResolveError(""); /* FIXME: This is an ugly hack; change the whole class to store the address as sockaddr */ struct sockaddr_in *t = (struct sockaddr_in*)resolved->ai_addr; m_address = ntohl(t->sin_addr.s_addr); freeaddrinfo(resolved); }
MediaInfo LocalFileResolver::ResolveInfo (const QString& file) { const auto& modified = QFileInfo (file).lastModified (); { QReadLocker locker (&CacheLock_); if (Cache_.contains (file)) { const auto& pair = Cache_ [file]; if (pair.first == modified) return pair.second; } } QMutexLocker tlLocker (&TaglibMutex_); auto r = GetFileRef (file); auto tag = r.tag (); if (!tag) throw ResolveError (file, "failed to get file tags"); auto audio = r.audioProperties (); auto ftl = [] (const TagLib::String& str) { return QString::fromUtf8 (str.toCString (true)); }; auto genres = ftl (tag->genre ()).split ('/', QString::SkipEmptyParts); std::for_each (genres.begin (), genres.end (), [] (QString& genre) { genre = genre.trimmed (); }); MediaInfo info { file, ftl (tag->artist ()), ftl (tag->album ()), ftl (tag->title ()), genres, audio ? audio->length () : 0, static_cast<qint32> (tag->year ()), static_cast<qint32> (tag->track ()) }; { QWriteLocker locker (&CacheLock_); if (Cache_.size () > 200) Cache_.clear (); Cache_ [file] = qMakePair (modified, info); } return info; }