/*
 * tcltransfer.c -- part of transfer.mod
 *
 * Copyright (C) 2003 - 2025 Eggheads Development Team
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

static int tcl_dccsend STDVAR
{
  char s[10], *sys, *nfn;
  int i;

  BADARGS(3, 3, " filename ircnick");

  if (!file_readable(argv[1])) {
    Tcl_AppendResult(irp, "3", NULL);
    return TCL_OK;
  }
  nfn = strrchr(argv[1], '/');

  if (nfn == NULL)
    nfn = argv[1];
  else
    nfn++;
  if (at_limit(argv[2])) {
    if (nfn == argv[1])
      queue_file("*", nfn, "(script)", argv[2]);
    else {
      nfn--;
      *nfn = 0;
      nfn++;
      sys = nmalloc(strlen(argv[1]) + 2);
      sprintf(sys, "*%s", argv[1]);
      queue_file(sys, nfn, "(script)", argv[2]);
      nfree(sys);
    }
    Tcl_AppendResult(irp, "4", NULL);
    return TCL_OK;
  }
  i = raw_dcc_send(argv[1], argv[2], "*");
  egg_snprintf(s, sizeof s, "%d", i);
  Tcl_AppendResult(irp, s, NULL);
  return TCL_OK;
}

static int tcl_getfileq STDVAR
{
  char *s = NULL;
  fileq_t *q;

  BADARGS(2, 2, " handle");

  for (q = fileq; q; q = q->next) {
    if (!strcasecmp(q->nick, argv[1])) {
      s = nrealloc(s, strlen(q->to) + strlen(q->dir) + strlen(q->file) + 4);
      if (q->dir[0] == '*')
        sprintf(s, "%s %s/%s", q->to, &q->dir[1], q->file);
      else
        sprintf(s, "%s /%s%s%s", q->to, q->dir, q->dir[0] ? "/" : "", q->file);
      Tcl_AppendElement(irp, s);
    }
  }
  if (s)
    nfree(s);
  return TCL_OK;
}

static int tcl_getfilesendtime STDVAR
{
  int sock, i;
  char s[15];

  BADARGS(2, 2, " idx");

  sock = atoi(argv[1]);
  for (i = 0; i < dcc_total; i++) {
    if (dcc[i].sock == sock) {
      if (dcc[i].type == &DCC_SEND || dcc[i].type == &DCC_GET) {
        egg_snprintf(s, sizeof s, "%lu", dcc[i].u.xfer->start_time);
        Tcl_AppendResult(irp, s, NULL);
      } else
        Tcl_AppendResult(irp, "-2", NULL); /* Not a valid file transfer */
      return TCL_OK;
    }
  }
  Tcl_AppendResult(irp, "-1", NULL); /* No matching entry found. */
  return TCL_OK;
}

static tcl_cmds mytcls[] = {
  {"dccsend",                 tcl_dccsend},
  {"getfileq",               tcl_getfileq},
  {"getfilesendtime", tcl_getfilesendtime},
  {NULL,                             NULL}
};
