VOID GROUP_NewGroup(void) { CHAR szName[MAX_PATHNAME_LEN] = ""; CHAR szFile[MAX_PATHNAME_LEN] = ""; OFSTRUCT dummy; if (!DIALOG_GroupAttributes(szName, szFile, MAX_PATHNAME_LEN)) return; if (OpenFile(szFile, &dummy, OF_EXIST) == HFILE_ERROR) { /* File doesn't exist */ HLOCAL hGroup = GROUP_AddGroup(szName, szFile, SW_SHOWNORMAL, DEF_GROUP_WIN_XPOS, DEF_GROUP_WIN_YPOS, DEF_GROUP_WIN_WIDTH, DEF_GROUP_WIN_HEIGHT, 0, 0, FALSE, FALSE, FALSE); if (!hGroup) return; GRPFILE_WriteGroupFile(hGroup); } else /* File exist */ GRPFILE_ReadGroupFile(szFile); /* FIXME Update progman.ini */ }
VOID GROUP_NewGroup(GROUPFORMAT format, BOOL bIsCommonGroup) { HANDLE hFile; WCHAR szGrpFile[MAX_PATHNAME_LEN] = L""; WCHAR szTitle[MAX_PATHNAME_LEN] = L""; // ZeroMemory(szTitle, sizeof(szTitle)); // ZeroMemory(szGrpFile, sizeof(szGrpFile)); if (!DIALOG_GroupAttributes(format, szTitle, szGrpFile, MAX_PATHNAME_LEN)) return; /* * Just check whether the group file does exist. If it does, close the handle, because GRPFILE_ReadGroupFile will * reopen the file for loading. If it doesn't exist, we create a new one. */ hFile = CreateFileW(szGrpFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { /* File doesn't exist */ PROGGROUP* hGroup = GROUP_AddGroup(format, bIsCommonGroup, szTitle, szGrpFile, DEF_GROUP_WIN_XPOS, DEF_GROUP_WIN_YPOS, DEF_GROUP_WIN_XPOS + DEF_GROUP_WIN_WIDTH, DEF_GROUP_WIN_YPOS + DEF_GROUP_WIN_HEIGHT, 0, 0, SW_SHOWNORMAL, 0, 0, FALSE, FALSE); if (hGroup) GRPFILE_WriteGroupFile(hGroup); } else { /* File exist */ CloseHandle(hFile); GRPFILE_ReadGroupFile(szGrpFile, bIsCommonGroup); } /* FIXME Update progman.ini */ }
static HLOCAL GRPFILE_ScanGroup(LPCSTR buffer, INT size, LPCSTR lpszGrpFile, BOOL bModifiedFileName) { HLOCAL hGroup; INT i, seqnum; LPCSTR extension; LPCSTR lpszName; INT x, y, width, height, iconx, icony, nCmdShow; INT number_of_programs; BOOL bOverwriteFileOk; if (buffer[0] != 'P' || buffer[1] != 'M') return(0); if (buffer[2] == 'C' && buffer[3] == 'C') /* original with checksum */ bOverwriteFileOk = FALSE; else if (buffer[2] == 'X' && buffer[3] == 'X') /* modified without checksum */ bOverwriteFileOk = TRUE; else return(0); /* checksum = GET_USHORT(buffer, 4) (ignored) */ extension = buffer + GET_USHORT(buffer, 6); if (extension == buffer + size) extension = 0; else if (extension + 6 > buffer + size) return(0); nCmdShow = GET_USHORT(buffer, 8); x = GET_SHORT(buffer, 10); y = GET_SHORT(buffer, 12); width = GET_USHORT(buffer, 14); height = GET_USHORT(buffer, 16); iconx = GET_SHORT(buffer, 18); icony = GET_SHORT(buffer, 20); lpszName = buffer + GET_USHORT(buffer, 22); if (lpszName >= buffer + size) return(0); /* unknown bytes 24 - 31 ignored */ /* Unknown bytes should be: wLogPixelsX = GET_SHORT(buffer, 24); wLogPixelsY = GET_SHORT(buffer, 26); byBitsPerPixel = byte at 28; byPlanes = byte at 29; wReserved = GET_SHORT(buffer, 30); */ hGroup = GROUP_AddGroup(lpszName, lpszGrpFile, nCmdShow, x, y, width, height, iconx, icony, bModifiedFileName, bOverwriteFileOk, TRUE); if (!hGroup) return(0); number_of_programs = GET_USHORT(buffer, 32); if (2 * number_of_programs + 34 > size) return(0); for (i=0, seqnum=0; i < number_of_programs; i++, seqnum++) { LPCSTR program_ptr = buffer + GET_USHORT(buffer, 34 + 2*i); if (program_ptr + 24 > buffer + size) return(0); if (!GET_USHORT(buffer, 34 + 2*i)) continue; if (!GRPFILE_ScanProgram(buffer, size, program_ptr, seqnum, extension, hGroup, lpszGrpFile)) { GROUP_DeleteGroup(hGroup); return(0); } } /* FIXME shouldn't be necessary */ GROUP_ShowGroupWindow(hGroup); return hGroup; }