static void sub_patch_add (sub_t *self, zdir_patch_t *patch) { // Skip file creation if client already has identical file zdir_patch_digest_set (patch); if (zdir_patch_op (patch) == patch_create) { char *digest = (char *) zhash_lookup (self->cache, zdir_patch_vpath (patch) + strlen(self->path) + 1); if (digest && streq (digest, zdir_patch_digest (patch))) return; // Just skip patch for this client } // Remove any previous patches for the same file zdir_patch_t *existing = (zdir_patch_t *) zlist_first (self->client->patches); while (existing) { if (streq (zdir_patch_vpath (patch), zdir_patch_vpath (existing))) { zlist_remove (self->client->patches, existing); zdir_patch_destroy (&existing); break; } existing = (zdir_patch_t *) zlist_next (self->client->patches); } if (zdir_patch_op (patch) == patch_create) zhash_insert (self->cache, zdir_patch_digest (patch), zdir_patch_vpath (patch)); // Track that we've queued patch for client, so we don't do it twice zlist_append (self->client->patches, zdir_patch_dup (patch)); }
/// // Create copy of a patch. If the patch is null, or memory was exhausted, // returns null. QZdirPatch * QZdirPatch::dup () { QZdirPatch *rv = new QZdirPatch (zdir_patch_dup (self)); return rv; }