#include #include #include #include #include #include #include "dragdrop.h" #include "resource.h" #define MAXLEN 2048 #define BIGBUF 32764 HANDLE hinst; HWND hMainWnd; char szFilterSpec [1024] = "All Files (*.*)\0*.*\0TIM Files (*.TIM)\0*.tim\0TMD Files (*.TMD)\0*.tmd\0VH Files (*.VH)\0*.vh\0VH Files (*.VB)\0*.VB\0"; char szSaveSpec [1024] = "Data Files (*.DAT)\0*.dat\0All Files (*.*)\0*.*\0"; char szIniFile[MAXLEN]; char szFileName[MAXLEN]; char szFileTitle[MAXLEN]; int PASCAL WinMain (HINSTANCE, HINSTANCE, LPSTR, int); long FAR PASCAL MainWndProc (HWND, UINT, WPARAM, LPARAM); BOOL FAR PASCAL About (HWND, unsigned, WPARAM, LPARAM); BOOL FAR PASCAL Main (HWND, unsigned, WPARAM, LPARAM); void FAR PASCAL LoadProject(HWND, LPSTR); void FAR PASCAL SaveProject(HWND, LPSTR); void FAR PASCAL Exchange(LPSTR, char, char); void FAR PASCAL Recalc(HWND); //-------------------------------------------------------------------------------- int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; WNDCLASS wc; RECT rectMain; if (!hPrevInstance) { wc.style = 0; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (hInstance, "DragDrop"); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = GetStockObject (WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "DataManager"; if(!RegisterClass (&wc)) return FALSE; } hMainWnd = CreateWindow ("DataManager", "Net Yaroze Data Manager", WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, MAIN_WIDTH, MAIN_HEIGHT, NULL, NULL, hInstance, NULL); if(!hMainWnd) return FALSE; GetClientRect(hMainWnd, &rectMain); UpdateWindow(hMainWnd); hinst=hInstance; PostMessage(hMainWnd, WM_COMMAND, IDM_INFO, 0); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } //-------------------------------------------------------------------------------- long FAR PASCAL MainWndProc (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) { FARPROC lpDialogProc; switch (wMsg) { case WM_COMMAND: switch (wParam) { case IDM_INFO: lpDialogProc = MakeProcInstance (Main, hinst); DialogBox (hinst, "Main", hWnd, (DLGPROC)lpDialogProc); FreeProcInstance (lpDialogProc); break; default: return DefWindowProc (hWnd, wMsg, wParam, lParam); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc (hWnd, wMsg, wParam, lParam); } return 0; } //-------------------------------------------------------------------------------- BOOL FAR PASCAL About (HWND hDlg, unsigned wMsg, WPARAM wParam, LPARAM lParam) { switch (wMsg) { case WM_INITDIALOG: return (TRUE); case WM_COMMAND: switch (wParam) { case IDOK: EndDialog (hDlg, TRUE); return TRUE; default: break; } } return FALSE; } //-------------------------------------------------------------------------------- BOOL FAR PASCAL Main (HWND hDlg, unsigned wMsg, WPARAM wParam, LPARAM lParam) { int nFile; int nCount; unsigned long lSize; unsigned long lAddr; unsigned long lTotal; unsigned long lBase; char szName[256]; char szSize[16]; HFILE hInFile; HFILE hOutFile; LPSTR lpSub; HGLOBAL hglb1; HGLOBAL hglb2; RECT rParent; RECT rWindow; LPSTR lpMem1; LPSTR lpMem2; LPSTR lpSub1; LPSTR lpSub2; OPENFILENAME ofn; OFSTRUCT ofInFile; OFSTRUCT ofOutFile; FARPROC lpDialogProc; LOGFONT lfFont; static HFONT hFont; switch (wMsg) { case WM_SYSCOLORCHANGE: break; case WM_INITDIALOG: hFont=(HFONT)SendMessage(hDlg, WM_GETFONT, 0, 0); GetObject(hFont, sizeof(LOGFONT), (LPSTR)&lfFont); lfFont.lfWeight=FW_NORMAL; hFont=CreateFontIndirect(&lfFont); SendDlgItemMessage(hDlg, IDFILES, WM_SETFONT, (WPARAM)hFont, TRUE); SendDlgItemMessage(hDlg, IDBATCH, WM_SETFONT, (WPARAM)hFont, TRUE); SendDlgItemMessage(hDlg, IDDEFINES, WM_SETFONT, (WPARAM)hFont, TRUE); SendDlgItemMessage(hDlg, IDPROJECTS, WM_SETFONT, (WPARAM)hFont, TRUE); SendDlgItemMessage(hDlg, IDBASE, WM_SETFONT, (WPARAM)hFont, TRUE); SendDlgItemMessage(hDlg, IDSTATUS, WM_SETFONT, (WPARAM)hFont, TRUE); CheckDlgButton(hDlg, IDSINGLE, TRUE); SetDlgItemText(hDlg, IDBASE ,"80090000"); GetWindowRect(GetDesktopWindow(), &rParent); GetWindowRect(hDlg, &rWindow); OffsetRect(&rWindow, -rWindow.left, -rWindow.top); MoveWindow(hDlg, (rParent.right-rWindow.right)/2, (rParent.bottom-rWindow.bottom)/2, rWindow.right, rWindow.bottom, TRUE); GetWindowsDirectory(szIniFile, MAXLEN); if(szIniFile[lstrlen(szIniFile)-1]!='\\') lstrcat(szIniFile, "\\"); lstrcat(szIniFile, "nydatman.ini"); hglb1=GlobalAlloc(GPTR, BIGBUF); lpMem1=GlobalLock(hglb1); GetPrivateProfileString("Projects", NULL, "", lpMem1, BIGBUF, szIniFile); while(*lpMem1) { SendDlgItemMessage(hDlg, IDPROJECTS, CB_ADDSTRING, 0, (LPARAM)lpMem1); lpMem1+=lstrlen(lpMem1)+1; } GlobalUnlock(hglb1); GlobalFree(hglb1); GetPrivateProfileString("General", "Last", "", szName, MAXLEN, szIniFile); if(szName[0]) { nCount=(int)SendDlgItemMessage(hDlg, IDPROJECTS, CB_FINDSTRINGEXACT, 0, (LPARAM)(LPSTR)szName); SendDlgItemMessage(hDlg, IDPROJECTS, CB_SETCURSEL, (WPARAM)nCount, 0); LoadProject(hDlg, szName); PostMessage(hDlg, WM_COMMAND, IDCALC, 0); } return TRUE; case WM_DESTROY: DeleteObject(hFont); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDADD: ofn.lStructSize=sizeof(OPENFILENAME); ofn.hwndOwner=hDlg; ofn.lpstrFilter=szFilterSpec; ofn.lpstrCustomFilter=NULL; ofn.nMaxCustFilter=0; ofn.nFilterIndex=1; ofn.lpstrFile=szFileName; ofn.nMaxFile=MAXLEN; ofn.lpstrInitialDir=NULL; ofn.lpstrFileTitle=szFileTitle; ofn.nMaxFileTitle=MAXLEN; ofn.lpstrTitle=NULL; ofn.lpstrDefExt="*"; ofn.Flags=OFN_ALLOWMULTISELECT|OFN_FILEMUSTEXIST; memset (szFileName, 0, MAXLEN); memset (szFileTitle, 0, MAXLEN); if(!GetOpenFileName ((LPOPENFILENAME)&ofn)) return FALSE; nCount=0; if(szFileName[0]) { if(strchr(szFileName, ' ')) { szFileName[lstrlen(szFileName)+1]='\0'; Exchange(szFileName, ' ', '\0'); } else { lpSub=strrchr(szFileName, '\\'); if(lpSub) *lpSub='\0'; } lpSub=(LPSTR)szFileName+lstrlen(szFileName)+1; while(*lpSub) { lstrcpy(szName, szFileName); if(szName[lstrlen(szName)-1]!='\\') lstrcat(szName, "\\"); lstrcat(szName, lpSub); nFile=_open( szName, 0 ); lSize=filelength(nFile); _close(nFile); ltoa(lSize, szSize, 10); lstrcat(szName, "-"); lstrcat(szName, szSize); lpSub+=lstrlen(lpSub)+1; _strupr(szName); SendDlgItemMessage(hDlg, IDFILES, LB_ADDSTRING, 0, (LPARAM)(LPSTR)szName); } PostMessage(hDlg, WM_COMMAND, IDCALC, 0); } break; case IDCANCEL: GetDlgItemText(hDlg, IDPROJECTS, szName, MAXLEN); WritePrivateProfileString("General", "Last", szName, szIniFile); PostMessage(hMainWnd, WM_DESTROY, 0, 0); EndDialog (hDlg, TRUE); return TRUE; case IDCALC: case IDSINGLE: Recalc(hDlg); hglb1=GlobalAlloc(GPTR, BIGBUF); lpMem1=GlobalLock(hglb1); hglb2=GlobalAlloc(GPTR, BIGBUF); lpMem2=GlobalLock(hglb2); lpSub1=lpMem1; lpSub2=lpMem2; lAddr=0; lSize=1; lTotal=0; GetDlgItemText(hDlg, IDBASE, szName, 256); if(!szName[0]) lstrcpy(szName, "0"); strcpy (szName, _strupr(szName)); nCount=lstrlen(szName)-1; while(nCount>=0) { if((szName[nCount]>='0')&&(szName[nCount]<='9')) lAddr+=((unsigned long)szName[nCount]-48)*lSize; else if((szName[nCount]>='A')&&(szName[nCount]<='F')) lAddr+=((unsigned long)szName[nCount]-55)*lSize; lSize*=2; lSize*=2; lSize*=2; lSize*=2; nCount--; } lBase=lAddr; nCount=0; while(SendDlgItemMessage(hDlg, IDFILES, LB_GETTEXT, nCount, (LPARAM)(LPSTR)szName)!=LB_ERR) { nFile=0; while(szName[nFile]) { if(szName[nFile]=='-') { szName[nFile]='\0'; lSize=atol(&szName[nFile+1]); } nFile++; } nFile=lstrlen(szName)-1; while((szName[nFile]!='\\')&&(nFile)) nFile--; wsprintf(lpSub1, "local dload %s %lx\r\n", (LPSTR)szName+(nFile+1), lAddr); Exchange(&szName[nFile], '.', '_'); wsprintf(lpSub2, "#define %s 0x%lx\r\n", (LPSTR)szName+(nFile+1), lAddr); lAddr+=lSize; lTotal+=lSize; lpSub1+=lstrlen(lpSub1); lpSub2+=lstrlen(lpSub2); nCount++; } wsprintf(lpSub2, "#define END_OF_DATA 0x%lx\r\n", lAddr); SetDlgItemText(hDlg, IDBATCH, lpMem1); SetDlgItemText(hDlg, IDDEFINES, lpMem2); wsprintf(szName, "%luk", lTotal/1024); SetDlgItemText(hDlg, IDTOTAL, szName); GlobalUnlock(hglb1); GlobalFree(hglb1); GlobalUnlock(hglb2); GlobalFree(hglb2); if(IsDlgButtonChecked(hDlg, IDSINGLE)!=0) { nCount=(int)SendDlgItemMessage(hDlg, IDPROJECTS, CB_GETCURSEL, 0, 0); if(nCount==CB_ERR) lstrcpy(szSize, "yaroze"); else SendDlgItemMessage(hDlg, IDPROJECTS, CB_GETLBTEXT, (WPARAM)nCount, (LPARAM)(LPSTR)szSize); wsprintf(szName, "local dload %s.dat %lx\r\n", (LPSTR)szSize, lBase); SetDlgItemText(hDlg, IDBATCH, szName); } break; case IDREMOVE: nCount=(int)SendDlgItemMessage(hDlg, IDFILES, LB_GETCURSEL, 0, 0); SendDlgItemMessage(hDlg, IDFILES, LB_DELETESTRING, nCount, 0); PostMessage(hDlg, WM_COMMAND, IDCALC, 0); break; case IDMOVEUP: nCount=(int)SendDlgItemMessage(hDlg, IDFILES, LB_GETCURSEL, 0, 0); if (nCount) { SendDlgItemMessage(hDlg, IDFILES, LB_GETTEXT, nCount, (LPARAM)(LPSTR)szName); SendDlgItemMessage(hDlg, IDFILES, LB_DELETESTRING, nCount, 0); SendDlgItemMessage(hDlg, IDFILES, LB_INSERTSTRING, nCount-1, (LPARAM)(LPSTR)szName); SendMessage(hDlg, WM_COMMAND, IDCALC, 0); SendDlgItemMessage(hDlg, IDFILES, LB_SETCURSEL, nCount-1, 0); } break; case IDMOVEDOWN: lTotal = (int)SendDlgItemMessage(hDlg, IDFILES, LB_GETCOUNT, 0, 0); nCount=(int)SendDlgItemMessage(hDlg, IDFILES, LB_GETCURSEL, 0, 0); if ((nCount+1) < (int)lTotal) { SendDlgItemMessage(hDlg, IDFILES, LB_GETTEXT, nCount, (LPARAM)(LPSTR)szName); SendDlgItemMessage(hDlg, IDFILES, LB_DELETESTRING, nCount, 0); SendDlgItemMessage(hDlg, IDFILES, LB_INSERTSTRING, nCount+1, (LPARAM)(LPSTR)szName); SendMessage(hDlg, WM_COMMAND, IDCALC, 0); SendDlgItemMessage(hDlg, IDFILES, LB_SETCURSEL, nCount+1, 0); } break; case IDDEL: GetDlgItemText(hDlg, IDPROJECTS, szSize, MAXLEN); wsprintf(szName, "Delete project \"%s\"?", szSize); if(MessageBox(hDlg, szName, "Data Manager", MB_ICONQUESTION|MB_YESNO)==IDYES) { GetDlgItemText(hDlg, IDPROJECTS, szName, MAXLEN); WritePrivateProfileString("Projects", szName, NULL, szIniFile); WritePrivateProfileString(szName, NULL, NULL, szIniFile); GetPrivateProfileString("General", "Last", "", szSize, 16, szIniFile); if(lstrcmpi(szName, szSize)==0) WritePrivateProfileString("General", "Last", NULL, szIniFile); PostMessage(hDlg, WM_COMMAND, IDCLEAR, 0); } break; case IDCLEAR: SendDlgItemMessage(hDlg, IDFILES, LB_RESETCONTENT, 0, 0); SetDlgItemText(hDlg, IDBATCH, ""); SetDlgItemText(hDlg, IDDEFINES, ""); SetDlgItemText(hDlg, IDTOTAL, ""); SetDlgItemText(hDlg, IDPROJECTS, ""); break; case IDPROJECTS: if(HIWORD(wParam)==CBN_SELCHANGE) { SendDlgItemMessage(hDlg, IDFILES, LB_RESETCONTENT, 0, 0); nCount=(int)SendDlgItemMessage(hDlg, IDPROJECTS, CB_GETCURSEL, 0, 0); SendDlgItemMessage(hDlg, IDPROJECTS, CB_GETLBTEXT, nCount, (LPARAM)(LPSTR)szName); LoadProject(hDlg, szName); PostMessage(hDlg, WM_COMMAND, IDCALC, 0); } break; case IDREVERT: SendDlgItemMessage(hDlg, IDFILES, LB_RESETCONTENT, 0, 0); nCount=(int)SendDlgItemMessage(hDlg, IDPROJECTS, CB_GETCURSEL, 0, 0); SendDlgItemMessage(hDlg, IDPROJECTS, CB_GETLBTEXT, nCount, (LPARAM)(LPSTR)szName); LoadProject(hDlg, szName); PostMessage(hDlg, WM_COMMAND, IDCALC, 0); break; case IDABOUT: lpDialogProc = MakeProcInstance (About, hinst); DialogBox (hinst, "AboutBox", hDlg, (DLGPROC)lpDialogProc); FreeProcInstance (lpDialogProc); break; case IDSAVE: GetDlgItemText(hDlg, IDPROJECTS, szName, MAXLEN); SaveProject(hDlg, szName); break; case IDCREATE: ofn.lStructSize=sizeof(OPENFILENAME); ofn.hwndOwner=hDlg; ofn.lpstrFilter=szSaveSpec; ofn.lpstrCustomFilter=NULL; ofn.nMaxCustFilter=0; ofn.nFilterIndex=1; ofn.lpstrFile=szFileName; ofn.nMaxFile=MAXLEN; ofn.lpstrInitialDir=NULL; ofn.lpstrFileTitle=szFileTitle; ofn.nMaxFileTitle=MAXLEN; ofn.lpstrTitle=NULL; ofn.lpstrDefExt=NULL; ofn.Flags=0; lstrcpy(szFileName, ""); lstrcpy(szFileTitle, ""); if(!GetSaveFileName((LPOPENFILENAME)&ofn)) break; hOutFile=OpenFile(ofn.lpstrFile, &ofOutFile, OF_CREATE|OF_WRITE); if(hOutFile==HFILE_ERROR) { wsprintf(szName, "Error creating file %s", ofn.lpstrFile); MessageBox(hDlg, szName, "Data Manager", MB_ICONEXCLAMATION); } else { hglb1=GlobalAlloc(GPTR, BIGBUF); lpMem1=GlobalLock(hglb1); nCount=0; while(SendDlgItemMessage(hDlg, IDFILES, LB_GETTEXT, nCount, (LPARAM)(LPSTR)szName)!=LB_ERR) { Exchange(szName, '-', '\0'); hInFile=OpenFile(szName, &ofInFile, OF_READ); SetDlgItemText(hDlg, IDSTATUS, szName); if(hInFile==HFILE_ERROR) { lstrcat(szName, "\nFile in error."); MessageBox(hDlg, szName, "Data Manager", MB_ICONEXCLAMATION); nCount=-1; } else { do { nFile=_lread(hInFile, lpMem1, BIGBUF); _lwrite(hOutFile, lpMem1, nFile); } while(nFile>0); _lclose(hInFile); nCount++; } } _lclose(hOutFile); GlobalUnlock(hglb1); GlobalFree(hglb1); SetDlgItemText(hDlg, IDSTATUS, "Ready"); } break; default: break; } } return FALSE; } //-------------------------------------------------------------------------------- void FAR PASCAL LoadProject(HWND hDlg, LPSTR lpName) { HGLOBAL hglb; LPSTR lpMem; hglb=GlobalAlloc(GPTR, BIGBUF); lpMem=GlobalLock(hglb); GetPrivateProfileString(lpName, NULL, "", lpMem, BIGBUF, szIniFile); while(*lpMem) { SendDlgItemMessage(hDlg, IDFILES, LB_ADDSTRING, 0, (LPARAM)lpMem); lpMem+=lstrlen(lpMem)+1; } GlobalUnlock(hglb); GlobalFree(hglb); SetDlgItemText(hDlg, IDSTATUS, "Loaded project OK"); } //-------------------------------------------------------------------------------- void FAR PASCAL SaveProject(HWND hDlg, LPSTR lpName) { int nCount; char szString[MAXLEN]; if(!*lpName) { MessageBox(hDlg, "Please specify a name for this project.", "Data Manager", MB_ICONEXCLAMATION|MB_OK); SetFocus(GetDlgItem(hDlg, IDPROJECTS)); return; } if(GetPrivateProfileString("Projects", lpName, "", szString, MAXLEN, szIniFile)!=0) { if(MessageBox(hDlg, "Overwrite project?", "Data Manager", MB_ICONQUESTION|MB_YESNO)!=IDYES) return; } WritePrivateProfileString(lpName, NULL, NULL, szIniFile); nCount=0; while(SendDlgItemMessage(hDlg, IDFILES, LB_GETTEXT, nCount, (LPARAM)(LPSTR)szString)!=LB_ERR) { WritePrivateProfileString(lpName, szString, "1", szIniFile); nCount++; } WritePrivateProfileString("Projects", lpName, "1", szIniFile); WritePrivateProfileString(NULL, NULL, NULL, szIniFile); SetDlgItemText(hDlg, IDSTATUS, "Saved project OK"); } //-------------------------------------------------------------------------------- void FAR PASCAL Recalc(HWND hDlg) { int nFile; int nCount=0; long lSize; char szString[MAXLEN]; while(SendDlgItemMessage(hDlg, IDFILES, LB_GETTEXT, nCount, (LPARAM)(LPSTR)szString)!=LB_ERR) { Exchange(szString, '-', '\0'); nFile=_open(szString, 0); lSize=filelength(nFile); _close(nFile); lstrcat(szString, "-"); ltoa(lSize, &szString[lstrlen(szString)], 10); SendDlgItemMessage(hDlg, IDFILES, LB_DELETESTRING, nCount, 0); SendDlgItemMessage(hDlg, IDFILES, LB_INSERTSTRING, nCount, (LPARAM)(LPSTR)szString); nCount++; } } //-------------------------------------------------------------------------------- void FAR PASCAL Exchange(LPSTR lpString, char s, char d) { while(*lpString) { if(*lpString==s) *lpString=d; lpString++; } }