#define INCL_DOS
#define INCL_DOSERRORS
#define INCL_WIN

#include <os2.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "fm3dll.h"
#include "fm3dlg.h"
#include "fm3str.h"

#pragma alloc_text(MKDIR,MassMkdir,SetDir,PMMkDir,SetTargetDir)


APIRET MassMkdir (HWND hwndClient,CHAR *dir) {

  APIRET last,was = 0;
  CHAR  *p;
  CHAR   s[CCHMAXPATH];

  if(DosQueryPathInfo(dir,
                      FIL_QUERYFULLNAME,
                      s,
                      sizeof(s)))
    strcpy(s,dir);
  p = s;
  while(*p) {
    if(*p == '/')
      *p = '\\';
    p++;
  }
  p = s;
  do {
    p = strchr(p,'\\');
    if(p &&
       p > s &&
       *(p - 1) == ':')
      p = strchr(p + 1,'\\');
    if(p &&
       *p) {
      *p = 0;
      was = 1;
    }
    else
      was = 0;
    last = DosCreateDir(s,NULL);
    if(!last)
      Broadcast((HAB)0,
                hwndClient,
                UM_UPDATERECORD,
                MPFROMP(s),
                MPVOID);
    else if(last == ERROR_ACCESS_DENIED) {
      if(!IsFile(s))
        last = 0;
    }
    if(was) {
      *p = '\\';
      p++;
    }
  }
  while(p &&
        *p);
  return last;
}


APIRET SetDir (HWND hwndClient,HWND hwnd,CHAR *dir,INT flags) {

  /*
   * bitmapped flags:
   * 1 = don't ask to create if non-existent
   */

  CHAR        s[CCHMAXPATH],*p;
  APIRET      ret = 0,error;
  INT         isfile;

  if(DosQueryPathInfo(dir,
                      FIL_QUERYFULLNAME,
                      s,
                      sizeof(s)))
    strcpy(s,dir);
  while((p = strchr(s,'/')) != NULL)
    *p = '\\';
  while(strlen(s) > 3 &&
        s[strlen(s) - 1] == '\\')
    s[strlen(s) - 1] = 0;
  if(IsFullName(s)) {
    if(driveflags[toupper(*s) - 'A'] & (DRIVE_IGNORE | DRIVE_INVALID)) {
      if(!(flags & 1))
        saymsg(MB_CANCEL,
               hwnd,
               GetPString(IDS_NOPETEXT),
               GetPString(IDS_DRIVEISTEXT),
               toupper(*s),
               ((driveflags[toupper(*s) - 'A'] & DRIVE_IGNORE) != 0) ?
                GetPString(IDS_BEINGIGNOREDTEXT) :
                GetPString(IDS_INVALIDTEXT));
      return -5;
    }
  }
  isfile = IsFile(s);
  if(isfile == -1) {
    if(IsFullName(s)) {
      if(driveflags[toupper(*s) - 'A'] & DRIVE_NOTWRITEABLE) {
        if(!(flags & 1))
          saymsg(MB_CANCEL,
                 hwnd,
                 GetPString(IDS_NOPETEXT),
                 GetPString(IDS_DRIVEISTEXT),
                 toupper(*s),
                 GetPString(IDS_NOWRITETEXT));
        return -4;
      }
    }
    if(!(flags & 1)) {
      if(saymsg(MB_YESNO,
                hwnd,
                GetPString(IDS_CONFIRMTEXT),
                GetPString(IDS_NODIRCREATEDIRTEXT),
                s) !=
         MBID_YES)
        return -3;
    }
    error = MassMkdir(hwndClient,s);
    if(error) {
      Dos_Error(MB_CANCEL,
                error,
                hwnd,
                __FILE__,
                __LINE__,
                GetPString(IDS_CREATEDIRFAILEDTEXT),
                s);
      ret = -1;
    }
  }
  else if(isfile) {
    saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
           hwnd,
           GetPString(IDS_ERRORTEXT),
           GetPString(IDS_EXISTSNOTDIRTEXT),
           s);
    ret = -2;
  }
  return ret;
}


BOOL PMMkDir (HWND hwnd,CHAR *filename,BOOL copy) {

  STRINGINPARMS sip;
  CHAR          szBuff[CCHMAXPATH];
  APIRET        error;

Over:
  sip.help = GetPString(IDS_MKDIRHELPTEXT);
  sip.ret = szBuff;
  if(filename)
    strcpy(szBuff,filename);
  else
    save_dir2(szBuff);
  MakeValidDir(szBuff);
  if(*szBuff &&
     szBuff[strlen(szBuff) - 1] != '\\')
    strcat(szBuff,"\\");
  sip.prompt = GetPString(IDS_MKDIRPROMPTTEXT);
  sip.inputlen = CCHMAXPATH - 1;
  sip.title = GetPString(IDS_MKDIRTITLETEXT);
  if(WinDlgBox(HWND_DESKTOP,
               hwnd,
               InputDlgProc,
               FM3ModHandle,
               STR_FRAME,
               &sip) &&
     *szBuff) {
    if((strchr(szBuff,'?') ||
        strchr(szBuff,'*')) ||
       IsFile(szBuff) == 1 ||
       IsRoot(szBuff)) {
      saymsg(MB_ENTER | MB_ICONEXCLAMATION,
             hwnd,
             GetPString(IDS_ERRORTEXT),
             GetPString(IDS_DIRNAMEERRORTEXT),
             szBuff);
      goto Over;
    }
    error = MassMkdir(hwnd,
                      szBuff);
    if(error)
      Dos_Error(MB_ENTER,
                error,
                hwnd,
                __FILE__,
                __LINE__,
                GetPString(IDS_CREATEDIRFAILEDTEXT),
                szBuff);
    else {
      if(copy &&
         filename)
        strcpy(filename,
               szBuff);
      return TRUE;
    }
  }
  return FALSE;
}


void SetTargetDir (HWND hwnd,BOOL justshow) {

  char temp[CCHMAXPATH + 12];

  if(!justshow) {
    strcpy(temp,
           targetdir);
    if(WinDlgBox(HWND_DESKTOP,
                 hwnd,
                 WalkTargetDlgProc,
                 FM3ModHandle,
                 WALK_FRAME,
                 MPFROMP(temp)) &&
       *temp) {
      strcpy(targetdir,temp);
      if(!fChangeTarget)
        PrfWriteProfileString(fmprof,
                              appname,
                              "Targetdir",
                              targetdir);
    }
    else {
      if(*targetdir &&
         saymsg(MB_YESNOCANCEL,
                hwnd,
                GetPString(IDS_CLEARTARGETTITLETEXT),
                "%s",
                GetPString(IDS_CLEARTARGETTEXT)) == MBID_YES) {
        *targetdir = 0;
        PrfWriteProfileString(fmprof,
                              appname,
                              "Targetdir",
                              NULL);
      }
    }
  }

  if(hwndBack) {
    if(fShowTarget)
      sprintf(temp,
              "%s%s%s%s",
              GetPString(IDS_TARGETDIRTITLETEXT),
              (*targetdir) ? "" : "<",
              (*targetdir) ?
               targetdir :
               GetPString(IDS_NONE),
              (*targetdir) ? "" : ">");
    else
      *temp = 0;
    WinSetWindowText(hwndBack,temp);
  }
}

