/*********************************************************************** $Id: attribs.c 1498 2010-01-18 00:57:01Z gyoung $ attributes editor Copyright (c) 1993, 1998 M. Kimes Copyright (c) 2006, 2010 Steven H.Levine 14 Jul 06 SHL Use Runtime_Error 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat 01 Sep 07 GKY Use xDosSetPathInfo to fix case where FS3 buffer crosses 64k boundry 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *. ***********************************************************************/ #include #include #define INCL_DOS #define INCL_WIN #include "fm3dll.h" #include "fm3dll2.h" // #define's for UM_*, control id's, etc. #include "notebook.h" // Data declaration(s) #include "info.h" // Data declaration(s) #include "init.h" // Data declaration(s) #include "fm3dlg.h" #include "fm3str.h" #include "makelist.h" // LISTINFO #include "errutil.h" // Runtime_Error #include "strutil.h" // GetPString #include "defview.h" // QuickView #include "attribs.h" #include "misc.h" // PaintRecessedWindow #include "wrappers.h" // xDosSetPathInfo static PSZ pszSrcFile = __FILE__; MRESULT EXPENTRY AttrListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) { LISTINFO *li; switch (msg) { case WM_INITDLG: if (!mp2) WinDismissDlg(hwnd, 0); else { WinSetWindowPtr(hwnd, QWL_USER, mp2); li = (LISTINFO *) mp2; if (!li->list || !li->list[0]) { WinSendMsg(hwnd, WM_CLOSE, MPVOID, MPVOID); break; } } WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETTEXTLIMIT, MPFROMSHORT(4L), MPVOID); WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L), MPVOID); WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L), MPVOID); WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L), MPVOID); WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L), MPVOID); WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L), MPVOID); WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_OVERRIDESETLIMITS, MPFROMLONG(2200L), MPFROMLONG(1980L)); WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_OVERRIDESETLIMITS, MPFROMLONG(12L), MPFROMLONG(1L)); WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_OVERRIDESETLIMITS, MPFROMLONG(31L), MPFROMLONG(1L)); WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_OVERRIDESETLIMITS, MPFROMLONG(23L), MPFROMLONG(0L)); WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_OVERRIDESETLIMITS, MPFROMLONG(59L), MPFROMLONG(0L)); WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_OVERRIDESETLIMITS, MPFROMLONG(59L), MPFROMLONG(0L)); WinCheckButton(hwnd, ATR_USEDATETIME, FALSE); { INT x; for (x = 0; li->list[x]; x++) { WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_INSERTITEM, MPFROM2SHORT(LIT_END, 0), MPFROMP(li->list[x])); WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_SELECTITEM, MPFROM2SHORT(x, 0), MPFROMSHORT(TRUE)); } } PostMsg(hwnd, UM_UNDO, MPFROMLONG(((!li->list[1]) ? 1L : 0L)), MPVOID); if (li->list[1]) PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ATR_NOW, 0), MPVOID); break; case UM_UNDO: { FILESTATUS3 fi; long ro = 2, hi = 2, sy = 2, ar = 2; BOOL allgrey; allgrey = ((long)WinQueryButtonCheckstate(hwnd, ATR_READONLY) == 2 && (long)WinQueryButtonCheckstate(hwnd, ATR_SYSTEM) == 2 && (long)WinQueryButtonCheckstate(hwnd, ATR_HIDDEN) == 2 && (long)WinQueryButtonCheckstate(hwnd, ATR_ARCHIVED) == 2); li = INSTDATA(hwnd); if (li && li->list[0] && (allgrey || mp1) && !DosQueryPathInfo(li->list[0], FIL_STANDARD, &fi, (ULONG) sizeof(fi))) { ro = ((fi.attrFile & FILE_READONLY) != 0); hi = ((fi.attrFile & FILE_HIDDEN) != 0); sy = ((fi.attrFile & FILE_SYSTEM) != 0); ar = ((fi.attrFile & FILE_ARCHIVED) != 0); WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETCURRENTVALUE, MPFROMSHORT(fi.fdateLastWrite.year + 1980), MPVOID); WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETCURRENTVALUE, MPFROMSHORT(fi.fdateLastWrite.month), MPVOID); WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETCURRENTVALUE, MPFROMSHORT(fi.fdateLastWrite.day), MPVOID); WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETCURRENTVALUE, MPFROMSHORT(fi.ftimeLastWrite.hours), MPVOID); WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETCURRENTVALUE, MPFROMSHORT(fi.ftimeLastWrite.minutes), MPVOID); WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETCURRENTVALUE, MPFROMSHORT(fi.ftimeLastWrite.twosecs * 2), MPVOID); } WinCheckButton(hwnd, ATR_READONLY, ro); WinCheckButton(hwnd, ATR_HIDDEN, hi); WinCheckButton(hwnd, ATR_SYSTEM, sy); WinCheckButton(hwnd, ATR_ARCHIVED, ar); PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_READONLY, BN_CLICKED), MPVOID); PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_HIDDEN, BN_CLICKED), MPVOID); PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_SYSTEM, BN_CLICKED), MPVOID); PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_ARCHIVED, BN_CLICKED), MPVOID); } return 0; case WM_ADJUSTWINDOWPOS: PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID); break; case UM_SETDIR: PaintRecessedWindow(WinWindowFromID(hwnd, ATR_HELP), (HPS) 0, FALSE, TRUE); return 0; case WM_CONTROL: switch (SHORT1FROMMP(mp1)) { case ATR_LISTBOX: if (SHORT2FROMMP(mp1) == LN_ENTER) { SHORT x; CHAR szBuffer[CCHMAXPATH]; x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYSELECTION, MPFROMSHORT(LIT_FIRST), MPVOID); if (x >= 0) { *szBuffer = 0; WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYITEMTEXT, MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer)); if (*szBuffer) QuickView(hwnd, szBuffer); } } else if (SHORT2FROMMP(mp1) == LN_KILLFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, NullStr); else if (SHORT2FROMMP(mp1) == LN_SETFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, (CHAR *) GetPString(IDS_ATTRLISTBOXHELPTEXT)); break; case ATR_YEAR: if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, NullStr); if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, (CHAR *) GetPString(IDS_ATTRYEARHELPTEXT)); break; case ATR_MONTH: if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, NullStr); if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, (CHAR *) GetPString(IDS_ATTRMONTHHELPTEXT)); break; case ATR_DAY: if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, NullStr); if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, (CHAR *) GetPString(IDS_ATTRDAYHELPTEXT)); break; case ATR_HOUR: if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, NullStr); if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, (CHAR *) GetPString(IDS_ATTRHOURHELPTEXT)); break; case ATR_MINUTES: if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, NullStr); if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, (CHAR *) GetPString(IDS_ATTRMINHELPTEXT)); break; case ATR_SECONDS: if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, NullStr); if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS) WinSetDlgItemText(hwnd, ATR_HELP, (CHAR *) GetPString(IDS_ATTRSECHELPTEXT)); break; case ATR_READONLY: case ATR_SYSTEM: case ATR_HIDDEN: case ATR_ARCHIVED: WinSendMsg(hwnd, UM_CONTROL, mp1, mp2); break; } return 0; case UM_CONTROL: switch (SHORT1FROMMP(mp1)) { case ATR_READONLY: case ATR_SYSTEM: case ATR_HIDDEN: case ATR_ARCHIVED: { LONG check = WinQueryButtonCheckstate(hwnd, SHORT1FROMMP(mp1)); CHAR s[80]; sprintf(s, "%s %s", (SHORT1FROMMP(mp1) == ATR_READONLY) ? GetPString(IDS_ATTRREADONLYBTEXT) : (SHORT1FROMMP(mp1) == ATR_SYSTEM) ? GetPString(IDS_ATTRSYSTEMBTEXT) : (SHORT1FROMMP(mp1) == ATR_HIDDEN) ? GetPString(IDS_ATTRHIDDENBTEXT) : GetPString(IDS_ATTRARCHIVEDBTEXT), (check == 1) ? GetPString(IDS_ONTEXT) : (check == 0) ? GetPString(IDS_OFFTEXT) : GetPString(IDS_UNCHANGEDTEXT)); WinSetDlgItemText(hwnd, SHORT1FROMMP(mp1), s); } break; } return 0; case WM_COMMAND: switch (SHORT1FROMMP(mp1)) { case ATR_LEAVEALL: PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID); break; case ATR_NOW: { time_t t; struct tm *tm; t = time(NULL); tm = localtime(&t); WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETCURRENTVALUE, MPFROMSHORT(tm->tm_year + 1900), MPVOID); WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETCURRENTVALUE, MPFROMSHORT(tm->tm_mon + 1), MPVOID); WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETCURRENTVALUE, MPFROMSHORT(tm->tm_mday), MPVOID); WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETCURRENTVALUE, MPFROMSHORT(tm->tm_hour), MPVOID); WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETCURRENTVALUE, MPFROMSHORT(tm->tm_min), MPVOID); WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETCURRENTVALUE, MPFROMSHORT(tm->tm_sec), MPVOID); } break; case DID_OK: if (!WinQueryButtonCheckstate(hwnd, ATR_USEDATETIME) && WinQueryButtonCheckstate(hwnd, ATR_HIDDEN) == 2 && WinQueryButtonCheckstate(hwnd, ATR_SYSTEM) == 2 && WinQueryButtonCheckstate(hwnd, ATR_READONLY) == 2 && WinQueryButtonCheckstate(hwnd, ATR_ARCHIVED) == 2) { saymsg(MB_ENTER, hwnd, GetPString(IDS_UHYOTEXT), GetPString(IDS_ATTRADVANTAGETEXT)); break; } { ULONG temp = 0; FILESTATUS3 fi; SHORT x; APIRET rc; USHORT state; li = INSTDATA(hwnd); if (!li) { Runtime_Error(pszSrcFile, __LINE__, NULL); break; } { CHAR szBuffer[CCHMAXPATH + 1]; UINT numfiles = 0, numalloc = 0; INT error; if (li->list) FreeList(li->list); li->list = NULL; x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYSELECTION, MPFROMSHORT(LIT_FIRST), MPVOID); if (x >= 0) { do { *szBuffer = 0; WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYITEMTEXT, MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer)); if (*szBuffer && isalpha(*szBuffer) && !(driveflags[toupper(*szBuffer) - 'A'] & DRIVE_NOTWRITEABLE)) { error = AddToList(szBuffer, &li->list, &numfiles, &numalloc); if (error) { Runtime_Error(pszSrcFile, __LINE__, "AddToList"); break; } } x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYSELECTION, MPFROMSHORT(x), MPVOID); } while (x >= 0); } } if (!li->list || !li->list[0]) { Runtime_Error(pszSrcFile, __LINE__, "list build failed"); break; } for (x = 0; li->list[x]; x++) { DosError(FERR_DISABLEHARDERR); rc = DosQueryPathInfo(li->list[x], FIL_STANDARD, &fi, (ULONG) sizeof(fi)); if (rc) continue; if (WinQueryButtonCheckstate(hwnd, ATR_USEDATETIME)) { WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_QUERYVALUE, MPFROMP(&temp), MPFROM2SHORT(0, SPBQ_DONOTUPDATE)); fi.fdateLastWrite.year = temp - 1980; WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_QUERYVALUE, MPFROMP(&temp), MPFROM2SHORT(0, SPBQ_DONOTUPDATE)); fi.fdateLastWrite.month = temp; WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_QUERYVALUE, MPFROMP(&temp), MPFROM2SHORT(0, SPBQ_DONOTUPDATE)); fi.fdateLastWrite.day = temp; WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_QUERYVALUE, MPFROMP(&temp), MPFROM2SHORT(0, SPBQ_DONOTUPDATE)); fi.ftimeLastWrite.hours = temp; WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_QUERYVALUE, MPFROMP(&temp), MPFROM2SHORT(0, SPBQ_DONOTUPDATE)); fi.ftimeLastWrite.minutes = temp; WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_QUERYVALUE, MPFROMP(&temp), MPFROM2SHORT(0, SPBQ_DONOTUPDATE)); fi.ftimeLastWrite.twosecs = (temp / 2L); } fi.attrFile &= (~FILE_DIRECTORY); state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_READONLY, BM_QUERYCHECK, MPVOID, MPVOID); if (!state) fi.attrFile &= (~FILE_READONLY); else if (state == 1) fi.attrFile |= FILE_READONLY; state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_HIDDEN, BM_QUERYCHECK, MPVOID, MPVOID); if (!state) fi.attrFile &= (~FILE_HIDDEN); else if (state == 1) fi.attrFile |= FILE_HIDDEN; state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_SYSTEM, BM_QUERYCHECK, MPVOID, MPVOID); if (!state) fi.attrFile &= (~FILE_SYSTEM); else if (state == 1) fi.attrFile |= FILE_SYSTEM; state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_ARCHIVED, BM_QUERYCHECK, MPVOID, MPVOID); if (!state) fi.attrFile &= (~FILE_ARCHIVED); else if (state == 1) fi.attrFile |= FILE_ARCHIVED; xDosSetPathInfo(li->list[x], FIL_STANDARD, &fi, sizeof(fi), 0); } WinDismissDlg(hwnd, 1); } break; case IDM_HELP: if (hwndHelp) WinSendMsg(hwndHelp, HM_DISPLAY_HELP, MPFROM2SHORT(HELP_ATTRIBSLIST, 0), MPFROMSHORT(HM_RESOURCEID)); break; case DID_CANCEL: WinDismissDlg(hwnd, 0); break; } return 0; } return WinDefDlgProc(hwnd, msg, mp1, mp2); } #pragma alloc_text(ATTRIBS,AttrListDlgProc)