FileNode *FileNode::createNodeForZipEntry(struct zip *zip, const char *fname, zip_int64_t id) { FileNode *n = new FileNode(zip, fname, id); if (n == NULL) { return NULL; } n->is_dir = false; n->open_count = 0; n->state = CLOSED; struct zip_stat stat; zip_stat_index(zip, id, 0, &stat); // check that all used fields are valid zip_uint64_t needValid = ZIP_STAT_NAME | ZIP_STAT_INDEX | ZIP_STAT_SIZE | ZIP_STAT_MTIME; // required fields are always valid for existing items or newly added // directories (see zip_stat_index.c from libzip) assert((stat.valid & needValid) == needValid); n->m_mtime = n->m_atime = n->m_ctime = stat.mtime; n->has_cretime = false; n->m_size = stat.size; n->parse_name(); n->processExternalAttributes(); n->processExtraFields(); return n; }