|
|
1.1 ! root 1: ! 2: /******************************************************************************\ ! 3: * This is a part of the Microsoft Source Code Samples. ! 4: * Copyright (C) 1993 Microsoft Corporation. ! 5: * All rights reserved. ! 6: * This source code is only intended as a supplement to ! 7: * Microsoft Development Tools and/or WinHelp documentation. ! 8: * See these sources for detailed information regarding the ! 9: * Microsoft samples programs. ! 10: \******************************************************************************/ ! 11: ! 12: /****************************** Module Header ******************************* ! 13: * Module Name: reslist.c ! 14: * ! 15: * Contains routines to manage the linked list of resources. ! 16: * ! 17: * Functions: ! 18: * FindDialog() ! 19: * AllocResLink() ! 20: * RestoreDialog() ! 21: * FreeRes() ! 22: * FreeResList() ! 23: * FreeResLink() ! 24: * DeleteDialogResource() ! 25: * ! 26: * Comments: ! 27: * ! 28: ****************************************************************************/ ! 29: ! 30: #include "dlgedit.h" ! 31: #include "dlgfuncs.h" ! 32: #include "dlgextrn.h" ! 33: ! 34: #include <stdlib.h> ! 35: #include <string.h> ! 36: ! 37: ! 38: ! 39: /************************************************************************ ! 40: * FindDialog ! 41: * ! 42: * This function steps through the linked list of resources looking ! 43: * for the dialog resource with the given name. This name can be either ! 44: * a string or an ordinal. Strings are compared without regard to case. ! 45: * ! 46: * When looking at the dialog names in the resources, if the dialog ! 47: * resource is the current one, it will compare the current name for the ! 48: * dialog instead of the name that is stored in the resource. This is ! 49: * because the name in the resource could be out of date with respect ! 50: * to the current name of the dialog being edited. This happens when ! 51: * the user changes the dialog's name, but has not yet done an action ! 52: * that causes the resource to be synched, such as a File/Save, for ! 53: * instance. ! 54: * ! 55: * Arguments: ! 56: * LPTSTR pszDlgName - Name or ordinal of the dialog to find. ! 57: * ! 58: * Returns: ! 59: * TRUE if a dialog with that name is found, FALSE if not. ! 60: * ! 61: ************************************************************************/ ! 62: ! 63: BOOL FindDialog( ! 64: LPTSTR pszDlgName) ! 65: { ! 66: PRESLINK prl; ! 67: ! 68: if (gfEditingDlg && NameOrdCmp(gcd.pszDlgName, pszDlgName) == 0) ! 69: return TRUE; ! 70: ! 71: for (prl = gprlHead; prl; prl = prl->prlNext) { ! 72: /* ! 73: * Is this a dialog resource and do they compare? ! 74: */ ! 75: if (prl->fDlgResource && prl != gcd.prl && ! 76: NameOrdCmp(prl->pszName, pszDlgName) == 0) ! 77: break; ! 78: } ! 79: ! 80: return prl ? TRUE : FALSE; ! 81: } ! 82: ! 83: ! 84: ! 85: /************************************************************************ ! 86: * AllocResLink ! 87: * ! 88: * This function allocates a new RESLINK structure for the linked list ! 89: * of resources. It allocates local memory for the link, allocates ! 90: * and fills global memory with the given resource data and initializes ! 91: * the fields of the structure. The link is not added to the list, ! 92: * however. ! 93: * ! 94: * Returns: ! 95: * A pointer to the newly allocated RESLINK structure, or NULL if ! 96: * an error occurs. ! 97: * ! 98: ************************************************************************/ ! 99: ! 100: PRESLINK AllocResLink( ! 101: PRES pRes) ! 102: { ! 103: PRESLINK prl; ! 104: PRES pResNew; ! 105: PRES2 pRes2; ! 106: LPTSTR pszName; ! 107: INT cbName; ! 108: LPTSTR pszType; ! 109: ! 110: if (!(prl = (PRESLINK)MyAlloc(sizeof(RESLINK)))) ! 111: return NULL; ! 112: ! 113: prl->prlNext = NULL; ! 114: ! 115: prl->cbRes = ResourceSize(pRes); ! 116: if (!(prl->hRes = GlobalAlloc(GMEM_MOVEABLE, prl->cbRes))) { ! 117: MyFree(prl); ! 118: Message(MSG_OUTOFMEMORY); ! 119: return NULL; ! 120: } ! 121: ! 122: pResNew = (PRES)GlobalLock(prl->hRes); ! 123: memcpy(pResNew, pRes, prl->cbRes); ! 124: GlobalUnlock(prl->hRes); ! 125: ! 126: pszType = ResourceType(pRes); ! 127: if (IsOrd(pszType) && OrdID(pszType) == ORDID_RT_DIALOG) { ! 128: prl->fDlgResource = TRUE; ! 129: pszName = ResourceName(pRes); ! 130: cbName = NameOrdLen(pszName); ! 131: ! 132: if (!(prl->pszName = MyAlloc(cbName))) { ! 133: GlobalFree(prl->hRes); ! 134: MyFree(prl); ! 135: return NULL; ! 136: } ! 137: ! 138: NameOrdCpy(prl->pszName, pszName); ! 139: ! 140: pRes2 = ResourcePart2(pRes); ! 141: prl->wLanguage = pRes2->LanguageId; ! 142: } ! 143: else { ! 144: prl->fDlgResource = FALSE; ! 145: prl->pszName = NULL; ! 146: prl->wLanguage = 0; ! 147: } ! 148: ! 149: return prl; ! 150: } ! 151: ! 152: ! 153: ! 154: /**************************************************************************** ! 155: * RestoreDialog ! 156: * ! 157: * This function is used to restore the current dialog to the condition ! 158: * that it was in just before it was last chosen to edit. ! 159: * ! 160: ****************************************************************************/ ! 161: ! 162: VOID RestoreDialog(VOID) ! 163: { ! 164: PRESLINK prlSave; ! 165: ! 166: if (Message(MSG_RESTOREDIALOG) == IDYES) { ! 167: prlSave = gcd.prl; ! 168: DeleteDialog(FALSE); ! 169: ! 170: ResLinkToDialog(prlSave); ! 171: } ! 172: } ! 173: ! 174: ! 175: ! 176: /**************************************************************************** ! 177: * FreeRes ! 178: * ! 179: * This frees the entire list of resources and deletes the dialog box ! 180: * being edited. ! 181: * ! 182: ****************************************************************************/ ! 183: ! 184: VOID FreeRes(VOID) ! 185: { ! 186: CancelSelection(TRUE); ! 187: ! 188: if (gfEditingDlg) ! 189: DeleteDialog(FALSE); ! 190: ! 191: FreeResList(); ! 192: ! 193: pszResFile = NULL; ! 194: gfResChged = FALSE; ! 195: } ! 196: ! 197: ! 198: ! 199: /**************************************************************************** ! 200: * FreeResList ! 201: * ! 202: * This function frees the entire resource list. ! 203: * ! 204: ****************************************************************************/ ! 205: ! 206: VOID FreeResList(VOID) ! 207: { ! 208: PRESLINK prl; ! 209: PRESLINK prlNext; ! 210: ! 211: for (prl = gprlHead; prl; prl = prlNext) { ! 212: prlNext = prl->prlNext; ! 213: FreeResLink(prl); ! 214: } ! 215: ! 216: gprlHead = NULL; ! 217: } ! 218: ! 219: ! 220: ! 221: /**************************************************************************** ! 222: * FreeResLink ! 223: * ! 224: * This frees a linked resource structure and everything that it ! 225: * contains. It does not close up the linked list, however. ! 226: * ! 227: * Arguments: ! 228: * PRESLINK prl - Points to the resource link to free. ! 229: * ! 230: ****************************************************************************/ ! 231: ! 232: VOID FreeResLink( ! 233: PRESLINK prl) ! 234: { ! 235: if (prl->pszName) ! 236: MyFree(prl->pszName); ! 237: ! 238: if (prl->hRes) ! 239: GlobalFree(prl->hRes); ! 240: ! 241: MyFree(prl); ! 242: } ! 243: ! 244: ! 245: ! 246: /************************************************************************ ! 247: * DeleteDialogResource ! 248: * ! 249: * This function deletes the current dialog from the linked list of ! 250: * resources. It handles the case where the current dialog is not ! 251: * yet in the list. ! 252: * ! 253: ************************************************************************/ ! 254: ! 255: VOID DeleteDialogResource(VOID) ! 256: { ! 257: PRESLINK prl; ! 258: PRESLINK prlPrev; ! 259: ! 260: /* ! 261: * Does a link for the current dialog exist? ! 262: */ ! 263: if (gcd.prl) { ! 264: /* ! 265: * Find the existing link and get it's previous link. ! 266: */ ! 267: for (prl = gprlHead, prlPrev = NULL; prl && prl != gcd.prl; ! 268: prlPrev = prl, prl = prl->prlNext) ! 269: ; ! 270: ! 271: /* ! 272: * Close up the linked list. ! 273: */ ! 274: if (prlPrev) ! 275: prlPrev->prlNext = gcd.prl->prlNext; ! 276: else ! 277: gprlHead = gcd.prl->prlNext; ! 278: ! 279: /* ! 280: * Delete the link. ! 281: */ ! 282: FreeResLink(gcd.prl); ! 283: gcd.prl = NULL; ! 284: } ! 285: } ! 286: ! 287: ! 288: ! 289: /**************************************************************************** ! 290: * ! 291: * Stubs for the C runtime international calls that are not implemented yet. ! 292: * These should be removed once the C runtime international library ! 293: * is dropped to NT. ! 294: * ! 295: ****************************************************************************/ ! 296: ! 297: LPWSTR itoaw( ! 298: INT value, ! 299: LPWSTR string, ! 300: INT radix) ! 301: { ! 302: CHAR szAnsi[17]; ! 303: ! 304: itoa(value, szAnsi, radix); ! 305: ! 306: MultiByteToWideChar(CP_ACP, 0, szAnsi, -1, string, 17); ! 307: ! 308: return string; ! 309: } ! 310: ! 311: ! 312: ! 313: INT awtoi( ! 314: LPWSTR string) ! 315: { ! 316: CHAR szAnsi[17]; ! 317: BOOL fDefCharUsed; ! 318: ! 319: WideCharToMultiByte(CP_ACP, 0, string, -1, szAnsi, 17, NULL, &fDefCharUsed); ! 320: ! 321: return atoi(szAnsi); ! 322: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.