int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam, int nCmdShow) { static int ret; static const char *m_Err; #ifdef NSIS_CONFIG_CRC_SUPPORT #ifdef NSIS_CONFIG_VISIBLE_SUPPORT static HWND hwnd; #endif static int crc; static char no_crc; static char do_crc; #endif//NSIS_CONFIG_CRC_SUPPORT #if defined(NSIS_CONFIG_SILENT_SUPPORT) && defined(NSIS_CONFIG_VISIBLE_SUPPORT) static char silent; #endif//NSIS_CONFIG_SILENT_SUPPORT && NSIS_CONFIG_VISIBLE_SUPPORT int left; #ifdef NSIS_CONFIG_VISIBLE_SUPPORT unsigned int verify_time=GetTickCount()+1000; #endif char *cmdline=state_command_line; char *realcmds; char seekchar=' '; InitCommonControls(); lstrcpyn(state_command_line,GetCommandLine(),NSIS_MAX_STRLEN); if (*cmdline == '\"') seekchar = *cmdline++; while (*cmdline && *cmdline != seekchar) if (*cmdline) cmdline++; if (*cmdline) cmdline++; realcmds=cmdline; do { #ifdef NSIS_CONFIG_CRC_SUPPORT #endif//NSIS_CONFIG_CRC_SUPPORT while (*cmdline == ' ') if (*cmdline) cmdline++; if (cmdline[0] != '/') break; cmdline++; #if defined(NSIS_CONFIG_VISIBLE_SUPPORT) && defined(NSIS_CONFIG_SILENT_SUPPORT) if (cmdline[0] == 'S' && (cmdline[1] == ' ' || !cmdline[1])) { silent++; cmdline+=2; } else #endif//NSIS_CONFIG_SILENT_SUPPORT && NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_CRC_SUPPORT if (cmdline[0] == 'N' && cmdline[1] == 'C' && cmdline[2] == 'R' && cmdline[3] == 'C' && (cmdline[4] == ' ' || !cmdline[4])) { no_crc++; cmdline+=4; } else #endif//NSIS_CONFIG_CRC_SUPPORT if (cmdline[0] == 'D' && cmdline[1] == '=') { cmdline[-2]=0; // keep this from being passed to uninstaller if necessary lstrcpy(state_install_directory,cmdline+2); cmdline+=lstrlen(cmdline); } else while (*cmdline && *cmdline != ' ') if (*cmdline) cmdline++; } while (*cmdline); lstrcpy(g_caption,_LANG_GENERIC_ERROR); g_hInstance=GetModuleHandle(NULL); GetModuleFileName(g_hInstance,state_exe_directory,NSIS_MAX_STRLEN); g_db_hFile=myOpenFile(state_exe_directory,GENERIC_READ,OPEN_EXISTING); if (g_db_hFile==INVALID_HANDLE_VALUE) { m_Err = _LANG_CANTOPENSELF; goto end; } // make state_exe_directory point to dir, not full exe. trimslashtoend(state_exe_directory); left = m_length = GetFileSize(g_db_hFile,NULL); while (left > 0) { static char temp[512]; DWORD l=left; if (l > 512) l=512; if (!ReadFile(g_db_hFile,temp,l,&l,NULL)) { m_Err=g_crcinvalid; #if defined(NSIS_CONFIG_CRC_SUPPORT) && defined(NSIS_CONFIG_VISIBLE_SUPPORT) if (hwnd) DestroyWindow(hwnd); #endif//NSIS_CONFIG_CRC_SUPPORT goto end; } if (!g_filehdrsize) { int dbl; dbl=isheader((firstheader*)temp); if (dbl) { int a=*(int*)temp; g_filehdrsize=m_pos; if (dbl > left) { m_Err=g_crcinvalid; goto end; } #if defined(NSIS_CONFIG_SILENT_SUPPORT) && defined(NSIS_CONFIG_VISIBLE_SUPPORT) if (a&FH_FLAGS_SILENT) silent++; #endif//NSIS_CONFIG_SILENT_SUPPORT && NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_CRC_SUPPORT // Changed by Amir Szekely 23rd July 2002 (CRCCheck force) if ((no_crc && !(a&FH_FLAGS_FORCE_CRC)) || !(a&FH_FLAGS_CRC)) break; // if first bit is not set, then no crc checking. do_crc++; #ifndef NSIS_CONFIG_CRC_ANAL left=dbl-4; // end crc checking at crc :) this means you can tack shit on the end and it'll still work. #else //!NSIS_CONFIG_CRC_ANAL left-=4; #endif//NSIS_CONFIG_CRC_ANAL // this is in case the end part is < 512 bytes. if (l > (DWORD)left) l=(DWORD)left; #else//!NSIS_CONFIG_CRC_SUPPORT break; #endif//!NSIS_CONFIG_CRC_SUPPORT } } #ifdef NSIS_CONFIG_CRC_SUPPORT #ifdef NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_SILENT_SUPPORT else if (!silent) #endif//NSIS_CONFIG_SILENT_SUPPORT { if (hwnd) { static MSG msg; while (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) DispatchMessage(&msg); } else if (GetTickCount() > verify_time) hwnd=CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_VERIFY),GetDesktopWindow(),verProc); } #endif//NSIS_CONFIG_VISIBLE_SUPPORT #ifndef NSIS_CONFIG_CRC_ANAL if (left<m_length) #endif//NSIS_CONFIG_CRC_ANAL crc=CRC32(crc, temp, l); #endif//NSIS_CONFIG_CRC_SUPPORT m_pos+=l; left -= l; } #ifdef NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_CRC_SUPPORT if (hwnd) DestroyWindow(hwnd); #endif//NSIS_CONFIG_CRC_SUPPORT #endif//NSIS_CONFIG_VISIBLE_SUPPORT if (!g_filehdrsize) m_Err=g_crcinvalid; else { #ifdef NSIS_CONFIG_CRC_SUPPORT if (do_crc) { DWORD l; int fcrc; SetFilePointer(g_db_hFile,m_pos,NULL,FILE_BEGIN); if (!ReadFile(g_db_hFile,&fcrc,4,&l,NULL) || crc != fcrc) { m_Err=g_crcinvalid; goto end; } } #endif//NSIS_CONFIG_CRC_SUPPORT SetFilePointer(g_db_hFile,g_filehdrsize,NULL,FILE_BEGIN); if (loadHeaders()) m_Err=g_crcinvalid; } if (m_Err) goto end; #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (g_is_uninstaller) { if (cmdline[0] == '_' && cmdline[1] == '=' && cmdline[2]) { cmdline[-1]=0; cmdline+=2; if (is_valid_instpath(cmdline)) { lstrcpy(state_install_directory,cmdline); lstrcpy(state_output_directory,cmdline); } else { m_Err = g_errorcopyinginstall; goto end; } } else { int x,done=0; for (x = 0; x < 26; x ++) { static char s[]="A~NSISu_.exe"; static char buf2[NSIS_MAX_STRLEN*2]; static char ibuf[NSIS_MAX_STRLEN]; buf2[0]='\"'; GetTempPath(sizeof(buf2)-1,buf2+1); lstrcat(buf2,s); DeleteFile(buf2+1); // clean up after all the other ones if they are there if (!done) { // get current name int l=GetModuleFileName(g_hInstance,ibuf,sizeof(ibuf)); // check if it is ?~NSISu_.exe - if so, f**k it if (!lstrcmpi(ibuf+l-(sizeof(s)-2),s+1)) break; // copy file if (CopyFile(ibuf,buf2+1,FALSE)) { HANDLE hProc; #ifdef NSIS_SUPPORT_MOVEONREBOOT MoveFileOnReboot(buf2+1,NULL); #endif if (state_install_directory[0]) lstrcpy(ibuf,state_install_directory); else trimslashtoend(ibuf); if (!is_valid_instpath(ibuf)) break; done++; lstrcat(buf2,"\" "); lstrcat(buf2,realcmds); lstrcat(buf2," _="); lstrcat(buf2,ibuf); GetTempPath(sizeof(ibuf),ibuf); hProc=myCreateProcess(buf2,ibuf); if (hProc) CloseHandle(hProc); else m_Err = g_errorcopyinginstall; } } s[0]++; } if (!done) m_Err=g_errorcopyinginstall; goto end; } } #endif//NSIS_CONFIG_UNINSTALL_SUPPORT #ifdef NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_SILENT_SUPPORT if (!g_inst_cmnheader->silent_install) g_inst_cmnheader->silent_install=silent; #endif//NSIS_CONFIG_SILENT_SUPPORT #endif//NSIS_CONFIG_VISIBLE_SUPPORT ret=ui_doinstall(); #ifdef NSIS_CONFIG_LOG log_write(1); #endif//NSIS_CONFIG_LOG end: if (g_db_hFile!=INVALID_HANDLE_VALUE) CloseHandle(g_db_hFile); #ifdef NSIS_COMPRESS_WHOLE if (dbd_hFile!=INVALID_HANDLE_VALUE) CloseHandle(dbd_hFile); #endif if (m_Err) MessageBox(NULL,m_Err,g_caption,MB_OK|MB_ICONSTOP); ExitProcess(ret); }
BOOL RegisterServer(CLSID clsid, LPTSTR lpszTitle) { int i; HKEY hKey; LRESULT lResult; DWORD dwDisp; TCHAR szSubKey[MAX_PATH]; TCHAR szCLSID[MAX_PATH]; TCHAR szModule[MAX_PATH]; LPWSTR pwsz; //get the CLSID in string form StringFromIID(clsid, &pwsz); if(pwsz) { #ifdef UNICODE lstrcpyn(szCLSID, pwsz, ARRAYSIZE(szCLSID)); #else WideCharToMultiByte( CP_ACP, 0, pwsz, -1, szCLSID, ARRAYSIZE(szCLSID), NULL, NULL); #endif //free the string CoTaskMemFree(pwsz); } //get this app's path and file name GetModuleFileName(g_hInst, szModule, ARRAYSIZE(szModule)); DOREGSTRUCT ClsidEntries[] = {HKEY_CLASSES_ROOT, TEXT("CLSID\\%s"), NULL, lpszTitle, HKEY_CLASSES_ROOT, TEXT("CLSID\\%s\\InprocServer32"), NULL, szModule, HKEY_CLASSES_ROOT, TEXT("CLSID\\%s\\InprocServer32"), TEXT("ThreadingModel"), TEXT("Apartment"), NULL, NULL, NULL, NULL}; //register the CLSID entries for(i = 0; ClsidEntries[i].hRootKey; i++) { //create the sub key string - for this case, insert the file extension wsprintf(szSubKey, ClsidEntries[i].szSubKey, szCLSID); lResult = RegCreateKeyEx( ClsidEntries[i].hRootKey, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp); if(NOERROR == lResult) { TCHAR szData[MAX_PATH]; //if necessary, create the value string wsprintf(szData, ClsidEntries[i].szData, szModule); lResult = RegSetValueEx( hKey, ClsidEntries[i].lpszValueName, 0, REG_SZ, (LPBYTE)szData, lstrlen(szData) + 1); RegCloseKey(hKey); } else return FALSE; } //If running on NT, register the extension as approved. OSVERSIONINFO osvi; osvi.dwOSVersionInfoSize = sizeof(osvi); GetVersionEx(&osvi); if(VER_PLATFORM_WIN32_NT == osvi.dwPlatformId) { lstrcpyn( szSubKey, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved"), ARRAYSIZE(szSubKey)); lResult = RegCreateKeyEx( HKEY_LOCAL_MACHINE, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp); if(NOERROR == lResult) { TCHAR szData[MAX_PATH]; //Create the value string. lstrcpyn(szData, lpszTitle, ARRAYSIZE(szData)); lResult = RegSetValueEx( hKey, szCLSID, 0, REG_SZ, (LPBYTE)szData, (lstrlen(szData) + 1) * sizeof(TCHAR)); RegCloseKey(hKey); } else return FALSE; } return TRUE; }
void ExecScript(int log) { char szRet[128] = ""; char meDLLPath[MAX_PATH]; char *executor; char *g_exec; char *pExec; unsigned int g_to; BOOL bOEM; if (!IsWOW64()) { char *p; int nComSpecSize; nComSpecSize = GetModuleFileName(g_hInst, meDLLPath, MAX_PATH) + 2; // 2 chars for quotes g_exec = (char *)GlobalAlloc(GPTR, sizeof(char)*g_stringsize+nComSpecSize+2); // 1 for space, 1 for null p = meDLLPath + nComSpecSize - 2; // point p at null char of meDLLPath *g_exec = '"'; executor = g_exec + 1; do { if (*p == '\\') break; p = CharPrev(meDLLPath, p); } while (p > meDLLPath); if (p == meDLLPath) { // bad path pushstring("error"); GlobalFree(g_exec); return; } *p = 0; GetTempFileName(meDLLPath, "ns", 0, executor); *p = '\\'; if (CopyFile(meDLLPath, executor, FALSE)) { HANDLE hFile, hMapping; LPBYTE pMapView; PIMAGE_NT_HEADERS pNTHeaders; hFile = CreateFile(executor, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING,0, 0); hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL); pMapView = MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 0); if (pMapView) { pNTHeaders = (PIMAGE_NT_HEADERS)(pMapView + ((PIMAGE_DOS_HEADER)pMapView)->e_lfanew); pNTHeaders->FileHeader.Characteristics = IMAGE_FILE_32BIT_MACHINE | IMAGE_FILE_LOCAL_SYMS_STRIPPED | IMAGE_FILE_LINE_NUMS_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE; pNTHeaders->OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI; pNTHeaders->OptionalHeader.AddressOfEntryPoint = (DWORD)WinMain - (DWORD)g_hInst; UnmapViewOfFile(pMapView); } CloseHandle(hMapping); CloseHandle(hFile); } lstrcat(g_exec, "\""); // add space pExec = g_exec + lstrlen(g_exec); *pExec = ' '; pExec++; } else { executor = NULL; g_exec = (char *)GlobalAlloc(GPTR, sizeof(char)*g_stringsize+1); // 1 for null pExec = g_exec; } g_to = 0; // default is no timeout bOEM = FALSE; // default is no OEM->ANSI conversion g_hwndList = NULL; if (g_hwndParent) g_hwndList = FindWindowEx(FindWindowEx(g_hwndParent,NULL,"#32770",NULL),NULL,"SysListView32",NULL); params: popstring(pExec); if (my_strstr(pExec, "/TIMEOUT=") == pExec) { char *szTimeout = pExec + 9; g_to = my_atoi(szTimeout); *pExec = 0; goto params; } if (!lstrcmpi(pExec, "/OEM")) { bOEM = TRUE; *pExec = 0; goto params; } if (!pExec[0]) { pushstring("error"); *(pExec-2) = '\0'; // skip space and quote if (executor) DeleteFile(executor); GlobalFree(g_exec); return; } { STARTUPINFO si={sizeof(si),}; SECURITY_ATTRIBUTES sa={sizeof(sa),}; SECURITY_DESCRIPTOR sd={0,}; PROCESS_INFORMATION pi={0,}; OSVERSIONINFO osv={sizeof(osv)}; HANDLE newstdout=0,read_stdout=0; HANDLE newstdin=0,read_stdin=0; DWORD dwRead = 1; DWORD dwExit = 0; DWORD dwWait = WAIT_TIMEOUT; DWORD dwLastOutput; static char szBuf[1024]; HGLOBAL hUnusedBuf = NULL; char *szUnusedBuf = 0; if (log) { hUnusedBuf = GlobalAlloc(GHND, log & 2 ? g_stringsize : sizeof(szBuf)*4); if (!hUnusedBuf) { lstrcpy(szRet, "error"); goto done; } szUnusedBuf = (char *)GlobalLock(hUnusedBuf); } GetVersionEx(&osv); if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) { InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sd,true,NULL,false); sa.lpSecurityDescriptor = &sd; } else sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = true; if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) { lstrcpy(szRet, "error"); goto done; } if (!CreatePipe(&read_stdin,&newstdin,&sa,0)) { lstrcpy(szRet, "error"); goto done; } GetStartupInfo(&si); si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdInput = newstdin; si.hStdOutput = newstdout; si.hStdError = newstdout; if (!CreateProcess(NULL,g_exec,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi)) { lstrcpy(szRet, "error"); goto done; } dwLastOutput = GetTickCount(); while (dwWait != WAIT_OBJECT_0 || dwRead) { PeekNamedPipe(read_stdout, 0, 0, 0, &dwRead, NULL); if (dwRead) { dwLastOutput = GetTickCount(); ReadFile(read_stdout, szBuf, sizeof(szBuf)-1, &dwRead, NULL); szBuf[dwRead] = 0; if (log) { char *p, *p2; SIZE_T iReqLen = lstrlen(szBuf) + lstrlen(szUnusedBuf); if (GlobalSize(hUnusedBuf) < iReqLen && (iReqLen < g_stringsize || !(log & 2))) { GlobalUnlock(hUnusedBuf); hUnusedBuf = GlobalReAlloc(hUnusedBuf, iReqLen+sizeof(szBuf), GHND); if (!hUnusedBuf) { lstrcpy(szRet, "error"); break; } szUnusedBuf = (char *)GlobalLock(hUnusedBuf); } p = szUnusedBuf; // get the old left overs if (iReqLen < g_stringsize || !(log & 2)) lstrcat(p, szBuf); else { lstrcpyn(p + lstrlen(p), szBuf, g_stringsize - lstrlen(p)); } if (!(log & 2)) { while ((p = my_strstr(p, "\t"))) { if ((int)(p - szUnusedBuf) > (int)(GlobalSize(hUnusedBuf) - TAB_REPLACE_SIZE - 1)) { *p++ = ' '; } else { int len = lstrlen(p); char *c_out=(char*)p+TAB_REPLACE_SIZE+len; char *c_in=(char *)p+len; while (len-- > 0) { *c_out--=*c_in--; } lstrcpy(p, TAB_REPLACE); p += TAB_REPLACE_SIZE; *p = ' '; } } p = szUnusedBuf; // get the old left overs for (p2 = p; *p2;) { if (*p2 == '\r') { *p2++ = 0; continue; } if (*p2 == '\n') { *p2 = 0; while (!*p && p != p2) p++; LogMessage(p, bOEM); p = ++p2; continue; } p2 = CharNext(p2); } // If data was taken out from the unused buffer, move p contents to the start of szUnusedBuf if (p != szUnusedBuf) { char *p2 = szUnusedBuf; while (*p) *p2++ = *p++; *p2 = 0; } } } } else { if (g_to && GetTickCount() > dwLastOutput+g_to) { TerminateProcess(pi.hProcess, -1); lstrcpy(szRet, "timeout"); } else Sleep(LOOPTIMEOUT); } dwWait = WaitForSingleObject(pi.hProcess, 0); GetExitCodeProcess(pi.hProcess, &dwExit); PeekNamedPipe(read_stdout, 0, 0, 0, &dwRead, NULL); } done: if (log & 2) pushstring(szUnusedBuf); if (log & 1 && *szUnusedBuf) LogMessage(szUnusedBuf, bOEM); if ( dwExit == STATUS_ILLEGAL_INSTRUCTION ) lstrcpy(szRet, "error"); if (!szRet[0]) wsprintf(szRet,"%d",dwExit); pushstring(szRet); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); CloseHandle(newstdout); CloseHandle(read_stdout); CloseHandle(newstdin); CloseHandle(read_stdin); *(pExec-2) = '\0'; // skip space and quote if (executor) DeleteFile(executor); GlobalFree(g_exec); if (log) { GlobalUnlock(hUnusedBuf); GlobalFree(hUnusedBuf); } } }
BOOL CALLBACK VerticalFileSwitcher::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG : { _fileListView.init(_hInst, _hSelf, _hImaLst); _fileListView.insertColumn(TEXT("Name"), 150, 0); _fileListView.insertColumn(TEXT("Ext."), 50, 1); _fileListView.initList(); _fileListView.display(); return TRUE; } case WM_NOTIFY: { switch (((LPNMHDR)lParam)->code) { case NM_DBLCLK: { LPNMITEMACTIVATE lpnmitem = (LPNMITEMACTIVATE) lParam; int i = lpnmitem->iItem; if (i == -1) { ::SendMessage(_hParent, WM_COMMAND, IDM_FILE_NEW, 0); } return TRUE; } case NM_CLICK: { if ((0x80 & GetKeyState(VK_CONTROL)) || (0x80 & GetKeyState(VK_SHIFT))) return TRUE; LPNMITEMACTIVATE lpnmitem = (LPNMITEMACTIVATE) lParam; int nbItem = ListView_GetItemCount(_fileListView.getHSelf()); int i = lpnmitem->iItem; if (i == -1 || i >= nbItem) return TRUE; LVITEM item; item.mask = LVIF_PARAM; item.iItem = i; ListView_GetItem(((LPNMHDR)lParam)->hwndFrom, &item); TaskLstFnStatus *tlfs = (TaskLstFnStatus *)item.lParam; activateDoc(tlfs); return TRUE; } case NM_RCLICK : { // Switch to the right document LPNMITEMACTIVATE lpnmitem = (LPNMITEMACTIVATE) lParam; int nbItem = ListView_GetItemCount(_fileListView.getHSelf()); if (nbItem == 1) { int i = lpnmitem->iItem; if (i == -1 || i >= nbItem) return TRUE; LVITEM item; item.mask = LVIF_PARAM; item.iItem = i; ListView_GetItem(((LPNMHDR)lParam)->hwndFrom, &item); TaskLstFnStatus *tlfs = (TaskLstFnStatus *)item.lParam; activateDoc(tlfs); } // Redirect NM_RCLICK message to Notepad_plus handle NMHDR nmhdr; nmhdr.code = NM_RCLICK; nmhdr.hwndFrom = _hSelf; nmhdr.idFrom = ::GetDlgCtrlID(nmhdr.hwndFrom); ::SendMessage(_hParent, WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr); return TRUE; } case LVN_GETINFOTIP: { LPNMLVGETINFOTIP pGetInfoTip = (LPNMLVGETINFOTIP)lParam; int i = pGetInfoTip->iItem; if (i == -1) return TRUE; generic_string fn = getFullFilePath((size_t)i); lstrcpyn(pGetInfoTip->pszText, fn.c_str(), pGetInfoTip->cchTextMax); return TRUE; } case LVN_COLUMNCLICK: { LPNMLISTVIEW pnmLV = (LPNMLISTVIEW)lParam; setHeaderOrder(pnmLV); ListView_SortItemsEx(pnmLV->hdr.hwndFrom, ListViewCompareProc,(LPARAM)pnmLV); return TRUE; } case LVN_KEYDOWN: { switch (((LPNMLVKEYDOWN)lParam)->wVKey) { case VK_RETURN: { int i = ListView_GetSelectionMark(_fileListView.getHSelf()); if (i == -1) return TRUE; LVITEM item; item.mask = LVIF_PARAM; item.iItem = i; ListView_GetItem(((LPNMHDR)lParam)->hwndFrom, &item); TaskLstFnStatus *tlfs = (TaskLstFnStatus *)item.lParam; activateDoc(tlfs); return TRUE; } default: break; } } break; default: break; } } return TRUE; case WM_SIZE: { int width = LOWORD(lParam); int height = HIWORD(lParam); ::MoveWindow(_fileListView.getHSelf(), 0, 0, width, height, TRUE); break; } case WM_DESTROY: { _fileListView.destroy(); break; } default : return DockingDlgInterface::run_dlgProc(message, wParam, lParam); } return DockingDlgInterface::run_dlgProc(message, wParam, lParam); }
int Backup(TCHAR* backup_filename) { TCHAR source_file[MAX_PATH] = {0}, dest_file[MAX_PATH] = {0}; TCHAR* backupfolder,* pathtmp,* puText; HWND progress_dialog; DWORD start_time = GetTickCount64(); int i; size_t dest_file_len; CallService(MS_DB_GETPROFILENAMET, MAX_PATH, (LPARAM)dbname); if (backup_filename == NULL) { int err = 0; SYSTEMTIME st; TCHAR buffer[MAX_COMPUTERNAME_LENGTH + 1 ]; //GetComputerName (buffer , & size); DWORD size = sizeof(buffer); /* Buffer size is chosen large enough to contain any DNS name, not just MAX_COMPUTERNAME_LENGTH + 1 */ /* characters. MAX_COMPUTERNAME_LENGTH is usually less than 32, but it varies among systems, so we */ /* cannot use the constant in a precompiled Windows agent, which is expected to work on any system. */ backupfolder = Utils_ReplaceVarsT(options.folder); // ensure the backup folder exists (either create it or return non-zero signifying error) err = CreateDirectoryTree(backupfolder); if(err != ERROR_ALREADY_EXISTS && err != 0) { return 1; } GetLocalTime(&st); GetComputerName(buffer, &size); mir_sntprintf(dest_file, MAX_PATH, _T("%s\\%s_%02d.%02d.%02d@%02d-%02d-%02d_%s.bak"), backupfolder, dbname, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, buffer); mir_free(backupfolder); } else lstrcpyn(dest_file, backup_filename, MAX_PATH); if(!options.disable_popups) ShowPopup(dbname, TranslateT("Backup in Progress")); if(!options.disable_progress) { progress_dialog = CreateDialog(hInst, MAKEINTRESOURCE(IDD_COPYPROGRESS), 0, (DLGPROC)DlgProcProgress); SetDlgItemText(progress_dialog, IDC_PROGRESSMESSAGE, TranslateT("Rotating backup files...")); } RotateBackups(progress_dialog, start_time); SetDlgItemText(progress_dialog, 0xDAED, TranslateT("Copying database file...")); SendMessage(progress_dialog, PBM_SETPOS, (WPARAM)(int)(0), 0); UpdateWindow(progress_dialog); mir_sntprintf(source_file, MAX_PATH, _T("%s\\%s"), profilePath, dbname); pathtmp = Utils_ReplaceVarsT(source_file); if (CopyFile(pathtmp, dest_file, 0)) { SendMessage(progress_dialog, PBM_SETPOS, (WPARAM)(int)(100), 0); UpdateWindow(progress_dialog); DBWriteContactSettingDword(0, "AutoBackups", "LastBackupTimestamp", (DWORD)time(0)); if(!options.disable_popups) { dest_file_len = lstrlen(dest_file); if(dest_file_len > 50) { puText = mir_alloc(sizeof(TCHAR) * (dest_file_len + 2)); for(i = (int)dest_file_len - 1; dest_file[i] != _T('\\'); i--); lstrcpyn(puText, dest_file, i + 2); lstrcat(puText, _T("\n")); lstrcat(puText, dest_file + i + 1); } else puText = mir_tstrdup(dest_file); ShowPopup(puText, TranslateT("Database backuped")); mir_free(puText); } } else DeleteFile(dest_file); mir_free(pathtmp); DestroyWindow(progress_dialog); return 0; }
void RebuildEntireListInternal(HWND hwnd, ClcData *tmp_dat, BOOL call_orig) { ClcData *dat = (ClcData*)tmp_dat; struct ClcGroup *group; struct ClcContact *item; TCHAR tmp[1024]; TCHAR count[128]; TCHAR template_contact[1024]; TCHAR template_group[1024]; TCHAR template_divider[1024]; TCHAR template_info[1024]; TCHAR *text; size_t size; int selection = dat->selection; BOOL has_focus = (GetFocus() == dat->hwnd_list || GetFocus() == hwnd); if (call_orig) coreCli.pfnRebuildEntireList(hwnd, (ClcData*)dat); MyDBGetContactSettingTString(NULL, "CLC", "TemplateContact", template_contact, 1024, TranslateT("%name% [%status% %protocol%] %status_message%")); MyDBGetContactSettingTString(NULL, "CLC", "TemplateGroup", template_group, 1024, TranslateT("Group: %name% %count% [%mode%]")); MyDBGetContactSettingTString(NULL, "CLC", "TemplateDivider", template_divider, 1024, TranslateT("Divider: %s")); MyDBGetContactSettingTString(NULL, "CLC", "TemplateInfo", template_info, 1024, TranslateT("Info: %s")); SendMessage(dat->hwnd_list, WM_SETREDRAW, FALSE, 0); // Reset content SendMessage(dat->hwnd_list, LB_RESETCONTENT, 0, 0); // Set font SendMessage(dat->hwnd_list, WM_SETFONT, (WPARAM) dat->fontInfo[FONTID_CONTACTS].hFont, 0); // Add all items to the list group = &dat->list; group->scanIndex = 0; text = tmp; size = MAX_REGS(tmp); while(1) { if (group->scanIndex == group->cl.count) { group = group->parent; if (group == NULL) break; text -= 2; size += 2; group->scanIndex++; continue; } item = group->cl.items[group->scanIndex]; text[0] = _T('\0'); switch(item->type) { case CLCIT_GROUP: { char *szCounts = pcli->pfnGetGroupCountsText((ClcData*)dat, item); const TCHAR *t[] = { _T("%name%"), _T("%count%"), _T("%mode%") }; const TCHAR *v[] = { item->szText, count, item->group->expanded ? TranslateT("Expanded") : TranslateT("Collapsed") }; TCHAR *txt; if (szCounts[0] != '\0') { #ifdef UNICODE mir_sntprintf(count, MAX_REGS(count), L"%S ", szCounts); #else mir_sntprintf(count, MAX_REGS(count), "%s ", szCounts); #endif } else { count[0] = _T('\0'); } txt = ParseText(template_group, t, MAX_REGS(t), v, MAX_REGS(v)); if (txt != NULL) lstrcpyn(text, txt, (int)size); mir_free(txt); break; } case CLCIT_CONTACT: { char *szCounts = pcli->pfnGetGroupCountsText((ClcData*)dat, item); const TCHAR *t[] = { _T("%name%"), _T("%status%"), _T("%protocol%"), _T("%status_message%") }; const TCHAR *v[] = { item->szText, GetStatusName(item), GetProtoName(item), GetStatusMessage(item) }; TCHAR *txt = ParseText(template_contact, t, MAX_REGS(t), v, MAX_REGS(v)); if (txt != NULL) lstrcpyn(text, txt, (int)size); mir_free(txt); break; } case CLCIT_DIVIDER: { mir_sntprintf(text, size, template_divider, item->szText); break; } case CLCIT_INFO: { mir_sntprintf(text, size, template_info, item->szText); break; } } SendMessage(dat->hwnd_list, LB_ADDSTRING, 0, (LPARAM) tmp); if (item->type == CLCIT_GROUP && item->group->expanded) { group = item->group; text[0] = _T(' '); text[1] = _T(' '); text += 2; size -= 2; group->scanIndex = 0; continue; } group->scanIndex++; } SendMessage(dat->hwnd_list, WM_SETREDRAW, TRUE, 0); InvalidateRect(dat->hwnd_list, NULL, TRUE); dat->selection = selection; SendMessage(dat->hwnd_list, LB_SETCURSEL, dat->selection, 0); if (has_focus) SetFocus(dat->hwnd_list); dat->need_rebuild = FALSE; }
LRESULT CALLBACK ContactListControlWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { ClcContact *contact; ClcGroup *group; BOOL frameHasTitlebar = FALSE; if (wndFrameCLC) frameHasTitlebar = wndFrameCLC->TitleBar.ShowTitleBar; ClcData *dat = (struct ClcData *) GetWindowLongPtr(hwnd, 0); if (msg >= CLM_FIRST && msg < CLM_LAST) return ProcessExternalMessages(hwnd, dat, msg, wParam, lParam); switch (msg) { case WM_CREATE: dat = (struct ClcData *)mir_alloc(sizeof(struct ClcData)); memset(dat, 0, sizeof(struct ClcData)); SetWindowLongPtr(hwnd, 0, (LONG_PTR)dat); RowHeight::Init(dat); dat->forceScroll = 0; dat->lastRepaint = 0; dat->hwndParent = GetParent(hwnd); dat->lastSort = GetTickCount(); dat->needsResort = FALSE; { CREATESTRUCT *cs = (CREATESTRUCT *)lParam; if (cs->lpCreateParams == (LPVOID)0xff00ff00) { dat->bisEmbedded = FALSE; dat->bHideSubcontacts = TRUE; cfg::clcdat = dat; if (cfg::dat.bShowLocalTime) SetTimer(hwnd, TIMERID_REFRESH, 65000, NULL); } else dat->bisEmbedded = TRUE; } break; case WM_SIZE: pcli->pfnEndRename(hwnd, dat, 1); KillTimer(hwnd, TIMERID_INFOTIP); KillTimer(hwnd, TIMERID_RENAME); pcli->pfnRecalcScrollBar(hwnd, dat); LBL_Def: return DefWindowProc(hwnd, msg, wParam, lParam); case WM_NCCALCSIZE: return FrameNCCalcSize(hwnd, DefWindowProc, wParam, lParam, frameHasTitlebar); /* * scroll bar handling */ case WM_NCPAINT: return FrameNCPaint(hwnd, DefWindowProc, wParam, lParam, frameHasTitlebar); case INTM_GROUPCHANGED: { WORD iExtraImage[EXTRA_ICON_COUNT]; BYTE flags = 0; if (!FindItem(hwnd, dat, (HANDLE)wParam, &contact, NULL, NULL)) memset(iExtraImage, 0xFF, sizeof(iExtraImage)); else { memcpy(iExtraImage, contact->iExtraImage, sizeof(iExtraImage)); flags = contact->flags; } pcli->pfnDeleteItemFromTree(hwnd, wParam); if (GetWindowLongPtr(hwnd, GWL_STYLE) & CLS_SHOWHIDDEN || !CLVM_GetContactHiddenStatus(wParam, NULL, dat)) { pcli->pfnAddContactToTree(hwnd, dat, wParam, 1, 1); if (FindItem(hwnd, dat, (HANDLE)wParam, &contact, NULL, NULL)) { memcpy(contact->iExtraImage, iExtraImage, sizeof(iExtraImage)); if (flags & CONTACTF_CHECKED) contact->flags |= CONTACTF_CHECKED; } NMCLISTCONTROL nm; nm.hdr.code = CLN_CONTACTMOVED; nm.hdr.hwndFrom = hwnd; nm.hdr.idFrom = GetDlgCtrlID(hwnd); nm.flags = 0; nm.hItem = (HANDLE)wParam; SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)&nm); } dat->needsResort = TRUE; PostMessage(hwnd, INTM_SORTCLC, 0, 1); } goto LBL_Def; case INTM_ICONCHANGED: { int recalcScrollBar = 0; MCONTACT hContact = wParam; WORD status = ID_STATUS_OFFLINE; int contactRemoved = 0; MCONTACT hSelItem = NULL; ClcContact *selcontact = NULL; char *szProto = GetContactProto(hContact); if (szProto == NULL) status = ID_STATUS_OFFLINE; else status = cfg::getWord(hContact, szProto, "Status", ID_STATUS_OFFLINE); int shouldShow = (GetWindowLongPtr(hwnd, GWL_STYLE) & CLS_SHOWHIDDEN || !CLVM_GetContactHiddenStatus(hContact, szProto, dat)) && ((cfg::dat.bFilterEffective ? TRUE : !pcli->pfnIsHiddenMode(dat, status)) || pcli->pfnGetContactIcon(hContact) != lParam); // XXX CLVM changed - this means an offline msg is flashing, so the contact should be shown if (!FindItem(hwnd, dat, (HANDLE)hContact, &contact, &group, NULL)) { if (shouldShow && CallService(MS_DB_CONTACT_IS, wParam, 0)) { if (dat->selection >= 0 && pcli->pfnGetRowByIndex(dat, dat->selection, &selcontact, NULL) != -1) hSelItem = (MCONTACT)pcli->pfnContactToHItem(selcontact); pcli->pfnAddContactToTree(hwnd, dat, hContact, 0, 0); recalcScrollBar = 1; FindItem(hwnd, dat, (HANDLE)hContact, &contact, NULL, NULL); if (contact) { contact->iImage = (WORD)lParam; pcli->pfnNotifyNewContact(hwnd, hContact); } } } else { //item in list already DWORD style = GetWindowLongPtr(hwnd, GWL_STYLE); if (contact->iImage == (WORD)lParam) break; if (!shouldShow && !(style & CLS_NOHIDEOFFLINE) && (style & CLS_HIDEOFFLINE || group->hideOffline || cfg::dat.bFilterEffective)) { // CLVM changed if (dat->selection >= 0 && pcli->pfnGetRowByIndex(dat, dat->selection, &selcontact, NULL) != -1) hSelItem = (MCONTACT)pcli->pfnContactToHItem(selcontact); pcli->pfnRemoveItemFromGroup(hwnd, group, contact, 0); contactRemoved = TRUE; recalcScrollBar = 1; } else { contact->iImage = (WORD)lParam; if (!pcli->pfnIsHiddenMode(dat, status)) contact->flags |= CONTACTF_ONLINE; else contact->flags &= ~CONTACTF_ONLINE; } } if (hSelItem) { ClcGroup *selgroup; if (pcli->pfnFindItem(hwnd, dat, hSelItem, &selcontact, &selgroup, NULL)) dat->selection = pcli->pfnGetRowsPriorTo(&dat->list, selgroup, List_IndexOf((SortedList*)& selgroup->cl, selcontact)); else dat->selection = -1; } dat->needsResort = TRUE; PostMessage(hwnd, INTM_SORTCLC, 0, recalcScrollBar); PostMessage(hwnd, INTM_INVALIDATE, 0, (LPARAM)(contactRemoved ? 0 : wParam)); if (recalcScrollBar) pcli->pfnRecalcScrollBar(hwnd, dat); } goto LBL_Def; case INTM_METACHANGED: if (!pcli->pfnFindItem(hwnd, dat, wParam, &contact, NULL, NULL)) break; if (contact->bIsMeta && !(cfg::dat.dwFlags & CLUI_USEMETAICONS)) { contact->hSubContact = db_mc_getMostOnline(contact->hContact); contact->metaProto = GetContactProto(contact->hSubContact); contact->iImage = pcli->pfnGetContactIcon(contact->hSubContact); if (contact->pExtra) { TExtraCache *pSub = cfg::getCache(contact->hSubContact, contact->metaProto); ClcContact *subContact; if (!pcli->pfnFindItem(hwnd, dat, contact->hSubContact, &subContact, NULL, NULL)) break; contact->pExtra->proto_status_item = GetProtocolStatusItem(contact->metaProto); if (pSub) { contact->pExtra->status_item = pSub->status_item; memcpy(contact->iExtraImage, subContact->iExtraImage, sizeof(contact->iExtraImage)); } } } SendMessage(hwnd, INTM_NAMEORDERCHANGED, wParam, lParam); goto LBL_Def; case INTM_METACHANGEDEVENT: if (!FindItem(hwnd, dat, (HANDLE)wParam, &contact, NULL, NULL)) break; if (lParam == 0) pcli->pfnInitAutoRebuild(hwnd); goto LBL_Def; case INTM_NAMECHANGED: ClcContact *contact; if (!FindItem(hwnd, dat, (HANDLE)wParam, &contact, NULL, NULL)) break; lstrcpyn(contact->szText, pcli->pfnGetContactDisplayName(wParam, 0), SIZEOF(contact->szText)); RTL_DetectAndSet(contact, 0); dat->needsResort = TRUE; PostMessage(hwnd, INTM_SORTCLC, 0, 0); goto LBL_Def; case INTM_CODEPAGECHANGED: if (!FindItem(hwnd, dat, (HANDLE)wParam, &contact, NULL, NULL)) break; contact->codePage = cfg::getDword(wParam, "Tab_SRMsg", "ANSIcodepage", cfg::getDword(wParam, "UserInfo", "ANSIcodepage", CP_ACP)); PostMessage(hwnd, INTM_INVALIDATE, 0, 0); goto LBL_Def; case INTM_AVATARCHANGED: { avatarCacheEntry *cEntry = (struct avatarCacheEntry *)lParam; contact = NULL; if (wParam == 0) { //RemoveFromImgCache(0, cEntry); cfg::dat.bForceRefetchOnPaint = TRUE; RedrawWindow(hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW); cfg::dat.bForceRefetchOnPaint = FALSE; goto LBL_Def; } if (!FindItem(hwnd, dat, (HANDLE)wParam, &contact, NULL, NULL)) return 0; contact->ace = cEntry; if (cEntry == NULL) contact->cFlags &= ~ECF_AVATAR; else { DWORD dwFlags; if (contact->pExtra) dwFlags = contact->pExtra->dwDFlags; else dwFlags = cfg::getDword(contact->hContact, "CList", "CLN_Flags", 0); if (cfg::dat.dwFlags & CLUI_FRAME_AVATARS) contact->cFlags = (dwFlags & ECF_HIDEAVATAR ? contact->cFlags & ~ECF_AVATAR : contact->cFlags | ECF_AVATAR); else contact->cFlags = (dwFlags & ECF_FORCEAVATAR ? contact->cFlags | ECF_AVATAR : contact->cFlags & ~ECF_AVATAR); } PostMessage(hwnd, INTM_INVALIDATE, 0, (LPARAM)contact->hContact); } goto LBL_Def; case INTM_STATUSMSGCHANGED: { TExtraCache *p; char *szProto = NULL; if (!FindItem(hwnd, dat, (HANDLE)wParam, &contact, NULL, NULL)) p = cfg::getCache(wParam, NULL); else { p = contact->pExtra; szProto = contact->proto; } GetCachedStatusMsg(p, szProto); PostMessage(hwnd, INTM_INVALIDATE, 0, (LPARAM)(contact ? contact->hContact : 0)); } goto LBL_Def; case INTM_STATUSCHANGED: if (FindItem(hwnd, dat, (HANDLE)wParam, &contact, NULL, NULL)) { WORD wStatus = cfg::getWord(wParam, contact->proto, "Status", ID_STATUS_OFFLINE); if (cfg::dat.bNoOfflineAvatars && wStatus != ID_STATUS_OFFLINE && contact->wStatus == ID_STATUS_OFFLINE) { contact->wStatus = wStatus; if (cfg::dat.bAvatarServiceAvail && contact->ace == NULL) LoadAvatarForContact(contact); } contact->wStatus = wStatus; goto LBL_Def; } break; case INTM_PROTOCHANGED: if (!FindItem(hwnd, dat, (HANDLE)wParam, &contact, NULL, NULL)) break; contact->proto = GetContactProto(wParam); CallService(MS_CLIST_INVALIDATEDISPLAYNAME, wParam, 0); lstrcpyn(contact->szText, pcli->pfnGetContactDisplayName(wParam, 0), SIZEOF(contact->szText)); RTL_DetectAndSet(contact, 0); dat->needsResort = TRUE; PostMessage(hwnd, INTM_SORTCLC, 0, 0); goto LBL_Def; case INTM_INVALIDATE: if (!dat->bNeedPaint) { KillTimer(hwnd, TIMERID_PAINT); SetTimer(hwnd, TIMERID_PAINT, 100, NULL); dat->bNeedPaint = TRUE; } goto LBL_Def; case INTM_INVALIDATECONTACT: if (!FindItem(hwnd, dat, (HANDLE)wParam, &contact, &group, NULL)) break; if (contact == 0 || group == 0) break; { int iItem = pcli->pfnGetRowsPriorTo(&dat->list, group, List_IndexOf((SortedList*) & group->cl, contact)); pcli->pfnInvalidateItem(hwnd, dat, iItem); } goto LBL_Def; case INTM_FORCESORT: dat->needsResort = TRUE; return SendMessage(hwnd, INTM_SORTCLC, wParam, lParam); case INTM_SORTCLC: if (dat->needsResort) { pcli->pfnSortCLC(hwnd, dat, TRUE); dat->needsResort = FALSE; } if (lParam) pcli->pfnRecalcScrollBar(hwnd, dat); goto LBL_Def; case INTM_IDLECHANGED: if (FindItem(hwnd, dat, (HANDLE)wParam, &contact, NULL, NULL)) { DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING *) lParam; char *szProto = (char*)cws->szModule; if (szProto == NULL) break; contact->flags &= ~CONTACTF_IDLE; if (cfg::getDword(wParam, szProto, "IdleTS", 0)) { contact->flags |= CONTACTF_IDLE; } PostMessage(hwnd, INTM_INVALIDATE, 0, (LPARAM)contact->hContact); goto LBL_Def; } break; case INTM_XSTATUSCHANGED: { DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING *) lParam; char *szProto = (char *)cws->szModule; MCONTACT hContact = wParam; TExtraCache *p; if (!FindItem(hwnd, dat, (HANDLE)hContact, &contact, NULL, NULL)) { p = cfg::getCache(hContact, szProto); if (!dat->bisEmbedded && szProto) { // may be a subcontact, forward the xstatus MCONTACT hMasterContact = db_mc_getMeta(hContact); if (hMasterContact && hMasterContact != hContact) // avoid recursive call of settings handler cfg::writeByte(hMasterContact, META_PROTO, "XStatusId", (BYTE)cfg::getByte(hContact, szProto, "XStatusId", 0)); break; } } else { contact->xStatus = cfg::getByte(hContact, szProto, "XStatusId", 0); p = contact->pExtra; } if (szProto == NULL) break; if (contact) { if (ProtoServiceExists(szProto, PS_GETADVANCEDSTATUSICON)) { int iconId = ProtoCallService(szProto, PS_GETADVANCEDSTATUSICON, hContact, 0); if (iconId != -1) contact->xStatusIcon = iconId >> 16; } } GetCachedStatusMsg(p, szProto); PostMessage(hwnd, INTM_INVALIDATE, 0, (LPARAM)(contact ? contact->hContact : 0)); } goto LBL_Def; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); if (IsWindowVisible(hwnd) && !during_sizing && !cfg::shutDown) { PaintClc(hwnd, dat, hdc, &ps.rcPaint); dat->bNeedPaint = FALSE; dat->lastRepaint = GetTickCount(); } EndPaint(hwnd, &ps); if (dat->selection != dat->oldSelection && !dat->bisEmbedded && g_ButtonItems != NULL) { SetDBButtonStates(0); dat->oldSelection = dat->selection; } } goto LBL_Def; case WM_MOUSEWHEEL: dat->forceScroll = TRUE; break; case WM_TIMER: if (wParam == TIMERID_PAINT) { KillTimer(hwnd, TIMERID_PAINT); InvalidateRect(hwnd, NULL, FALSE); goto LBL_Def; } if (wParam == TIMERID_REFRESH) { InvalidateRect(hwnd, NULL, FALSE); goto LBL_Def; } break; case WM_LBUTTONDBLCLK: ReleaseCapture(); dat->iHotTrack = -1; pcli->pfnHideInfoTip(hwnd, dat); KillTimer(hwnd, TIMERID_RENAME); KillTimer(hwnd, TIMERID_INFOTIP); dat->szQuickSearch[0] = 0; { DWORD hitFlags; dat->selection = HitTest(hwnd, dat, (short) LOWORD(lParam), (short) HIWORD(lParam), &contact, NULL, &hitFlags); if (hitFlags & CLCHT_ONITEMEXTRA) break; InvalidateRect(hwnd, NULL, FALSE); if (dat->selection != -1) pcli->pfnEnsureVisible(hwnd, dat, dat->selection, 0); if (hitFlags & CLCHT_ONAVATAR && cfg::dat.bDblClkAvatars) { CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)contact->hContact, 0); return TRUE; } if (hitFlags & (CLCHT_ONITEMICON | CLCHT_ONITEMLABEL | CLCHT_ONITEMSPACE)) { UpdateWindow(hwnd); pcli->pfnDoSelectionDefaultAction(hwnd, dat); } } return TRUE; case WM_CONTEXTMENU: { HMENU hMenu = NULL; POINT pt; DWORD hitFlags; pcli->pfnEndRename(hwnd, dat, 1); pcli->pfnHideInfoTip(hwnd, dat); KillTimer(hwnd, TIMERID_RENAME); KillTimer(hwnd, TIMERID_INFOTIP); if (GetFocus() != hwnd) SetFocus(hwnd); dat->iHotTrack = -1; dat->szQuickSearch[0] = 0; pt.x = (short) LOWORD(lParam); pt.y = (short) HIWORD(lParam); if (pt.x == -1 && pt.y == -1) { dat->selection = pcli->pfnGetRowByIndex(dat, dat->selection, &contact, NULL); if (dat->selection != -1) pcli->pfnEnsureVisible(hwnd, dat, dat->selection, 0); pt.x = dat->iconXSpace + 15; pt.y = RowHeight::getItemTopY(dat, dat->selection) - dat->yScroll + (int)(dat->row_heights[dat->selection] * .7); hitFlags = dat->selection == -1 ? CLCHT_NOWHERE : CLCHT_ONITEMLABEL; } else { ScreenToClient(hwnd, &pt); dat->selection = HitTest(hwnd, dat, pt.x, pt.y, &contact, NULL, &hitFlags); } InvalidateRect(hwnd, NULL, FALSE); if (dat->selection != -1) pcli->pfnEnsureVisible(hwnd, dat, dat->selection, 0); UpdateWindow(hwnd); if (dat->selection != -1 && hitFlags & (CLCHT_ONITEMICON | CLCHT_ONITEMCHECK | CLCHT_ONITEMLABEL)) { if (contact->type == CLCIT_GROUP) { hMenu = (HMENU)CallService(MS_CLIST_MENUBUILDSUBGROUP, (WPARAM)contact->group, 0); ClientToScreen(hwnd, &pt); TrackPopupMenu(hMenu, TPM_TOPALIGN | TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, pcli->hwndContactList, NULL); CheckMenuItem(hMenu, POPUP_GROUPHIDEOFFLINE, contact->group->hideOffline ? MF_CHECKED : MF_UNCHECKED); DestroyMenu(hMenu); return 0; } else if (contact->type == CLCIT_CONTACT) hMenu = (HMENU) CallService(MS_CLIST_MENUBUILDCONTACT, (WPARAM) contact->hContact, 0); } else { //call parent for new group/hide offline menu PostMessage(GetParent(hwnd), WM_CONTEXTMENU, wParam, lParam); return 0; } if (hMenu != NULL) { ClientToScreen(hwnd, &pt); TrackPopupMenu(hMenu, TPM_TOPALIGN | TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL); DestroyMenu(hMenu); } } return 0; case WM_COMMAND: if (LOWORD(wParam) == POPUP_NEWGROUP) SendMessage(GetParent(hwnd), msg, wParam, lParam); break; case WM_NCHITTEST: { LRESULT lr = SendMessage(GetParent(hwnd), WM_NCHITTEST, wParam, lParam); if (lr == HTLEFT || lr == HTRIGHT || lr == HTBOTTOM || lr == HTTOP || lr == HTTOPLEFT || lr == HTTOPRIGHT || lr == HTBOTTOMLEFT || lr == HTBOTTOMRIGHT) return HTTRANSPARENT; } break; case WM_DESTROY: RowHeight::Free(dat); break; } return saveContactListControlWndProc(hwnd, msg, wParam, lParam); }
//用户处理 bool CAttemperEngineSink::OnTCPNetworkMainUserCollect(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_CS_C_USER_ENTER: //用户进入 { //效验数据 ASSERT(wDataSize==sizeof(CMD_CS_C_UserEnter)); if (wDataSize!=sizeof(CMD_CS_C_UserEnter)) return false; //消息处理 CMD_CS_C_UserEnter * pUserEnter=(CMD_CS_C_UserEnter *)pData; pUserEnter->szNickName[CountArray(pUserEnter->szNickName)-1]=0; //获取参数 WORD wBindIndex=LOWORD(dwSocketID); tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex); //连接效验 ASSERT(pBindParameter->ServiceKind==ServiceKind_Game); if (pBindParameter->ServiceKind!=ServiceKind_Game) return false; //变量定义 tagGlobalUserInfo GlobalUserInfo; ZeroMemory(&GlobalUserInfo,sizeof(GlobalUserInfo)); //设置变量 GlobalUserInfo.dwUserID=pUserEnter->dwUserID; GlobalUserInfo.dwGameID=pUserEnter->dwGameID; lstrcpyn(GlobalUserInfo.szNickName,pUserEnter->szNickName,CountArray(GlobalUserInfo.szNickName)); //辅助信息 GlobalUserInfo.cbGender=pUserEnter->cbGender; GlobalUserInfo.cbMemberOrder=pUserEnter->cbMemberOrder; GlobalUserInfo.cbMasterOrder=pUserEnter->cbMasterOrder; //激活用户 m_GlobalInfoManager.ActiveUserItem(GlobalUserInfo,pBindParameter->wServiceID); return true; } case SUB_CS_C_USER_LEAVE: //用户离开 { //效验数据 ASSERT(wDataSize==sizeof(CMD_CS_C_UserLeave)); if (wDataSize!=sizeof(CMD_CS_C_UserLeave)) return false; //消息处理 CMD_CS_C_UserLeave * pUserLeave=(CMD_CS_C_UserLeave *)pData; //获取参数 WORD wBindIndex=LOWORD(dwSocketID); tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex); //连接效验 ASSERT(pBindParameter->ServiceKind==ServiceKind_Game); if (pBindParameter->ServiceKind!=ServiceKind_Game) return false; //删除用户 m_GlobalInfoManager.DeleteUserItem(pUserLeave->dwUserID,pBindParameter->wServiceID); return true; } case SUB_CS_C_USER_FINISH: //用户完成 { //获取参数 WORD wBindIndex=LOWORD(dwSocketID); tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex); //连接效验 ASSERT((m_wCollectItem==wBindIndex)&&(pBindParameter->ServiceKind==ServiceKind_Game)); if ((m_wCollectItem!=wBindIndex)||(pBindParameter->ServiceKind!=ServiceKind_Game)) return false; //设置变量 m_wCollectItem=INVALID_WORD; //汇总切换 if (m_WaitCollectItemArray.GetCount()>0) { //切换汇总 INT_PTR nWaitCount=m_WaitCollectItemArray.GetCount(); m_wCollectItem=m_WaitCollectItemArray[nWaitCount-1]; //删除数组 m_WaitCollectItemArray.RemoveAt(nWaitCount-1); //发送消息 DWORD dwSocketID=(m_pBindParameter+m_wCollectItem)->dwSocketID; m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_USER_COLLECT,SUB_CS_S_COLLECT_REQUEST); } return true; } } return false; }
//远程服务 bool CAttemperEngineSink::OnTCPNetworkMainRemoteService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_CS_C_SEARCH_CORRESPOND: //协调查找 { //效验参数 ASSERT(wDataSize==sizeof(CMD_CS_C_SearchCorrespond)); if (wDataSize!=sizeof(CMD_CS_C_SearchCorrespond)) return false; //处理消息 CMD_CS_C_SearchCorrespond * pSearchCorrespond=(CMD_CS_C_SearchCorrespond *)pData; pSearchCorrespond->szNickName[CountArray(pSearchCorrespond->szNickName)-1]=0; //变量定义 CMD_CS_S_SearchCorrespond SearchCorrespond; ZeroMemory(&SearchCorrespond,sizeof(SearchCorrespond)); //结果用户 CGlobalUserItem * ResultUserItem[2]; ZeroMemory(ResultUserItem,sizeof(ResultUserItem)); //设置变量 SearchCorrespond.dwSocketID=pSearchCorrespond->dwSocketID; SearchCorrespond.dwClientAddr=pSearchCorrespond->dwClientAddr; //查找用户 if (pSearchCorrespond->dwGameID!=0L) { ResultUserItem[0]=m_GlobalInfoManager.SearchUserItemByGameID(pSearchCorrespond->dwGameID); } //查找用户 if (pSearchCorrespond->szNickName[0]!=0) { _tcslwr(pSearchCorrespond->szNickName); ResultUserItem[1]=m_GlobalInfoManager.SearchUserItemByNickName(pSearchCorrespond->szNickName); } //设置结果 for (BYTE i=0;i<CountArray(ResultUserItem);i++) { if (ResultUserItem[i]!=NULL) { //变量定义 WORD wServerIndex=0; //查找房间 do { //查找房间 CGlobalServerItem * pGlobalServerItem=ResultUserItem[i]->EnumServerItem(wServerIndex++); //终止判断 if (pGlobalServerItem==NULL) break; if (SearchCorrespond.wUserCount>=CountArray(SearchCorrespond.UserRemoteInfo)) break; //索引定义 WORD wIndex=SearchCorrespond.wUserCount++; //辅助信息 SearchCorrespond.UserRemoteInfo[wIndex].cbGender=ResultUserItem[i]->GetGender(); SearchCorrespond.UserRemoteInfo[wIndex].cbMemberOrder=ResultUserItem[i]->GetMemberOrder(); SearchCorrespond.UserRemoteInfo[wIndex].cbMasterOrder=ResultUserItem[i]->GetMasterOrder(); //用户信息 SearchCorrespond.UserRemoteInfo[wIndex].dwUserID=ResultUserItem[i]->GetUserID(); SearchCorrespond.UserRemoteInfo[wIndex].dwGameID=ResultUserItem[i]->GetGameID(); lstrcpyn(SearchCorrespond.UserRemoteInfo[wIndex].szNickName,ResultUserItem[i]->GetNickName(),LEN_NICKNAME); //房间信息 SearchCorrespond.UserRemoteInfo[wIndex].wKindID=pGlobalServerItem->GetKindID(); SearchCorrespond.UserRemoteInfo[wIndex].wServerID=pGlobalServerItem->GetServerID(); lstrcpyn(SearchCorrespond.UserRemoteInfo[wIndex].szGameServer,pGlobalServerItem->m_GameServer.szServerName,LEN_SERVER); } while (true); } } //发送数据 WORD wHeadSize=sizeof(SearchCorrespond)-sizeof(SearchCorrespond.UserRemoteInfo); WORD wItemSize=sizeof(SearchCorrespond.UserRemoteInfo[0])*SearchCorrespond.wUserCount; m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_REMOTE_SERVICE,SUB_CS_S_SEARCH_CORRESPOND,&SearchCorrespond,wHeadSize+wItemSize); return true; } } return false; }
//注册服务 bool CAttemperEngineSink::OnTCPNetworkMainRegister(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_CS_C_REGISTER_PLAZA: //注册广场 { //效验数据 ASSERT(wDataSize==sizeof(CMD_CS_C_RegisterPlaza)); if (wDataSize!=sizeof(CMD_CS_C_RegisterPlaza)) return false; //消息定义 CMD_CS_C_RegisterPlaza * pRegisterPlaza=(CMD_CS_C_RegisterPlaza *)pData; //有效判断 if ((pRegisterPlaza->szServerName[0]==0)||(pRegisterPlaza->szServerAddr[0]==0)) { //变量定义 CMD_CS_S_RegisterFailure RegisterFailure; ZeroMemory(&RegisterFailure,sizeof(RegisterFailure)); //设置变量 RegisterFailure.lErrorCode=0L; lstrcpyn(RegisterFailure.szDescribeString,TEXT("服务器注册失败,“服务地址”与“服务器名”不合法!"),CountArray(RegisterFailure.szDescribeString)); //发送消息 WORD wStringSize=CountStringBuffer(RegisterFailure.szDescribeString); WORD wSendSize=sizeof(RegisterFailure)-sizeof(RegisterFailure.szDescribeString)+wStringSize; m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_REGISTER,SUB_CS_S_REGISTER_FAILURE,&RegisterFailure,wSendSize); //中断网络 m_pITCPNetworkEngine->ShutDownSocket(dwSocketID); return true; } //设置绑定 WORD wBindIndex=LOWORD(dwSocketID); (m_pBindParameter+wBindIndex)->wServiceID=wBindIndex; (m_pBindParameter+wBindIndex)->ServiceKind=ServiceKind_Plaza; //变量定义 tagGamePlaza GamePlaza; ZeroMemory(&GamePlaza,sizeof(GamePlaza)); //构造数据 GamePlaza.wPlazaID=wBindIndex; lstrcpyn(GamePlaza.szServerName,pRegisterPlaza->szServerName,CountArray(GamePlaza.szServerName)); lstrcpyn(GamePlaza.szServerAddr,pRegisterPlaza->szServerAddr,CountArray(GamePlaza.szServerAddr)); //注册房间 m_GlobalInfoManager.ActivePlazaItem(wBindIndex,GamePlaza); //发送列表 SendServerListItem(dwSocketID); //群发设置 m_pITCPNetworkEngine->AllowBatchSend(dwSocketID,true,0L); return true; } case SUB_CS_C_REGISTER_SERVER: //注册房间 { //效验数据 ASSERT(wDataSize==sizeof(CMD_CS_C_RegisterServer)); if (wDataSize!=sizeof(CMD_CS_C_RegisterServer)) return false; //消息定义 CMD_CS_C_RegisterServer * pRegisterServer=(CMD_CS_C_RegisterServer *)pData; //查找房间 if (m_GlobalInfoManager.SearchServerItem(pRegisterServer->wServerID)!=NULL) { //变量定义 CMD_CS_S_RegisterFailure RegisterFailure; ZeroMemory(&RegisterFailure,sizeof(RegisterFailure)); //设置变量 RegisterFailure.lErrorCode=0L; lstrcpyn(RegisterFailure.szDescribeString,TEXT("已经存在相同标识的游戏房间服务,房间服务注册失败"),CountArray(RegisterFailure.szDescribeString)); //发送消息 WORD wStringSize=CountStringBuffer(RegisterFailure.szDescribeString); WORD wSendSize=sizeof(RegisterFailure)-sizeof(RegisterFailure.szDescribeString)+wStringSize; m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_REGISTER,SUB_CS_S_REGISTER_FAILURE,&RegisterFailure,wSendSize); //中断网络 m_pITCPNetworkEngine->ShutDownSocket(dwSocketID); return true; } //设置绑定 WORD wBindIndex=LOWORD(dwSocketID); (m_pBindParameter+wBindIndex)->ServiceKind=ServiceKind_Game; (m_pBindParameter+wBindIndex)->wServiceID=pRegisterServer->wServerID; //变量定义 tagGameServer GameServer; ZeroMemory(&GameServer,sizeof(GameServer)); //构造数据 GameServer.wKindID=pRegisterServer->wKindID; GameServer.wNodeID=pRegisterServer->wNodeID; GameServer.wSortID=pRegisterServer->wSortID; GameServer.wServerID=pRegisterServer->wServerID; GameServer.wServerPort=pRegisterServer->wServerPort; GameServer.dwOnLineCount=pRegisterServer->dwOnLineCount; GameServer.dwFullCount=pRegisterServer->dwFullCount; GameServer.lCellScore=pRegisterServer->lCellScore; GameServer.lMaxEnterScore=pRegisterServer->lMaxEnterScore; GameServer.lMinEnterScore=pRegisterServer->lMinEnterScore; GameServer.lMinTableScore=pRegisterServer->lMinTableScore; GameServer.lRestrictScore=pRegisterServer->lRestrictScore; lstrcpyn(GameServer.szServerName,pRegisterServer->szServerName,CountArray(GameServer.szServerName)); lstrcpyn(GameServer.szServerAddr,pRegisterServer->szServerAddr,CountArray(GameServer.szServerAddr)); lstrcpyn(GameServer.szAgentGroup,pRegisterServer->szAgentGroup,CountArray(GameServer.szAgentGroup)); //注册房间 m_GlobalInfoManager.ActiveServerItem(wBindIndex,GameServer); //群发房间 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_INSERT,&GameServer,sizeof(GameServer),0L); //发送列表 SendServerListItem(dwSocketID); //群发设置 m_pITCPNetworkEngine->AllowBatchSend(dwSocketID,true,0L); //汇总通知 if (m_wCollectItem==INVALID_WORD) { m_wCollectItem=wBindIndex; m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_USER_COLLECT,SUB_CS_S_COLLECT_REQUEST); } else m_WaitCollectItemArray.Add(wBindIndex); return true; } } return false; }
//服务状态 bool CAttemperEngineSink::OnTCPNetworkMainServiceInfo(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_CS_C_SERVER_ONLINE: //房间人数 { //效验数据 ASSERT(wDataSize==sizeof(CMD_CS_C_ServerOnLine)); if (wDataSize!=sizeof(CMD_CS_C_ServerOnLine)) return false; //消息定义 CMD_CS_C_ServerOnLine * pServerOnLine=(CMD_CS_C_ServerOnLine *)pData; //获取参数 WORD wBindIndex=LOWORD(dwSocketID); tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex); //连接效验 ASSERT(pBindParameter->ServiceKind==ServiceKind_Game); if (pBindParameter->ServiceKind!=ServiceKind_Game) return false; //查找房间 WORD wServerID=pBindParameter->wServiceID; CGlobalServerItem * pGlobalServerItem=m_GlobalInfoManager.SearchServerItem(wServerID); //设置人数 if (pGlobalServerItem!=NULL) { //变量定义 CMD_CS_S_ServerOnLine ServerOnLine; ZeroMemory(&ServerOnLine,sizeof(ServerOnLine)); //设置变量 pGlobalServerItem->m_GameServer.dwOnLineCount=pServerOnLine->dwOnLineCount; //设置变量 ServerOnLine.wServerID=wServerID; ServerOnLine.dwOnLineCount=pServerOnLine->dwOnLineCount; //发送通知 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_ONLINE,&ServerOnLine,sizeof(ServerOnLine),0L); } return true; } case SUB_CS_C_SERVER_MODIFY: //房间修改 { //效验数据 ASSERT(wDataSize==sizeof(CMD_CS_C_ServerModify)); if (wDataSize!=sizeof(CMD_CS_C_ServerModify)) return false; //消息定义 CMD_CS_C_ServerModify * pServerModify=(CMD_CS_C_ServerModify *)pData; //获取参数 WORD wBindIndex=LOWORD(dwSocketID); tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex); //连接效验 ASSERT(pBindParameter->ServiceKind==ServiceKind_Game); if (pBindParameter->ServiceKind!=ServiceKind_Game) return false; //查找房间 ASSERT(m_GlobalInfoManager.SearchServerItem(pBindParameter->wServiceID)!=NULL); CGlobalServerItem * pGlobalServerItem=m_GlobalInfoManager.SearchServerItem(pBindParameter->wServiceID); //房间修改 if (pGlobalServerItem!=NULL) { //设置变量 pGlobalServerItem->m_GameServer.wSortID=pServerModify->wSortID; pGlobalServerItem->m_GameServer.wKindID=pServerModify->wKindID; pGlobalServerItem->m_GameServer.wNodeID=pServerModify->wNodeID; pGlobalServerItem->m_GameServer.wServerPort=pServerModify->wServerPort; pGlobalServerItem->m_GameServer.dwOnLineCount=pServerModify->dwOnLineCount; pGlobalServerItem->m_GameServer.dwFullCount=pServerModify->dwFullCount; lstrcpyn(pGlobalServerItem->m_GameServer.szServerName,pServerModify->szServerName,CountArray(pGlobalServerItem->m_GameServer.szServerName)); lstrcpyn(pGlobalServerItem->m_GameServer.szServerAddr,pServerModify->szServerAddr,CountArray(pGlobalServerItem->m_GameServer.szServerAddr)); //变量定义 CMD_CS_S_ServerModify ServerModify; ZeroMemory(&ServerModify,sizeof(ServerModify)); //设置变量 ServerModify.wKindID=pServerModify->wKindID; ServerModify.wSortID=pServerModify->wSortID; ServerModify.wNodeID=pServerModify->wNodeID; ServerModify.wServerID=pBindParameter->wServiceID; ServerModify.wServerPort=pServerModify->wServerPort; ServerModify.dwOnLineCount=pServerModify->dwOnLineCount; ServerModify.dwFullCount=pServerModify->dwFullCount; lstrcpyn(ServerModify.szServerAddr,pServerModify->szServerAddr,CountArray(ServerModify.szServerAddr)); lstrcpyn(ServerModify.szServerName,pServerModify->szServerName,CountArray(ServerModify.szServerName)); //发送通知 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_MODIFY,&ServerModify,sizeof(ServerModify),0L); } return true; } } return false; }
//----------------------------------------------------------------------------- // Name: DXUtil_FindMediaFileCch() // Desc: Returns a valid path to a DXSDK media file // cchDest is the size in TCHARs of strDestPath. Be careful not to // pass in sizeof(strDest) on UNICODE builds. //----------------------------------------------------------------------------- HRESULT DXUtil_FindMediaFileCch( TCHAR* strDestPath, int cchDest, TCHAR* strFilename ) { HRESULT hr; HANDLE file; TCHAR* strShortNameTmp = NULL; TCHAR strShortName[MAX_PATH]; int cchPath; if( NULL==strFilename || NULL==strDestPath || cchDest < 1 ) return E_INVALIDARG; lstrcpy( strDestPath, TEXT("") ); lstrcpy( strShortName, TEXT("") ); // Build full path name from strFileName (strShortName will be just the leaf filename) cchPath = GetFullPathName(strFilename, cchDest, strDestPath, &strShortNameTmp); if ((cchPath == 0) || (cchDest <= cchPath)) return E_FAIL; if( strShortNameTmp ) lstrcpyn( strShortName, strShortNameTmp, MAX_PATH ); // first try to find the filename given a full path file = CreateFile( strDestPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL ); if( INVALID_HANDLE_VALUE != file ) { CloseHandle( file ); return S_OK; } // next try to find the filename in the current working directory (path stripped) file = CreateFile( strShortName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL ); if( INVALID_HANDLE_VALUE != file ) { _tcsncpy_s( strDestPath, cchDest, strShortName, cchDest ); strDestPath[cchDest-1] = 0; // _tcsncpy doesn't NULL term if it runs out of space CloseHandle( file ); return S_OK; } // last, check if the file exists in the media directory if( FAILED( hr = DXUtil_GetDXSDKMediaPathCch( strDestPath, cchDest ) ) ) return hr; if( lstrlen(strDestPath) + lstrlen(strShortName) < cchDest ) lstrcat( strDestPath, strShortName ); else return E_INVALIDARG; file = CreateFile( strDestPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL ); if( INVALID_HANDLE_VALUE != file ) { CloseHandle( file ); return S_OK; } // On failure, just return the file as the path _tcsncpy_s( strDestPath, cchDest, strFilename, cchDest ); strDestPath[cchDest-1] = 0; // _tcsncpy doesn't NULL term if it runs out of space return HRESULT_FROM_WIN32( ERROR_FILE_NOT_FOUND ); }
static LRESULT WINAPI swellFileSelectProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { const int maxPathLen = 2048; const char *multiple_files = "(multiple files)"; switch (uMsg) { case WM_CREATE: if (lParam) // swell-specific { SetWindowLong(hwnd,GWL_WNDPROC,(LPARAM)SwellDialogDefaultWindowProc); SetWindowLong(hwnd,DWL_DLGPROC,(LPARAM)swellFileSelectProc); SetWindowLongPtr(hwnd,GWLP_USERDATA,lParam); BrowseFile_State *parms = (BrowseFile_State *)lParam; if (parms->caption) SetWindowText(hwnd,parms->caption); SWELL_MakeSetCurParms(1,1,0,0,hwnd,false,false); SWELL_MakeButton(0, parms->mode == BrowseFile_State::OPENDIR ? "Choose directory" : parms->mode == BrowseFile_State::SAVE ? "Save" : "Open", IDOK,0,0,0,0, 0); SWELL_MakeButton(0, "Cancel", IDCANCEL,0,0,0,0, 0); HWND edit = SWELL_MakeEditField(0x100, 0,0,0,0, 0); HWND dir = SWELL_MakeCombo(0x103, 0,0,0,0, CBS_DROPDOWNLIST); HWND list = SWELL_MakeControl("",0x104,"SysListView32",LVS_REPORT|LVS_SHOWSELALWAYS| (parms->mode == BrowseFile_State::OPENMULTI ? 0 : LVS_SINGLESEL)| LVS_OWNERDATA|WS_BORDER|WS_TABSTOP,0,0,0,0,0); if (list) { LVCOLUMN c={LVCF_TEXT|LVCF_WIDTH, 0, 280, (char*)"Filename" }; ListView_InsertColumn(list,0,&c); c.cx = 120; c.pszText = (char*) "Size"; ListView_InsertColumn(list,1,&c); c.cx = 140; c.pszText = (char*) "Date"; ListView_InsertColumn(list,2,&c); } HWND extlist = (parms->extlist && *parms->extlist) ? SWELL_MakeCombo(0x105, 0,0,0,0, CBS_DROPDOWNLIST) : NULL; if (extlist) { const char *p = parms->extlist; while (*p) { const char *rd=p; p += strlen(p)+1; if (!*p) break; int a = SendMessage(extlist,CB_ADDSTRING,0,(LPARAM)rd); SendMessage(extlist,CB_SETITEMDATA,a,(LPARAM)p); p += strlen(p)+1; } SendMessage(extlist,CB_SETCURSEL,0,0); } SWELL_MakeLabel(-1,parms->mode == BrowseFile_State::OPENDIR ? "Directory: " : "File:",0x101, 0,0,0,0, 0); if (BFSF_Templ_dlgid && BFSF_Templ_dlgproc) { HWND dlg = SWELL_CreateDialog(BFSF_Templ_reshead, BFSF_Templ_dlgid, hwnd, BFSF_Templ_dlgproc, 0); if (dlg) SetWindowLong(dlg,GWL_ID,0x102); BFSF_Templ_dlgproc=0; BFSF_Templ_dlgid=0; } SWELL_MakeSetCurParms(1,1,0,0,NULL,false,false); if (edit && dir) { char buf[maxPathLen]; const char *filepart = ""; if (parms->initialfile && *parms->initialfile && *parms->initialfile != '.') { lstrcpyn_safe(buf,parms->initialfile,sizeof(buf)); char *p = (char *)WDL_get_filepart(buf); if (p > buf) { p[-1]=0; filepart = p; } } else if (parms->initialdir && *parms->initialdir) { lstrcpyn_safe(buf,parms->initialdir,sizeof(buf)); } else getcwd(buf,sizeof(buf)); SetWindowText(edit,filepart); SendMessage(hwnd, WM_USER+100, 0x103, (LPARAM)buf); } SetWindowPos(hwnd,NULL,0,0,600, 400, SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE); SendMessage(hwnd,WM_USER+100,1,0); // refresh list } break; case WM_USER+100: switch (wParam) { case 0x103: // update directory combo box -- destroys buffer pointed to by lParam if (lParam) { char *path = (char*)lParam; HWND combo=GetDlgItem(hwnd,0x103); SendMessage(combo,CB_RESETCONTENT,0,0); WDL_remove_trailing_dirchars(path); while (path[0]) { SendMessage(combo,CB_ADDSTRING,0,(LPARAM)path); WDL_remove_filepart(path); WDL_remove_trailing_dirchars(path); } SendMessage(combo,CB_ADDSTRING,0,(LPARAM)"/"); SendMessage(combo,CB_SETCURSEL,0,0); } break; case 1: { BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); if (parms) { char buf[maxPathLen]; const char *filt = NULL; buf[0]=0; int a = (int) SendDlgItemMessage(hwnd,0x105,CB_GETCURSEL,0,0); if (a>=0) filt = (const char *)SendDlgItemMessage(hwnd,0x105,CB_GETITEMDATA,a,0); a = (int) SendDlgItemMessage(hwnd,0x103,CB_GETCURSEL,0,0); if (a>=0) SendDlgItemMessage(hwnd,0x103,CB_GETLBTEXT,a,(LPARAM)buf); if (buf[0]) parms->scan_path(buf, filt, parms->mode == BrowseFile_State::OPENDIR); else parms->viewlist.DeleteAll(); HWND list = GetDlgItem(hwnd,0x104); ListView_SetItemCount(list, 0); // clear selection ListView_SetItemCount(list, parms->viewlist.GetSize()); ListView_RedrawItems(list,0, parms->viewlist.GetSize()); } } break; } break; case WM_GETMINMAXINFO: { LPMINMAXINFO p=(LPMINMAXINFO)lParam; p->ptMinTrackSize.x = 300; p->ptMinTrackSize.y = 300; } break; case WM_SIZE: { BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); // reposition controls RECT r; GetClientRect(hwnd,&r); const int buth = 24, cancelbutw = 50, okbutw = parms->mode == BrowseFile_State::OPENDIR ? 120 : 50; const int xborder = 4, yborder=8; const int fnh = 20, fnlblw = parms->mode == BrowseFile_State::OPENDIR ? 70 : 50; int ypos = r.bottom - 4 - buth; int xpos = r.right; SetWindowPos(GetDlgItem(hwnd,IDCANCEL), NULL, xpos -= cancelbutw + xborder, ypos, cancelbutw,buth, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,IDOK), NULL, xpos -= okbutw + xborder, ypos, okbutw,buth, SWP_NOZORDER|SWP_NOACTIVATE); HWND emb = GetDlgItem(hwnd,0x102); if (emb) { RECT sr; GetClientRect(emb,&sr); if (ypos > r.bottom-4-sr.bottom) ypos = r.bottom-4-sr.bottom; SetWindowPos(emb,NULL, xborder,ypos, xpos - xborder*2, sr.bottom, SWP_NOZORDER|SWP_NOACTIVATE); ShowWindow(emb,SW_SHOWNA); } HWND filt = GetDlgItem(hwnd,0x105); if (filt) { SetWindowPos(filt, NULL, xborder*2 + fnlblw, ypos -= fnh + yborder, r.right-fnlblw-xborder*3, fnh, SWP_NOZORDER|SWP_NOACTIVATE); } SetWindowPos(GetDlgItem(hwnd,0x100), NULL, xborder*2 + fnlblw, ypos -= fnh + yborder, r.right-fnlblw-xborder*3, fnh, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,0x101), NULL, xborder, ypos, fnlblw, fnh, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,0x103), NULL, xborder, 0, r.right-xborder*2, fnh, SWP_NOZORDER|SWP_NOACTIVATE); SetWindowPos(GetDlgItem(hwnd,0x104), NULL, xborder, fnh+yborder, r.right-xborder*2, ypos - (fnh+yborder) - yborder, SWP_NOZORDER|SWP_NOACTIVATE); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case 0x105: if (HIWORD(wParam) == CBN_SELCHANGE) { SendMessage(hwnd,WM_USER+100,1,0); // refresh list } return 0; case 0x103: if (HIWORD(wParam) == CBN_SELCHANGE) { SendMessage(hwnd,WM_USER+100,1,0); // refresh list } return 0; case IDCANCEL: EndDialog(hwnd,0); return 0; case IDOK: { char buf[maxPathLen], msg[2048]; buf[0]=0; int a = (int) SendDlgItemMessage(hwnd,0x103,CB_GETCURSEL,0,0); if (a>=0) { SendDlgItemMessage(hwnd,0x103,CB_GETLBTEXT,a,(LPARAM)buf); size_t buflen = strlen(buf); if (!buflen) strcpy(buf,"/"); else { if (buflen > sizeof(buf)-2) buflen = sizeof(buf)-2; if (buf[buflen-1]!='/') { buf[buflen++] = '/'; buf[buflen]=0; } } } GetDlgItemText(hwnd,0x100,msg,sizeof(msg)); BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); int cnt; if (parms->mode == BrowseFile_State::OPENMULTI && (cnt=ListView_GetSelectedCount(GetDlgItem(hwnd,0x104)))>1 && (!*msg || !strcmp(msg,multiple_files))) { HWND list = GetDlgItem(hwnd,0x104); WDL_TypedBuf<char> fs; fs.Set(buf,strlen(buf)+1); int a = ListView_GetNextItem(list,-1,LVNI_SELECTED); while (a != -1 && fs.GetSize() < 4096*4096 && cnt--) { const char *fn = NULL; struct BrowseFile_State::rec *rec = parms->viewlist.EnumeratePtr(a,&fn); if (!rec) break; if (*fn) fn++; // skip type ident fs.Add(fn,strlen(fn)+1); a = ListView_GetNextItem(list,a,LVNI_SELECTED); } fs.Add("",1); parms->fnout = (char*)malloc(fs.GetSize()); if (parms->fnout) memcpy(parms->fnout,fs.Get(),fs.GetSize()); EndDialog(hwnd,1); return 0; } else { if (msg[0] == '.' && (msg[1] == '.' || msg[1] == 0)) { if (msg[1] == '.') SendDlgItemMessage(hwnd,0x103,CB_SETCURSEL,a+1,0); SetDlgItemText(hwnd,0x100,""); SendMessage(hwnd,WM_USER+100,1,0); // refresh list return 0; } else if (msg[0] == '/') lstrcpyn_safe(buf,msg,sizeof(buf)); else lstrcatn(buf,msg,sizeof(buf)); } switch (parms->mode) { case BrowseFile_State::OPENDIR: if (!buf[0]) return 0; else if (msg[0]) { // navigate to directory if filepart set DIR *dir = opendir(buf); if (!dir) { snprintf(msg,sizeof(msg),"Error opening directory:\r\n\r\n%s\r\n\r\nCreate?",buf); if (MessageBox(hwnd,msg,"Create directory?",MB_OKCANCEL)==IDCANCEL) return 0; CreateDirectory(buf,NULL); dir=opendir(buf); } if (!dir) { MessageBox(hwnd,"Error creating directory","Error",MB_OK); return 0; } closedir(dir); SendMessage(hwnd, WM_USER+100, 0x103, (LPARAM)buf); SetDlgItemText(hwnd,0x100,""); SendMessage(hwnd,WM_USER+100,1,0); // refresh list return 0; } else { DIR *dir = opendir(buf); if (!dir) return 0; closedir(dir); } break; case BrowseFile_State::SAVE: if (!buf[0]) return 0; else { struct stat st={0,}; DIR *dir = opendir(buf); if (dir) { closedir(dir); SendMessage(hwnd, WM_USER+100, 0x103, (LPARAM)buf); SetDlgItemText(hwnd,0x100,""); SendMessage(hwnd,WM_USER+100,1,0); // refresh list return 0; } if (!stat(buf,&st)) { snprintf(msg,sizeof(msg),"File exists:\r\n\r\n%s\r\n\r\nOverwrite?",buf); if (MessageBox(hwnd,msg,"Overwrite file?",MB_OKCANCEL)==IDCANCEL) return 0; } } break; default: if (!buf[0]) return 0; else { struct stat st={0,}; DIR *dir = opendir(buf); if (dir) { closedir(dir); SendMessage(hwnd, WM_USER+100, 0x103, (LPARAM)buf); SetDlgItemText(hwnd,0x100,""); SendMessage(hwnd,WM_USER+100,1,0); // refresh list return 0; } if (stat(buf,&st)) { snprintf(msg,sizeof(msg),"File does not exist:\r\n\r\n%s",buf); MessageBox(hwnd,msg,"File not found",MB_OK); return 0; } } break; } if (parms->fnout) { lstrcpyn_safe(parms->fnout,buf,parms->fnout_sz); } else { size_t l = strlen(buf); parms->fnout = (char*)calloc(l+2,1); memcpy(parms->fnout,buf,l); } } EndDialog(hwnd,1); return 0; } break; case WM_NOTIFY: { LPNMHDR l=(LPNMHDR)lParam; if (l->code == LVN_GETDISPINFO) { BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); NMLVDISPINFO *lpdi = (NMLVDISPINFO*) lParam; const int idx=lpdi->item.iItem; if (l->idFrom == 0x104 && parms && idx >=0 && idx < parms->viewlist.GetSize()) { const char *fn = NULL; struct BrowseFile_State::rec *rec = parms->viewlist.EnumeratePtr(idx,&fn); if (rec && fn) { if (lpdi->item.mask&LVIF_TEXT) { switch (lpdi->item.iSubItem) { case 0: if (fn[0]) lstrcpyn_safe(lpdi->item.pszText,fn+1,lpdi->item.cchTextMax); break; case 1: if (fn[0] == 1) { lstrcpyn_safe(lpdi->item.pszText,"<DIR>",lpdi->item.cchTextMax); } else { static const char *tab[]={ "bytes","KB","MB","GB" }; int lf=0; WDL_INT64 s=rec->size; if (s<1024) { snprintf(lpdi->item.pszText,lpdi->item.cchTextMax,"%d %s ",(int)s,tab[0]); break; } int w = 1; do { w++; lf = (int)(s&1023); s/=1024; } while (s >= 1024 && w<4); snprintf(lpdi->item.pszText,lpdi->item.cchTextMax,"%d.%d %s ",(int)s,(int)((lf*10.0)/1024.0+0.5),tab[w-1]); } break; case 2: if (rec->date > 0 && rec->date < WDL_INT64_CONST(0x793406fff)) { struct tm *a=localtime(&rec->date); if (a) { char str[512]; strftime(str,sizeof(str),"%c",a); lstrcpyn(lpdi->item.pszText, str,lpdi->item.cchTextMax); } } break; } } } } } else if (l->code == LVN_ODFINDITEM) { } else if (l->code == LVN_ITEMCHANGED) { const int selidx = ListView_GetNextItem(l->hwndFrom, -1, LVNI_SELECTED); if (selidx>=0) { BrowseFile_State *parms = (BrowseFile_State *)GetWindowLongPtr(hwnd,GWLP_USERDATA); if (parms && parms->mode == BrowseFile_State::OPENMULTI && ListView_GetSelectedCount(l->hwndFrom)>1) { SetDlgItemText(hwnd,0x100,multiple_files); } else { const char *fn = NULL; struct BrowseFile_State::rec *rec = parms ? parms->viewlist.EnumeratePtr(selidx,&fn) : NULL; if (rec) { if (fn && fn[0]) SetDlgItemText(hwnd,0x100,fn+1); } } } } else if (l->code == NM_DBLCLK) { SendMessage(hwnd,WM_COMMAND,IDOK,0); } } break; } return 0; }
// !!! WARNING !!! В ЭТОЙ функции обращений к реестру (или advapi32) НЕ ДЕЛАТЬ !!! void PrepareHookedKeyList() { CESERVER_CONSOLE_MAPPING_HDR* pInfo = GetConMap(); if (!pInfo || !(pInfo->isHookRegistry&1) || !*pInfo->sHiveFileName) return; // Сейчас HookedNow НЕ проверять, т.к. функция вызывается при первоначальной инициализации // Здесь важен сам факт того, что виртуальный реестр может быть включен (в любой момент)! gbRegHookedNow = ((pInfo->isHookRegistry&3) == 3); //BOOL lbHookedNow = ((pInfo->isHookRegistry&3) == 3); //if (gbRegHookedNow != lbHookedNow) //{ // if (gbRegHookedNow && gpRegKeyStore) // gpRegKeyStore->Clear(); // gbRegHookedNow = lbHookedNow; // if (!lbHookedNow) // return; //} if (!gpRegKeyStore) { WARNING("gpRegKeyStore"); gpRegKeyStore = (RegKeyStore*)calloc(1,sizeof(*gpRegKeyStore)); if (!gpRegKeyStore) { _ASSERTE(gpRegKeyStore!=NULL); return; } gpRegKeyStore->Init(); } if (!gpRegKeyHooks) { wchar_t wsGhost[42] = L"." VIRTUAL_REGISTRY_GUID; // L".{16B56CA5-F8D2-4EEA-93DC-32403C7355E1}"; //char sGhost[42] = ".{16B56CA5-F8D2-4EEA-93DC-32403C7355E1}"; { struct { HKEY hKey; LPCWSTR pszKey; } RegKeyHooks[] = { // Поддерживаются только ПОДКЛЮЧИ в "Software\\" {HKEY_LOCAL_MACHINE, L"Far"}, {HKEY_CURRENT_USER, L"Far"}, {HKEY_LOCAL_MACHINE, L"Far2"}, {HKEY_CURRENT_USER, L"Far2"}, {HKEY_LOCAL_MACHINE, L"Far Manager"}, {HKEY_CURRENT_USER, L"Far Manager"}, {NULL} }; gpRegKeyHooks = (RegKeyHook*)calloc(countof(RegKeyHooks)+1, sizeof(RegKeyHook)); if (!gpRegKeyHooks) { _ASSERTE(gpRegKeyHooks!=NULL); gpRegKeyStore->Free(); free(gpRegKeyStore); gpRegKeyStore = NULL; return; } //memmove(gpRegKeyHooks, RegKeyHooks, sizeof(RegKeyHooks)); for (size_t i = 0; i < countof(RegKeyHooks) && RegKeyHooks[i].hKey; i++) { gpRegKeyHooks[i].hkRoot = RegKeyHooks[i].hKey; lstrcpyn(gpRegKeyHooks[i].wsHooked, RegKeyHooks[i].pszKey, countof(gpRegKeyHooks[i].wsHooked)); } } // Подготовить структуру gpRegKeyHooks к использованию for (UINT i = 0; gpRegKeyHooks[i].hkRoot; i++) { // Длина перехватываемого ключа gpRegKeyHooks[i].nHookedLen = lstrlen(gpRegKeyHooks[i].wsHooked); WideCharToMultiByte(CP_ACP, 0, gpRegKeyHooks[i].wsHooked, gpRegKeyHooks[i].nHookedLen+1, gpRegKeyHooks[i].sHooked, gpRegKeyHooks[i].nHookedLen+1, 0,0); // Что показываем в RegEnumKey, вместо реальных ключей wcscpy_c(gpRegKeyHooks[i].wsGhost, PointToName(gpRegKeyHooks[i].wsHooked)); wcscat_c(gpRegKeyHooks[i].wsGhost, wsGhost); gpRegKeyHooks[i].nGhostLen = lstrlen(gpRegKeyHooks[i].wsGhost); WideCharToMultiByte(CP_ACP, 0, gpRegKeyHooks[i].wsGhost, -1, gpRegKeyHooks[i].sGhost, countof(gpRegKeyHooks[i].sGhost), 0,0); // Для упрощения обработки - переопределенные пути msprintf(gpRegKeyHooks[i].wsNewPath, countof(gpRegKeyHooks[i].wsNewPath), L"%s\\Software\\%s", (gpRegKeyHooks[i].hkRoot == HKEY_LOCAL_MACHINE) ? L"HKLM" : L"HKCU", gpRegKeyHooks[i].wsHooked); WideCharToMultiByte(CP_ACP, 0, gpRegKeyHooks[i].wsNewPath, -1, gpRegKeyHooks[i].sNewPath, countof(gpRegKeyHooks[i].sNewPath), 0, 0); } } }
bool SettingsXML::OpenKey(const wchar_t *regPath, uint access, BOOL abSilent /*= FALSE*/) { // That may occures if Basic settings and "Export" button was pressed _ASSERTE(!gpConEmu->IsResetBasicSettings() || ((access & KEY_WRITE)!=KEY_WRITE)); bool lbRc = false; HRESULT hr = S_OK; wchar_t szErr[512]; szErr[0] = 0; wchar_t szName[MAX_PATH]; const wchar_t* psz = NULL; IXMLDOMNode* pKey = NULL; IXMLDOMNode* pChild = NULL; bool bAllowCreate = (access & KEY_WRITE) == KEY_WRITE; CloseKey(); // на всякий if (!regPath || !*regPath) { return false; } if (!OpenStorage(access, szErr)) { goto wrap; } SAFETRY { _ASSERTE(mp_File != NULL); hr = mp_File->QueryInterface(IID_IXMLDOMNode, (void **)&pKey); if (FAILED(hr)) { _wsprintf(szErr, SKIPLEN(countof(szErr)) L"XML: Root node not found!\nErrCode=0x%08X", (DWORD)hr); goto wrap; } mi_Level = 0; while (*regPath) { // Получить следующий токен psz = wcschr(regPath, L'\\'); if (!psz) psz = regPath + _tcslen(regPath); lstrcpyn(szName, regPath, psz-regPath+1); // Найти в структуре XML pChild = FindItem(pKey, L"key", szName, bAllowCreate); pKey->Release(); pKey = pChild; pChild = NULL; mi_Level++; if (!pKey) { if (bAllowCreate) { _wsprintf(szErr, SKIPLEN(countof(szErr)) L"XML: Can't create key <%s>!", szName); } else { //_wsprintf(szErr, SKIPLEN(countof(szErr)) L"XML: key <%s> not found!", szName); szErr[0] = 0; // ошибку не показывать - настройки по умолчанию } goto wrap; } if (*psz == L'\\') { regPath = psz + 1; } else { break; } } // Нашли, запомнили mp_Key = pKey; pKey = NULL; #if 0 if (mp_Key) { SYSTEMTIME st; wchar_t szTime[32]; GetLocalTime(&st); _wsprintf(szTime, SKIPLEN(countof(szTime)) L"%04i-%02i-%02i %02i:%02i:%02i", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); SetAttr(mp_Key, L"modified", szTime); SetAttr(mp_Key, L"build", gpConEmu->ms_ConEmuBuild); } #endif lbRc = true; } SAFECATCH { lstrcpy(szErr, L"Exception in SettingsXML::OpenKey"); lbRc = false; } wrap: SafeRelease(pChild); SafeRelease(pKey); if (!lbRc && szErr[0] && !abSilent) { MBoxA(szErr); } return lbRc; }
// IDYES - Close All consoles // IDNO - Close active console only // IDCANCEL - As is int ConfirmCloseConsoles(const ConfirmCloseParam& Parm) { DontEnable de; if (Parm.rpLeaveConEmuOpened) *Parm.rpLeaveConEmuOpened = false; // Use TaskDialog? if (gOSVer.dwMajorVersion >= 6) { // must be already initialized: CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); wchar_t szMessage[128]; lstrcpyn(szMessage, Parm.asSingleConsole ? Parm.asSingleConsole : Parm.bForceKill ? L"Confirm killing?" : L"Confirm closing?", countof(szMessage)); wchar_t szWWW[MAX_PATH]; _wsprintf(szWWW, SKIPLEN(countof(szWWW)) L"<a href=\"%s\">%s</a>", gsHomePage, gsHomePage); wchar_t szCloseAll[MAX_PATH*2]; wchar_t *pszText; if (Parm.asSingleConsole) { wcscpy_c(szCloseAll, L"Yes\n"); pszText = szCloseAll + _tcslen(szCloseAll); lstrcpyn(pszText, Parm.asSingleTitle, min(MAX_PATH,(countof(szCloseAll)-(pszText-szCloseAll)))); pszText += _tcslen(pszText); } else { _wsprintf(szCloseAll, SKIPLEN(countof(szCloseAll)) (Parm.bGroup && (Parm.nConsoles>1)) ? ((Parm.bGroup == ConfirmCloseParam::eGroup) ? L"Close group (%u console%s)" : L"Close (%u console%s)") : L"Close all %u console%s.", Parm.nConsoles, (Parm.nConsoles>1)?L"s":L""); pszText = szCloseAll + _tcslen(szCloseAll); } if ((Parm.asSingleConsole == NULL) || (Parm.nOperations || Parm.nUnsavedEditors)) { //if (nOperations) { _wsprintf(pszText, SKIPLEN(countof(szCloseAll)-(pszText-szCloseAll)) L"\nIncomplete operations: %i", Parm.nOperations); pszText += _tcslen(pszText); } //if (nUnsavedEditors) { _wsprintf(pszText, SKIPLEN(countof(szCloseAll)-(pszText-szCloseAll)) L"\nUnsaved editor windows: %i", Parm.nUnsavedEditors); pszText += _tcslen(pszText); } } wchar_t szCloseOne[MAX_PATH]; wcscpy_c(szCloseOne, L"Close active console only"); if (Parm.nConsoles > 1) { CVConGuard VCon; int iCon = gpConEmu->GetActiveVCon(&VCon); if (iCon >= 0) { pszText = szCloseOne + _tcslen(szCloseOne); _wsprintf(pszText, SKIPLEN(countof(szCloseOne)-(pszText-szCloseOne)) L"\n#%u: ", (iCon+1)); pszText += _tcslen(pszText); lstrcpyn(pszText, VCon->RCon()->GetTitle(true), countof(szCloseOne)-(pszText-szCloseOne)); } } const wchar_t* szCancel = L"Cancel\nDon't close anything"; int nButtonPressed = 0; TASKDIALOGCONFIG config = {sizeof(config)}; TASKDIALOG_BUTTON buttons[] = { { IDYES, szCloseAll }, { IDNO, szCloseOne }, { IDCANCEL, szCancel }, }; config.cButtons = countof(buttons); if (Parm.nConsoles <= 1) { buttons[1] = buttons[2]; config.cButtons--; } config.hwndParent = ghWnd; config.hInstance = NULL /*g_hInstance*/; config.dwFlags = TDF_USE_HICON_MAIN|TDF_USE_COMMAND_LINKS|TDF_ALLOW_DIALOG_CANCELLATION |TDF_ENABLE_HYPERLINKS; //|TDIF_SIZE_TO_CONTENT|TDF_CAN_BE_MINIMIZED; //config.pszMainIcon = MAKEINTRESOURCE(IDI_ICON1); config.hMainIcon = hClassIcon; config.pszWindowTitle = gpConEmu->GetDefaultTitle(); config.pszMainInstruction = szMessage; //config.pszContent = L"..."; config.pButtons = buttons; config.nDefaultButton = IDYES; config.pszFooter = szWWW; config.pfCallback = TaskDlgCallback; //{ // config.dwFlags |= TDF_VERIFICATION_FLAG_CHECKED; // config.pszVerificationText = L"Text on checkbox"; //} if (!TaskDialogIndirect_f) { HMODULE hDll = GetModuleHandle(L"comctl32.dll"); if (!hDll) { hDll = LoadLibrary(L"comctl32.dll"); } TaskDialogIndirect_f = (TaskDialogIndirect_t)(hDll?GetProcAddress(hDll, "TaskDialogIndirect"):NULL); } BOOL lbCheckBox = TRUE; if (TaskDialogIndirect_f) { HRESULT hr = TaskDialogIndirect_f(&config, &nButtonPressed, NULL, &lbCheckBox); if (hr == S_OK) { //TODO: lbCheckBox? switch (nButtonPressed) { case IDCANCEL: // user cancelled the dialog case IDYES: case IDNO: return nButtonPressed; default: _ASSERTE(nButtonPressed==IDCANCEL||nButtonPressed==IDYES||nButtonPressed==IDNO); break; // should never happen } } } } // »наче - через стандартный MessageBox wchar_t szText[512], *pszText; if (Parm.asSingleConsole) { lstrcpyn(szText, Parm.asSingleConsole ? Parm.asSingleConsole : Parm.bForceKill ? L"Confirm killing?" : L"Confirm closing?", min(128,countof(szText))); wcscat_c(szText, L"\r\n\r\n"); int nLen = lstrlen(szText); lstrcpyn(szText+nLen, Parm.asSingleTitle, countof(szText)-nLen); } else { _wsprintf(szText, SKIPLEN(countof(szText)) L"About to close %u console%s.\r\n", Parm.nConsoles, (Parm.nConsoles>1)?L"s":L""); } pszText = szText+_tcslen(szText); if (Parm.nOperations || Parm.nUnsavedEditors) { *(pszText++) = L'\r'; *(pszText++) = L'\n'; *(pszText) = 0; if (Parm.nOperations) { _wsprintf(pszText, SKIPLEN(countof(szText)-(pszText-szText)) L"Incomplete operations: %i\r\n", Parm.nOperations); pszText += _tcslen(pszText); } if (Parm.nUnsavedEditors) { _wsprintf(pszText, SKIPLEN(countof(szText)-(pszText-szText)) L"Unsaved editor windows: %i\r\n", Parm.nUnsavedEditors); pszText += _tcslen(pszText); } } if (Parm.nConsoles > 1) { //if (rpPanes) // wcscat_c(szText, L"\r\nProceed with close group?"); //else wcscat_c(szText, L"\r\nPress button <No> to close active console only\r\n" L"\r\nProceed with close ConEmu?"); } int nBtn = MessageBoxW(ghWnd, szText, gpConEmu->GetDefaultTitle(), (/*rpPanes ? MB_OKCANCEL :*/ (Parm.nConsoles>1) ? MB_YESNOCANCEL : MB_OKCANCEL)|MB_ICONEXCLAMATION); if (nBtn == IDOK) { nBtn = IDYES; // дл¤ однозначности } return nBtn; }
/******************************Public*Routine******************************\ * CubeOpenCmd * \**************************************************************************/ BOOL CubeOpenCmd( void ) { static OPENFILENAME ofn; static BOOL fFirstTime = TRUE; BOOL fRet = FALSE; TCHAR achFileName[MAXSTREAMS][MAX_PATH]; TCHAR achFilter[MAX_PATH], achfileFilter[MAX_PATH]; LPTSTR lp = 0; DWORD dwNumFiles = 0; if(fFirstTime) { ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = g_hwndApp; ofn.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_SHAREAWARE | OFN_PATHMUSTEXIST; } lstrcpyn(achFilter, IdStr(STR_FILE_FILTER, achfileFilter, sizeof(achfileFilter)), NUMELMS(achFilter)-1); achFilter[MAX_PATH-1] = 0; // Ensure NULL-termination ofn.lpstrFilter = achFilter; /* ** Convert the resource string into to something suitable for ** GetOpenFileName (ie. replace '#' characters with '\0' characters). */ for(lp = achFilter; *lp; lp++) { if(*lp == TEXT('#')) { *lp = TEXT('\0'); } } for (DWORD i = 0; i < MAXSTREAMS; i++) { ofn.lpstrFile = achFileName[i]; ofn.nMaxFile = sizeof(achFileName[i]) / sizeof(TCHAR); ZeroMemory(achFileName[i], sizeof(achFileName[i])); switch (i) { case 0: // load first file ofn.lpstrTitle = TEXT("Select First Media File\0"); break; case 1: // load first file ofn.lpstrTitle = TEXT("Select Second Media File\0"); break; case 2: // load first file ofn.lpstrTitle = TEXT("Select Third Media File\0"); break; } fRet = GetOpenFileName(&ofn); if(!fRet) break; dwNumFiles++; } fFirstTime = FALSE; if (0 == dwNumFiles) { return fRet; } ProcessOpen(achFileName, dwNumFiles); return fRet; }
INT_PTR CALLBACK DlgProcSettings(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static TCHAR customCommand[MAX_PATH] = {0}; static TCHAR customText[TITLE_SIZE] = {0}; static TCHAR szKeyTemp[MAX_PATH + GUID_STRING_SIZE]; static DWORD showMenu = 2; //0 off, 1 on, 2 unknown static DWORD useMenuIcon = 1; // 0 off, otherwise on HKEY settingKey; LONG result; DWORD size = 0; switch(uMsg) { case WM_INITDIALOG: { wsprintf(szKeyTemp, TEXT("CLSID\\%s\\Settings"), szGUID); result = RegOpenKeyEx(HKEY_CLASSES_ROOT, szKeyTemp, 0, KEY_READ, &settingKey); if (result == ERROR_SUCCESS) { size = sizeof(TCHAR)*TITLE_SIZE; result = RegQueryValueEx(settingKey, TEXT("Title"), NULL, NULL, (LPBYTE)(customText), &size); if (result != ERROR_SUCCESS) { lstrcpyn(customText, szDefaultMenutext, TITLE_SIZE); } size = sizeof(TCHAR)*MAX_PATH; result = RegQueryValueEx(settingKey, TEXT("Custom"), NULL, NULL, (LPBYTE)(customCommand), &size); if (result != ERROR_SUCCESS) { lstrcpyn(customCommand, TEXT(""), MAX_PATH); } size = sizeof(DWORD); result = RegQueryValueEx(settingKey, TEXT("Dynamic"), NULL, NULL, (BYTE*)(&isDynamic), &size); if (result != ERROR_SUCCESS) { isDynamic = 1; } size = sizeof(DWORD); result = RegQueryValueEx(settingKey, TEXT("ShowIcon"), NULL, NULL, (BYTE*)(&useMenuIcon), &size); if (result != ERROR_SUCCESS) { useMenuIcon = 1; } RegCloseKey(settingKey); } Button_SetCheck(GetDlgItem(hwndDlg, IDC_CHECK_USECONTEXT), BST_INDETERMINATE); Button_SetCheck(GetDlgItem(hwndDlg, IDC_CHECK_USEICON), BST_INDETERMINATE); Button_SetCheck(GetDlgItem(hwndDlg, IDC_CHECK_CONTEXTICON), useMenuIcon?BST_CHECKED:BST_UNCHECKED); Button_SetCheck(GetDlgItem(hwndDlg, IDC_CHECK_ISDYNAMIC), isDynamic?BST_CHECKED:BST_UNCHECKED); SetDlgItemText(hwndDlg, IDC_EDIT_MENU, customText); SetDlgItemText(hwndDlg, IDC_EDIT_COMMAND, customCommand); return TRUE; break; } case WM_COMMAND: { switch(LOWORD(wParam)) { case IDOK: { //Store settings GetDlgItemText(hwndDlg, IDC_EDIT_MENU, customText, TITLE_SIZE); GetDlgItemText(hwndDlg, IDC_EDIT_COMMAND, customCommand, MAX_PATH); int textLen = lstrlen(customText); int commandLen = lstrlen(customCommand); wsprintf(szKeyTemp, TEXT("CLSID\\%s\\Settings"), szGUID); result = RegCreateKeyEx(HKEY_CLASSES_ROOT, szKeyTemp, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &settingKey, NULL); if (result == ERROR_SUCCESS) { result = RegSetValueEx(settingKey, TEXT("Title"), 0,REG_SZ, (LPBYTE)customText, (textLen+1)*sizeof(TCHAR)); result = RegSetValueEx(settingKey, TEXT("Custom"), 0,REG_SZ, (LPBYTE)customCommand, (commandLen+1)*sizeof(TCHAR)); result = RegSetValueEx(settingKey, TEXT("Dynamic"), 0, REG_DWORD, (LPBYTE)&isDynamic, sizeof(DWORD)); result = RegSetValueEx(settingKey, TEXT("ShowIcon"), 0, REG_DWORD, (LPBYTE)&useMenuIcon, sizeof(DWORD)); RegCloseKey(settingKey); } if (showMenu == 1) { result = RegCreateKeyEx(HKEY_CLASSES_ROOT, szShellExtensionKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &settingKey, NULL); if (result == ERROR_SUCCESS) { result = RegSetValueEx(settingKey, NULL, 0,REG_SZ, (LPBYTE)szGUID, (lstrlen(szGUID)+1)*sizeof(TCHAR)); RegCloseKey(settingKey); } } else if (showMenu == 0) { RegDeleteKey(HKEY_CLASSES_ROOT, szShellExtensionKey); } if (showIcon == 1) { result = RegCreateKeyEx(HKEY_CLASSES_ROOT, TEXT("Notepad++_file\\shellex\\IconHandler"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &settingKey, NULL); if (result == ERROR_SUCCESS) { result = RegSetValueEx(settingKey, NULL, 0,REG_SZ, (LPBYTE)szGUID, (lstrlen(szGUID)+1)*sizeof(TCHAR)); RegCloseKey(settingKey); } } else if (showIcon == 0) { RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("Notepad++_file\\shellex\\IconHandler")); RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("Notepad++_file\\shellex")); } PostMessage(hwndDlg, WM_CLOSE, 0, 0); break; } case IDC_CHECK_USECONTEXT: { int state = Button_GetCheck((HWND)lParam); if (state == BST_CHECKED) showMenu = 1; else if (state == BST_UNCHECKED) showMenu = 0; else showMenu = 2; break; } case IDC_CHECK_USEICON: { int state = Button_GetCheck((HWND)lParam); if (state == BST_CHECKED) showIcon = 1; else if (state == BST_UNCHECKED) showIcon = 0; else showIcon = 2; break; } case IDC_CHECK_CONTEXTICON: { int state = Button_GetCheck((HWND)lParam); if (state == BST_CHECKED) useMenuIcon = 1; else useMenuIcon = 0; break; } case IDC_CHECK_ISDYNAMIC: { int state = Button_GetCheck((HWND)lParam); if (state == BST_CHECKED) isDynamic = 1; else isDynamic = 0; break; } default: break; } return TRUE; break; } case WM_CLOSE: { EndDialog(hwndDlg, 0); return TRUE; break; } default: break; } return FALSE; }
bool CPluginW995::GetPanelItemInfo(const CEPanelInfo& PnlInfo, bool bSelected, INT_PTR iIndex, WIN32_FIND_DATAW& Info, wchar_t** ppszFullPathName) { if (!InfoW995 || !InfoW995->Control) return false; FILE_CONTROL_COMMANDS iCmd = bSelected ? FCTL_GETSELECTEDPANELITEM : FCTL_GETPANELITEM; INT_PTR iItemsNumber = bSelected ? ((PanelInfo*)PnlInfo.panelInfo)->SelectedItemsNumber : ((PanelInfo*)PnlInfo.panelInfo)->ItemsNumber; if ((iIndex < 0) || (iIndex >= iItemsNumber)) { _ASSERTE(FALSE && "iItem out of bounds"); return false; } INT_PTR sz = PanelControlApi(PANEL_ACTIVE, iCmd, iIndex, NULL); if (sz <= 0) return false; PluginPanelItem* pItem = (PluginPanelItem*)calloc(sz, 1); // размер возвращается в байтах if (!pItem) return false; if (PanelControlApi(PANEL_ACTIVE, iCmd, iIndex, pItem) <= 0) { free(pItem); return false; } ZeroStruct(Info); Info.dwFileAttributes = pItem->FindData.dwFileAttributes; Info.ftCreationTime = pItem->FindData.ftCreationTime; Info.ftLastAccessTime = pItem->FindData.ftLastAccessTime; Info.ftLastWriteTime = pItem->FindData.ftLastWriteTime; Info.nFileSizeLow = LODWORD(pItem->FindData.nFileSize); Info.nFileSizeHigh = HIDWORD(pItem->FindData.nFileSize); if (pItem->FindData.lpwszFileName) { LPCWSTR pszName = pItem->FindData.lpwszFileName; int iLen = lstrlen(pszName); // If full paths exceeds MAX_PATH chars - return in Info.cFileName the file name only if (iLen >= countof(Info.cFileName)) pszName = PointToName(pItem->FindData.lpwszFileName); lstrcpyn(Info.cFileName, pszName, countof(Info.cFileName)); if (ppszFullPathName) *ppszFullPathName = lstrdup(pItem->FindData.lpwszFileName); } else if (ppszFullPathName) { _ASSERTE(*ppszFullPathName == NULL); *ppszFullPathName = NULL; } if (pItem->FindData.lpwszAlternateFileName) { lstrcpyn(Info.cAlternateFileName, pItem->FindData.lpwszAlternateFileName, countof(Info.cAlternateFileName)); } free(pItem); return true; }
// --- CShellExt --- CShellExt::CShellExt() : m_cRef(0L), m_cbFiles(0), m_pDataObj(NULL), m_menuID(0), m_hMenu(NULL), m_showIcon(true), m_useCustom(false), m_nameLength(0), m_nameMaxLength(maxText), m_isDynamic(false), m_winVer(0) { TCHAR szKeyTemp [MAX_PATH + GUID_STRING_SIZE]; ZeroMemory(&m_stgMedium, sizeof(m_stgMedium)); _cRef++; GetModuleFileName(_hModule, m_szModule, MAX_PATH); OSVERSIONINFOEX inf; ZeroMemory(&inf, sizeof(OSVERSIONINFOEX)); inf.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO *)&inf); m_winVer = MAKEWORD(inf.dwMinorVersion, inf.dwMajorVersion); if (m_winVer >= WINVER_VISTA) { InitTheming(); } HKEY settingKey; LONG result; DWORD size = 0; DWORD dyn = 0, siz = 0, showicon = 0; wsprintf(szKeyTemp, TEXT("CLSID\\%s\\Settings"), szGUID); result = RegOpenKeyEx(HKEY_CLASSES_ROOT, szKeyTemp, 0, KEY_READ, &settingKey); if (result == ERROR_SUCCESS) { size = sizeof(TCHAR)*TITLE_SIZE; result = RegQueryValueEx(settingKey, TEXT("Title"), NULL, NULL, (LPBYTE)(m_szMenuTitle), &size); if (result != ERROR_SUCCESS) { lstrcpyn(m_szMenuTitle, szDefaultMenutext, TITLE_SIZE); } size = sizeof(DWORD); result = RegQueryValueEx(settingKey, TEXT("Dynamic"), NULL, NULL, (BYTE*)(&dyn), &size); if (result == ERROR_SUCCESS && dyn != 0) { m_isDynamic = true; } size = sizeof(DWORD); result = RegQueryValueEx(settingKey, TEXT("Maxtext"), NULL, NULL, (BYTE*)(&siz), &size); if (result == ERROR_SUCCESS) { m_nameMaxLength = std::max((DWORD)0,siz); } size = sizeof(DWORD); result = RegQueryValueEx(settingKey, TEXT("ShowIcon"), NULL, NULL, (BYTE*)(&showicon), &size); if (result == ERROR_SUCCESS) { m_showIcon = (showicon != 0); } result = RegQueryValueEx(settingKey, TEXT("CustomIcon"), NULL, NULL, NULL, NULL); if (result == ERROR_SUCCESS) { m_useCustom = true; size = MAX_PATH; RegQueryValueEx(settingKey, TEXT("CustomIcon"), NULL, NULL, (BYTE*)m_szCustomPath, &size); } RegCloseKey(settingKey); } }
BOOL CSoundFile::ReadPTM(const BYTE *lpStream, DWORD dwMemLength) //--------------------------------------------------------------- { DWORD dwMemPos; UINT nOrders; if ((!lpStream) || (dwMemLength < sizeof(PTMFILEHEADER))) return FALSE; PTMFILEHEADER pfh = *(LPPTMFILEHEADER)lpStream; pfh.norders = bswapLE16(pfh.norders); pfh.nsamples = bswapLE16(pfh.nsamples); pfh.npatterns = bswapLE16(pfh.npatterns); pfh.nchannels = bswapLE16(pfh.nchannels); pfh.fileflags = bswapLE16(pfh.fileflags); pfh.reserved2 = bswapLE16(pfh.reserved2); pfh.ptmf_id = bswapLE32(pfh.ptmf_id); for (UINT j=0; j<128; j++) { pfh.patseg[j] = bswapLE16(pfh.patseg[j]); } if ((pfh.ptmf_id != 0x464d5450) || (!pfh.nchannels) || (pfh.nchannels > 32) || (pfh.norders > 256) || (!pfh.norders) || (!pfh.nsamples) || (pfh.nsamples > 255) || (!pfh.npatterns) || (pfh.npatterns > 128) || (SIZEOF_PTMFILEHEADER+pfh.nsamples*SIZEOF_PTMSAMPLE >= (int)dwMemLength)) return FALSE; memcpy(m_szNames[0], pfh.songname, 28); m_szNames[0][28] = 0; m_nType = MOD_TYPE_PTM; m_nChannels = pfh.nchannels; m_nSamples = (pfh.nsamples < MAX_SAMPLES) ? pfh.nsamples : MAX_SAMPLES-1; dwMemPos = SIZEOF_PTMFILEHEADER; nOrders = (pfh.norders < MAX_ORDERS) ? pfh.norders : MAX_ORDERS-1; memcpy(Order, pfh.orders, nOrders); for (UINT ipan=0; ipan<m_nChannels; ipan++) { ChnSettings[ipan].nVolume = 64; ChnSettings[ipan].nPan = ((pfh.chnpan[ipan] & 0x0F) << 4) + 4; } for (UINT ismp=0; ismp<m_nSamples; ismp++, dwMemPos += SIZEOF_PTMSAMPLE) { MODINSTRUMENT *pins = &Ins[ismp+1]; PTMSAMPLE *psmp = (PTMSAMPLE *)(lpStream+dwMemPos); lstrcpyn(m_szNames[ismp+1], psmp->samplename, 28); memcpy(pins->name, psmp->filename, 12); pins->name[12] = 0; pins->nGlobalVol = 64; pins->nPan = 128; pins->nVolume = psmp->volume << 2; pins->nC4Speed = bswapLE16(psmp->nC4Spd) << 1; pins->uFlags = 0; if ((psmp->sampletype & 3) == 1) { UINT smpflg = RS_PCM8D; pins->nLength = BS2WORD(psmp->length); pins->nLoopStart = BS2WORD(psmp->loopbeg); pins->nLoopEnd = BS2WORD(psmp->loopend); DWORD samplepos = BS2WORD(psmp->fileofs); if (psmp->sampletype & 4) pins->uFlags |= CHN_LOOP; if (psmp->sampletype & 8) pins->uFlags |= CHN_PINGPONGLOOP; if (psmp->sampletype & 16) { pins->uFlags |= CHN_16BIT; pins->nLength >>= 1; pins->nLoopStart >>= 1; pins->nLoopEnd >>= 1; smpflg = RS_PTM8DTO16; } if ((pins->nLength) && (samplepos) && (samplepos < dwMemLength)) { ReadSample(pins, smpflg, (LPSTR)(lpStream+samplepos), dwMemLength-samplepos); } }
STDMETHODIMP CShellExt::Extract(LPCTSTR /*pszFile*/, UINT /*nIconIndex*/, HICON * phiconLarge, HICON * phiconSmall, UINT nIconSize) { WORD sizeSmall = HIWORD(nIconSize); WORD sizeLarge = LOWORD(nIconSize); ICONINFO iconinfo; BOOL res; HRESULT hrSmall = S_OK, hrLarge = S_OK; if (phiconSmall) hrSmall = LoadShellIcon(sizeSmall, sizeSmall, phiconSmall); if (phiconLarge) hrLarge = LoadShellIcon(sizeLarge, sizeLarge, phiconLarge); if (FAILED(hrSmall) || FAILED(hrLarge)) { InvalidateIcon(phiconSmall, phiconLarge); return S_FALSE; } if (!m_isDynamic || !phiconLarge || sizeLarge < 32) //No modifications required return S_OK; HDC dcEditColor, dcEditMask, dcEditTemp; HFONT font; HBRUSH brush; HPEN pen; BITMAPINFO bmi; HBITMAP hbm; LPDWORD pPix; res = GetIconInfo(*phiconLarge, &iconinfo); if (!res) return S_OK; //abort, the icon is still valid res = DestroyIcon(*phiconLarge); if (!res) return S_OK; else *phiconLarge = NULL; dcEditColor = CreateCompatibleDC(GetDC(0)); dcEditMask = CreateCompatibleDC(GetDC(0)); dcEditTemp = CreateCompatibleDC(GetDC(0)); // Create temp bitmap to render rectangle to ZeroMemory(&bmi, sizeof(bmi)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = sizeLarge; bmi.bmiHeader.biHeight = sizeLarge; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; hbm = CreateDIBSection(dcEditTemp, &bmi, DIB_RGB_COLORS, (VOID**)&pPix, NULL, 0); memset(pPix, 0x00FFFFFF, sizeof(DWORD)*sizeLarge*sizeLarge); //initialize to white pixels, no alpha SelectObject(dcEditColor, iconinfo.hbmColor); SelectObject(dcEditMask, iconinfo.hbmMask); SelectObject(dcEditTemp, hbm); LONG calSize = (LONG)(sizeLarge*2/5); LOGFONT lf = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0}}; lf.lfHeight = calSize; lf.lfWeight = FW_NORMAL; lf.lfCharSet = DEFAULT_CHARSET; lstrcpyn(lf.lfFaceName, TEXT("Courier New"), LF_FACESIZE); RECT rectText = {0, 0, 0, 0}; RECT rectBox = {0, 0, 0, 0}; COLORREF backGround = RGB(1, 1, 60); COLORREF textColor = RGB(250,250,250); font = CreateFontIndirect(&lf); brush = CreateSolidBrush(backGround); pen = CreatePen(PS_NULL, 0, backGround); SelectObject(dcEditTemp, font); SelectObject(dcEditTemp, brush); SelectObject(dcEditTemp, pen); SetBkMode(dcEditTemp, TRANSPARENT); //dont clear background when drawing text SetBkColor(dcEditTemp, backGround); SetTextColor(dcEditTemp, textColor); //Calculate size of the displayed string SIZE stringSize; GetTextExtentPoint32(dcEditTemp, m_szFilePath, m_nameLength, &stringSize); stringSize.cx = std::min(stringSize.cx, (LONG)sizeLarge-2); stringSize.cy = std::min(stringSize.cy, (LONG)sizeLarge-2); rectText.top = sizeLarge - stringSize.cy - 1; rectText.left = sizeLarge - stringSize.cx - 1; rectText.bottom = sizeLarge - 1; rectText.right = sizeLarge - 1; rectBox.top = sizeLarge - stringSize.cy - 2; rectBox.left = sizeLarge - stringSize.cx - 2; rectBox.bottom = sizeLarge; rectBox.right = sizeLarge; //Draw the background (rounded) rectangle int elipsSize = calSize/3; RoundRect(dcEditTemp, rectBox.left, rectBox.top, rectBox.right, rectBox.bottom, elipsSize, elipsSize); //Draw text in the rectangle DrawText(dcEditTemp, m_szFilePath, m_nameLength, &rectText, DT_BOTTOM|DT_SINGLELINE|DT_LEFT); //set alpha of non white pixels back to 255 //premultiply alpha //Fill in the mask bitmap (anything not 100% alpha is transparent) int red, green, blue, alpha; for(int y = 0; y < sizeLarge; y++) { for(int x = 0; x < sizeLarge; x++) { DWORD * pix = pPix+(y*sizeLarge+x); red = *pix & 0xFF; green = *pix >> 8 & 0xFF; blue = *pix >> 16 & 0xFF; alpha = *pix >> 24 & 0xFF; if ((*pix << 8) == 0xFFFFFF00) alpha = 0x00; else alpha = 0xFF; red = (red*alpha)/0xFF; green = (green*alpha)/0xFF; blue = (blue*alpha)/0xFF; *pix = RGBA(red, green, blue, alpha); } } BLENDFUNCTION ftn = { AC_SRC_OVER, 0, 0xFF, AC_SRC_ALPHA }; int width = rectBox.right - rectBox.left; int height = rectBox.bottom - rectBox.top; AlphaBlend(dcEditColor, rectBox.left, rectBox.top, stringSize.cx, stringSize.cy, dcEditTemp, rectBox.left, rectBox.top, width, height, ftn); //Adjust the mask image: simply draw the rectangle to it backGround = RGB(0, 0, 0); DeleteBrush(brush); DeletePen(pen); brush = CreateSolidBrush(backGround); pen = CreatePen(PS_NULL, 0, backGround); SelectObject(dcEditMask, brush); SelectObject(dcEditMask, pen); RoundRect(dcEditMask, rectBox.left, rectBox.top, rectBox.right, rectBox.bottom, elipsSize, elipsSize); DeleteDC(dcEditColor); DeleteDC(dcEditMask); DeleteDC(dcEditTemp); DeleteBrush(brush); DeletePen(pen); DeleteFont(font); DeleteBitmap(hbm); *phiconLarge = CreateIconIndirect(&iconinfo); DeleteBitmap(iconinfo.hbmColor); DeleteBitmap(iconinfo.hbmMask); if (*phiconLarge == NULL) { InvalidateIcon(phiconSmall, phiconLarge); return S_FALSE; } return S_OK; }
// ReadDataAndFillList(): Reads the data from the passed-in COleDataObject // and fills in the list control with the available formats. void CClipSpyListCtrl::ReadDataAndFillList ( IDataObject* pDO ) { FORMATETC etc; TCHAR szFormat[256]; HGLOBAL hgData; UINT uDataSize; CString sSize; int nItem = 0; // Empty the list control and the doc. DeleteAllItems(); // g_pMainWnd->ClearDataList(); // Get all the data and pass it to the main frame for storage. CComPtr<IEnumFORMATETC> pEnumFormats; pDO->EnumFormatEtc ( DATADIR_GET, &pEnumFormats ); while ( S_OK == pEnumFormats->Next ( 1, &etc, NULL ) ) { bool bReadData = false; STGMEDIUM stg = {0}; HRESULT hr; if ( FAILED( pDO->QueryGetData ( &etc ) )) continue; // See if this is a built-in clipboard format. If so, we already have // a description string for it - we just have to find it in the // clip format name map. If we don't find the format in the map, // then it's a custom format, and we need to get the name from Windows. CClipFormatNameMap::const_iterator it; it = m_mapFormatNames.find ( etc.cfFormat ); if ( it != m_mapFormatNames.end() ) lstrcpyn ( szFormat, it->second, countof(szFormat) ); else GetClipboardFormatName ( etc.cfFormat, szFormat, countof(szFormat) ); // Get an HGLOBAL or IStream on the next data format. etc.tymed |= TYMED_HGLOBAL | TYMED_ISTREAM; hr = pDO->GetData ( &etc, &stg ); if ( SUCCEEDED(hr) ) { // If the clipboard returned an HGLOBAL, read the data from the // global memory object. if ( stg.tymed & TYMED_HGLOBAL ) { hgData = stg.hGlobal; if ( NULL != hgData ) { uDataSize = GlobalSize ( hgData ); sSize.Format ( _T("%u (0x%X)"), uDataSize, uDataSize ); // g_pMainWnd->AddDataBlock ( hgData, uDataSize ); bReadData = true; } } // If the clipboard returned an IStream, read all the data from // the stream. if ( !bReadData && (stg.tymed & TYMED_ISTREAM) ) { LARGE_INTEGER li; ULARGE_INTEGER uli; li.QuadPart = 0; if ( SUCCEEDED( stg.pstm->Seek ( li, STREAM_SEEK_END, &uli ))) { HGLOBAL hg = GlobalAlloc ( GMEM_MOVEABLE | GMEM_SHARE, uli.LowPart ); void* pv = GlobalLock ( hg ); stg.pstm->Seek ( li, STREAM_SEEK_SET, NULL ); if ( SUCCEEDED( stg.pstm->Read ( pv, uli.LowPart, (PULONG) &uDataSize ))) { GlobalUnlock ( hg ); sSize.Format ( _T("%u (0x%X)"), uDataSize, uDataSize ); // g_pMainWnd->AddDataBlock ( hg, uDataSize ); // Free the memory we just allocated. GlobalFree ( hg ); bReadData = true; } else GlobalUnlock ( hg ); } } ReleaseStgMedium ( &stg ); } // end if (GetData() succeeded) InsertItem ( nItem, szFormat ); if ( bReadData ) { SetItemText ( nItem, 1, sSize ); } else { // If we couldn't get the data for this format, set the item data // to 1 so that the NM_CUSTOMDRAW handler will draw the text in grey. // g_pMainWnd->AddEmptyBlock(); SetItemData ( nItem, 1 ); if ( FAILED(hr) ) SetItemText ( nItem, 1, _T("<Data unavailable>") ); else SetItemText ( nItem, 1, _T("<Not displayable format>") ); } nItem++; } // end while SetColumnWidth ( 0, LVSCW_AUTOSIZE_USEHEADER ); SetColumnWidth ( 1, LVSCW_AUTOSIZE_USEHEADER ); }
/*++ Routine Description: This routine uninstalls a 3rd-party INF, PNF, and CAT (if one exists). By default this routine will first verify that there aren't any other device's, live and phantom, that are pointing their InfPath to this INF. This behavior can be overridden by the SUOI_FORCEDELETE flag. Arguments: InfFullPath - supplies the full path of the INF to be uninstalled. LogContext - optionally, supplies the log context to be used if we encounter an error when attempting to delete the catalog. Flags - the following flags are supported: SUOI_FORCEDELETE - delete the INF even if other driver keys are have their InfPath pointing to it. InfDeleteErr - optionally, supplies the address of a variable that receives the error (if any) encountered when attempting to delete the INF. Note that we delete the INF last (to avoid race conditions), so the corresponding CAT and PNF may have already been deleted at this point. Return Value: None. --*/ BOOL WINAPI SetupUninstallOEMInf_Impl( IN LPCTSTR InfFileName, IN DWORD Flags, IN PVOID Reserved) { TCHAR szInfFullPath[MAX_PATH]; UINT uiRet = ::GetSystemWindowsDirectory(szInfFullPath, MAX_PATH); _ASSERTE(0 != uiRet); HRESULT hr; hr = ::StringCchCat(szInfFullPath, MAX_PATH, _T("\\INF\\")); _ASSERTE(SUCCEEDED(hr)); hr = ::StringCchCat(szInfFullPath, MAX_PATH, pGetFilePart(InfFileName)); _ASSERTE(SUCCEEDED(hr)); if (!pFileExists(szInfFullPath)) { return FALSE; } LPCTSTR CAT_SUFFIX = _T(".cat"); LPCTSTR INF_SUFFIX = _T(".inf"); LPCTSTR PNF_SUFFIX = _T(".pnf"); BOOL fSuccess = FALSE; TCHAR FileNameBuffer[MAX_PATH+4]; // +4 in case filename is aaa. not aaa.inf LPTSTR ExtPtr= NULL; // // Unless the caller passed in the SUOI_FORCEDELETE flag first check that // no devices are using this INF file. // if (!(Flags & SUOI_FORCEDELETE) && pAnyDeviceUsingInf(szInfFullPath)) { // // Some device is still using this INF so we can't delete it. // // ERROR_SHARING_VIOLATION will be set by pAnyDeviceUsingInf return FALSE; } // // Copy the caller-supplied INF name into a local buffer, so we can modify // it when deleting the various files (INF, PNF, and CAT). // lstrcpyn(FileNameBuffer, szInfFullPath, RTL_NUMBER_OF(FileNameBuffer)); // // Uninstall the catalog (if any) first, because as soon as we delete the // INF, that slot is "open" for use by another INF, and we wouldn't want to // inadvertently delete someone else's catalog due to a race condition. // ExtPtr = _tcsrchr(FileNameBuffer, TEXT('.')); if(!ExtPtr) { // // not xxx.inf, so we know there is no catalog to delete // ::SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } hr = ::StringCchCopy(ExtPtr, MAX_PATH, CAT_SUFFIX); _ASSERTE(SUCCEEDED(hr)); fSuccess = pSetupUninstallCatalog(pGetFilePart(FileNameBuffer)); // // Now delete the PNF (we don't care so much if this succeeds or fails)... // hr = ::StringCchCopy(_tcsrchr(FileNameBuffer, TEXT('.')), MAX_PATH, PNF_SUFFIX); _ASSERTE(SUCCEEDED(hr)); (VOID) ::DeleteFile(FileNameBuffer); // // and finally the INF itself... // hr = ::StringCchCopy(_tcsrchr(FileNameBuffer, TEXT('.')), MAX_PATH, INF_SUFFIX); _ASSERTE(SUCCEEDED(hr)); fSuccess = ::DeleteFile(FileNameBuffer); if (!fSuccess) { return FALSE; } return TRUE; }
STDAPI DllRegisterServer(void) { //Register the desk band object. if(!RegisterServer(CLSID_SampleDeskBand, TEXT("Sample &Desk Band"))) return SELFREG_E_CLASS; //Register the component categories for the desk band object. if(!RegisterComCat(CLSID_SampleDeskBand, CATID_DeskBand)) return SELFREG_E_CLASS; //Register the explorer bar object. if(!RegisterServer(CLSID_SampleExplorerBar, TEXT("Sample &Explorer Bar"))) return SELFREG_E_CLASS; //Register the component categories for the explorer bar object. if(!RegisterComCat(CLSID_SampleExplorerBar, CATID_InfoBand)) return SELFREG_E_CLASS; //Register the comm band object. if(!RegisterServer(CLSID_SampleCommBand, TEXT("Sample &Comm Band"))) return SELFREG_E_CLASS; //Register the component categories for the comm band object. if(!RegisterComCat(CLSID_SampleCommBand, CATID_CommBand)) return SELFREG_E_CLASS; //Register the tool band object. if(!RegisterServer(CLSID_SampleToolBand, TEXT("Sample &Tool Band"))) return SELFREG_E_CLASS; //Register the tool band object. if(!RegisterToolBand(CLSID_SampleToolBand)) return SELFREG_E_CLASS; /* Remove the cache of the deskbands on Windows 2000. This will cause the new deskband to be displayed in the toolbar menu the next time the user brings it up. See KB article Q214842 for more information on this. */ TCHAR szSubKey[MAX_PATH]; TCHAR szCATID[MAX_PATH]; LPWSTR pwszCATID; StringFromCLSID(CATID_DeskBand, &pwszCATID); if(pwszCATID) { #ifdef UNICODE lstrcpyn(szCATID, pwszCATID, ARRAYSIZE(szCATID)); #else WideCharToMultiByte( CP_ACP, 0, pwszCATID, -1, szCATID, ARRAYSIZE(szCATID), NULL, NULL); #endif //free the string CoTaskMemFree(pwszCATID); wsprintf(szSubKey, TEXT("Component Categories\\%s\\Enum"), szCATID); RegDeleteKey(HKEY_CLASSES_ROOT, szSubKey); } return S_OK; }
void BuildMRUMenus() { HMENU hMenu = g_sdata.fileSubmenu; int i, n; MENUITEMINFO mii; TCHAR buf[MRU_DISPLAY_LENGTH + 5/*number*/ + 1/*null*/]; TCHAR buf2[MRU_DISPLAY_LENGTH - 6]; TCHAR buf3[MRU_DISPLAY_LENGTH + 1]; mii.cbSize = sizeof(mii); for(i = 0; i < MRU_LIST_SIZE; i++) { DeleteMenu(hMenu, IDM_MRU_FILE+i, MF_BYCOMMAND); } n = GetMenuItemCount(hMenu); // Remove MRU separator int seppos = n - 1; mii.fMask = MIIM_TYPE, mii.cch = 0; if (GetMenuItemInfo(hMenu, seppos, TRUE, &mii)) { if (MFT_SEPARATOR & mii.fType) { DeleteMenu(hMenu, seppos, MF_BYPOSITION); n--; } } for(i = 0; i < MRU_LIST_SIZE; i++) { if(g_mru_list[i][0]) { if (seppos) { // We have MRU items so add the separator mii.fMask = MIIM_TYPE; mii.fType = MFT_SEPARATOR; InsertMenuItem(hMenu, n++, TRUE, &mii); seppos = 0; } memset(buf,0,sizeof(buf)); mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; mii.wID = IDM_MRU_FILE+i; mii.fType = MFT_STRING; wsprintf(buf, _T("&%d "), i + 1); if(lstrlen(g_mru_list[i]) > MRU_DISPLAY_LENGTH) { TCHAR *p = _tcsrchr(g_mru_list[i],_T('\\')); if(p) { p++; if(lstrlen(p) > MRU_DISPLAY_LENGTH - 7) { *buf2 = 0; lstrcpyn(buf2,p,MRU_DISPLAY_LENGTH - 9); lstrcat(buf2,_T("...")); lstrcpyn(buf3,g_mru_list[i],4); lstrcat(buf,buf3); lstrcat(buf,_T("...\\")); lstrcat(buf,buf2); } else { lstrcpyn(buf3,g_mru_list[i],(MRU_DISPLAY_LENGTH - lstrlen(p) - 3)); lstrcat(buf,buf3); lstrcat(buf,_T("...\\")); lstrcat(buf,p); } } else { lstrcpyn(buf3,g_mru_list[i],(MRU_DISPLAY_LENGTH-2)); lstrcat(buf,buf3); lstrcat(buf,_T("...")); } } else { lstrcat(buf, g_mru_list[i]); } mii.dwTypeData = buf; mii.cch = lstrlen(buf)+1; mii.fState = MFS_ENABLED; InsertMenuItem(hMenu, n++, TRUE, &mii); } else { break; } } hMenu = g_sdata.toolsSubmenu; mii.fMask = MIIM_STATE; mii.fState = g_mru_list[0][0] ? MFS_ENABLED : MFS_GRAYED; SetMenuItemInfo(hMenu, IDM_CLEAR_MRU_LIST,FALSE,&mii); }
void TmpPanel::UpdateItems(int ShowOwners,int ShowLinks) { if (UpdateNotNeeded || TmpItemsNumber == 0) { UpdateNotNeeded=FALSE; return; } HANDLE hScreen=Info.SaveScreen(0,0,-1,-1); const wchar_t *MsgItems[]={GetMsg(MTempPanel),GetMsg(MTempUpdate)}; Info.Message(&MainGuid, nullptr,0,NULL,MsgItems,ARRAYSIZE(MsgItems),0); LastOwnersRead=ShowOwners; LastLinksRead=ShowLinks; struct PluginPanelItem *CurItem=TmpPanelItem; for (size_t i=0; i<TmpItemsNumber; i++,CurItem++) { HANDLE FindHandle; const wchar_t *lpFullName = CurItem->FileName; const wchar_t *lpSlash = wcsrchr(lpFullName,L'\\'); int Length=lpSlash ? (int)(lpSlash-lpFullName+1):0; int SameFolderItems=1; /* $ 23.12.2001 DJ если FullName - это каталог, то FindFirstFile (FullName+"*.*") этот каталог не найдет. Поэтому для каталогов оптимизацию с SameFolderItems пропускаем. */ if (Length>0 && Length > (int)lstrlen(lpFullName)) /* DJ $ */ { for (size_t j=1; i+j<TmpItemsNumber; j++) { if (memcmp(lpFullName,CurItem[j].FileName,Length*sizeof(wchar_t))==0 && wcschr((const wchar_t*)CurItem[j].FileName+Length,L'\\')==NULL) { SameFolderItems++; } else { break; } } } // SameFolderItems - оптимизация для случая, когда в панели лежат // несколько файлов из одного и того же каталога. При этом // FindFirstFile() делается один раз на каталог, а не отдельно для // каждого файла. if (SameFolderItems>2) { WIN32_FIND_DATA FindData; StrBuf FindFile((int)(lpSlash-lpFullName)+1+1+1); lstrcpyn(FindFile, lpFullName, (int)(lpSlash-lpFullName)+1); lstrcpy(FindFile+(lpSlash+1-lpFullName),L"*"); StrBuf NtPath; FormNtPath(FindFile, NtPath); for (int J=0; J<SameFolderItems; J++) CurItem[J].Flags|=REMOVE_FLAG; int Done=(FindHandle=FindFirstFile(NtPath,&FindData))==INVALID_HANDLE_VALUE; while (!Done) { for (int J=0; J<SameFolderItems; J++) { if ((CurItem[J].Flags & 1) && cmp_names(FindData, CurItem[J])==0) { CurItem[J].Flags&=~REMOVE_FLAG; const wchar_t *save = CurItem[J].FileName; WFD2FFD(FindData,CurItem[J]); free((wchar_t*)CurItem[J].FileName); CurItem[J].FileName = save; break; } } Done=!FindNextFile(FindHandle,&FindData); } FindClose(FindHandle); i+=SameFolderItems-1; CurItem+=SameFolderItems-1; } else { if (!GetFileInfoAndValidate(lpFullName,CurItem,Opt.AnyInPanel)) CurItem->Flags|=REMOVE_FLAG; } } RemoveEmptyItems(); if (ShowOwners || ShowLinks) { struct PluginPanelItem *CurItem=TmpPanelItem; for (size_t i=0; i<TmpItemsNumber; i++,CurItem++) { if (ShowOwners) { wchar_t Owner[80]; if (CurItem->Owner) { free((void*)CurItem->Owner); CurItem->Owner=NULL; } if (FSF.GetFileOwner(NULL,CurItem->FileName,Owner,80)) CurItem->Owner=wcsdup(Owner); } if (ShowLinks) CurItem->NumberOfLinks=FSF.GetNumberOfLinks(CurItem->FileName); } } Info.RestoreScreen(hScreen); }
bool SettingsXML::Load(const wchar_t *regName, LPBYTE value, DWORD nSize) { bool lbRc = false; HRESULT hr = S_OK; IXMLDOMNode* pChild = NULL; IXMLDOMNamedNodeMap* pAttrs = NULL; IXMLDOMAttribute *pIXMLDOMAttribute = NULL; IXMLDOMNode *pNode = NULL; BSTR bsType = NULL; BSTR bsData = NULL; if (!value || !nSize) return false; if (mp_Key) pChild = FindItem(mp_Key, L"value", regName, false); if (!pChild) return false; hr = pChild->get_attributes(&pAttrs); if (SUCCEEDED(hr) && pAttrs) { bsType = GetAttr(pChild, pAttrs, L"type"); } if (SUCCEEDED(hr) && bsType) { bsData = GetAttr(pChild, pAttrs, L"data"); } if (SUCCEEDED(hr) && bsData) { if (!lstrcmpi(bsType, L"string")) { #ifdef _DEBUG DWORD nLen = _tcslen(bsData) + 1; #endif DWORD nMaxLen = nSize / 2; lstrcpyn((wchar_t*)value, bsData, nMaxLen); lbRc = true; } else if (!lstrcmpi(bsType, L"ulong")) { wchar_t* pszEnd = NULL; DWORD lVal = wcstoul(bsData, &pszEnd, 10); if (nSize > 4) nSize = 4; if (pszEnd && pszEnd != bsData) { memmove(value, &lVal, nSize); lbRc = true; } } else if (!lstrcmpi(bsType, L"long")) { wchar_t* pszEnd = NULL; int lVal = wcstol(bsData, &pszEnd, 10); if (nSize > 4) nSize = 4; if (pszEnd && pszEnd != bsData) { memmove(value, &lVal, nSize); lbRc = true; } } else if (!lstrcmpi(bsType, L"dword")) { wchar_t* pszEnd = NULL; DWORD lVal = wcstoul(bsData, &pszEnd, 16); if (nSize > 4) nSize = 4; if (pszEnd && pszEnd != bsData) { memmove(value, &lVal, nSize); lbRc = true; } } else if (!lstrcmpi(bsType, L"hex")) { wchar_t* pszCur = bsData; wchar_t* pszEnd = NULL; LPBYTE pCur = value; wchar_t cHex; DWORD lVal = 0; lbRc = true; while (*pszCur && nSize) { lVal = 0; cHex = *(pszCur++); if (cHex >= L'0' && cHex <= L'9') { lVal = cHex - L'0'; } else if (cHex >= L'a' && cHex <= L'f') { lVal = cHex - L'a' + 10; } else if (cHex >= L'A' && cHex <= L'F') { lVal = cHex - L'A' + 10; } else { lbRc = false; break; } cHex = *(pszCur++); if (cHex && cHex != L',') { lVal = lVal << 4; if (cHex >= L'0' && cHex <= L'9') { lVal |= cHex - L'0'; } else if (cHex >= L'a' && cHex <= L'f') { lVal |= cHex - L'a' + 10; } else if (cHex >= L'A' && cHex <= L'F') { lVal |= cHex - L'A' + 10; } else { lbRc = false; break; } cHex = *(pszCur++); } *pCur = (BYTE)lVal; pCur++; nSize--; if (cHex != L',') { break; } } while (nSize--) // очистить хвост *(pCur++) = 0; } } // Остальные типы (строки) - не интересуют if (bsType) { ::SysFreeString(bsType); bsType = NULL; } if (bsData) { ::SysFreeString(bsData); bsData = NULL; } if (pChild) { pChild->Release(); pChild = NULL; } if (pAttrs) { pAttrs->Release(); pAttrs = NULL; } return lbRc; }
int ArcCommand::ReplaceVar(char *Command,int &Length) { char Chr=Command[2]&(~0x20); if (Command[0]!='%' || Command[1]!='%' || Chr < 'A' || Chr > 'Z') return FALSE; char SaveStr[MAX_COMMAND_LENGTH],LocalAllFilesMask[NM]; int QuoteName=0,UseSlash=FALSE,FolderMask=FALSE,FolderName=FALSE; int NameOnly=FALSE,PathOnly=FALSE,AnsiCode=FALSE; int MaxNamesLength=127; int VarLength=3; lstrcpy(LocalAllFilesMask,AllFilesMask); while (1) { int BreakScan=FALSE; Chr=Command[VarLength]; if (Command[2]=='F' && Chr >= '0' && Chr <= '9') { MaxNamesLength=FSF.atoi(&Command[VarLength]); while (Chr >= '0' && Chr <= '9') Chr=Command[++VarLength]; continue; } if (Command[2]=='E' && Chr >= '0' && Chr <= '9') { MaxAllowedExitCode=FSF.atoi(&Command[VarLength]); while (Chr >= '0' && Chr <= '9') Chr=Command[++VarLength]; continue; } switch(Command[VarLength]) { case 'A': AnsiCode=TRUE; break; case 'Q': QuoteName=1; break; case 'q': QuoteName=2; break; case 'S': UseSlash=TRUE; break; case 'M': FolderMask=TRUE; break; case 'N': FolderName=TRUE; break; case 'W': NameOnly=TRUE; break; case 'P': PathOnly=TRUE; break; case '*': lstrcpy(LocalAllFilesMask,"*"); break; default: BreakScan=TRUE; break; } if (BreakScan) break; VarLength++; } if ((MaxNamesLength-=Length)<=0) MaxNamesLength=1; if (MaxNamesLength>MAX_COMMAND_LENGTH-512) MaxNamesLength=MAX_COMMAND_LENGTH-512; if (FolderMask==FALSE && FolderName==FALSE) FolderName=TRUE; lstrcpy(SaveStr,Command+VarLength); switch(Command[2]) { case 'A': lstrcpy(Command,ArcName); if (AnsiCode) OemToChar(Command,Command); if (PathOnly) { char *NamePtr=(char *)FSF.PointToName(Command); if (NamePtr!=Command) *(NamePtr-1)=0; else lstrcpy(Command," "); } FSF.QuoteSpaceOnly(Command); break; case 'a': { int Dot=strchr(FSF.PointToName(ArcName),'.')!=NULL; ConvertNameToShort(ArcName,Command); char *Slash=strrchr(ArcName,'\\'); if (GetFileAttributes(ArcName)==0xFFFFFFFF && Slash!=NULL && Slash!=ArcName) { char Path[NM]; lstrcpy(Path,ArcName); Path[Slash-ArcName]=0; ConvertNameToShort(Path,Command); lstrcat(Command,Slash); } if (Dot && strchr(FSF.PointToName(Command),'.')==NULL) lstrcat(Command,"."); if (AnsiCode) OemToChar(Command,Command); if (PathOnly) { char *NamePtr=(char *)FSF.PointToName(Command); if (NamePtr!=Command) *(NamePtr-1)=0; else lstrcpy(Command," "); } } FSF.QuoteSpaceOnly(Command); break; case 'D': *Command=0; break; case 'E': *Command=0; break; case 'l': case 'L': if (!MakeListFile(ListFileName,Command[2]=='l',QuoteName,UseSlash, FolderName,NameOnly,PathOnly,FolderMask, LocalAllFilesMask,AnsiCode)) return -1; char QListName[NM+2]; FSF.QuoteSpaceOnly(lstrcpy(QListName,ListFileName)); lstrcpy(Command,QListName); break; case 'P': lstrcpy(Command,Password); break; case 'C': if(*CommentFileName) //второй раз сюда не лезем break; { *Command=0; HANDLE CommentFile; //char CommentFileName[MAX_PATH]; char Buf[512]; SECURITY_ATTRIBUTES sa; sa.nLength=sizeof(sa); sa.lpSecurityDescriptor=NULL; sa.bInheritHandle=TRUE; if(FSF.MkTemp(CommentFileName, "FAR") && (CommentFile=CreateFile(CommentFileName, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, &sa, CREATE_ALWAYS, /*FILE_ATTRIBUTE_TEMPORARY|*//*FILE_FLAG_DELETE_ON_CLOSE*/0, NULL)) != INVALID_HANDLE_VALUE) { DWORD Count; if(Info.InputBox(GetMsg(MComment), GetMsg(MInputComment), NULL, "", Buf, sizeof(Buf), NULL, 0)) //??тут можно и заполнить строку комментарием, но надо знать, файловый //?? он или архивный. да и имя файла в архиве тоже надо знать... { WriteFile(CommentFile, Buf, lstrlen(Buf), &Count, NULL); lstrcpy(Command, CommentFileName); CloseHandle(CommentFile); } FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); } } break; case 'R': lstrcpy(Command,RealArcDir); if (UseSlash) { for (int I=0;Command[I];I++) if (Command[I]=='\\') // Command[I]='//'; /* $ 28.11.2000 AS */ Command[I]='/'; /* AS $*/ } FSF.QuoteSpaceOnly(Command); break; case 'W': lstrcpy(Command,TempPath); break; case 'f': case 'F': if (PanelItem!=NULL) { char CurArcDir[NM]; lstrcpy(CurArcDir,ArcDir); int Length=lstrlen(CurArcDir); if (Length>0 && CurArcDir[Length-1]!='\\') lstrcat(CurArcDir,"\\"); char Names[MAX_COMMAND_LENGTH]; *Names=0; if (NameNumber==-1) NameNumber=0; while (NameNumber<ItemsNumber || Command[2]=='f') { char Name[NM*2]; int IncreaseNumber=0,FileAttr; if (*NextFileName) { FSF.sprintf(Name,"%s%s%s",PrefixFileName,CurArcDir,NextFileName); *NextFileName=0; FileAttr=0; } else { int N; if (Command[2]=='f' && PrevFileNameNumber!=-1) N=PrevFileNameNumber; else { N=NameNumber; IncreaseNumber=1; } if (N>=ItemsNumber) break; *PrefixFileName=0; char *cFileName=PanelItem[N].FindData.cFileName; if(PanelItem[N].UserData && (PanelItem[N].Flags & PPIF_USERDATA)) { struct ArcItemUserData *aud=(struct ArcItemUserData*)PanelItem[N].UserData; if(aud->SizeStruct == sizeof(struct ArcItemUserData)) { if(aud->Prefix) lstrcpyn(PrefixFileName,aud->Prefix,sizeof(PrefixFileName)); if(aud->LinkName) cFileName=aud->LinkName; } } // CHECK for BUGS!! if(*cFileName == '\\' || *cFileName == '/') FSF.sprintf(Name,"%s%s",PrefixFileName,cFileName+1); else FSF.sprintf(Name,"%s%s%s",PrefixFileName,CurArcDir,cFileName); NormalizePath(Name,Name); FileAttr=PanelItem[N].FindData.dwFileAttributes; PrevFileNameNumber=N; } if (AnsiCode) OemToChar(Name,Name); if (NameOnly) { char NewName[NM]; lstrcpy(NewName,FSF.PointToName(Name)); lstrcpy(Name,NewName); } if (PathOnly) { char *NamePtr=(char *)FSF.PointToName(Name); if (NamePtr!=Name) *(NamePtr-1)=0; else lstrcpy(Name," "); } if (*Names==0 || (lstrlen(Names)+lstrlen(Name)<MaxNamesLength && Command[2]!='f')) { NameNumber+=IncreaseNumber; if (FileAttr & FILE_ATTRIBUTE_DIRECTORY) { char FolderMaskName[NM]; //lstrcpy(LocalAllFilesMask,PrefixFileName); FSF.sprintf(FolderMaskName,"%s\\%s",Name,LocalAllFilesMask); if (PathOnly) { lstrcpy(FolderMaskName,Name); char *NamePtr=(char *)FSF.PointToName(FolderMaskName); if (NamePtr!=FolderMaskName) *(NamePtr-1)=0; else lstrcpy(FolderMaskName," "); } if (FolderMask) { if (FolderName) lstrcpy(NextFileName,FolderMaskName); else lstrcpy(Name,FolderMaskName); } } if (QuoteName==1) FSF.QuoteSpaceOnly(Name); else if (QuoteName==2) QuoteText(Name); if (UseSlash) for (int I=0;Name[I];I++) if (Name[I]=='\\') // Name[I]='//'; /* $ 28.11.2000 AS */ Name[I]='/'; /* AS $*/ if (*Names) lstrcat(Names," "); lstrcat(Names,Name); } else break; } lstrcpy(Command,Names); } else *Command=0; break; default: return FALSE; } Length=lstrlen(Command); lstrcat(Command,SaveStr); return TRUE; }
bool CDpiForDialog::Attach(HWND hWnd, HWND hCenterParent, CDynDialog* apDlgTemplate) { mh_Dlg = hWnd; wchar_t szLog[100]; mn_TemplateFontSize = apDlgTemplate ? apDlgTemplate->GetFontPointSize() : 8; mh_OldFont = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0); if ((mh_OldFont != NULL) && (GetObject(mh_OldFont, sizeof(mlf_InitFont), &mlf_InitFont) > 0)) { _wsprintf(szLog, SKIPLEN(countof(szLog)) L"CDpiForDialog(x%08X) Font='%s' lfHeight=%i Points=%u", (DWORD)(DWORD_PTR)hWnd, mlf_InitFont.lfFaceName, mlf_InitFont.lfHeight, mn_TemplateFontSize); } else { ZeroStruct(mlf_InitFont); mlf_InitFont.lfHeight = GetFontSizeForDpi(NULL, 96); lstrcpyn(mlf_InitFont.lfFaceName, L"MS Shell Dlg", countof(mlf_InitFont.lfFaceName)); mlf_InitFont.lfWeight = 400; mlf_InitFont.lfCharSet = DEFAULT_CHARSET; _wsprintf(szLog, SKIPLEN(countof(szLog)) L"CDpiForDialog(x%08X) DefaultFont='%s' lfHeight=%i Points=%u", (DWORD)(DWORD_PTR)hWnd, mlf_InitFont.lfFaceName, mlf_InitFont.lfHeight, mn_TemplateFontSize); } LogString(szLog); // Up to Windows 8 - OS will care of dialog scaling // And what will happens in Windows 8.1? // If `Per-monitor` dpi was choosed in the OS settings, // we need to re-scale our dialog manually! // But if one dpi was choosed for all monitors? CDpiAware::QueryDpiForMonitor(NULL, &m_InitDpi); // Whole desktop DPI (in most cases that will be Primary monitor DPI) m_CurDpi.SetDpi(m_InitDpi); if (!m_Items.Initialized()) m_Items.Init(8); bool bPerMonitor = CDpiAware::IsPerMonitorDpi(); DEBUGTEST(bPerMonitor = true); if (bPerMonitor) { // When Windows 8.1 is in per-monitor mode // and application is marked as per-monitor-dpi aware // Windows does not resize dialogs automatically. // Our resources are designed for standard 96 dpi. MArray<DlgItem>* p = NULL; if (m_Items.Get(m_CurDpi.Ydpi, &p) && p) delete p; p = LoadDialogItems(hWnd); m_Items.Set(m_CurDpi.Ydpi, p); DpiValue CurMonDpi; CDpiAware::QueryDpi(hCenterParent ? hCenterParent : hWnd, &CurMonDpi); // Need to resize the dialog? if (m_CurDpi.Ydpi != CurMonDpi.Ydpi) { if (!SetDialogDPI(CurMonDpi)) return false; } } else { m_CurDpi.SetDpi(m_InitDpi.Xdpi, m_InitDpi.Ydpi); } return true; }