QPixmap ImageManager::getImage(const QString& host, const QString& url) { //qDebug() << "ImageManager::getImage"; QPixmap pm; if ( net->imageIsLoading(url) ) { //currently loading an image return loadingPixmap; } else if ( QPixmapCache::find( md5hex(url), &pm) ) { //image found in cache, use this version return pm; } else if ( doPersistentCaching ) //image disk-caching (persistent) enabled { if ( tileExist(url) && !tileCacheExpired(url) ) { loadTile(url,pm); QPixmapCache::insert(md5hex(url), pm); return pm; } else { //no file yet, go and request an image net->loadImage(host, url); } } //is image cached (memory) else if ( QPixmapCache::find(md5hex(url), &pm) && !pm.isNull() ) { //we had a valid copy cached in memory (not disk) so return this return pm; } else { //load from net, add empty image net->loadImage(host, url); } return emptyPixmap; }
bool ImageManager::loadTile(QString tileName,QPixmap &tileData) { tileName.replace("/","-"); QFile file(cacheDir.absolutePath() + "/" + md5hex(tileName) ); if (!file.open(QIODevice::ReadOnly )) { return false; } tileData.loadFromData( file.readAll() ); file.close(); return true; }
bool ImageManager::tileExist(QString tileName) { tileName.replace("/","-"); QFile file(cacheDir.absolutePath() + "/" + md5hex(tileName) ); if (file.exists()) { return true; } else { return false; } }
bool ImageManager::tileCacheExpired(QString tileName) { tileName.replace("/","-"); QFile file(cacheDir.absolutePath() + "/" + md5hex(tileName) ); if (file.exists() && cachedTileExpiry > 0) { QFileInfo fileInfo( file ); if ( fileInfo.lastModified().msecsTo( QDateTime::currentDateTime() ) > ( cachedTileExpiry * 1000 * 60 ) ) { cacheDir.remove( file.fileName() ); return true; } } return false; }
static int update_database_general(geoipupdate_s * gu, const char *product_id) { char *url, *geoip_filename, *geoip_gz_filename, *client_ipaddr; char hex_digest[33], hex_digest2[33]; xasprintf(&url, "%s://%s/app/update_getfilename?product_id=%s", gu->proto, gu->host, product_id); in_mem_s *mem = get(gu, url); free(url); if (mem->size == 0) { fprintf(stderr, "product_id %s not found\n", product_id); in_mem_s_delete(mem); return ERROR; } xasprintf(&geoip_filename, "%s/%s", gu->database_dir, mem->ptr); in_mem_s_delete(mem); md5hex(geoip_filename, hex_digest); say_if(gu->verbose, "md5hex_digest: %s\n", hex_digest); xasprintf(&url, "%s://%s/app/update_getipaddr", gu->proto, gu->host); mem = get(gu, url); free(url); client_ipaddr = strdup(mem->ptr); in_mem_s_delete(mem); say_if(gu->verbose, "Client IP address: %s\n", client_ipaddr); md5hex_license_ipaddr(gu, client_ipaddr, hex_digest2); free(client_ipaddr); say_if(gu->verbose, "md5hex_digest2: %s\n", hex_digest2); xasprintf( &url, "%s://%s/app/update_secure?db_md5=%s&challenge_md5=%s&user_id=%d&edition_id=%s", gu->proto, gu->host, hex_digest, hex_digest2, gu->license.user_id, product_id); xasprintf(&geoip_gz_filename, "%s.gz", geoip_filename); char expected_file_md5[33]; download_to_file(gu, url, geoip_gz_filename, expected_file_md5); free(url); int rc = gunzip_and_replace(gu, geoip_gz_filename, geoip_filename, expected_file_md5); free(geoip_gz_filename); free(geoip_filename); return rc; }
END_TEST START_TEST (test_md5_quick_brown_fox) { const char expected[] = "14aa0efdbdac9187f334b9d25ddeaefe"; char res[16]; MD5_CTX ctx; MD5Init(&ctx); MD5Update(&ctx, "The quick brown fox ", 20); MD5Update(&ctx, "jumped over ", 12); MD5Update(&ctx, "the \0NUL\n", 9); //MD5Update(&ctx, "The quick brown fox jumped over the \0NUL\n", 41); MD5Final(res, &ctx); fail_unless( strcmp(md5hex(res), expected) == 0, "md5('The quick brown fox jumped over the \\0NUL\\n') " "returned %s instead of %s", &md5hex_buf, expected); }
bool ImageManager::saveTile(QString tileName,QPixmap tileData) { tileName.replace("/","-"); QFile file(cacheDir.absolutePath() + "/" + md5hex(tileName) ); //qDebug() << "writing: " << file.fileName(); if (!file.open(QIODevice::ReadWrite )){ qDebug()<<"error reading file"; return false; } QByteArray bytes; QBuffer buffer(&bytes); buffer.open(QIODevice::WriteOnly); tileData.save(&buffer, "PNG"); file.write(bytes); file.close(); return true; }
void ImageManager::receivedImage(const QPixmap pixmap, const QString& url) { //qDebug() << "ImageManager::receivedImage"; QPixmapCache::insert(md5hex(url), pixmap); if (doPersistentCaching && !tileExist(url)) { saveTile(url,pixmap); } if (!prefetch.contains(url)) { emit(imageReceived()); } else { #if defined Q_WS_QWS || defined Q_WS_MAEMO_5 || defined Q_WS_S60 prefetch.remove(prefetch.indexOf(url)); #endif } }
static int update_country_database(geoipupdate_s * gu) { char *geoip_filename, *geoip_gz_filename, *url; char hex_digest[33]; xasprintf(&geoip_filename, "%s/GeoIP.dat", gu->database_dir); xasprintf(&geoip_gz_filename, "%s/GeoIP.dat.gz", gu->database_dir); md5hex(geoip_filename, hex_digest); say_if(gu->verbose, "md5hex_digest: %s\n", hex_digest); xasprintf(&url, "%s://%s/app/update?license_key=%s&md5=%s", gu->proto, gu->host, &gu->license.license_key[0], hex_digest); char expected_file_md5[33]; download_to_file(gu, url, geoip_gz_filename, expected_file_md5); free(url); int rc = gunzip_and_replace(gu, geoip_gz_filename, geoip_filename, expected_file_md5); free(geoip_gz_filename); free(geoip_filename); return rc ? ERROR : OK; }
static int gunzip_and_replace(geoipupdate_s * gu, const char *gzipfile, const char *geoip_filename, const char *expected_file_md5) { gzFile gz_fh; FILE *fh = fopen(gzipfile, "rb"); exit_if(NULL == fh, "Can't open %s\n", gzipfile); size_t bsize = 8096; char *buffer = (char *)xmalloc(bsize); ssize_t read_bytes = my_getline(&buffer, &bsize, fh); exit_if(-1 == fclose(fh), "Error closing stream: %s", strerror(errno)); if (read_bytes < 0) { fprintf(stderr, "Read error %s\n", gzipfile); unlink(gzipfile); free(buffer); return ERROR; } const char *no_new_upd = "No new updates available"; if (!strncmp(no_new_upd, buffer, strlen(no_new_upd))) { say_if(gu->verbose, "%s\n", no_new_upd); unlink(gzipfile); free(buffer); return OK; } if (strncmp(buffer, "\x1f\x8b", 2)) { // error not a zip file unlink(gzipfile); fputs(buffer, stderr); return ERROR; } // We do this here as we have to check that there is an update before // we check for the header. exit_unless( 32 == strnlen(expected_file_md5, 33), "Did not receive a valid expected database MD5 from server\n"); char *file_path_test; xasprintf(&file_path_test, "%s.test", geoip_filename); say_if(gu->verbose, "Uncompress file %s to %s\n", gzipfile, file_path_test); gz_fh = gzopen(gzipfile, "rb"); exit_if(gz_fh == NULL, "Can't open %s\n", gzipfile); FILE *fhw = fopen(file_path_test, "wb"); exit_if(fhw == NULL, "Can't open %s\n", file_path_test); for (;; ) { int amt = gzread(gz_fh, buffer, bsize); if (amt == 0) { break; // EOF } exit_if(amt == -1, "Gzip read error while reading from %s\n", gzipfile); exit_unless(fwrite(buffer, 1, amt, fhw) == (size_t)amt, "Gzip write error\n"); } exit_if(-1 == fclose(fhw), "Error closing stream: %s", strerror(errno)); exit_if(gzclose(gz_fh) != Z_OK, "Gzip read error while closing from %s\n", gzipfile); free(buffer); char actual_md5[33]; md5hex(file_path_test, actual_md5); exit_if(strncasecmp(actual_md5, expected_file_md5, 32), "MD5 of new database (%s) does not match expected MD5 (%s)", actual_md5, expected_file_md5); say_if(gu->verbose, "Rename %s to %s\n", file_path_test, geoip_filename); int err = rename(file_path_test, geoip_filename); exit_if(err, "Rename %s to %s failed\n", file_path_test, geoip_filename); // fsync directory to ensure the rename is durable int dirfd = open(gu->database_dir, O_DIRECTORY); exit_if(-1 == dirfd, "Error opening database directory: %s", strerror(errno)); exit_if(-1 == fsync(dirfd), "Error syncing database directory: %s", strerror(errno)); exit_if(-1 == close(dirfd), "Error closing database directory: %s", strerror(errno)); exit_if(-1 == unlink(gzipfile), "Error unlinking %s: %s", gzipfile, strerror(errno)); free(file_path_test); return OK; }