Changeset 783 for trunk/dll/objcnr.c
- Timestamp:
- Aug 14, 2007, 6:09:54 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/dll/objcnr.c
r775 r783 18 18 03 Aug 07 GKY Enlarged and made setable everywhere Findbuf (speed file loading) 19 19 06 Aug 07 GKY Reduce DosSleep times (ticket 148) 20 20 13 Aug 07 SHL Avoid realloc - not needed; sanitize code 21 13 Aug 07 SHL Move #pragma alloc_text to end for OpenWatcom compat 21 22 22 23 ***********************************************************************/ … … 24 25 #define INCL_DOS 25 26 #define INCL_WIN 27 #define INCL_DOSERRORS 26 28 #include <os2.h> 27 29 … … 59 61 static HWND objcnrwnd; 60 62 61 #pragma alloc_text(OBJCNR,ProcessDir,FillCnrsThread,ObjCnrDlgProc) 62 63 static VOID ProcessDir(HWND hwndCnr, CHAR * filename,PCNRITEM pciParent,64 CHAR * 63 static VOID ProcessDir(HWND hwndCnr, 64 CHAR *filename, 65 PCNRITEM pciParent, 66 CHAR *stopflag) 65 67 { 66 68 CHAR maskstr[CCHMAXPATH], *endpath, *p; 67 ULONG nm, ulM; 69 ULONG ulFindCnt, ulFindMax; 70 ULONG ulBufBytes; 68 71 HDIR hdir; 69 FILEFINDBUF3 *ffb, *fft;72 PFILEFINDBUF3 pffbArray; 70 73 APIRET rc; 71 74 RECORDINSERT ri; 72 75 PCNRITEM pciP; 73 74 ffb = xmalloc(sizeof(FILEFINDBUF3), pszSrcFile, __LINE__); 75 if (!ffb) 76 return; 76 HPOINTER hptr; 77 78 ulBufBytes = sizeof(FILEFINDBUF3) * FilesToGet; 79 pffbArray = xmalloc(ulBufBytes, pszSrcFile, __LINE__); 80 if (!pffbArray) 81 return; // Error already reported 77 82 strcpy(maskstr, filename); 78 83 if (maskstr[strlen(maskstr) - 1] != '\\') … … 81 86 strcat(maskstr, "*"); 82 87 hdir = HDIR_CREATE; 83 nm= 1;88 ulFindCnt = 1; 84 89 rc = DosFindFirst(filename, &hdir, 85 90 FILE_NORMAL | FILE_READONLY | FILE_ARCHIVED | 86 91 FILE_SYSTEM | FILE_HIDDEN | MUST_HAVE_DIRECTORY, 87 ffb, sizeof(FILEFINDBUF3), &nm, FIL_STANDARD);92 pffbArray, ulBufBytes, &ulFindCnt, FIL_STANDARD); 88 93 if (!rc) 89 94 DosFindClose(hdir); 90 91 if (rc) { /* work around furshluginer FAT bug... */ 92 if (IsRoot(filename)) 93 rc = 0; 94 } 95 96 if ((!rc && (ffb->attrFile & FILE_DIRECTORY))) { 95 // work around furshluginer FAT root bug 96 else if (IsRoot(filename)) 97 rc = 0; 98 99 if ((!rc && (pffbArray->attrFile & FILE_DIRECTORY))) { 97 100 pciP = WinSendMsg(hwndCnr, 98 101 CM_ALLOCRECORD, … … 100 103 MPFROMLONG(1)); 101 104 if (!pciP) { 102 free(ffb); 105 Win_Error(hwndCnr, HWND_DESKTOP, pszSrcFile, __LINE__, "CM_ALLOCRECORD"); 106 free(pffbArray); 103 107 return; 104 108 } … … 125 129 } 126 130 else { 127 free(ffb); 128 Dos_Error(MB_ENTER, 129 rc, 130 HWND_DESKTOP, 131 pszSrcFile, 132 __LINE__, GetPString(IDS_CANTFINDDIRTEXT), filename); 131 free(pffbArray); 132 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__, 133 GetPString(IDS_CANTFINDDIRTEXT), filename); 133 134 return; 134 135 } 135 { 136 HPOINTER hptr; 137 138 hptr = WinLoadFileIcon(pciP->pszFileName, FALSE); 139 if (hptr) 140 pciP->rc.hptrIcon = hptr; 141 } 136 137 hptr = WinLoadFileIcon(pciP->pszFileName, FALSE); 138 if (hptr) 139 pciP->rc.hptrIcon = hptr; 140 142 141 if (!pciP->rc.hptrIcon || pciP->rc.hptrIcon == hptrFile) /* OS/2 bug bug bug bug */ 143 142 pciP->rc.hptrIcon = hptrDir; 143 144 144 memset(&ri, 0, sizeof(RECORDINSERT)); 145 145 ri.cb = sizeof(RECORDINSERT); … … 150 150 ri.fInvalidateRecord = TRUE; 151 151 if (!WinSendMsg(hwndCnr, CM_INSERTRECORD, MPFROMP(pciP), MPFROMP(&ri))) { 152 free( ffb);152 free(pffbArray); 153 153 return; 154 154 } … … 156 156 if (!isalpha(*maskstr) || maskstr[1] != ':' || maskstr[2] != '\\' || 157 157 ((driveflags[toupper(*maskstr) - 'A'] & DRIVE_REMOTE) && fRemoteBug)) 158 ul M= 1;158 ulFindMax = 1; 159 159 else 160 ulM = FilesToGet; 161 if (ulM > 1) { 162 fft = xrealloc(ffb, sizeof(FILEFINDBUF3) * ulM, pszSrcFile, __LINE__); 163 if (!fft) 164 ulM = 1; 165 else 166 ffb = fft; 167 } 168 nm = ulM; 160 ulFindMax = FilesToGet; 161 ulFindCnt = ulFindMax; 169 162 rc = DosFindFirst(maskstr, &hdir, 170 163 FILE_NORMAL | FILE_READONLY | FILE_ARCHIVED | 171 FILE_SYSTEM | FILE_HIDDEN | MUST_HAVE_DIRECTORY, ffb,172 sizeof(FILEFINDBUF3) * ulM, &nm, FIL_STANDARD);164 FILE_SYSTEM | FILE_HIDDEN | MUST_HAVE_DIRECTORY, 165 pffbArray, ulBufBytes, &ulFindCnt, FIL_STANDARD); 173 166 if (!rc) { 174 175 register PBYTE fb = (PBYTE) ffb; 176 FILEFINDBUF3 *pffbFile; 167 PFILEFINDBUF3 pffbFile; 177 168 ULONG x; 178 169 179 170 while (!rc) { 180 for (x = 0; x < nm; x++) {181 pffbFile = (FILEFINDBUF3 *) fb; 171 pffbFile = pffbArray; 172 for (x = 0; x < ulFindCnt; x++) { 182 173 if (*stopflag) 183 174 break; … … 192 183 if (!pffbFile->oNextEntryOffset) 193 184 break; 194 fb += pffbFile->oNextEntryOffset;195 } 185 pffbFile = (PFILEFINDBUF3)((PBYTE)pffbFile + pffbFile->oNextEntryOffset); 186 } // for 196 187 DosSleep(1); 197 188 if (*stopflag) 198 189 break; 199 nm = ulM;200 rc = DosFindNext(hdir, ffb, sizeof(FILEFINDBUF3) * ulM, &nm);201 } 190 ulFindCnt = ulFindMax; 191 rc = DosFindNext(hdir, pffbArray, ulBufBytes, &ulFindCnt); 192 } // while 202 193 DosFindClose(hdir); 203 194 } 204 free(ffb); 195 196 if (rc && rc != ERROR_NO_MORE_FILES) { 197 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__, 198 GetPString(IDS_CANTFINDDIRTEXT), filename); 199 } 200 201 free(pffbArray); 205 202 WinSendMsg(hwndCnr, CM_INVALIDATERECORD, MPFROMP(&pciP), 206 203 MPFROM2SHORT(1, 0)); … … 211 208 HAB hab; 212 209 HMQ hmq; 213 DIRSIZE *dirsize = (DIRSIZE *) args; 214 215 if (!dirsize) 210 DIRSIZE *dirsize = (DIRSIZE *)args; 211 212 if (!dirsize) { 213 Runtime_Error(pszSrcFile, __LINE__, "no data"); 216 214 return; 215 } 217 216 218 217 DosError(FERR_DISABLEHARDERR); … … 430 429 return WinDefDlgProc(hwnd, msg, mp1, mp2); 431 430 } 431 432 #pragma alloc_text(OBJCNR,ProcessDir,FillCnrsThread,ObjCnrDlgProc)
Note:
See TracChangeset
for help on using the changeset viewer.