HLOCAL GRPFILE_ReadGroupFile(LPCSTR lpszPath) { CHAR szPath_gr[MAX_PATHNAME_LEN]; BOOL bFileNameModified = FALSE; OFSTRUCT dummy; HLOCAL hBuffer, hGroup; INT size; /* if `.gr' file exists use that */ GRPFILE_ModifyFileName(szPath_gr, lpszPath, MAX_PATHNAME_LEN, TRUE); if (OpenFile(szPath_gr, &dummy, OF_EXIST) != HFILE_ERROR) { lpszPath = szPath_gr; bFileNameModified = TRUE; } /* Read the whole file into a buffer */ if (!GRPFILE_ReadFileToBuffer(lpszPath, &hBuffer, &size)) { MAIN_MessageBoxIDS_s(IDS_GRPFILE_READ_ERROR_s, lpszPath, IDS_ERROR, MB_YESNO); return(0); } /* Interpret buffer */ hGroup = GRPFILE_ScanGroup(LocalLock(hBuffer), size, lpszPath, bFileNameModified); if (!hGroup) MAIN_MessageBoxIDS_s(IDS_GRPFILE_READ_ERROR_s, lpszPath, IDS_ERROR, MB_YESNO); LocalFree(hBuffer); return(hGroup); }
BOOL GRPFILE_WriteGroupFile(HLOCAL hGroup) { CHAR szPath[MAX_PATHNAME_LEN]; PROGGROUP *group = LocalLock(hGroup); OFSTRUCT dummy; HFILE file; BOOL ret; GRPFILE_ModifyFileName(szPath, LocalLock(group->hGrpFile), MAX_PATHNAME_LEN, group->bFileNameModified); /* Try not to overwrite original files */ /* group->bOverwriteFileOk == TRUE only if a file has the modified format */ if (!group->bOverwriteFileOk && OpenFile(szPath, &dummy, OF_EXIST) != HFILE_ERROR) { /* Original file exists, try `.gr' extension */ GRPFILE_ModifyFileName(szPath, LocalLock(group->hGrpFile), MAX_PATHNAME_LEN, TRUE); if (OpenFile(szPath, &dummy, OF_EXIST) != HFILE_ERROR) { /* File exists. Do not overwrite */ MAIN_MessageBoxIDS_s(IDS_FILE_NOT_OVERWRITTEN_s, szPath, IDS_INFO, MB_OK); return FALSE; } /* Inform about the modified file name */ if (IDCANCEL == MAIN_MessageBoxIDS_s(IDS_SAVE_GROUP_AS_s, szPath, IDS_INFO, MB_OKCANCEL | MB_ICONINFORMATION)) return FALSE; } { /* Warn about the (possible) incompatibility */ CHAR msg[MAX_PATHNAME_LEN + 200]; wsprintf(msg, "Group files written by this DRAFT Program Manager " "possibly cannot be read by the Microsoft Program Manager!!\n" "Are you sure to write %s?", szPath); if (IDOK != MessageBox(Globals.hMainWnd, msg, "WARNING", MB_OKCANCEL | MB_DEFBUTTON2)) return FALSE; } /* Open file */ file = _lcreat(szPath, 0); if (file != HFILE_ERROR) { ret = GRPFILE_DoWriteGroupFile(file, group); _lclose(file); } else ret = FALSE; if (!ret) MAIN_MessageBoxIDS_s(IDS_FILE_WRITE_ERROR_s, szPath, IDS_ERROR, MB_OK); return(ret); }
static VOID MAIN_CreateGroups(VOID) { CHAR buffer[BUFFER_SIZE]; CHAR szPath[MAX_PATHNAME_LEN]; CHAR key[20], *ptr; /* Initialize groups according the `Order' entry of `progman.ini' */ GetPrivateProfileStringA("Settings", "Order", "", buffer, sizeof(buffer), Globals.lpszIniFile); ptr = buffer; while (ptr < buffer + sizeof(buffer)) { int num, skip, ret; ret = sscanf(ptr, "%d%n", &num, &skip); if (ret == 0) MAIN_MessageBoxIDS_s(IDS_FILE_READ_ERROR_s, Globals.lpszIniFile, IDS_ERROR, MB_OK); if (ret != 1) break; sprintf(key, "Group%d", num); GetPrivateProfileStringA("Groups", key, "", szPath, sizeof(szPath), Globals.lpszIniFile); if (!szPath[0]) continue; GRPFILE_ReadGroupFile(szPath); ptr += skip; } /* FIXME initialize other groups, not enumerated by `Order' */ }
static HLOCAL GRPFILE_ScanProgram(LPCSTR buffer, INT size, LPCSTR program_ptr, INT seqnum, LPCSTR extension, HLOCAL hGroup, LPCSTR lpszGrpFile) { INT icontype; HICON hIcon; LPCSTR lpszName, lpszCmdLine, lpszIconFile, lpszWorkDir; LPCSTR iconinfo_ptr, iconANDbits_ptr, iconXORbits_ptr; INT x, y, nIconIndex, iconANDsize, iconXORsize; INT nHotKey, nCmdShow; UINT width, height, planes, bpp; x = GET_SHORT(program_ptr, 0); y = GET_SHORT(program_ptr, 2); nIconIndex = GET_USHORT(program_ptr, 4); /* FIXME is this correct ?? */ icontype = GET_USHORT(program_ptr, 6); switch (icontype) { default: MAIN_MessageBoxIDS_s(IDS_UNKNOWN_FEATURE_s, lpszGrpFile, IDS_WARNING, MB_OK); case 0x048c: iconXORsize = GET_USHORT(program_ptr, 8); iconANDsize = GET_USHORT(program_ptr, 10) / 8; iconinfo_ptr = buffer + GET_USHORT(program_ptr, 12); iconXORbits_ptr = buffer + GET_USHORT(program_ptr, 14); iconANDbits_ptr = buffer + GET_USHORT(program_ptr, 16); width = GET_USHORT(iconinfo_ptr, 4); height = GET_USHORT(iconinfo_ptr, 6); planes = GET_USHORT(iconinfo_ptr, 10); bpp = GET_USHORT(iconinfo_ptr, 11); break; case 0x000c: iconANDsize = GET_USHORT(program_ptr, 8); iconXORsize = GET_USHORT(program_ptr, 10); iconinfo_ptr = buffer + GET_USHORT(program_ptr, 12); iconANDbits_ptr = buffer + GET_USHORT(program_ptr, 14); iconXORbits_ptr = buffer + GET_USHORT(program_ptr, 16); width = GET_USHORT(iconinfo_ptr, 4); height = GET_USHORT(iconinfo_ptr, 6); planes = GET_USHORT(iconinfo_ptr, 10); bpp = GET_USHORT(iconinfo_ptr, 11); } if (iconANDbits_ptr + iconANDsize > buffer + size || iconXORbits_ptr + iconXORsize > buffer + size) return(0); hIcon = CreateIcon( Globals.hInstance, width, height, planes, bpp, iconANDbits_ptr, iconXORbits_ptr ); lpszName = buffer + GET_USHORT(program_ptr, 18); lpszCmdLine = buffer + GET_USHORT(program_ptr, 20); lpszIconFile = buffer + GET_USHORT(program_ptr, 22); if (iconinfo_ptr + 6 > buffer + size || lpszName > buffer + size || lpszCmdLine > buffer + size || lpszIconFile > buffer + size) return(0); /* Scan Extensions */ lpszWorkDir = ""; nHotKey = 0; nCmdShow = SW_SHOWNORMAL; if (extension) { LPCSTR ptr = extension; while (ptr + 6 <= buffer + size) { UINT type = GET_USHORT(ptr, 0); UINT number = GET_USHORT(ptr, 2); UINT skip = GET_USHORT(ptr, 4); if (number == seqnum) { switch (type) { case 0x8000: if (ptr + 10 > buffer + size) return(0); if (ptr[6] != 'P' || ptr[7] != 'M' || ptr[8] != 'C' || ptr[9] != 'C') return(0); break; case 0x8101: lpszWorkDir = ptr + 6; break; case 0x8102: if (ptr + 8 > buffer + size) return(0); nHotKey = GET_USHORT(ptr, 6); break; case 0x8103: if (ptr + 8 > buffer + size) return(0); nCmdShow = GET_USHORT(ptr, 6); break; default: MAIN_MessageBoxIDS_s(IDS_UNKNOWN_FEATURE_s, lpszGrpFile, IDS_WARNING, MB_OK); } } if (!skip) break; ptr += skip; } } return (PROGRAM_AddProgram(hGroup, hIcon, lpszName, x, y, lpszCmdLine, lpszIconFile, nIconIndex, lpszWorkDir, nHotKey, nCmdShow)); }
BOOL DIALOG_Delete(UINT ids_text_s, LPCSTR lpszName) { return (IDYES == MAIN_MessageBoxIDS_s(ids_text_s, lpszName, IDS_DELETE, MB_YESNO | MB_DEFBUTTON2)); }