/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "test.h"

#include "testutil.h"
#include "memdebug.h"

typedef struct {
  int remains;
  int print_content;
} chunk_data_t;

static
long chunk_bgn(const struct curl_fileinfo *finfo, void *ptr, int remains);
static
long chunk_end(void *ptr);

static
long chunk_bgn(const struct curl_fileinfo *finfo, void *ptr, int remains)
{
  chunk_data_t *ch_d = ptr;
  ch_d->remains = remains;

  printf("=============================================================\n");
  printf("Remains:      %d\n", remains);
  printf("Filename:     %s\n", finfo->filename);
  if(finfo->strings.perm) {
    printf("Permissions:  %s", finfo->strings.perm);
    if(finfo->flags & CURLFINFOFLAG_KNOWN_PERM)
      printf(" (parsed => %o)", finfo->perm);
    printf("\n");
  }
  printf("Size:         %ldB\n", (long)finfo->size);
  if(finfo->strings.user)
    printf("User:         %s\n", finfo->strings.user);
  if(finfo->strings.group)
    printf("Group:        %s\n", finfo->strings.group);
  if(finfo->strings.time)
    printf("Time:         %s\n", finfo->strings.time);
  printf("Filetype:     ");
  switch(finfo->filetype) {
  case CURLFILETYPE_FILE:
    printf("regular file\n");
    break;
  case CURLFILETYPE_DIRECTORY:
    printf("directory\n");
    break;
  case CURLFILETYPE_SYMLINK:
    printf("symlink\n");
    printf("Target:       %s\n", finfo->strings.target);
    break;
  default:
    printf("other type\n");
    break;
  }
  if(finfo->filetype == CURLFILETYPE_FILE) {
    ch_d->print_content = 1;
    printf("Content:\n-----------------------"
           "--------------------------------------\n");
  }
  if(strcmp(finfo->filename, "someothertext.txt") == 0) {
    printf("# THIS CONTENT WAS SKIPPED IN CHUNK_BGN CALLBACK #\n");
    return CURL_CHUNK_BGN_FUNC_SKIP;
  }
  return CURL_CHUNK_BGN_FUNC_OK;
}

static
long chunk_end(void *ptr)
{
  chunk_data_t *ch_d = ptr;
  if(ch_d->print_content) {
    ch_d->print_content = 0;
    printf("-------------------------------------------------------------\n");
  }
  if(ch_d->remains == 1)
    printf("=============================================================\n");
  return CURL_CHUNK_END_FUNC_OK;
}

int test(char *URL)
{
  CURL *handle = NULL;
  CURLcode res = CURLE_OK;
  chunk_data_t chunk_data = {0, 0};
  curl_global_init(CURL_GLOBAL_ALL);
  handle = curl_easy_init();
  if(!handle) {
    res = CURLE_OUT_OF_MEMORY;
    goto test_cleanup;
  }

  test_setopt(handle, CURLOPT_URL, URL);
  test_setopt(handle, CURLOPT_WILDCARDMATCH, 1L);
  test_setopt(handle, CURLOPT_CHUNK_BGN_FUNCTION, chunk_bgn);
  test_setopt(handle, CURLOPT_CHUNK_END_FUNCTION, chunk_end);
  test_setopt(handle, CURLOPT_CHUNK_DATA, &chunk_data);

  res = curl_easy_perform(handle);

test_cleanup:
  if(handle)
    curl_easy_cleanup(handle);
  curl_global_cleanup();
  return res;
}
