#include "pch.h" #include "extra.h" #include "resource.h" #include "recact.h" #include "list.h" #include "merge.h" #include "lib3.h" #include "utils.h" // AssertData; AssertError; // // extern HANDLE vhinstCur; // current instance (from reint.c) typedef struct tagINFO { HWND hwnd; // dialog handle. node *mergeList; // list of files to query } INFO, FAR * PINFO; BOOL APIENTRY NewDlg_DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); /* externs needed */ BOOL GetWin32Info(LPSTR lpFile, LPWIN32_FIND_DATA lpFW32); char vszLocalCopy[] = "Local Database"; /**************************************************************************** * Caller entrypoint for merge conflicts dialog. */ int doMergeDialog(HWND hWnd, node *aList) { int nRet=-1; INFO sInfo; static inited=FALSE; node *currItem=aList; // There is a chance that the view window may be closed before we put up UI // in this case, we abort any merging that we thought may have gone on. if( !IsWindow(hWnd) ) { DEBUG_PRINT(("Merge: hwnd is no longer active\n")); return -1; } sInfo.mergeList = aList; DEBUG_PRINT(("attempt to open dialog\n")); if(!inited) { RecAct_Init(vhinstCur); InitCommonControls(); InitializeAll(0); // bogus param, but same as in FileSync... inited = TRUE; } nRet = DialogBoxParam(vhinstCur, MAKEINTRESOURCE(IDD_MERGE_LIST), hWnd, NewDlg_DlgProc, (LPARAM) &sInfo); DEBUG_PRINT(("return = %d (0x%08x)\n", nRet, nRet)); while(currItem) { char szBigBuf[2*MAX_PATH]; if(currItem->iFileStatus == SI_NOEXIST) { strcpy(szBigBuf, currItem->lpCP->lpServerPath); strcat(szBigBuf, currItem->lpCP->lpRemotePath); DeleteFile(szBigBuf); DEBUG_PRINT(("temp file <%s> deleted\n", szBigBuf)); } currItem= currItem->next; } // RecAct_Term(vhinstCur); return(nRet); } /**************************************************************************** * dialog stuff */ BOOL NEAR PASCAL NewDlg_OnInitDialog( PINFO this, HWND hwndFocus, LPARAM lParam) { int currCount=0; RA_ITEM item; node *currItem=this->mergeList; char szBigBuf[2*MAX_PATH]; char *szTemp; DEBUG_PRINT(("Merge:OnInitDialog\n")); while(currItem) { // insert each item into the list... item.mask = RAIF_ALL; // One of RAIF_ item.iItem = currCount++; item.uStyle=RAIS_CANMERGE; // One of RAIS_ item.uAction=currItem->uAction; // One of RAIA_ item.pszName = currItem->sFind32Local.cFileName; if (currItem->sFind32Local.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) item.uStyle = RAIS_FOLDER; memcpy(&item.siInside.fs.ftMod,&currItem->sFind32Local.ftLastWriteTime, sizeof(FILETIME)); item.siInside.fs.dwcbHighLength = currItem->sFind32Local.nFileSizeHigh; item.siInside.fs.dwcbLowLength = currItem->sFind32Local.nFileSizeLow; item.siInside.pszDir=vszLocalCopy; item.siInside.fs.fscond = FS_COND_EXISTS; item.siInside.uState=currItem->iShadowStatus; lstrcpy(szBigBuf, currItem->lpCP->lpServerPath); lstrcat(szBigBuf, currItem->lpCP->lpRemotePath); if(currItem->iFileStatus != SI_NOEXIST) { Assert(currItem->sFind32Remote.cFileName[0]); memcpy(&item.siOutside.fs.ftMod, &currItem->sFind32Remote.ftLastWriteTime, sizeof(FILETIME)); item.siOutside.fs.dwcbHighLength = currItem->sFind32Remote.nFileSizeHigh; item.siOutside.fs.dwcbLowLength = currItem->sFind32Remote.nFileSizeLow; } else { HANDLE fh; // fake up a file for a little while. fh = CreateFile(szBigBuf, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(fh==INVALID_HANDLE_VALUE) { DEBUG_PRINT(("file not created\n")); } else { DEBUG_PRINT(("temp file <%s> created\n", szBigBuf)); CloseHandle( fh ); } } szTemp = StrRChr(szBigBuf, szBigBuf+lstrlen(szBigBuf)-1, '\\'); Assert(szTemp); *szTemp = (char) 0; item.siOutside.pszDir=szBigBuf; item.siOutside.fs.fscond = FS_COND_EXISTS; item.siOutside.uState=currItem->iFileStatus; item.lParam=(LPARAM) currItem; DEBUG_PRINT(("inserting <%s> <%s %s> at %d\n", item.siInside.pszDir, item.siOutside.pszDir, item.pszName, item.iItem)); if(-1 == RecAct_InsertItem(GetDlgItem(this->hwnd, IDC_RECACTION), &item)) { #ifdef DEBUG DEBUG_PRINT(("RecAct_InsertItem failed\n")); #endif //DEBUG } else { #ifdef DEBUG DEBUG_PRINT(("RecAct_InsertItem done right!\n")); #endif //DEBUG } currItem = currItem->next; } DEBUG_PRINT(("done list\n")); return TRUE; } /***************************************************************************** * Purpose: NewDlg handle WM_COMMAND * Returns: -- * Cond: -- */ VOID NEAR PASCAL NewDlg_OnCommand( PINFO this, int id, HWND hwndCtl, UINT uNotifyCode) { HWND hwnd = this->hwnd; switch (id) { case IDOK: EndDialog(hwnd,TRUE); break; case IDCANCEL: EndDialog(hwnd,FALSE); break; default: DEBUG_PRINT(("Merge:OnCommand - Unknown id %d\n",id)); return; } } /***************************************************************************** * Purpose: NewDlg handle WM_NOTIFY * Returns: -- * Cond: -- */ BOOL NEAR PASCAL NewDlg_OnNotify( PINFO this, int idFrom, NMHDR FAR * lpnmhdr) { node *currItem; HWND hwnd = this->hwnd; NM_RECACT *pnmrecact = (NM_RECACT *) lpnmhdr; Assert(lpnmhdr); Assert(this); switch (lpnmhdr->code) { case RN_SELCHANGED: DEBUG_PRINT(("RN_SELCHANGED received\n")); return FALSE; case RN_ITEMCHANGED: if(pnmrecact->mask & RAIF_ACTION) { currItem = (node *) pnmrecact->lParam; Assert(currItem); currItem->uAction = pnmrecact->uAction; DEBUG_PRINT(("RN_ITEMCHANGED on %08x received and delt with\n", currItem->lpCP->hShadow)); } else DEBUG_PRINT(("RN_ITEMCHANGED: no RAIF_ACTION\n")); break; default: break; } return FALSE; } /***************************************************************************** * Purpose: Handle WM_DESTROY * Returns: -- * Cond: -- */ void NEAR PASCAL NewDlg_OnDestroy(PINFO this) { } /***************************************************************************** * Purpose: random * Returns: mush * Cond: -- */ BOOL APIENTRY NewDlg_DlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { PINFO this; this = (PINFO)GetWindowLong(hDlg, DWL_USER); if(!this) if(message == WM_INITDIALOG) { // lparam = the pinfo we need. Allocated from above. this = (PINFO) lParam; this->hwnd = hDlg; SetWindowLong(hDlg, DWL_USER, (LONG) lParam); } else return FALSE; // ignore everthing until we get an initdialog switch (message) { HANDLE_MSG(this, WM_INITDIALOG, NewDlg_OnInitDialog); HANDLE_MSG(this, WM_COMMAND, NewDlg_OnCommand); HANDLE_MSG(this, WM_NOTIFY, NewDlg_OnNotify); HANDLE_MSG(this, WM_DESTROY, NewDlg_OnDestroy); default: return FALSE; } }