/*
 zip_progress.c -- progress reporting
 Copyright (C) 2017-2020 Dieter Baron and Thomas Klausner

 This file is part of libzip, a library to manipulate ZIP archives.
 The authors can be contacted at <libzip@nih.at>

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
 are met:
 1. Redistributions of source code must retain the above copyright
 notice, this list of conditions and the following disclaimer.
 2. Redistributions in binary form must reproduce the above copyright
 notice, this list of conditions and the following disclaimer in
 the documentation and/or other materials provided with the
 distribution.
 3. The names of the authors may not be used to endorse or promote
 products derived from this software without specific prior
 written permission.

 THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */


#include <stdlib.h>


#define _ZIP_COMPILING_DEPRECATED
#include "zipint.h"

struct zip_progress {
    zip_t *za;

    zip_progress_callback callback_progress;
    void (*ud_progress_free)(void *);
    void *ud_progress;

    zip_cancel_callback callback_cancel;
    void (*ud_cancel_free)(void *);
    void *ud_cancel;

    double precision;

    /* state */
    double last_update; /* last value callback function was called with */

    double start; /* start of sub-progress section */
    double end;   /* end of sub-progress section */
};

static void _zip_progress_free_cancel_callback(zip_progress_t *progress);
static void _zip_progress_free_progress_callback(zip_progress_t *progress);
static zip_progress_t *_zip_progress_new(zip_t *za);
static void _zip_progress_set_cancel_callback(zip_progress_t *progress, zip_cancel_callback callback, void (*ud_free)(void *), void *ud);
static void _zip_progress_set_progress_callback(zip_progress_t *progress, double precision, zip_progress_callback callback, void (*ud_free)(void *), void *ud);

void
_zip_progress_end(zip_progress_t *progress) {
    _zip_progress_update(progress, 1.0);
}


void
_zip_progress_free(zip_progress_t *progress) {
    if (progress == NULL) {
        return;
    }

    _zip_progress_free_progress_callback(progress);
    _zip_progress_free_cancel_callback(progress);

    free(progress);
}


static zip_progress_t *
_zip_progress_new(zip_t *za) {
    zip_progress_t *progress = (zip_progress_t *)malloc(sizeof(*progress));

    if (progress == NULL) {
        zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
        return NULL;
    }

    progress->za = za;

    progress->callback_progress = NULL;
    progress->ud_progress_free = NULL;
    progress->ud_progress = NULL;
    progress->precision = 0.0;

    progress->callback_cancel = NULL;
    progress->ud_cancel_free = NULL;
    progress->ud_cancel = NULL;

    return progress;
}

static void
_zip_progress_free_progress_callback(zip_progress_t *progress) {
    if (progress->ud_progress_free) {
        progress->ud_progress_free(progress->ud_progress);
    }

    progress->callback_progress = NULL;
    progress->ud_progress = NULL;
    progress->ud_progress_free = NULL;
}

static void
_zip_progress_free_cancel_callback(zip_progress_t *progress) {
    if (progress->ud_cancel_free) {
        progress->ud_cancel_free(progress->ud_cancel);
    }

    progress->callback_cancel = NULL;
    progress->ud_cancel = NULL;
    progress->ud_cancel_free = NULL;
}

static void
_zip_progress_set_progress_callback(zip_progress_t *progress, double precision, zip_progress_callback callback, void (*ud_free)(void *), void *ud) {
    _zip_progress_free_progress_callback(progress);

    progress->callback_progress = callback;
    progress->ud_progress_free = ud_free;
    progress->ud_progress = ud;
    progress->precision = precision;
}

void
_zip_progress_set_cancel_callback(zip_progress_t *progress, zip_cancel_callback callback, void (*ud_free)(void *), void *ud) {
    _zip_progress_free_cancel_callback(progress);

    progress->callback_cancel = callback;
    progress->ud_cancel_free = ud_free;
    progress->ud_cancel = ud;
}

int
_zip_progress_start(zip_progress_t *progress) {
    if (progress == NULL) {
        return 0;
    }

    if (progress->callback_progress != NULL) {
        progress->last_update = 0.0;
        progress->callback_progress(progress->za, 0.0, progress->ud_progress);
    }

    if (progress->callback_cancel != NULL) {
        if (progress->callback_cancel(progress->za, progress->ud_cancel)) {
            return -1;
        }
    }

    return 0;
}


int
_zip_progress_subrange(zip_progress_t *progress, double start, double end) {
    if (progress == NULL) {
        return 0;
    }

    progress->start = start;
    progress->end = end;

    return _zip_progress_update(progress, 0.0);
}

int
_zip_progress_update(zip_progress_t *progress, double sub_current) {
    double current;

    if (progress == NULL) {
        return 0;
    }

    if (progress->callback_progress != NULL) {
        current = ZIP_MIN(ZIP_MAX(sub_current, 0.0), 1.0) * (progress->end - progress->start) + progress->start;

        if (current - progress->last_update > progress->precision) {
            progress->callback_progress(progress->za, current, progress->ud_progress);
            progress->last_update = current;
        }
    }

    if (progress->callback_cancel != NULL) {
        if (progress->callback_cancel(progress->za, progress->ud_cancel)) {
            return -1;
        }
    }

    return 0;
}


ZIP_EXTERN int
zip_register_progress_callback_with_state(zip_t *za, double precision, zip_progress_callback callback, void (*ud_free)(void *), void *ud) {
    if (callback != NULL) {
        if (za->progress == NULL) {
            if ((za->progress = _zip_progress_new(za)) == NULL) {
                return -1;
            }
        }

        _zip_progress_set_progress_callback(za->progress, precision, callback, ud_free, ud);
    }
    else {
        if (za->progress != NULL) {
            if (za->progress->callback_cancel == NULL) {
                _zip_progress_free(za->progress);
                za->progress = NULL;
            }
            else {
                _zip_progress_free_progress_callback(za->progress);
            }
        }
    }

    return 0;
}


ZIP_EXTERN int
zip_register_cancel_callback_with_state(zip_t *za, zip_cancel_callback callback, void (*ud_free)(void *), void *ud) {
    if (callback != NULL) {
        if (za->progress == NULL) {
            if ((za->progress = _zip_progress_new(za)) == NULL) {
                return -1;
            }
        }

        _zip_progress_set_cancel_callback(za->progress, callback, ud_free, ud);
    }
    else {
        if (za->progress != NULL) {
            if (za->progress->callback_progress == NULL) {
                _zip_progress_free(za->progress);
                za->progress = NULL;
            }
            else {
                _zip_progress_free_cancel_callback(za->progress);
            }
        }
    }

    return 0;
}


struct legacy_ud {
    zip_progress_callback_t callback;
};


static void
_zip_legacy_progress_callback(zip_t *za, double progress, void *vud) {
    struct legacy_ud *ud = (struct legacy_ud *)vud;

    ud->callback(progress);
}

ZIP_EXTERN void
zip_register_progress_callback(zip_t *za, zip_progress_callback_t progress_callback) {
    struct legacy_ud *ud;

    if (progress_callback == NULL) {
        zip_register_progress_callback_with_state(za, 0, NULL, NULL, NULL);
    }

    if ((ud = (struct legacy_ud *)malloc(sizeof(*ud))) == NULL) {
        return;
    }

    ud->callback = progress_callback;

    if (zip_register_progress_callback_with_state(za, 0.001, _zip_legacy_progress_callback, free, ud) < 0) {
        free(ud);
    }
}
