BOOL CALLBACK SelectDbDlgProc(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam) { BOOL bReturn; if ( DoMyControlProcessing( hdlg, message, wParam, lParam, &bReturn )) return bReturn; switch ( message ) { case WM_INITDIALOG: { TCHAR szMirandaPath[MAX_PATH]; szMirandaPath[ 0 ] = 0; { HIMAGELIST hIml; hIml=ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), (IsWinVerXPPlus() ? ILC_COLOR32 : ILC_COLOR16) | ILC_MASK, 3, 3); ImageList_AddIcon(hIml,LoadIcon(hInst,MAKEINTRESOURCE(IDI_PROFILEGREEN))); ImageList_AddIcon(hIml,LoadIcon(hInst,MAKEINTRESOURCE(IDI_PROFILEYELLOW))); ImageList_AddIcon(hIml,LoadIcon(hInst,MAKEINTRESOURCE(IDI_PROFILERED))); ImageList_AddIcon(hIml,LoadIcon(hInst,MAKEINTRESOURCE(IDI_BAD))); ListView_SetImageList(GetDlgItem(hdlg,IDC_DBLIST),hIml,LVSIL_SMALL); } ListView_SetExtendedListViewStyleEx(GetDlgItem(hdlg,IDC_DBLIST),LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT); { LV_COLUMN lvc; lvc.mask = LVCF_WIDTH | LVCF_FMT | LVCF_TEXT; lvc.cx = 205; lvc.fmt = LVCFMT_LEFT; lvc.pszText = TranslateT("Database"); ListView_InsertColumn( GetDlgItem(hdlg,IDC_DBLIST), 0, &lvc ); lvc.cx = 68; lvc.fmt = LVCFMT_RIGHT; lvc.pszText = TranslateT("Total size"); ListView_InsertColumn(GetDlgItem(hdlg,IDC_DBLIST), 1, &lvc ); lvc.pszText = TranslateT("Wasted"); ListView_InsertColumn(GetDlgItem(hdlg,IDC_DBLIST), 2, &lvc ); } { TCHAR *str2; GetModuleFileName(NULL,szMirandaPath,SIZEOF(szMirandaPath)); str2 = _tcsrchr(szMirandaPath,'\\'); if( str2 != NULL ) *str2=0; } { int i = 0; HKEY hKey; TCHAR szProfileDir[MAX_PATH]; DWORD cbData = SIZEOF(szMirandaPath); TCHAR szMirandaProfiles[MAX_PATH]; _tcscpy(szMirandaProfiles, szMirandaPath); _tcscat(szMirandaProfiles, _T("\\Profiles")); GetProfileDirectory(szMirandaPath,szProfileDir,SIZEOF(szProfileDir)); // search in profile dir (using ini file) if( lstrcmpi(szProfileDir,szMirandaProfiles) ) FindAdd(hdlg, szProfileDir, _T("[ini]\\")); FindAdd(hdlg, szMirandaProfiles, _T("[prf]\\")); // search in current dir (as DBTOOL) FindAdd(hdlg, szMirandaPath, _T("[ . ]\\")); // search in profile dir (using registry path + ini file) if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Miranda"),0,KEY_QUERY_VALUE,&hKey) == ERROR_SUCCESS) { if(RegQueryValueEx(hKey,_T("Install_Dir"),NULL,NULL,(PBYTE)szMirandaPath,&cbData) == ERROR_SUCCESS) { if( lstrcmp(szProfileDir,szMirandaPath) ) { GetProfileDirectory(szMirandaPath,szProfileDir,SIZEOF(szProfileDir)); FindAdd(hdlg, szProfileDir, _T("[reg]\\")); } } RegCloseKey(hKey); } // select if ( opts.filename[0] ) i = AddDatabaseToList( GetDlgItem( hdlg, IDC_DBLIST ), opts.filename, _T("") ); if ( i == -1 ) i = 0; ListView_SetItemState( GetDlgItem(hdlg,IDC_DBLIST), i, LVIS_SELECTED, LVIS_SELECTED ); } if ( opts.hFile != NULL && opts.hFile != INVALID_HANDLE_VALUE ) { CloseHandle( opts.hFile ); opts.hFile = NULL; } TranslateDialog( hdlg ); return TRUE; } case WZN_PAGECHANGING: GetDlgItemText( hdlg, IDC_FILE, opts.filename, SIZEOF(opts.filename)); break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_FILE: if(HIWORD(wParam)==EN_CHANGE) EnableWindow(GetDlgItem(GetParent(hdlg),IDOK),GetWindowTextLength(GetDlgItem(hdlg,IDC_FILE))); break; case IDC_OTHER: { OPENFILENAME ofn={0}; TCHAR str[MAX_PATH]; // _T("Miranda Databases (*.dat)\0*.DAT\0All Files (*)\0*\0"); TCHAR *filter, *tmp, *tmp1, *tmp2; tmp1 = TranslateT("Miranda Databases (*.dat)"); tmp2 = TranslateT("All Files"); filter = tmp = (TCHAR*)_malloca((_tcslen(tmp1)+_tcslen(tmp2)+11)*sizeof(TCHAR)); tmp = addstring(tmp, tmp1); tmp = addstring(tmp, _T("*.DAT")); tmp = addstring(tmp, tmp2); tmp = addstring(tmp, _T("*")); *tmp = 0; GetDlgItemText( hdlg, IDC_FILE, str, SIZEOF( str )); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hdlg; ofn.hInstance = NULL; ofn.lpstrFilter = filter; ofn.lpstrDefExt = _T("dat"); ofn.lpstrFile = str; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; ofn.nMaxFile = SIZEOF(str); ofn.nMaxFileTitle = MAX_PATH; if ( GetOpenFileName( &ofn )) { int i; i = AddDatabaseToList( GetDlgItem(hdlg,IDC_DBLIST), str, _T("") ); if ( i == -1 ) i=0; ListView_SetItemState( GetDlgItem(hdlg,IDC_DBLIST), i, LVIS_SELECTED, LVIS_SELECTED ); } break; } case IDC_BACK: SendMessage(GetParent(hdlg),WZM_GOTOPAGE,IDD_WELCOME,(LPARAM)WelcomeDlgProc); break; case IDOK: opts.hFile = CreateFile( opts.filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL ); if ( opts.hFile == INVALID_HANDLE_VALUE ) { opts.hFile = NULL; opts.error = GetLastError(); SendMessage( GetParent(hdlg), WZM_GOTOPAGE, IDD_OPENERROR, ( LPARAM )OpenErrorDlgProc ); } else SendMessage( GetParent(hdlg), WZM_GOTOPAGE, IDD_FILEACCESS, (LPARAM)FileAccessDlgProc ); break; } break; case WM_NOTIFY: switch(((LPNMHDR)lParam)->idFrom) { case IDC_DBLIST: switch(((LPNMLISTVIEW)lParam)->hdr.code) { case LVN_ITEMCHANGED: { LV_ITEM lvi; lvi.iItem=ListView_GetNextItem(GetDlgItem(hdlg,IDC_DBLIST),-1,LVNI_SELECTED); if(lvi.iItem==-1) break; lvi.mask=LVIF_PARAM; ListView_GetItem(GetDlgItem(hdlg,IDC_DBLIST),&lvi); SetDlgItemText(hdlg,IDC_FILE,(TCHAR*)lvi.lParam); SendMessage(hdlg,WM_COMMAND,MAKEWPARAM(IDC_FILE,EN_CHANGE),(LPARAM)GetDlgItem(hdlg,IDC_FILE)); break; } } break; } break; case WM_DESTROY: { LV_ITEM lvi; lvi.mask=LVIF_PARAM; for(lvi.iItem=ListView_GetItemCount(GetDlgItem(hdlg,IDC_DBLIST))-1;lvi.iItem>=0;lvi.iItem--) { ListView_GetItem(GetDlgItem(hdlg,IDC_DBLIST),&lvi); free((char*)lvi.lParam); } } break; } return FALSE; }
void MapWindow::DrawMapScale(LKSurface& Surface, const RECT& rc /* the Map Rect*/, const bool ScaleChangeFeedback) { static short terrainwarning=0; static POINT lineOneStart, lineOneEnd,lineTwoStart,lineTwoEnd,lineThreeStart,lineThreeEnd; static POINT lineTwoStartB,lineThreeStartB; static int ytext; static bool flipflop=true; if (DoInit[MDI_DRAWMAPSCALE]) { lineOneStart.x = MAPSCALE_RIGHTMARGIN; lineOneEnd.x = MAPSCALE_RIGHTMARGIN; lineOneStart.y = MAPSCALE_BOTTOMMARGIN; lineOneEnd.y = lineOneStart.y - MAPSCALE_VSIZE; lineTwoStart.x = MAPSCALE_RIGHTMARGIN - MAPSCALE_HSIZE; lineTwoEnd.x = MAPSCALE_RIGHTMARGIN; lineTwoEnd.y = lineOneStart.y; lineTwoStart.y = lineOneStart.y; lineThreeStart.y = lineTwoStart.y - MAPSCALE_VSIZE; lineThreeEnd.y = lineThreeStart.y; lineThreeStart.x = lineTwoStart.x; lineThreeEnd.x = lineTwoEnd.x; lineTwoStartB=lineTwoStart; lineTwoStartB.x++; lineThreeStartB=lineThreeStart; lineThreeStartB.x++; SIZE tsize; Surface.SelectObject(MapScaleFont); Surface.GetTextSize(_T("M"),1,&tsize); int ofs=(MAPSCALE_VSIZE - (tsize.cy + tsize.cy))/2; ytext=lineThreeStart.y+ofs; DoInit[MDI_DRAWMAPSCALE]=false; } TCHAR Scale[200]; TCHAR Scale1[200]; TCHAR Scale2[200]; TCHAR TEMP[20]; const auto hpOld = Surface.SelectObject(hpMapScale2); Surface.DrawSolidLine(lineOneStart,lineOneEnd, rc); Surface.DrawSolidLine(lineTwoStart,lineTwoEnd, rc); Surface.DrawSolidLine(lineThreeStart,lineThreeEnd, rc); Surface.SelectObject(LKPen_White_N0); Surface.DrawSolidLine(lineOneStart,lineOneEnd, rc); Surface.DrawSolidLine(lineTwoStartB,lineTwoEnd, rc); Surface.DrawSolidLine(lineThreeStartB,lineThreeEnd, rc); Surface.SelectObject(hpOld); flipflop=!flipflop; _tcscpy(Scale2,TEXT("")); bool inpanmode= (!mode.Is(Mode::MODE_TARGET_PAN) && mode.Is(Mode::MODE_PAN)); if (inpanmode) { if (DerivedDrawInfo.TerrainValid) { double alt= ALTITUDEMODIFY*RasterTerrain::GetTerrainHeight(GetPanLatitude(), GetPanLongitude()); if (alt==TERRAIN_INVALID) alt=0.0; _stprintf(Scale2, _T(" %.0f%s "),alt, Units::GetUnitName(Units::GetUserAltitudeUnit())); } double pandistance, panbearing; if(ValidTaskPoint(PanTaskEdit)) { _stprintf(Scale, _T("Task %.1f%s"), CALCULATED_INFO.TaskDistanceToGo*DISTANCEMODIFY, Units::GetDistanceName()/*, panbearing,_T(DEG)*/ ); } else { DistanceBearing(DrawInfo.Latitude,DrawInfo.Longitude,GetPanLatitude(),GetPanLongitude(),&pandistance,&panbearing); _stprintf(Scale, _T(" %.1f%s %.0f%s "), pandistance*DISTANCEMODIFY, Units::GetDistanceName(), panbearing, gettext(_T("_@M2179_")) ); } _tcscat(Scale2,Scale); goto _skip1; } // // This stuff is not painted while panning, to save space on screen // // warn about missing terrain if (!DerivedDrawInfo.TerrainValid) { if (terrainwarning < 120) { // LKTOKEN _@M1335_ " TERRAIN?" _tcscat(Scale2, MsgToken(1335)); terrainwarning++; } else { // LKTOKEN _@M1336_ " T?" _tcscat(Scale2, MsgToken(1336)); terrainwarning=120; } } else terrainwarning=0; if (UseTotalEnergy) { _tcscat(Scale2, TEXT("[TE]")); // Total Energy indicator } if (zoom.AutoZoom()) { // LKTOKEN _@M1337_ " AZM" _tcscat(Scale2, MsgToken(1337)); } _skip1: // // Back painting stuff even in PAN mode // if (mode.AnyPan()) { // LKTOKEN _@M1338_ " PAN" _tcscat(Scale2, MsgToken(1338)); } if (DrawBottom) { switch(BottomMode) { case BM_TRM: // LKTOKEN _@M1340_ " TRM0" _tcscat(Scale2, MsgToken(1340)); break; case BM_CRU: // LKTOKEN _@M1341_ " NAV1" _tcscat(Scale2, MsgToken(1341)); break; case BM_HGH: // LKTOKEN _@M1342_ " ALT2" _tcscat(Scale2, MsgToken(1342)); break; case BM_AUX: // LKTOKEN _@M1343_ " STA3" _tcscat(Scale2, MsgToken(1343)); break; case BM_TSK: // LKTOKEN _@M1344_ " TSK4" _tcscat(Scale2, MsgToken(1344)); break; case BM_ALT: // LKTOKEN _@M1345_ " ATN5" _tcscat(Scale2, MsgToken(1345)); break; case BM_SYS: // LKTOKEN _@M1346_ " SYS6" _tcscat(Scale2, MsgToken(1346)); break; case BM_CUS2: // LKTOKEN _@M1347_ " CRU7" _tcscat(Scale2, MsgToken(1347)); break; case BM_CUS3: // LKTOKEN _@M1348_ " FIN8" _tcscat(Scale2, MsgToken(1348)); break; case BM_CUS: // LKTOKEN _@M1349_ " AUX9" _tcscat(Scale2, MsgToken(1349)); break; default: break; } } if (inpanmode) goto _skip2; if (ReplayLogger::IsEnabled()) { _stprintf(Scale,_T("%s %.0fX"), MsgToken(1350), // " REPLAY" ReplayLogger::TimeScale); _tcscat(Scale2, Scale); } if (BallastTimerActive) { // LKTOKEN _@M1351_ " BALLAST" _stprintf(TEMP,TEXT("%s %3.0fL"), MsgToken(1351), WEIGHTS[2]*BALLAST); _tcscat(Scale2, TEMP); } _skip2: _tcscpy(Scale,TEXT("")); _tcscpy(Scale1,TEXT("")); //if (SIMMODE && (!mode.Is(Mode::MODE_TARGET_PAN) && mode.Is(Mode::MODE_PAN)) ) { if (inpanmode) { TCHAR sCoordinate[32]={0}; Units::CoordinateToString(GetPanLongitude(), GetPanLatitude(), sCoordinate, array_size(sCoordinate)-1); _tcscat(Scale, sCoordinate); _tcscat(Scale, _T(" ")); } double mapScale=Units::ToSysDistance(zoom.Scale()*1.4); // 1.4 for mapscale symbol size on map screen // zoom.Scale() gives user units, but FormatUserMapScale() needs system distance units Units::FormatUserMapScale(NULL, mapScale, Scale1, sizeof(Scale1)/sizeof(Scale1[0])); _tcscat(Scale,Scale1); SIZE tsize; Surface.SetBackgroundTransparent(); const auto oldFont = Surface.SelectObject(MapScaleFont); const auto oldPen = Surface.SelectObject(LK_BLACK_PEN); const auto oldBrush = Surface.SelectObject(LKBrush_Black); Surface.GetTextSize(Scale, _tcslen(Scale), &tsize); LKColor mapscalecolor = OverColorRef; if (OverColorRef==RGB_SBLACK) mapscalecolor=RGB_WHITE; LKWriteText(Surface, Scale, rc.right-NIBLSCALE(7)-tsize.cx, ytext, 0, WTMODE_OUTLINED, WTALIGN_LEFT, mapscalecolor, true); Surface.GetTextSize(Scale2, _tcslen(Scale2), &tsize); if (!DerivedDrawInfo.TerrainValid) { if (terrainwarning>0 && terrainwarning<120) mapscalecolor=RGB_RED; } LKWriteText(Surface, Scale2, rc.right-NIBLSCALE(7)-tsize.cx, ytext+tsize.cy, 0, WTMODE_OUTLINED, WTALIGN_LEFT, mapscalecolor, true); Surface.SelectObject(oldPen); Surface.SelectObject(oldBrush); Surface.SelectObject(oldFont); }
INT_PTR CALLBACK DlgList(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HWND hwndList = GetDlgItem(hDlg, IDC_LIST_UPDATES); switch (message) { case WM_INITDIALOG: hwndDialog = hDlg; TranslateDialogDefault( hDlg ); oldWndProc = (WNDPROC)SetWindowLongPtr(hwndList, GWLP_WNDPROC, (LONG_PTR)PluginListWndProc); SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)Skin_GetIcon("plg_list", 1)); SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)Skin_GetIcon("plg_list")); { HIMAGELIST hIml = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 4, 0); ImageList_AddIconFromIconLib(hIml, "info"); ListView_SetImageList(hwndList, hIml, LVSIL_SMALL); OSVERSIONINFO osver = { sizeof(osver) }; if (GetVersionEx(&osver) && osver.dwMajorVersion >= 6) { wchar_t szPath[MAX_PATH]; GetModuleFileName(NULL, szPath, SIZEOF(szPath)); TCHAR *ext = _tcsrchr(szPath, '.'); if (ext != NULL) *ext = '\0'; _tcscat(szPath, _T(".test")); HANDLE hFile = CreateFile(szPath, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) // Running Windows Vista or later (major version >= 6). Button_SetElevationRequiredState(GetDlgItem(hDlg, IDOK), !IsProcessElevated()); else { CloseHandle(hFile); DeleteFile(szPath); } } RECT r; GetClientRect(hwndList, &r); /// LVCOLUMN lvc = {0}; lvc.mask = LVCF_WIDTH | LVCF_TEXT; //lvc.fmt = LVCFMT_LEFT; lvc.pszText = TranslateT("Component Name"); lvc.cx = 220; // width of column in pixels ListView_InsertColumn(hwndList, 0, &lvc); lvc.pszText = L""; lvc.cx = 32 - GetSystemMetrics(SM_CXVSCROLL); // width of column in pixels ListView_InsertColumn(hwndList, 1, &lvc); lvc.pszText = TranslateT("State"); lvc.cx = 100 - GetSystemMetrics(SM_CXVSCROLL); // width of column in pixels ListView_InsertColumn(hwndList, 2, &lvc); /// LVGROUP lvg; lvg.cbSize = sizeof(LVGROUP); lvg.mask = LVGF_HEADER | LVGF_GROUPID; lvg.pszHeader = TranslateT("Plugins"); lvg.iGroupId = 1; ListView_InsertGroup(hwndList, 0, &lvg); lvg.pszHeader = TranslateT("Icons"); lvg.iGroupId = 2; ListView_InsertGroup(hwndList, 0, &lvg); lvg.pszHeader = TranslateT("Other"); lvg.iGroupId = 3; ListView_InsertGroup(hwndList, 0, &lvg); ListView_EnableGroupView(hwndList, TRUE); /// SendMessage(hwndList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES | LVS_EX_CHECKBOXES | LVS_EX_LABELTIP); ListView_DeleteAllItems(hwndList); /// OBJLIST<FILEINFO> &todo = *(OBJLIST<FILEINFO> *)lParam; for (int i = 0; i < todo.getCount(); ++i) { int groupId = 3; LVITEM lvi = {0}; lvi.mask = LVIF_PARAM | LVIF_GROUPID | LVIF_TEXT | LVIF_IMAGE; if (_tcschr(todo[i].tszOldName, L'\\') != NULL) groupId = _tcsstr(todo[i].tszOldName, L"Plugins") != NULL ? 1 : 2; lvi.iItem = i; lvi.lParam = (LPARAM)&todo[i]; lvi.iGroupId = groupId; lvi.iImage = -1; lvi.pszText = todo[i].tszOldName; int iRow = ListView_InsertItem(hwndList, &lvi); if (iRow != -1) { lvi.iItem = iRow; if (groupId == 1) { lvi.mask = LVIF_IMAGE; lvi.iSubItem = 1; lvi.iImage = 0; ListView_SetItem(hwndList, &lvi); } } todo[i].bEnabled = false; } HWND hwOk = GetDlgItem(hDlg, IDOK); EnableWindow(hwOk, false); } // do this after filling list - enables 'ITEMCHANGED' below SetWindowLongPtr(hDlg, GWLP_USERDATA, lParam); Utils_RestoreWindowPosition(hDlg, 0, MODNAME, "ListWindow"); return TRUE; case WM_NOTIFY: if (((LPNMHDR) lParam)->hwndFrom == hwndList) { switch (((LPNMHDR) lParam)->code) { case LVN_ITEMCHANGED: if (GetWindowLongPtr(hDlg, GWLP_USERDATA)) { NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam; LVITEM lvI = {0}; lvI.iItem = nmlv->iItem; lvI.iSubItem = 0; lvI.mask = LVIF_PARAM; ListView_GetItem(hwndList, &lvI); OBJLIST<FILEINFO> &todo = *(OBJLIST<FILEINFO> *)GetWindowLongPtr(hDlg, GWLP_USERDATA); if ((nmlv->uNewState ^ nmlv->uOldState) & LVIS_STATEIMAGEMASK) { todo[lvI.iItem].bEnabled = ListView_GetCheckState(hwndList, nmlv->iItem); bool enableOk = false; for (int i=0; i < todo.getCount(); ++i) { if (todo[i].bEnabled) { enableOk = true; break; } } HWND hwOk = GetDlgItem(hDlg, IDOK); EnableWindow(hwOk, enableOk ? TRUE : FALSE); } } break; } } break; case WM_COMMAND: if (HIWORD( wParam ) == BN_CLICKED) { switch(LOWORD(wParam)) { case IDOK: EnableWindow( GetDlgItem(hDlg, IDOK), FALSE); EnableWindow( GetDlgItem(hDlg, IDC_SELNONE), FALSE); mir_forkthread(ApplyDownloads, hDlg); return TRUE; case IDC_SELNONE: SelectAll(hDlg, false); break; case IDCANCEL: DestroyWindow(hDlg); return TRUE; } } break; case WM_SIZE: // make the dlg resizeable if (!IsIconic(hDlg)) { UTILRESIZEDIALOG urd = { sizeof(urd) }; urd.hInstance = hInst; urd.hwndDlg = hDlg; urd.lpTemplate = MAKEINTRESOURCEA(IDD_LIST); urd.pfnResizer = ListDlg_Resize; CallService(MS_UTILS_RESIZEDIALOG, 0, (LPARAM)&urd); } break; case WM_GETMINMAXINFO: { LPMINMAXINFO mmi = (LPMINMAXINFO)lParam; // The minimum width in points mmi->ptMinTrackSize.x = 370; // The minimum height in points mmi->ptMinTrackSize.y = 300; } break; case WM_DESTROY: Utils_SaveWindowPosition(hDlg, NULL, MODNAME, "ListWindow"); Skin_ReleaseIcon((HICON)SendMessage(hDlg, WM_SETICON, ICON_BIG, 0)); Skin_ReleaseIcon((HICON)SendMessage(hDlg, WM_SETICON, ICON_SMALL, 0)); hwndDialog = NULL; delete (OBJLIST<FILEINFO> *)GetWindowLongPtr(hDlg, GWLP_USERDATA); SetWindowLongPtr(hDlg, GWLP_USERDATA, 0); break; } return FALSE; }
/* If /s switch is specifyed all subdirs has to be considered */ INT recFindSubDirs(DWORD dwFlags, TCHAR szSrcPath[MAX_PATH], TCHAR szDestPath[MAX_PATH], BOOL *doMore) { HANDLE hFile; WIN32_FIND_DATA findBuffer; TCHAR tmpDestPath[MAX_PATH], tmpSrcPath[MAX_PATH]; INT filesReplaced = 0, i; /* Add a wildcard to dest end so the it will be easy to itterate over all the files and directorys in the dest directory */ _tcscat(szDestPath, _T("*")); /* Get the first file in the directory */ hFile = FindFirstFile (szDestPath, &findBuffer); /* Remove the star added earlyer to dest path */ for(i = (_tcslen(szDestPath) - 1); i > -1; i--) if(szDestPath[i] != _T('\\')) szDestPath[i] = _T('\0'); else break; /* Iterate over all filed directories in the dest dir */ do { /* Save the source path so that it will not be wrecked */ _tcscpy(tmpSrcPath,szSrcPath); /* Check for reading problems */ if(hFile == INVALID_HANDLE_VALUE) { ConOutFormatMessage (GetLastError(), tmpSrcPath); return filesReplaced; } /* Check if the we should enter the dir or if it is a file or . or .. if so thake the next object to process */ if(!_tcscmp (findBuffer.cFileName, _T(".")) || !_tcscmp (findBuffer.cFileName, _T(".."))|| IsExistingFile(findBuffer.cFileName)) continue; /* Add the destpath and the new dir path to tempDestPath */ _tcscpy(tmpDestPath,szDestPath); _tcscat (tmpDestPath, findBuffer.cFileName); /* Make sure that we have a directory */ if(IsExistingDirectory(tmpDestPath)) { /* Add a \ to the end or the path */ if(szDestPath[_tcslen(tmpDestPath) - 1] != _T('\\')) _tcscat(tmpDestPath, _T("\\")); /* Call the function to replace files in the new directory */ filesReplaced += recReplace(dwFlags, tmpSrcPath, tmpDestPath, doMore); /* If there were problems break e.g. read-only file */ if(!*doMore) break; _tcscpy(tmpSrcPath,szSrcPath); /* Controle the next level of subdirs */ filesReplaced += recFindSubDirs(dwFlags,tmpSrcPath,tmpDestPath, doMore); if(!*doMore) break; } /* Get the next handle */ } while(FindNextFile (hFile, &findBuffer)); return filesReplaced; }
// see "MetaData Unmanaged API.doc" file available inside // Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Tool Developers Guide\docs\ // for meta data informations CParameterInfo* CParameterInfo::Parse(IN IMetaDataImport *pMetaDataImport,IN PCOR_SIGNATURE pSigParam,OUT PCOR_SIGNATURE* pNextSig) { CParameterInfo* pParameterInfo=NULL; COR_SIGNATURE SigContent; *pNextSig=0; pParameterInfo=new CParameterInfo(); if (!pParameterInfo) return NULL; //SigParam: //1) 0,N ELEMENT_TYPE_CMOD_REQD/ELEMENT_TYPE_CMOD_OPT //2) a) 0,1 TYPE_BYREF + 1 Type // or // b) 1 TYPE_TYPEDBYREF SigContent=*pSigParam; pSigParam++; switch (SigContent) { // 1) 0,N ELEMENT_TYPE_CMOD_REQD/ELEMENT_TYPE_CMOD_OPT case ELEMENT_TYPE_CMOD_REQD: case ELEMENT_TYPE_CMOD_OPT: { // in these 2 case we don't get mdToken Token; TCHAR szClassName[MAX_LENGTH]; *szClassName=0; pSigParam += CorSigUncompressToken(pSigParam,&Token); if (TypeFromToken(Token)!=mdtTypeRef) { HRESULT hr; WCHAR szName[MAX_LENGTH]; DWORD szNameSize; *szName=0; hr = pMetaDataImport->GetTypeDefProps(Token, szName, MAX_LENGTH, &szNameSize, NULL, NULL); szName[MAX_LENGTH-1]=0; if (FAILED(hr) || (szName==0) ) { wsprintfW(szName,L"ParamToken%u",Token); } #if (defined(UNICODE)||defined(_UNICODE)) _tcsncpy(szClassName,szName,MAX_LENGTH); #else wcstombs(szClassName,szName,MAX_LENGTH); #endif szClassName[MAX_LENGTH-1]=0; } _tcscpy(pParameterInfo->szName,szClassName); // get type pParameterInfo->WinAPIOverrideType=CSupportedParameters::GetParamType(pParameterInfo->szName); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); } break; // 2) b) 1 TYPE_TYPEDBYREF case ELEMENT_TYPE_TYPEDBYREF: //A TYPEDBYREF is a simple structure of two DWORDs – one indicates the type of the parameter, the other, its value. //This struct is pushed on the stack by the caller. //So, only at runtime, is the type of the parameter actually provided. //TYPEDBYREF was originally introduced to support VB’s "refany" argument-passing technique _tcscpy(pParameterInfo->szName,_T("ULONG64")); // get type pParameterInfo->WinAPIOverrideType=PARAM_INT64; // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; // 2) a) 0,1 TYPE_BYREF + 1 Type case ELEMENT_TYPE_BYREF: // delete current info delete pParameterInfo; // get type infos pParameterInfo=CParameterInfo::Parse(pMetaDataImport,pSigParam,&pSigParam); if (!pParameterInfo) return NULL; _tcscat(pParameterInfo->szName,_T("*")); pParameterInfo->bPointedParameter=TRUE; // get type if (pParameterInfo->WinAPIOverrideType & EXTENDED_TYPE_FLAG_MASK) pParameterInfo->WinAPIOverrideType=PARAM_POINTER; else pParameterInfo->WinAPIOverrideType=CSupportedParameters::GetParamType(pParameterInfo->szName); pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; ////////////////////////// // from now only Type ////////////////////////// //Type := VOID (for return type) // | Intrinsic (BOOLEAN | CHAR | I1 | U1 | I2 | U2 | I4 | U4 | I8 | U8 | R4 | R8 | I | U) // | VALUETYPE TypeDefOrRefEncoded // | CLASS TypeDefOrRefEncoded // | STRING // | OBJECT // | PTR CustomMod* VOID // | PTR CustomMod* Type // | FNPTR MethodDefSig // | FNPTR MethodRefSig // | ARRAY Type ArrayShape // | SZARRAY CustomMod* Type case ELEMENT_TYPE_VOID: // set default type pParameterInfo->WinAPIOverrideType=PARAM_VOID; _tcscpy(pParameterInfo->szName,_T("VOID")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_BOOLEAN: // set default type pParameterInfo->WinAPIOverrideType=PARAM_BOOL; _tcscpy(pParameterInfo->szName,_T("BOOL")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_CHAR: // set default type pParameterInfo->WinAPIOverrideType=PARAM_WCHAR; _tcscpy(pParameterInfo->szName,_T("WCHAR")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_I1: // set default type pParameterInfo->WinAPIOverrideType=PARAM_CHAR; _tcscpy(pParameterInfo->szName,_T("SBYTE")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_U1: // set default type pParameterInfo->WinAPIOverrideType=PARAM_BYTE; _tcscpy(pParameterInfo->szName,_T("BYTE")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_I2: // set default type pParameterInfo->WinAPIOverrideType=PARAM_SHORT; _tcscpy(pParameterInfo->szName,_T("SHORT")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_U2: // set default type pParameterInfo->WinAPIOverrideType=PARAM_USHORT; _tcscpy(pParameterInfo->szName,_T("USHORT")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_I4: // set default type pParameterInfo->WinAPIOverrideType=PARAM_INT; _tcscpy(pParameterInfo->szName,_T("INT")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_U4: // set default type pParameterInfo->WinAPIOverrideType=PARAM_UINT; _tcscpy(pParameterInfo->szName,_T("UINT")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_I8: // set default type pParameterInfo->WinAPIOverrideType=PARAM_INT64; _tcscpy(pParameterInfo->szName,_T("INT64")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_U8: // set default type pParameterInfo->WinAPIOverrideType=PARAM_INT64; _tcscpy(pParameterInfo->szName,_T("UINT64")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_R4: // set default type pParameterInfo->WinAPIOverrideType=PARAM_FLOAT; _tcscpy(pParameterInfo->szName,_T("float")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_R8: // set default type pParameterInfo->WinAPIOverrideType=PARAM_DOUBLE; _tcscpy(pParameterInfo->szName,_T("double")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_U: // set default type pParameterInfo->WinAPIOverrideType=PARAM_UINT; _tcscpy(pParameterInfo->szName,_T("UINT")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_I: // set default type pParameterInfo->WinAPIOverrideType=PARAM_INT; _tcscpy(pParameterInfo->szName,_T("INT")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_OBJECT: // set default type pParameterInfo->WinAPIOverrideType=PARAM_POINTER; _tcscpy(pParameterInfo->szName,_T("PVOID")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_STRING: // set default type pParameterInfo->WinAPIOverrideType=PARAM_NET_STRING; _tcscpy(pParameterInfo->szName,_T("string")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_VALUETYPE: case ELEMENT_TYPE_CLASS: { HRESULT hResult=E_FAIL; mdToken Token; TCHAR szClassName[MAX_LENGTH]; WCHAR szName[MAX_LENGTH]; DWORD szNameSize; *szClassName=0; *szName=0; pSigParam+=CorSigUncompressToken(pSigParam,&Token); if ( TypeFromToken( Token ) == mdtTypeDef ) { hResult = pMetaDataImport->GetTypeDefProps( Token, szName, MAX_LENGTH, &szNameSize, NULL, NULL ); } else if ( TypeFromToken( Token ) == mdtTypeRef ) { hResult = pMetaDataImport->GetTypeRefProps(Token, NULL,szName, MAX_LENGTH, &szNameSize); } szName[MAX_LENGTH-1]=0; if (FAILED(hResult) || (szName==0) || (*szName<32) || (*szName>126) // assume readable name ) { wsprintfW(szName,L"ParamToken%u",Token); } #if (defined(UNICODE)||defined(_UNICODE)) _tcsncpy( szClassName,szName, MAX_LENGTH); #else wcstombs( szClassName, szName, MAX_LENGTH ); #endif szClassName[MAX_LENGTH-1]=0; _tcscpy(pParameterInfo->szName,szClassName); // set default type pParameterInfo->WinAPIOverrideType=PARAM_POINTER; // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; } case ELEMENT_TYPE_FNPTR: // set default type pParameterInfo->WinAPIOverrideType=PARAM_POINTER; _tcscpy(pParameterInfo->szName,_T("FunctionPointer")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_SZARRAY: // The SZARRAY production describes a frequently-used, special-case of ARRAY // that's to say, a single-dimension (rank 1) array, with a zero lower bound, and no specified size // delete current info delete pParameterInfo; // get type infos pParameterInfo=CParameterInfo::Parse(pMetaDataImport,pSigParam,&pSigParam); if (!pParameterInfo) return NULL; _tcscat(pParameterInfo->szName,_T("*")); pParameterInfo->bPointedParameter=TRUE; // get type pParameterInfo->WinAPIOverrideType=CSupportedParameters::GetParamType(pParameterInfo->szName); pParameterInfo->WinAPIOverrideType|=EXTENDED_TYPE_FLAG_NET_SINGLE_DIM_ARRAY; pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; case ELEMENT_TYPE_ARRAY: { //1) rank //2) num size //3) 0-N Sizes //4) nb low bounds //5) 0-N low bounds // //ex // Type Rank NumSizes Size* NumLoBounds LoBound* //[0..2] I4 1 1 3 0 //[,,,,,,] I4 6 0 //[0..3, 0..2,,,,] I4 6 2 4,3 0 //[1..2, 6..8] I4 2 2 2,3 2 1,6 //[5, 3..5, , ] I4 3 2 5,3 2 0,3 ULONG rank; // delete current info delete pParameterInfo; // parse element pParameterInfo=CParameterInfo::Parse(pMetaDataImport,pSigParam,&pSigParam); if (!pParameterInfo) return NULL; _tcscat(pParameterInfo->szName,_T("*")); pParameterInfo->bPointedParameter=TRUE; // get type pParameterInfo->WinAPIOverrideType=CSupportedParameters::GetParamType(pParameterInfo->szName); pParameterInfo->WinAPIOverrideType|=EXTENDED_TYPE_FLAG_NET_MULTIPLE_DIM_ARRAY; pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); // we have to do parsing even if not necessary to find next signature // 1) rank rank = CorSigUncompressData((PCCOR_SIGNATURE&)pSigParam); if ( rank > 0 ) { ULONG *lower; ULONG *sizes; ULONG numsizes; ULONG arraysize=(sizeof(ULONG)*2*rank); lower=(ULONG*)_alloca(arraysize); memset(lower,0,arraysize); sizes=&lower[rank]; // 2) num size numsizes = CorSigUncompressData((PCCOR_SIGNATURE&)pSigParam); if ( numsizes <= rank ) { ULONG numlower; ULONG i; // 3) sizes for ( i = 0; i < numsizes; i++ ) sizes[i] = CorSigUncompressData((PCCOR_SIGNATURE&)pSigParam); // 4) num lower numlower = CorSigUncompressData((PCCOR_SIGNATURE&)pSigParam); if ( numlower <= rank ) { // 5) low bounds for ( i = 0; i < numlower; i++) lower[i] = CorSigUncompressData((PCCOR_SIGNATURE&)pSigParam); //// to display array size only //_tcscat( pParameterInfo->szName, "[" ); //for ( i = 0; i < rank; i++ ) //{ // if ( (sizes[i] != 0) && (lower[i] != 0) ) // { // if ( lower[i] == 0 ) // _stprintf ( pParameterInfo->szName, _T("%d"), sizes[i] ); // else // { // _stprintf( pParameterInfo->szName, _T("%d"), lower[i] ); // _tcscat( pParameterInfo->szName, _T("...") ); // if ( sizes[i] != 0 ) // _stprintf( pParameterInfo->szName, _T("%d"), (lower[i] + sizes[i] + 1) ); // } // } // if ( i < (rank - 1) ) // _tcscat( pParameterInfo->szName, _T(",") ); //} //_tcscat( pParameterInfo->szName, _T("]") ); } } } } break; case ELEMENT_TYPE_PINNED: // delete current info delete pParameterInfo; // parse element pParameterInfo=CParameterInfo::Parse(pMetaDataImport,pSigParam,&pSigParam); if (!pParameterInfo) return NULL; // _tcscat(pParameterInfo->szName,_T("pinned")); break; case ELEMENT_TYPE_PTR: // delete current info delete pParameterInfo; // get type infos pParameterInfo=CParameterInfo::Parse(pMetaDataImport,pSigParam,&pSigParam); if (!pParameterInfo) return NULL; _tcscat(pParameterInfo->szName,_T("*")); pParameterInfo->bPointedParameter=TRUE; // get type if (pParameterInfo->WinAPIOverrideType & EXTENDED_TYPE_FLAG_MASK) pParameterInfo->WinAPIOverrideType=PARAM_POINTER; else pParameterInfo->WinAPIOverrideType=CSupportedParameters::GetParamType(pParameterInfo->szName); pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; default: case ELEMENT_TYPE_END: case ELEMENT_TYPE_SENTINEL: // set default type pParameterInfo->WinAPIOverrideType=PARAM_UNKNOWN; _tcscpy(pParameterInfo->szName,_T("Unknown")); // get sizes pParameterInfo->StackSize=CSupportedParameters::GetParamStackSize(pParameterInfo->WinAPIOverrideType); pParameterInfo->PointedSize=CSupportedParameters::GetParamPointedSize(pParameterInfo->WinAPIOverrideType); break; } // switch // fill output parameters *pNextSig=pSigParam; return pParameterInfo; }
BOOL CPropertiesGeneral::OnInitDialog() { CPropertyPage::OnInitDialog(); CARMDlg* dlg=(CARMDlg*)this->GetParentOwner()->GetParent(); TCHAR szTemp[MAX_PATH]; arfile* arFile=(arfile*)dlg->m_lstFiles.GetItemDataPtr(dlg->m_lstFiles.GetCurSel()); HANDLE hFile; FILETIME fileTime; size_t fileSize; SYSTEMTIME stUTC, stLocal; TCITEM ti={0}; HZIP hZip; ZIPENTRY ze; LPTSTR pszTemp, pszBuffer, pszTok; CString szBytes; szBytes.LoadString(IDS_BYTES); _tcscpy(szTemp,arFile->fileName); *_tcsrchr(szTemp,'\\')=0; SetDlgItemText(IDC_PROP_DESC,arFile->description); SetDlgItemText(IDC_PROP_FILENAME,szTemp+_tcslen(szTemp)+1); SetDlgItemText(IDC_PROP_LOCATION,szTemp); _itot(arFile->size,szTemp,10); _tcscat(szTemp,szBytes); SetDlgItemText(IDC_PROP_UNCOMPRESSED,szTemp); hFile=CreateFile(arFile->fileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); fileSize=GetFileSize(hFile,NULL); GetFileTime(hFile,NULL,NULL,&fileTime); FileTimeToSystemTime(&fileTime, &stUTC); SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal); CloseHandle(hFile); _itot((int)fileSize,szTemp,10); _tcscat(szTemp,szBytes); SetDlgItemText(IDC_PROP_FILESIZE,szTemp); _stprintf(szTemp,"%4d/%2d/%2d %2d:%2d:%2d",stLocal.wYear,stLocal.wMonth,stLocal.wDay,stLocal.wHour,stLocal.wMinute,stLocal.wSecond); SetDlgItemText(IDC_PROP_MODIFIED,szTemp); _stprintf(szTemp,"%d - ",arFile->features); ti.mask=TCIF_TEXT; ti.pszText=szTemp+_tcslen(szTemp); ti.cchTextMax=MAX_PATH-(int)_tcslen(szTemp); dlg->m_tab.GetItem(dlg->m_tab.GetCurSel(),&ti); SetDlgItemText(IDC_PROP_FILETYPE,szTemp); hZip=OpenZip(arFile->fileName,0,ZIP_FILENAME); if (hZip) { for (int c=0; GetZipItem(hZip,c,&ze)!=ZR_ARGS; c++) { _tcslwr(ze.name); if (!_tcsncmp(ze.name,"tune/",5) && _tcsstr(ze.name,".info")) { pszTemp=(LPTSTR)malloc(ze.unc_size); UnzipItem(hZip,c,pszTemp,ze.unc_size,ZIP_MEMORY); pszBuffer=_tcsstr(pszTemp,"Colors="); if (pszBuffer) { pszBuffer+=7; if (_tcschr(pszBuffer,'\r')) *_tcschr(pszBuffer,'\r')=0; if (_tcschr(pszBuffer,'\n')) *_tcschr(pszBuffer,'\n')=0; pszTok=_tcstok(pszBuffer,"|"); while (pszTok) { ((CListBox*)this->GetDlgItem(IDC_PROP_VARIATIONS))->AddString(pszTok); pszTok=_tcstok(NULL,"|"); } } free(pszTemp); } } CloseZip(hZip); } return FALSE; }
ButtonLabel::Expanded ButtonLabel::Expand(const TCHAR *text, TCHAR *buffer, size_t size) { Expanded expanded; const TCHAR *dollar; if ((text == NULL) || (*text == _T('\0')) || (*text == _T(' '))) { expanded.visible = false; return expanded; } else if ((dollar = _tcschr(text, '$')) == NULL) { /* no macro, we can just translate the text */ expanded.visible = true; expanded.enabled = true; const TCHAR *nl; if (((nl = _tcschr(text, '\n')) != NULL) && LacksAlphaASCII(nl + 1)) { /* Quick hack for skipping the translation for second line of a two line label with only digits and punctuation in the second line, e.g. for menu labels like "Config\n2/3" */ /* copy the text up to the '\n' to a new buffer and translate it */ TCHAR translatable[256]; std::copy(text, nl, translatable); translatable[nl - text] = _T('\0'); const TCHAR *translated = StringIsEmpty(translatable) ? _T("") : gettext(translatable); /* concatenate the translated text and the part starting with '\n' */ _tcscpy(buffer, translated); _tcscat(buffer, nl); expanded.text = buffer; } else expanded.text = gettext(text); return expanded; } else { const TCHAR *macros = dollar; /* backtrack until the first non-whitespace character, because we don't want to translate whitespace between the text and the macro */ while (macros > text && IsWhitespaceOrNull(macros[-1])) --macros; TCHAR s[100]; expanded.enabled = !ExpandMacros(text, s, ARRAY_SIZE(s)); if (s[0] == _T('\0') || s[0] == _T(' ')) { expanded.visible = false; return expanded; } /* copy the text (without trailing whitespace) to a new buffer and translate it */ TCHAR translatable[256]; std::copy(text, macros, translatable); translatable[macros - text] = _T('\0'); const TCHAR *translated = StringIsEmpty(translatable) ? _T("") : gettext(translatable); /* concatenate the translated text and the macro output */ _tcscpy(buffer, translated); _tcscat(buffer, s + (macros - text)); expanded.visible = true; expanded.text = buffer; return expanded; } }
void CMainWnd::MakeOpenFilter(LPTSTR* ppszFilter, BOOL fGsGetFile) { CTempStr str; TCHAR szExt[MAX_PATH]; TCHAR szExtDesc[MAX_PATH]; TCHAR szTemp[MAX_PATH * 2]; MAP_DEC_PLUGIN* pPlugIn; EXT_INFO* pExt; CMultiBuff extbuff; BOOL fFound; int i, j; int nBuf = OPEN_FILTER_BUF; int nPlugIn = MAP_GetDecoderPlugInCount(m_hMap); int nExt; *ppszFilter = new TCHAR[nBuf]; *ppszFilter[0] = NULL; if (fGsGetFile) { str.LoadNormal(IDS_FILTER_OPEN_SUPPORTED); _tcscpy(*ppszFilter, str); } for (i = 0; i < nPlugIn; i++) { pPlugIn = MAP_GetDecoderPlugIn(m_hMap, i); if (!pPlugIn) continue; nExt = pPlugIn->GetFileExtCount(); for (j = 0; j < nExt; j++) { memset(szExt, 0, sizeof(szExt)); memset(szExtDesc, 0, sizeof(szExtDesc)); if (pPlugIn->GetFileExt(j, szExt, szExtDesc) && _tcslen(szExt)) { if (!IsDefSupportedExt(szExt)) { fFound = FALSE; for (int k = 0; k < extbuff.GetCount(); k++) { pExt = (EXT_INFO*)extbuff.GetAt(k); if (_tcsicmp(pExt->szExt, szExt) == 0) { fFound = TRUE; break; } } if (!fFound) { if (fGsGetFile) { if (nBuf - 1 < (int)(_tcslen(*ppszFilter) + _tcslen(szExt) + 3)) { nBuf += OPEN_FILTER_BUF; LPTSTR pszNew = new TCHAR[nBuf]; _tcscpy(pszNew, *ppszFilter); delete *ppszFilter; *ppszFilter = pszNew; } _tcscat(*ppszFilter, _T(";*.")); _tcscat(*ppszFilter, szExt); } pExt = new EXT_INFO; _tcscpy(pExt->szExt, szExt); _tcscpy(pExt->szExtDesc, szExtDesc); extbuff.Add((DWORD)pExt); } } } } } str.LoadNormal(IDS_FILTER_OPEN_INTERNAL); if (nBuf - 1 < (int)(_tcslen(*ppszFilter) + _tcslen(str))) { nBuf += OPEN_FILTER_BUF; LPTSTR pszNew = new TCHAR[nBuf]; _tcscpy(pszNew, *ppszFilter); delete *ppszFilter; *ppszFilter = pszNew; } if (_tcslen(*ppszFilter)) _tcscat(*ppszFilter, str); else _tcscpy(*ppszFilter, (LPTSTR)str + 1); while (!extbuff.IsEmpty()) { pExt = (EXT_INFO*)extbuff.RemoveAt(0); if (!_tcslen(pExt->szExtDesc)) { str.LoadNormal(IDS_FMT_NULL_FILE_TYPE); wsprintf(pExt->szExtDesc, str, pExt->szExt, pExt->szExt); } wsprintf(szTemp, _T("|%s|*.%s"), pExt->szExtDesc, pExt->szExt); if (nBuf - 1 < (int)(_tcslen(*ppszFilter) + _tcslen(szTemp))) { nBuf += OPEN_FILTER_BUF; LPTSTR pszNew = new TCHAR[nBuf]; _tcscpy(pszNew, *ppszFilter); delete *ppszFilter; *ppszFilter = pszNew; } _tcscat(*ppszFilter, szTemp); delete pExt; } str.LoadNormal(IDS_FILTER_OPEN_ALL); if (nBuf - 1 < (int)(_tcslen(*ppszFilter) + _tcslen(str))) { nBuf += OPEN_FILTER_BUF; LPTSTR pszNew = new TCHAR[nBuf]; _tcscpy(pszNew, *ppszFilter); } _tcscat(*ppszFilter, str); LPTSTR psz = *ppszFilter; while (psz = _tcschr(psz, _T('|'))) { *psz++ = NULL; } }
//method to parse target file "*.pbg" //call back function cb on each entry //cb have to return true if everything is ok BOOL _readPbgFile( TCHAR * pbgpath, TCHAR * folder, ORCA_PBG_INFO cb, void*udata ){ //pbg file(s), dst folder FILE * fpbg=_tfopen(pbgpath,TEXT("rt")); int status=0;// 0:wait for "@begin Objects", 1:processing lines, 2:found "@end;" TCHAR buf[4096]; TCHAR file[4096]; TCHAR *fileptr; TCHAR lib[4096]; TCHAR *c; TCHAR *ce; BOOL ret=true; printf("\t%S\n",pbgpath); if(fpbg){ _tcscpy(lib,folder); if(_tcslen(lib)<1)_tcscat(lib,TEXT(".")); if(lib[_tcslen(lib)-1]!='\\')_tcscat(lib,TEXT("\\")); ce=NULL; for(int i=0;pbgpath[i];i++) if(pbgpath[i]=='\\' || pbgpath[i]=='/') ce=pbgpath+i; if(ce){ _tcscat(lib,ce+1); _tcsncpy(file,pbgpath,ce-pbgpath+1); fileptr=file+(ce-pbgpath+1); }else{ _tcscat(lib,pbgpath); fileptr=file; } lib[_tcslen(lib)-1]='l'; while( ret && _fgetts(buf,_tsizeof(buf),fpbg) ){ switch(status){ case 0: if(!_tcsicmp(trim(buf),TEXT("@begin Objects")))status=1; break; case 1: c=trim(buf); if(!_tcsicmp(c,TEXT("@end;")))status=2; else{ if(c[0]=='"'){ c++; ce=_tcschr(c,'"'); if(ce){ ce[0]=0; while(ce!=c){ ce--; if(ce[0]=='\\' || ce[0]=='/'){ c=ce+1; break; } } _tcscpy(fileptr,c); if( !cb(file,lib,udata) ){ ret=false; } } } } break; case 2: status=3; break; } if(status==3)break; } fclose(fpbg); }else{ printline(); _tprintf(TEXT("can't open PBG file \"%s\"\n"),pbgpath); ret=false; } return ret; }
PassFail TestSQLSpecialColumns(TestInfo *pTestInfo, int MX_MP_SPECIFIC) { TEST_DECLARE; TCHAR Heading[MAX_HEADING_SIZE]; RETCODE returncode; SQLHANDLE henv; SQLHANDLE hdbc; SQLHANDLE hstmt; TCHAR TQualifier[NAME_LEN],TOwner[NAME_LEN],TName[NAME_LEN]; UWORD fColType[NUM_COLTYPE] = {SQL_BEST_ROWID,SQL_ROWVER}; UWORD Scope[NUM_SCOPE] = {SQL_SCOPE_CURROW,SQL_SCOPE_TRANSACTION,SQL_SCOPE_SESSION}; UWORD Nullable[NUM_NULL] = {SQL_NO_NULLS,SQL_NULLABLE}; TCHAR ocname[MAX_COLUMN_NAME],octype[MAX_COLUMN_NAME]; SWORD oscope,ocdatatype,ocsca,ocpc; SDWORD ocprec,oclen; SQLLEN oscopelen,ocnamelen,ocdatatypelen,octypelen,ocpreclen,oclenlen,ocscalen,ocpclen; struct { TCHAR *ColName; SWORD ColDataType; TCHAR *ColTypeName; TCHAR *ColTypeOutput; TCHAR *ColTypeLen; SDWORD ColPrec; SWORD ColSca; SDWORD ColLen; } Columns[] = { {_T("--"),SQL_CHAR,_T("char"),_T("CHAR"),_T("(10) CHARACTER SET ISO88591"),10,0,10}, {_T("--"),SQL_VARCHAR,_T("varchar"),_T("VARCHAR"),_T("(10) CHARACTER SET ISO88591"),10,0,10}, {_T("--"),SQL_VARCHAR,_T("varchar"),_T("VARCHAR"),_T("(255) CHARACTER SET ISO88591"),255,0,255}, {_T("--"),SQL_WCHAR,_T("char"),_T("NCHAR"),_T("(10) CHARACTER SET UCS2"),10,0,20}, {_T("--"),SQL_WVARCHAR,_T("varchar"),_T("NCHAR VARYING"),_T("(10) CHARACTER SET UCS2"),10,0,20}, {_T("--"),SQL_WVARCHAR,_T("varchar"),_T("NCHAR VARYING"),_T("(255) CHARACTER SET UCS2"),255,0,510}, {_T("--"),SQL_DECIMAL,_T("decimal"),_T("DECIMAL SIGNED"),_T("(10,5)"),10,5,12}, {_T("--"),SQL_NUMERIC,_T("numeric"),_T("NUMERIC SIGNED"),_T("(10,5)"),10,5,12}, {_T("--"),SQL_NUMERIC,_T("numeric"),_T("NUMERIC SIGNED"),_T("(19,0)"),19,0,21}, //Bignum {_T("--"),SQL_NUMERIC,_T("numeric"),_T("NUMERIC SIGNED"),_T("(19,6)"),19,6,21}, //Bignum {_T("--"),SQL_NUMERIC,_T("numeric"),_T("NUMERIC SIGNED"),_T("(128,0)"),128,0,130}, //Bignum {_T("--"),SQL_NUMERIC,_T("numeric"),_T("NUMERIC SIGNED"),_T("(128,128)"),128,128,130}, //Bignum {_T("--"),SQL_NUMERIC,_T("numeric"),_T("NUMERIC SIGNED"),_T("(128,64)"),128,64,130}, //Bignum {_T("--"),SQL_NUMERIC,_T("numeric"),_T("NUMERIC UNSIGNED"),_T("(10,5) unsigned"),10,5,12}, //Bignum {_T("--"),SQL_NUMERIC,_T("numeric"),_T("NUMERIC UNSIGNED"),_T("(18,5) unsigned"),18,5,20}, //Bignum {_T("--"),SQL_NUMERIC,_T("numeric"),_T("NUMERIC UNSIGNED"),_T("(30,10) unsigned"),30,10,32}, //Bignum {_T("--"),SQL_SMALLINT,_T("smallint"),_T("SMALLINT SIGNED"),_T(""),5,0,2}, {_T("--"),SQL_INTEGER,_T("integer"),_T("INTEGER SIGNED"),_T(""),10,0,4}, {_T("--"),SQL_BIGINT,_T("bigint"),_T("BIGINT SIGNED"),_T(""),19,0,20}, {_T("--"),SQL_DATE,_T("date"),_T("DATE"),_T(""),10,0,6}, {_T("--"),SQL_TIME,_T("time"),_T("TIME"),_T(""),8,0,6}, {_T("--"),SQL_TIMESTAMP,_T("TIMESTAMP"),_T("timestamp"),_T(""),26,6,16}, {_T("--"),SQL_BIT,_T("bit"),_T("BIT"),_T(""),1,1,0}, {_T("--"),SQL_TINYINT,_T("tinyint"),_T("TINYINT"),_T(""),3,0,2}, {_T("--"),SQL_BINARY,_T("binary"),_T("BINARY"),_T("(10)"),10,0,10}, {_T("--"),SQL_VARBINARY,_T("varbinary"),_T("VARBINARY"),_T("(10)"),10,0,10}, {_T("--"),SQL_WCHAR,_T("char"),_T("NCHAR"),_T("(10) CHARACTER SET UTF8"),10,0,20}, {_T("--"),SQL_WVARCHAR,_T("varchar"),_T("NCHAR VARYING"),_T("(10) CHARACTER SET UTF8"),10,0,20}, {_T("--"),SQL_WVARCHAR,_T("varchar"),_T("NCHAR VARYING"),_T("(255) CHARACTER SET UTF8"),255,0,510}, {_T("--"),0,_T("endloop"),_T(""),0,0,0,0} }; TCHAR *TableStr[4]; TCHAR ColStr[MAX_NOS_SIZE], KeyStr[MAX_NOS_SIZE], CreateTbl[MAX_NOS_SIZE],END_LOOP[10]; int i = 0, k = 0,ct = 0, s = 0, t = 0, n = 0, psc = 1; BOOL found = FALSE; //TCHAR *charNameUCS2 = _T("NCHAR"); //TCHAR *varcharNameUCS2 = _T("NCHAR VARYING"); //=========================================================================================================== var_list_t *var_list; var_list = load_api_vars(_T("SQLSpecialColumns"), charset_file); if (var_list == NULL) return FAILED; //print_list(var_list); Columns[0].ColName = var_mapping(_T("SQLSpecialColumns_Columns_1"), var_list); Columns[1].ColName = var_mapping(_T("SQLSpecialColumns_Columns_2"), var_list); Columns[2].ColName = var_mapping(_T("SQLSpecialColumns_Columns_3"), var_list); Columns[3].ColName = var_mapping(_T("SQLSpecialColumns_Columns_4"), var_list); Columns[4].ColName = var_mapping(_T("SQLSpecialColumns_Columns_5"), var_list); Columns[5].ColName = var_mapping(_T("SQLSpecialColumns_Columns_6"), var_list); Columns[6].ColName = var_mapping(_T("SQLSpecialColumns_Columns_7"), var_list); Columns[7].ColName = var_mapping(_T("SQLSpecialColumns_Columns_8"), var_list); Columns[8].ColName = var_mapping(_T("SQLSpecialColumns_Columns_9"), var_list); Columns[9].ColName = var_mapping(_T("SQLSpecialColumns_Columns_10"), var_list); Columns[10].ColName = var_mapping(_T("SQLSpecialColumns_Columns_11"), var_list); Columns[11].ColName = var_mapping(_T("SQLSpecialColumns_Columns_12"), var_list); Columns[12].ColName = var_mapping(_T("SQLSpecialColumns_Columns_13"), var_list); Columns[13].ColName = var_mapping(_T("SQLSpecialColumns_Columns_14"), var_list); Columns[14].ColName = var_mapping(_T("SQLSpecialColumns_Columns_15"), var_list); Columns[15].ColName = var_mapping(_T("SQLSpecialColumns_Columns_16"), var_list); Columns[16].ColName = var_mapping(_T("SQLSpecialColumns_Columns_17"), var_list); Columns[17].ColName = var_mapping(_T("SQLSpecialColumns_Columns_18"), var_list); Columns[18].ColName = var_mapping(_T("SQLSpecialColumns_Columns_19"), var_list); Columns[19].ColName = var_mapping(_T("SQLSpecialColumns_Columns_20"), var_list); Columns[20].ColName = var_mapping(_T("SQLSpecialColumns_Columns_21"), var_list); Columns[21].ColName = var_mapping(_T("SQLSpecialColumns_Columns_22"), var_list); Columns[22].ColName = var_mapping(_T("SQLSpecialColumns_Columns_23"), var_list); Columns[23].ColName = var_mapping(_T("SQLSpecialColumns_Columns_24"), var_list); Columns[24].ColName = var_mapping(_T("SQLSpecialColumns_Columns_25"), var_list); Columns[25].ColName = var_mapping(_T("SQLSpecialColumns_Columns_26"), var_list); Columns[26].ColName = var_mapping(_T("SQLSpecialColumns_Columns_27"), var_list); Columns[27].ColName = var_mapping(_T("SQLSpecialColumns_Columns_28"), var_list); Columns[28].ColName = var_mapping(_T("SQLSpecialColumns_Columns_29"), var_list); TableStr[0] = var_mapping(_T("SQLSpecialColumns_TableStr_1"), var_list); TableStr[1] = var_mapping(_T("SQLSpecialColumns_TableStr_2"), var_list); TableStr[2] = var_mapping(_T("SQLSpecialColumns_TableStr_3"), var_list); TableStr[3] = var_mapping(_T("SQLSpecialColumns_TableStr_4"), var_list); //========================================================================================= //if(isUCS2) { // LogMsg(NONE,_T("Setup for UCS2 mode testing: ColPrec has to be doubled\n")); // i = 0; // while(_tcsicmp(Columns[i].ColTypeName,_T("endloop")) != 0) { // if (Columns[i].ColDataType == SQL_WCHAR){ // Columns[i].ColDataType = SQL_WCHAR; // Columns[i].ColTypeOutput = charNameUCS2; // //Columns[i].ColPrec *= 2; --> This is in character, no need to double // Columns[i].ColLen *= 2; // } // else if (Columns[i].ColDataType == SQL_WVARCHAR) { // Columns[i].ColDataType = SQL_WVARCHAR; // Columns[i].ColTypeOutput = varcharNameUCS2; // //Columns[i].ColPrec *= 2; --> This is in character, no need to double // Columns[i].ColLen *= 2; // } // else if (Columns[i].ColDataType == SQL_WLONGVARCHAR) { // Columns[i].ColDataType = SQL_WLONGVARCHAR; // Columns[i].ColTypeOutput = varcharNameUCS2; // //Columns[i].ColPrec *= 2; --> This is in character, no need to double // Columns[i].ColLen *= 2; // } // i++; // } // i = 0; //} //========================================================================================= if (MX_MP_SPECIFIC == MX_SPECIFIC) LogMsg(LINEBEFORE+SHORTTIMESTAMP,_T("Begin testing API => MX Specific SQLSpecialColumns.\n")); else LogMsg(LINEBEFORE+SHORTTIMESTAMP,_T("Begin testing API => MP Specific SQLSpecialColumns.\n")); TEST_INIT; TESTCASE_BEGIN("Setup for SQLSpecialColumns tests\n"); if(!FullConnect(pTestInfo)){ LogMsg(NONE,_T("Unable to connect\n")); TEST_FAILED; TEST_RETURN; } henv = pTestInfo->henv; hdbc = pTestInfo->hdbc; hstmt = (SQLHANDLE)pTestInfo->hstmt; returncode = SQLAllocStmt((SQLHANDLE)hdbc, &hstmt); if(!CHECKRC(SQL_SUCCESS,returncode,"SQLAllocStmt")){ LogAllErrors(henv,hdbc,hstmt); TEST_FAILED; TEST_RETURN; } TESTCASE_END; _tcscpy(ColStr,_T("")); _tcscpy(KeyStr,_T("")); _tcscpy(END_LOOP,_T("")); _tcscpy(TName,TableStr[2]); if (MX_MP_SPECIFIC == MX_SPECIFIC) { _tcscpy(TQualifier,pTestInfo->Catalog); _tcscpy(TOwner,pTestInfo->Schema); _tcscpy(END_LOOP,_T("bit")); } else { _tcscpy(TQualifier,_T("")); _tcscpy(TOwner,pTestInfo->UserID); _tcscpy(END_LOOP,_T("endloop")); } while (_tcsicmp(Columns[i].ColTypeName,END_LOOP) != 0) { SQLExecDirect(hstmt,(SQLTCHAR*) (SQLTCHAR *)TableStr[1],SQL_NTS); // cleanup if (i > 0) { _tcscat(ColStr,_T(",")); _tcscat(KeyStr,_T(",")); } _tcscat(ColStr,Columns[i].ColName); _tcscat(ColStr,_T(" ")); _tcscat(ColStr,Columns[i].ColTypeName); _tcscat(ColStr,Columns[i].ColTypeLen); _tcscat(ColStr,_T(" not null")); _tcscat(KeyStr,Columns[i].ColName); _tcscpy(CreateTbl,_T("")); _tcscat(CreateTbl,TableStr[0]); _tcscat(CreateTbl,_T("(")); _tcscat(CreateTbl,ColStr); _tcscat(CreateTbl,_T(", primary key(")); _tcscat(CreateTbl,KeyStr); _tcscat(CreateTbl,_T("))")); _stprintf(Heading,_T("Test Positive Functionality of SQLSpecialColumns for this table:\n")); _tcscat(Heading,CreateTbl); _tcscat(Heading,_T("\n")); TESTCASE_BEGINW(Heading); returncode = SQLExecDirect(hstmt,(SQLTCHAR*)CreateTbl,SQL_NTS); if(!CHECKRC(SQL_SUCCESS,returncode,"SQLExecDirect")){ TEST_FAILED; LogAllErrors(henv,hdbc,hstmt); } else{ if (_tcslen(TQualifier) > 0) returncode = SQLSpecialColumns(hstmt,fColType[ct],(SQLTCHAR*)TQualifier,(SWORD)_tcslen(TQualifier),(SQLTCHAR*)TOwner,(SWORD)_tcslen(TOwner),(SQLTCHAR*)TName,(SWORD)_tcslen(TName),Scope[s],Nullable[n]); else returncode = SQLSpecialColumns(hstmt,fColType[ct],NULL,0,(SQLTCHAR*)TOwner,(SWORD)_tcslen(TOwner),(SQLTCHAR*)TName,(SWORD)_tcslen(TName),Scope[s],Nullable[n]); if(!CHECKRC(SQL_SUCCESS,returncode,"SQLSpecialColumns")){ TEST_FAILED; LogAllErrors(henv,hdbc,hstmt); } else{ oscope = 0; _tcscpy(ocname,_T("")); ocdatatype = 0; _tcscpy(octype,_T("")); ocprec = 0; oclen = 0; ocsca = 0; ocpc = 0; SQLBindCol(hstmt,1,SQL_C_SHORT,&oscope,0,&oscopelen); SQLBindCol(hstmt,2,SQL_C_TCHAR,ocname,MAX_COLUMN_NAME,&ocnamelen); SQLBindCol(hstmt,3,SQL_C_SHORT,&ocdatatype,0,&ocdatatypelen); SQLBindCol(hstmt,4,SQL_C_TCHAR,octype,MAX_COLUMN_NAME,&octypelen); SQLBindCol(hstmt,5,SQL_C_LONG,&ocprec,0,&ocpreclen); SQLBindCol(hstmt,6,SQL_C_LONG,&oclen,0,&oclenlen); SQLBindCol(hstmt,7,SQL_C_SHORT,&ocsca,0,&ocscalen); SQLBindCol(hstmt,8,SQL_C_SHORT,&ocpc,0,&ocpclen); k = 0; while (returncode == SQL_SUCCESS){ returncode = SQLFetch(hstmt); if((returncode!=SQL_NO_DATA_FOUND) &&(!CHECKRC(SQL_SUCCESS,returncode,"SQLFetch"))){ TEST_FAILED; LogAllErrors(henv,hdbc,hstmt); } else{ if (returncode == SQL_SUCCESS){ if (MX_MP_SPECIFIC == MX_SPECIFIC) { psc = SQL_PC_NOT_PSEUDO; } else { psc = 1; } LogMsg(NONE,_T("Comparing results for SQLSpecialColumns\n")); t = 0; found = FALSE; while(_tcscmp(Columns[t].ColTypeName,_T("endloop"))!=0) { if(cwcscmp(ocname, Columns[t].ColName,TRUE) == 0) { if ((oscope == Scope[s]) && (ocdatatype == Columns[t].ColDataType) && (_tcsicmp(octype,Columns[t].ColTypeOutput) == 0) && (ocprec == Columns[t].ColPrec) && (oclen == Columns[t].ColLen) && (ocsca == Columns[t].ColSca) && (ocpc == (SWORD)psc)){ /* LogMsg(NONE,_T("Scope expect: %d and actual: %d are matched\n"),Scope[s],oscope); LogMsg(NONE,_T("colname expect: %s and actual: %s are matched\n"),Columns[t].ColName,ocname); LogMsg(NONE,_T("ColDataType expect: %d and actual: %d are matched\n"),Columns[t].ColDataType,ocdatatype); LogMsg(NONE,_T("ColTypeOutput expect: %s and actual: %s are matched\n"),Columns[t].ColTypeOutput,octype); LogMsg(NONE,_T("ColPrec expect: %d and actual: %d are matched\n"),Columns[t].ColPrec,ocprec); LogMsg(NONE,_T("ColLen expect: %d and actual: %d are matched\n"),Columns[t].ColLen,oclen); LogMsg(NONE,_T("ColScale expect: %d and actual: %d are matched\n"),Columns[t].ColSca,ocsca); LogMsg(NONE,_T("ColPseudoCol expect: %d and actual: %d are matched\n\n"),(SWORD)psc,ocpc); */ } else { TEST_FAILED; if (oscope != Scope[s]) LogMsg(ERRMSG,_T("Scope expect: %d and actual: %d are not matched\n"),Scope[t],oscope); if (ocdatatype != Columns[t].ColDataType) LogMsg(ERRMSG,_T("ColDataType expect: %d and actual: %d are not matched\n"),Columns[t].ColDataType,ocdatatype); if (_tcsicmp(octype,Columns[t].ColTypeOutput) != 0) LogMsg(ERRMSG,_T("ColTypeName expect: %s and actual: %s are not matched\n"),Columns[t].ColTypeOutput,octype); if (ocprec != Columns[t].ColPrec) LogMsg(ERRMSG,_T("ColPrec expect: %d and actual: %d are not matched\n"),Columns[t].ColPrec,ocprec); if (oclen != Columns[t].ColLen) LogMsg(ERRMSG,_T("ColLen expect: %d and actual: %d are not matched\n"),Columns[t].ColLen,oclen); if (ocsca != Columns[t].ColSca) LogMsg(ERRMSG,_T("ColScale expect: %d and actual: %d are not matched\n"),Columns[t].ColSca,ocsca); if (ocpc != (SWORD)psc) LogMsg(ERRMSG,_T("ColPseudoCol expect: %d and actual: %d are not matched\n\n"),(SWORD)psc,ocpc); } found = TRUE; break; } else { t++; } } if(!found) { TEST_FAILED; LogMsg(ERRMSG,_T("Unexpected returned data: %s\n"), ocname); } } } if (returncode == SQL_SUCCESS) k++; } // end while if(k == 0) { TEST_FAILED; LogMsg(ERRMSG,_T("No Data Found => Atleast one row should be fetched\n")); } } SQLFreeStmt(hstmt,SQL_UNBIND); SQLFreeStmt(hstmt,SQL_CLOSE); } SQLExecDirect(hstmt,(SQLTCHAR*) (SQLTCHAR *)TableStr[1],SQL_NTS); i++; TESTCASE_END; } // end while //======================================================================================================== _stprintf(Heading,_T("SQLSpecialColumns: Negative test with NULL handle\n")); TESTCASE_BEGINW(Heading); hstmt = (SQLHANDLE)NULL; _tcscpy(TQualifier,_T("")); _tcscpy(TOwner,pTestInfo->UserID); _tcscpy(TName,TableStr[3]); i = 0; returncode = SQLSpecialColumns(hstmt,fColType[i],(SQLTCHAR*)TQualifier,(SWORD)_tcslen(TQualifier),(SQLTCHAR*)TOwner,(SWORD)_tcslen(TOwner),(SQLTCHAR*)TName,(SWORD)_tcslen(TName),Scope[i],Nullable[i]); if(!CHECKRC(SQL_INVALID_HANDLE,returncode,"SQLSpecialColumns")) { TEST_FAILED; LogAllErrors(henv,hdbc,hstmt); } TESTCASE_END; //======================================================================================================== FullDisconnect(pTestInfo); LogMsg(SHORTTIMESTAMP+LINEAFTER,_T("End testing API => SQLSpecialColumns.\n")); free_list(var_list); TEST_RETURN; }
//----------------------------------------------------------------------------- // Name: LookupValue() // Desc: //----------------------------------------------------------------------------- VOID LookupValue( HWND hDlg ) { HRESULT hrErr = 0; TCHAR strValue[MAX_PATH]; const TCHAR* strHRESULT; const TCHAR* strDescription; TCHAR strHRESULTCopy[MAX_PATH*2]; int nIndex; int nPower = 0; int nDigit = 0; GetDlgItemText( hDlg, IDC_VALUE, strValue, MAX_PATH ); nIndex = lstrlen(strValue) - 1; // skip whitespace while( nIndex >= 0 ) { if( strValue[nIndex] != ' ' && strValue[nIndex] != 'L' ) break; nIndex--; } while( nIndex >= 0 ) { // Convert to uppercase if( strValue[nIndex] >= 'a' && strValue[nIndex] <= 'z' ) strValue[nIndex] += 'A' - 'a'; if( strValue[nIndex] >= 'A' && strValue[nIndex] <= 'F' ) nDigit = strValue[nIndex] - 'A' + 10; else if( strValue[nIndex] >= '0' && strValue[nIndex] <= '9' ) nDigit = strValue[nIndex] - '0'; else break; hrErr += ( nDigit << (nPower*4) ); nIndex--; nPower++; } // Use DXErr8.lib to lookup HRESULT. strHRESULT = DXGetErrorString8( hrErr ); _tcscpy( strHRESULTCopy, TEXT("HRESULT: ") ); _tcscat( strHRESULTCopy, strHRESULT ); strDescription = DXGetErrorDescription8( hrErr ); TCHAR* strTemp; while( strTemp = _tcschr( strHRESULTCopy, '&') ) { strTemp[0] = '\r'; strTemp[1] = '\n'; } if( lstrlen(strDescription) > 0 ) { _tcscat( strHRESULTCopy, TEXT("\r\nDescription: ") ); _tcscat( strHRESULTCopy, strDescription ); } SetDlgItemText( hDlg, IDC_MESSAGE, strHRESULTCopy ); return; }
//************************************ BOOL CAdbCtrl::AdbExeCommand(CString cmdLine, DWORD& exitCode, CString& strRet, CMD_TYPE iCMD) { int iCounter=0, SecondsToWait=30; //Create pipes to write and read data HANDLE rPipe, wPipe; SECURITY_ATTRIBUTES secattr; ZeroMemory( &secattr,sizeof(secattr) ); secattr.nLength = sizeof(secattr); secattr.bInheritHandle = TRUE; // Create pipe for redirect stdout CreatePipe( &rPipe, &wPipe, &secattr, 0 ); // Get current file directory TCHAR cCurrentDir[MAX_PATH]; GetCurrentDirectory( MAX_PATH, cCurrentDir ); (iCMD == CMD_ADB)? _tcscat(cCurrentDir, ADB_PROC_NAME) : _tcscat(cCurrentDir, FASTBOOT_PROC_NAME); PROCESS_INFORMATION processInfo = {0}; STARTUPINFO startupInfo = {0}; ZeroMemory( &startupInfo, sizeof(startupInfo) ); ZeroMemory( &processInfo, sizeof(processInfo) ); startupInfo.cb = sizeof(startupInfo); startupInfo.dwFlags = STARTF_USESTDHANDLES; startupInfo.hStdInput = rPipe; startupInfo.hStdOutput = wPipe; startupInfo.hStdError = wPipe; int nStrBuffer = cmdLine.GetLength() + 1; DbgPrint("[ADB-EXE]Execute command : ", cmdLine); Sleep(100); // Create the process if (CreateProcess( cCurrentDir, // No module name (use command line) cmdLine.GetBuffer(nStrBuffer), // Command line NULL, // Process handle not inheritable NULL, // Thread handle not inheritable TRUE, // Set handle inheritance to FALSE CREATE_NEW_CONSOLE, // use create new console so i can see what the child proc is actually doing - HIGH_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, // Use parent's environment block NULL, // Use parent's starting directory &startupInfo, // Pointer to STARTUPINFO structure &processInfo) == FALSE ) // Pointer to PROCESS_INFORMATION structure { DbgPrint("CreateProcess retrun zero!!!!!!!!!!!!!"); // CreateProcess() failed - Get the error from the system LPVOID lpMsgBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); // Display the error CString strError = (LPTSTR) lpMsgBuf; TRACE(_T("::AdbExeCommand() failed at CreateProcess()\nCommand=%s\nMessage=%s\n\n"), cmdLine, strError); // Free resources created by the system LocalFree( lpMsgBuf ); // We failed. return FALSE; } else { // Successfully created the process. Wait for it to finish. /* A loop to watch the process. Dismissed with SecondsToWait set to 0 */ GetExitCodeProcess(piProcessInfo.hProcess, &exitCode); while (exitCode == STILL_ACTIVE && SecondsToWait != 0) { GetExitCodeProcess(piProcessInfo.hProcess, &exitCode); Sleep(500); iCounter += 500; if (iCounter > (SecondsToWait * 1000)) { exitCode = 0; } } if (exitCode) // Not timeout { // After process finished, now read the output pipe here. char buf[BUF_SIZE]={0}; DWORD reDword; string m_csOutput, csTemp; BOOL res=TRUE; while( res )) { DbgPrint("HI~1"); if( res = ::ReadFile( rPipe, buf, BUF_SIZE, &reDword, 0 ) ) { csTemp = buf; m_csOutput += csTemp; } DbgPrint("HI~2"); } // Save the output string from console strRet = m_csOutput.c_str(); } // Print the log to debugview for debug DbgPrint("[ADB-EXE]Command Response : ", strRet); // Close the pipe handle CloseHandle( rPipe ); CloseHandle( wPipe ); // Close the handles. CloseHandle( processInfo.hProcess ); CloseHandle( processInfo.hThread ); // Release buffer cmdLine.ReleaseBuffer(); // We succeeded. return TRUE; } cmdLine.ReleaseBuffer(); return TRUE; }
////////////////////////////////////////////////////////////////////////////////////////////////// // Executes the given command using CreateProcess() and WaitForSingleObject(). // Returns FALSE if the command could not be executed or if the exit code could not be determined. // Extend : Redirect the stdout to get the result code/////////////////////////////////////////// BOOL CTestCreateProcessDlg::ExeCommand(CString cmdLine, DWORD & exitCode, CString& strRet) { //Create pipes to write and read data HANDLE rPipe, wPipe; SECURITY_ATTRIBUTES secattr; ZeroMemory(&secattr,sizeof(secattr)); secattr.nLength = sizeof(secattr); secattr.bInheritHandle = TRUE; CreatePipe( &rPipe, &wPipe, &secattr, 0 ); // Get current file directory TCHAR cCurrentDir[MAX_PATH]; GetCurrentDirectory(MAX_PATH, cCurrentDir); _tcscat(cCurrentDir, ADB_PROC_NAME); PROCESS_INFORMATION processInformation = {0}; STARTUPINFO startupInfo = {0}; startupInfo.cb = sizeof(startupInfo); startupInfo.dwFlags = STARTF_USESTDHANDLES; startupInfo.hStdInput = rPipe; startupInfo.hStdOutput = wPipe; startupInfo.hStdError = wPipe; int nStrBuffer = cmdLine.GetLength() + 50; // Create the process BOOL result = CreateProcess(cCurrentDir, cmdLine.GetBuffer(nStrBuffer), NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL, &startupInfo, &processInformation); cmdLine.ReleaseBuffer(); // Close the pipe write handle CloseHandle(wPipe); //now read the output pipe here. char buf[100]={0}; DWORD reDword; string m_csOutput, csTemp; BOOL res=TRUE; while(res) { if(res = ::ReadFile( rPipe, buf, 100, &reDword, 0 )) { csTemp = buf; m_csOutput += csTemp; } } // Get the output string here strRet = m_csOutput.c_str(); // Close the pipe read handle CloseHandle(rPipe); if (!result) { // CreateProcess() failed // Get the error from the system LPVOID lpMsgBuf; DWORD dw = GetLastError(); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); // Display the error CString strError = (LPTSTR) lpMsgBuf; TRACE(_T("::executeCommandLine() failed at CreateProcess()\nCommand=%s\nMessage=%s\n\n"), cmdLine, strError); // Free resources created by the system LocalFree(lpMsgBuf); // We failed. return FALSE; } else { // Successfully created the process. Wait for it to finish. WaitForSingleObject( processInformation.hProcess, INFINITE ); // Get the exit code. result = GetExitCodeProcess(processInformation.hProcess, &exitCode); // Close the handles. CloseHandle( processInformation.hProcess ); CloseHandle( processInformation.hThread ); if (!result) { // Could not get exit code. TRACE(_T("Executed command but couldn't get exit code.\nCommand=%s\n"), cmdLine); return FALSE; } // We succeeded. return TRUE; } }
static int AddDatabaseToList(HWND hwndList, TCHAR* filename, TCHAR* dir) { LV_ITEM lvi; int iNewItem; TCHAR szSize[20], *pName, *pDot, szName[MAX_PATH]; HANDLE hDbFile; DBHeader dbhdr; DWORD bytesRead; DWORD totalSize,wasted=0; int broken=0; lvi.mask=LVIF_PARAM; lvi.iSubItem=0; for(lvi.iItem=ListView_GetItemCount(hwndList)-1;lvi.iItem>=0;lvi.iItem--) { ListView_GetItem(hwndList,&lvi); if( !_tcsicmp(( TCHAR* )lvi.lParam,filename)) return lvi.iItem; } hDbFile=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); if ( hDbFile == INVALID_HANDLE_VALUE ) return -1; ReadFile(hDbFile,&dbhdr,sizeof(dbhdr),&bytesRead,NULL); totalSize=GetFileSize(hDbFile,NULL); broken = (bytesRead<sizeof(dbhdr) || memcmp(dbhdr.signature,&dbSignature,sizeof(dbhdr.signature))); if(!broken) { wasted = dbhdr.slackSpace; if (totalSize>dbhdr.ofsFileEnd) wasted+=totalSize-dbhdr.ofsFileEnd; } CloseHandle(hDbFile); pName = _tcsrchr(filename,'\\'); if ( pName == NULL ) pName = ( LPTSTR )filename; else pName++; _tcscpy(szName,dir); _tcscat(szName,pName); pDot = _tcsrchr( szName, '.' ); if ( pDot != NULL && !_tcsicmp( pDot, _T(".dat")) ) *pDot=0; lvi.iItem = 0; lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; lvi.iSubItem = 0; lvi.lParam = ( LPARAM )_tcsdup(filename); lvi.pszText = szName; if (broken) lvi.iImage = 3; else if ( wasted < 1024*128 ) lvi.iImage = 0; else if ( wasted < 1024*256 + (DWORD)(totalSize > 2*1024*1024 ) ? 256 * 1024 : 0 ) lvi.iImage=1; else lvi.iImage=2; iNewItem = ListView_InsertItem(hwndList, &lvi ); _stprintf(szSize,_T("%.2lf MB"),totalSize/1048576.0); ListView_SetItemText(hwndList,iNewItem,1,szSize); if ( !broken ) { _stprintf(szSize,_T("%.2lf MB"),wasted/1048576.0); ListView_SetItemText(hwndList,iNewItem,2,szSize); } return iNewItem; }
_TDIR * _topendir (const _TCHAR *szPath) { _TDIR *nd; unsigned int rc; _TCHAR szFullPath[MAX_PATH]; errno = 0; if (!szPath) { errno = EFAULT; return (_TDIR *) 0; } if (szPath[0] == _T('\0')) { errno = ENOTDIR; return (_TDIR *) 0; } /* Attempt to determine if the given path really is a directory. */ rc = GetFileAttributes (szPath); if (rc == (unsigned int)-1) { /* call GetLastError for more error info */ errno = ENOENT; return (_TDIR *) 0; } if (!(rc & FILE_ATTRIBUTE_DIRECTORY)) { /* Error, entry exists but not a directory. */ errno = ENOTDIR; return (_TDIR *) 0; } /* Make an absolute pathname. */ _tfullpath (szFullPath, szPath, MAX_PATH); /* Allocate enough space to store DIR structure and the complete * directory path given. */ nd = (_TDIR *) malloc (sizeof (_TDIR) + (_tcslen(szFullPath) + _tcslen (SLASH) + _tcslen(SUFFIX) + 1) * sizeof(_TCHAR)); if (!nd) { /* Error, out of memory. */ errno = ENOMEM; return (_TDIR *) 0; } /* Create the search expression. */ _tcscpy (nd->dd_name, szFullPath); /* Add on a slash if the path does not end with one. */ if (nd->dd_name[0] != _T('\0') && nd->dd_name[_tcslen (nd->dd_name) - 1] != _T('/') && nd->dd_name[_tcslen (nd->dd_name) - 1] != _T('\\')) { _tcscat (nd->dd_name, SLASH); } /* Add on the search pattern */ _tcscat (nd->dd_name, SUFFIX); /* Initialize handle to -1 so that a premature closedir doesn't try * to call _findclose on it. */ nd->dd_handle = -1; /* Initialize the status. */ nd->dd_stat = 0; /* Initialize the dirent structure. ino and reclen are invalid under * Win32, and name simply points at the appropriate part of the * findfirst_t structure. */ nd->dd_dir.d_ino = 0; nd->dd_dir.d_reclen = 0; nd->dd_dir.d_namlen = 0; memset (nd->dd_dir.d_name, 0, FILENAME_MAX); return nd; }
STDMETHODIMP CisInstalled::InPlaceActivate(LONG iVerb, const RECT* prcPosRect) { HRESULT hres; TCHAR javawscmd[MAX_PATH], cmdline[MAX_PATH]; char mbsval[MAX_PATH]; DWORD dwType, cbData = MAX_PATH; LPTSTR p; STARTUPINFO startupInfo; PROCESS_INFORMATION processInfo; HKEY hKey; if (FAILED(hres = CComControl<CisInstalled>::InPlaceActivate(iVerb, prcPosRect))) return hres; if (m_app) { // find JavaWS path registry key if (SUCCEEDED(RegOpenKeyEx(HKEY_CLASSES_ROOT, JAVAWS_KEY, 0, KEY_QUERY_VALUE, &hKey))) { if (SUCCEEDED(RegQueryValueEx(hKey, NULL, NULL, &dwType, (UCHAR *)javawscmd, &cbData))) { // value now contains "<path to javaws.exe>" "%1" // chop it at second quote p = _tcschr(javawscmd, '\"'); if (p!= NULL) p = _tcschr(++p, '\"'); if (p!= NULL) { LPTSTR lpCmdStr = NULL; *++p = 0; _tcscat(javawscmd, _T(" ")); _tcscpy(cmdline, javawscmd); #ifdef UNICODE lpCmdStr = m_app; #else WideCharToMultiByte(CP_ACP, 0, m_app, -1, mbsval, MAX_PATH, NULL, NULL); lpCmdStr = mbsval; #endif // 4782008: disallow spaces, tabs, newlines, and leading // "-" in argument if (_tcschr(lpCmdStr, ' ') == NULL && _tcschr(lpCmdStr, '\t') == NULL && _tcschr(lpCmdStr, '\r') == NULL && _tcschr(lpCmdStr, '\n') == NULL && lpCmdStr[0] != '-') { // 4782008: guard against buffer overrun _tcsncat(cmdline, lpCmdStr, MAX_PATH - lstrlen(cmdline) - 1); } if (m_dbg) { ::MessageBox(NULL, cmdline, "Launch Command line", 0); } ZeroMemory((LPVOID)&startupInfo, sizeof(startupInfo)); startupInfo.cb = sizeof(startupInfo); // Start JavaWS if (SUCCEEDED( CreateProcess(NULL, // app name cmdline, NULL, // process security attributes NULL, // thread security attributes FALSE, // handle inheritance flag 0, // creation flags NULL, // environment block NULL, // current directory name &startupInfo, &processInfo))) { // don't need to wait for process to complete if (processInfo.hProcess != NULL) { if (processInfo.hThread != NULL) CloseHandle(processInfo.hThread); CloseHandle(processInfo.hProcess); } } } } RegCloseKey(hKey); } } if (m_back) { WideCharToMultiByte(CP_ACP, 0, m_back, -1, mbsval, MAX_PATH, NULL, NULL); } if (!m_back || stricmp(mbsval, "false") != 0) { // don't go back if not still open because of bug in urlmon.dll if (m_closed == FALSE) { HlinkGoBack(GetUnknown()); } } return hres; }
void MapWindow::RenderNearAirspace(LKSurface& Surface, const RECT rci) { RECT rc = rci; /* rectangle for sideview */ RECT rct = rc; /* rectangle for topview */ rc.top = (int)((double)(rci.bottom-rci.top )*fSplitFact); rct.bottom = rc.top ; // Expose the topview rect size in use.. Current_Multimap_TopRect=rct; LKFont hfOldFnt = Surface.SelectObject(LK8PanelUnitFont/* Sender->GetFont()*/); int *iSplit = &Multimap_SizeY[Get_Current_Multimap_Type()]; int k; static double fHeigtScaleFact = 1.0; double GPSlat, GPSlon, GPSalt, GPSbrg; double calc_terrainalt; double calc_altitudeagl; // double alt; TCHAR text[TBSIZE+1]; TCHAR buffer[TBSIZE+1]; CAirspaceBase near_airspace; CAirspace *found = NULL; // bool bFound = false; DiagrammStruct sDia; bool bAS_Inside=false; int iAS_Bearing=0; int iAS_HorDistance=15000; int iABS_AS_HorDistance=0; int iAS_VertDistance=0; bool bValid; static bool bHeightScale = false; long wpt_brg = 0; POINT line[2]; POINT TxYPt; POINT TxXPt; SIZE tsize; LKColor GREEN_COL = RGB_GREEN; LKColor BLUE_COL = RGB_BLUE; LKColor LIGHTBLUE_COL = RGB_LIGHTBLUE; BOOL bInvCol = true; //INVERTCOLORS unsigned short getsideviewpage=GetSideviewPage(); LKASSERT(getsideviewpage<3); if(bInvCol) Sideview_TextColor = INV_GROUND_TEXT_COLOUR; else Sideview_TextColor = RGB_WHITE; switch(LKevent) { case LKEVENT_NEWRUN: // CALLED ON ENTRY: when we select this page coming from another mapspace bHeightScale = false; // fZOOMScale[getsideviewpage] = 1.0; fHeigtScaleFact = 1.0; if (IsMultimapTopology()) ForceVisibilityScan=true; break; case LKEVENT_UP: // click on upper part of screen, excluding center if(bHeightScale) fHeigtScaleFact /= ZOOMFACTOR; else fZOOMScale[getsideviewpage] /= ZOOMFACTOR; if (IsMultimapTopology()) ForceVisibilityScan=true; break; case LKEVENT_DOWN: // click on lower part of screen, excluding center if(bHeightScale) fHeigtScaleFact *= ZOOMFACTOR; else fZOOMScale[getsideviewpage] *= ZOOMFACTOR; if (IsMultimapTopology()) ForceVisibilityScan=true; break; case LKEVENT_LONGCLICK: for (k=0 ; k <= Sideview_iNoHandeldSpaces; k++) { if( Sideview_pHandeled[k].psAS != NULL) { if (PtInRect(&(Sideview_pHandeled[k].rc), startScreen)) { #if 1 // MULTISELECT dlgAddMultiSelectListItem((long*) Sideview_pHandeled[k].psAS, 0, IM_AIRSPACE, 0); #else if (EnableSoundModes)PlayResource(TEXT("IDR_WAV_BTONE4")); dlgAirspaceDetails(Sideview_pHandeled[k].psAS); // dlgA #endif LKevent=LKEVENT_NONE; } } } dlgMultiSelectListShowModal(); if ( LKevent != LKEVENT_NONE ) { if (PtInRect(&rc, startScreen)) bHeightScale = !bHeightScale; if (PtInRect(&rct, startScreen)) bHeightScale = false; } break; case LKEVENT_PAGEUP: #ifdef OFFSET_SETP if(bHeightScale) fOffset -= OFFSET_SETP; else #endif { if(*iSplit == SIZE1) *iSplit = SIZE0; if(*iSplit == SIZE2) *iSplit = SIZE1; if(*iSplit == SIZE3) *iSplit = SIZE2; } break; case LKEVENT_PAGEDOWN: #ifdef OFFSET_SETP if(bHeightScale) fOffset += OFFSET_SETP; else #endif { if(*iSplit == SIZE2) *iSplit = SIZE3; if(*iSplit == SIZE1) *iSplit = SIZE2; if(*iSplit == SIZE0) *iSplit = SIZE1; } break; } LKASSERT(((*iSplit==SIZE0)||(*iSplit==SIZE1)||(*iSplit==SIZE2)||(*iSplit==SIZE3)||(*iSplit==SIZE4))); LKevent=LKEVENT_NONE; // Current_Multimap_SizeY is global, and must be used by all multimaps! // It is defined in Multimap.cpp and as an external in Multimap.h // It is important that it is updated, because we should resize terrain // only if needed! Resizing terrain takes some cpu and some time. // So we need to know when this is not necessary, having the same size of previous // multimap, if we are switching. // The current implementation is terribly wrong by managing resizing of sideview in // each multimap: it should be done by a common layer. // CAREFUL: // If for any reason DrawTerrain() is called after resizing to 0 (full sideview) // LK WILL CRASH with no hope to recover. if(Current_Multimap_SizeY != *iSplit) { Current_Multimap_SizeY=*iSplit; SetSplitScreenSize(*iSplit); rc.top = (long)((double)(rci.bottom-rci.top )*fSplitFact); rct.bottom = rc.top ; } if(bInvCol) { GREEN_COL = GREEN_COL.ChangeBrightness(0.6); BLUE_COL = BLUE_COL.ChangeBrightness(0.6);; LIGHTBLUE_COL = LIGHTBLUE_COL.ChangeBrightness(0.4);; } GPSlat = DrawInfo.Latitude; GPSlon = DrawInfo.Longitude; GPSalt = DrawInfo.Altitude; GPSbrg = DrawInfo.TrackBearing; calc_terrainalt = DerivedDrawInfo.TerrainAlt; calc_altitudeagl = DerivedDrawInfo.AltitudeAGL; GPSalt = DerivedDrawInfo.NavAltitude; bValid = false; iAS_HorDistance = 5000; iAS_Bearing = (int)GPSbrg; iAS_VertDistance= 0; found = CAirspaceManager::Instance().GetNearestAirspaceForSideview(); if(found != NULL) { near_airspace = CAirspaceManager::Instance().GetAirspaceCopy(found); bValid = near_airspace.GetDistanceInfo(bAS_Inside, iAS_HorDistance, iAS_Bearing, iAS_VertDistance); } iABS_AS_HorDistance = abs( iAS_HorDistance); wpt_brg = (long)AngleLimit360(GPSbrg - iAS_Bearing + 90.0); // Variables from ASP system here contain the following informations: // fAS_HorDistance - always contains horizontal distance from the asp, negative if horizontally inside (This does not mean that we're inside vertically as well!) // fAS_Bearing - always contains bearing to the nearest horizontal point // bValid - true if bAS_Inside, iAS_HorDistance, iAS_Bearing, iAS_VertDistance contains valid informations // this will be true if the asp border is close enough to be tracked by the warning system // bAS_Inside - current position is inside in the asp, calculated by the warning system // iAS_HorDistance - horizontal distance to the nearest horizontal border, negative if horizontally inside, calculated by the warning system // iAS_Bearing - bearing to the nearest horizontal border, calculated by the warning system // iAS_VertDistance - vertical distance to the nearest asp border, negative if the border is above us, positive if the border below us, calculated by the warning system // near_airspace.WarningLevel(): // awNone - no warning condition exists // awYellow - current position is near to a warning position // awRed - current posisiton is forbidden by asp system, we are in a warning position /********************************************************************* * calc the horizontal zoom *********************************************************************/ sDia.fXMin = -5000.0; sDia.fXMax = 5000.0; /* even when invalid the horizontal distance is calculated correctly */ if(bValid) { double fScaleDist = iABS_AS_HorDistance; sDia.fXMin = min(-2500.0 , fScaleDist * 1.5 ); sDia.fXMax = max( 2500.0 , fScaleDist * 1.5 ); #ifdef NEAR_AS_ZOOM_1000M if(((iABS_AS_HorDistance) < 900) && (bValid)) // 1km zoom { sDia.fXMin = min(-900.0, fScaleDist * 1.5 ); sDia.fXMax = max( 900.0, fScaleDist * 1.5 ); } #endif #ifdef NEAR_AS_ZOOM_1000FT if((abs(iABS_AS_HorDistance) < 333)) // 1000ft zoom { sDia.fXMin = min(-333.0, fScaleDist * 1.5 ); sDia.fXMax = max( 333.0, fScaleDist * 1.5 ); } #endif } #define RND_FACT 10.0 if( ( sDia.fXMax *fZOOMScale[getsideviewpage]) > 100000) fZOOMScale[getsideviewpage] /= ZOOMFACTOR; if(( sDia.fXMax *fZOOMScale[getsideviewpage]) < 500) { fZOOMScale[getsideviewpage] *= ZOOMFACTOR; } double fOldZoomScale=-1; if(fZOOMScale[getsideviewpage] != fOldZoomScale) { fOldZoomScale = fZOOMScale[getsideviewpage]; sDia.fXMax = sDia.fXMax *fZOOMScale[getsideviewpage]; sDia.fXMin = -sDia.fXMax /5; } /********************************************************************* * calc the vertical zoom *********************************************************************/ sDia.fYMin = max(0.0, GPSalt-2300); sDia.fYMax = max(MAXALTTODAY, GPSalt+1000); if(bValid) { double fBottom = near_airspace.Base()->Altitude; sDia.fYMin = min(fBottom*0.8, sDia.fYMin ); sDia.fYMin = max(0.0, sDia.fYMin ); if(sDia.fYMin < 300) sDia.fYMin =0; sDia.fYMax = max((fBottom*1.2f), sDia.fYMax ); if(abs(iAS_VertDistance) < 250) { sDia.fYMax = ((int)((GPSalt+abs(iAS_VertDistance))/400) + 2) *400 ; sDia.fYMin = ((int)((GPSalt-abs(iAS_VertDistance))/400) - 1) *400 ; if(sDia.fYMin-MIN_ALTITUDE < 0) sDia.fYMin = 0; } #ifdef VERTICAL_ZOOM_50 if(abs(iAS_VertDistance) < 50) { sDia.fYMax = ((int)((GPSalt+abs(iAS_VertDistance))/100) + 2) *100 ; sDia.fYMin = ((int)((GPSalt-abs(iAS_VertDistance))/100) - 1) *100 ; if(sDia.fYMin-MIN_ALTITUDE < 0) sDia.fYMin = 0; } #endif sDia.fYMin = max((double)0.0f,(double) sDia.fYMin); #ifdef OFFSET_SETP if(( sDia.fYMax + fOffset) > MAX_ALTITUDE) fOffset -= OFFSET_SETP; if(( sDia.fYMin + fOffset) < 0.0) fOffset += OFFSET_SETP; sDia.fYMin += fOffset; sDia.fYMax += fOffset; #endif // if(fHeigtScaleFact * sDia.fYMax > MAX_ALTITUDE ) // fHeigtScaleFact /=ZOOMFACTOR; if(fHeigtScaleFact * sDia.fYMax < MIN_ALTITUDE ) fHeigtScaleFact *=ZOOMFACTOR; sDia.fYMax *= fHeigtScaleFact; } /**************************************************************************************************** * draw topview first ****************************************************************************************************/ if(fSplitFact > 0.0) { sDia.rc = rct; sDia.rc.bottom-=1; SharedTopView(Surface, &sDia, (double) iAS_Bearing, (double) wpt_brg); } /**************************************************************************************************** * draw airspace and terrain elements ****************************************************************************************************/ RECT rcc = rc; /* rc corrected */ if(sDia.fYMin < GC_SEA_LEVEL_TOLERANCE) rcc.bottom -= SV_BORDER_Y; /* scale witout sea */ sDia.rc = rcc; RenderAirspaceTerrain(Surface, GPSlat, GPSlon, iAS_Bearing, &sDia ); LKFont hfOld = Surface.SelectObject(LK8InfoNormalFont); if(bValid) { LKASSERT(_tcslen(near_airspace.Name())<TBSIZE); // Diagnostic only in 3.1j, to be REMOVED LK_tcsncpy(Sideview_szNearAS, near_airspace.Name(), TBSIZE ); } else { _stprintf(text,TEXT("%s"), MsgToken(1259)); // LKTOKEN _@M1259_ "Too far, not calculated" Surface.GetTextSize(text, _tcslen(text), &tsize); TxYPt.x = (rc.right-rc.left-tsize.cx)/2; TxYPt.y = (rc.bottom-rc.top)/2; Surface.SetBkMode(TRANSPARENT); Surface.DrawText(TxYPt.x, TxYPt.y-20, text, _tcslen(text)); _stprintf(Sideview_szNearAS,TEXT("%s"), text); } Surface.SelectObject(hfOld); /**************************************************************************************************** * draw airspace and terrain elements ****************************************************************************************************/ /**************************************************************************************************** * draw diagram ****************************************************************************************************/ double xtick = 1.0; double fRange =fabs(sDia.fXMax - sDia.fXMin) ; if (fRange>3.0*1000.0) xtick = 2.0; if (fRange>15*1000.0) xtick = 5.0; if (fRange>50.0*1000.0) xtick = 10.0; if (fRange>100.0*1000.0) xtick = 20.0; if (fRange>200.0*1000.0) xtick = 25.0; if (fRange>250.0*1000.0) xtick = 50.0; if (fRange>500.0*1000.0) xtick = 100.0; if (fRange>1000.0*1000.0) xtick = 1000.0; if(bInvCol) { Surface.SelectObject(LK_BLACK_PEN); Surface.SelectObject(LKBrush_Black); } else { Surface.SelectObject(LK_WHITE_PEN); Surface.SelectObject(LKBrush_White); } LKColor txtCol = GROUND_TEXT_COLOUR; if(bInvCol) if(sDia.fYMin > GC_SEA_LEVEL_TOLERANCE) txtCol = INV_GROUND_TEXT_COLOUR; Surface.SetBkMode(TRANSPARENT); Surface.SetTextColor(txtCol); _stprintf(text, TEXT("%s"),Units::GetUnitName(Units::GetUserDistanceUnit())); switch(GetMMNorthUp(getsideviewpage)) { case NORTHUP: default: DrawXGrid(Surface, rc , xtick/DISTANCEMODIFY, xtick, 0,TEXT_ABOVE_LEFT, RGB_BLACK, &sDia,text); break; case TRACKUP: DrawXGrid(Surface, rci, xtick/DISTANCEMODIFY, xtick, 0,TEXT_ABOVE_LEFT, RGB_BLACK, &sDia,text); break; } Surface.SetTextColor(Sideview_TextColor); double fHeight = (sDia.fYMax-sDia.fYMin); double ytick = 100.0; if (fHeight >500.0) ytick = 200.0; if (fHeight >1000.0) ytick = 500.0; if (fHeight >2000.0) ytick = 1000.0; if (fHeight >4000.0) ytick = 2000.0; if (fHeight >8000.0) ytick = 4000.0; if(Units::GetUserAltitudeUnit() == unFeet) ytick = ytick * FEET_FACTOR; _stprintf(text, TEXT("%s"),Units::GetUnitName(Units::GetUserAltitudeUnit())); if(sDia.fYMin < GC_SEA_LEVEL_TOLERANCE) rc.bottom -= SV_BORDER_Y; /* scale witout sea */ DrawYGrid(Surface, rc, ytick/ALTITUDEMODIFY,ytick, 0,TEXT_UNDER_RIGHT ,Sideview_TextColor, &sDia, text); if(!bInvCol) Surface.SetBkMode(OPAQUE); /**************************************************************************************************** * draw AGL ****************************************************************************************************/ if(calc_altitudeagl - sDia.fYMin > 500) { Surface.SetTextColor(LIGHTBLUE_COL); Units::FormatUserAltitude(calc_altitudeagl, buffer, 7); LK_tcsncpy(text, MsgToken(1742), TBSIZE-_tcslen(buffer)); // AGL: _tcscat(text,buffer); Surface.GetTextSize(text, _tcslen(text), &tsize); TxYPt.x = CalcDistanceCoordinat(0, &sDia)- tsize.cx/2; TxYPt.y = CalcHeightCoordinat( (calc_terrainalt + calc_altitudeagl )*0.8, &sDia ); if((tsize.cy) < ( CalcHeightCoordinat( calc_terrainalt, &sDia )- TxYPt.y )) { Surface.DrawText(TxYPt.x+IBLSCALE(1), TxYPt.y , text, _tcslen(text)); } } Surface.SetBkMode(TRANSPARENT); /**************************************************************************************************** * Print current Elevation ****************************************************************************************************/ Surface.SetTextColor(RGB_BLACK); int x,y; if((calc_terrainalt- sDia.fYMin) > 0) { Units::FormatUserAltitude(calc_terrainalt, buffer, 7); LK_tcsncpy(text, MsgToken(1743), TBSIZE-_tcslen(buffer)); // ELV: _tcscat(text,buffer); Surface.GetTextSize(text, _tcslen(text), &tsize); x = CalcDistanceCoordinat(0, &sDia) - tsize.cx/2; y = CalcHeightCoordinat( calc_terrainalt, &sDia ); if ((ELV_FACT*tsize.cy) < abs(rc.bottom - y)) { Surface.DrawText(x, rc.bottom -(int)(ELV_FACT * tsize.cy), text, _tcslen(text)); } } /**************************************************************************************************** * draw side elements ****************************************************************************************************/ Surface.SetTextColor(Sideview_TextColor); Surface.SetBkMode(OPAQUE); LKFont hfOld2 = Surface.SelectObject(LK8InfoNormalFont); // DrawTelescope ( hdc, iAS_Bearing-90.0, rc.right - NIBLSCALE(13), rc.top + NIBLSCALE(58)); Surface.SelectObject(hfOld2); Surface.SetBkMode(TRANSPARENT); Surface.SelectObject(hfOld); Surface.SetTextColor(GROUND_TEXT_COLOUR); if(bInvCol) if(sDia.fYMin > GC_SEA_LEVEL_TOLERANCE) Surface.SetTextColor(INV_GROUND_TEXT_COLOUR); /****************************************************************************************************/ /****************************************************************************************************/ /**************************************************************************************************** * draw distances to next airspace ****************************************************************************************************/ /****************************************************************************************************/ /****************************************************************************************************/ if (bValid) { /**************************************************************************************************** * draw horizontal distance to next airspace ****************************************************************************************************/ Surface.SetTextColor(Sideview_TextColor); Surface.SetBkMode(OPAQUE); LKFont hfOldU = Surface.SelectObject(LK8InfoNormalFont); // horizontal distance line[0].x = CalcDistanceCoordinat(0, &sDia); line[0].y = CalcHeightCoordinat( GPSalt, &sDia ); line[1].x = CalcDistanceCoordinat(iABS_AS_HorDistance, &sDia); line[1].y = line[0].y; Surface.DrawDashLine(THICK_LINE, line[0], line[1], Sideview_TextColor, rc); if(iAS_HorDistance < 0) { line[0].y = CalcHeightCoordinat( GPSalt - (double)iAS_VertDistance, &sDia ); line[1].y = line[0].y; Surface.DrawDashLine(THICK_LINE, line[0], line[1], Sideview_TextColor, rc); } bool bLeft = false; if( line[0].x < line[1].x) bLeft = false; else bLeft = true; Units::FormatUserDistance(iABS_AS_HorDistance, buffer, 7); _stprintf(text,_T(" %s"),buffer); Surface.GetTextSize(text, _tcslen(text), &tsize); if((GPSalt- sDia.fYMin /*-calc_terrainalt */) < 300) TxXPt.y = CalcHeightCoordinat( GPSalt, &sDia ) - tsize.cy; else TxXPt.y = CalcHeightCoordinat( GPSalt, &sDia ) + NIBLSCALE(3); if(tsize.cx > (line[1].x - line[0].x) ) TxXPt.x = CalcDistanceCoordinat( iABS_AS_HorDistance ,&sDia) -tsize.cx- NIBLSCALE(3); else TxXPt.x = CalcDistanceCoordinat( iABS_AS_HorDistance / 2.0, &sDia) -tsize.cx/2; Surface.DrawText(TxXPt.x, TxXPt.y, text, _tcslen(text)); /**************************************************************************************************** * draw vertical distance to next airspace ****************************************************************************************************/ line[0].x = CalcDistanceCoordinat( iABS_AS_HorDistance , &sDia); line[0].y = CalcHeightCoordinat( GPSalt, &sDia ); line[1].x = line[0].x; line[1].y = CalcHeightCoordinat( GPSalt - (double)iAS_VertDistance, &sDia ); Surface.DrawDashLine(THICK_LINE, line[0], line[1], Sideview_TextColor, rc); Units::FormatUserAltitude( (double)abs(iAS_VertDistance), buffer, 7); _stprintf(text,_T(" %s"),buffer); Surface.GetTextSize(text, _tcslen(text), &tsize); if ( bLeft ) TxYPt.x = CalcDistanceCoordinat(iABS_AS_HorDistance, &sDia)- tsize.cx - NIBLSCALE(3); else TxYPt.x = CalcDistanceCoordinat(iABS_AS_HorDistance, &sDia)+ NIBLSCALE(5); if( abs( line[0].y - line[1].y) > tsize.cy) TxYPt.y = CalcHeightCoordinat( GPSalt - (double)iAS_VertDistance/2.0, &sDia) -tsize.cy/2 ; else TxYPt.y = min( line[0].y , line[1].y) - tsize.cy ; Surface.DrawText(TxYPt.x, TxYPt.y , text, _tcslen(text)); Surface.SelectObject(hfOldU); } /**************************************************************************************************** * draw plane sideview at least ****************************************************************************************************/ RenderPlaneSideview(Surface, 0.0 , GPSalt,wpt_brg, &sDia ); hfOldFnt = Surface.SelectObject(LK8InfoNormalFont/* Sender->GetFont()*/); DrawMultimap_SideTopSeparator(Surface,rct); /**************************************************************************************************** * draw selection frame ****************************************************************************************************/ if(bHeightScale) DrawSelectionFrame(Surface, rc); #ifdef TOP_SELECTION_FRAME else DrawSelectionFrame(hdc, rci); #endif Surface.SelectObject(hfOldFnt/* Sender->GetFont()*/); Surface.SetBkMode(TRANSPARENT); Surface.SelectObject(hfOldFnt/* Sender->GetFont()*/); }
bool EWDevice::AddWayPoint(const Waypoint &way_point) { char EWRecord[100]; TCHAR IDString[12]; int DegLat, DegLon; double tmp, MinLat, MinLon; char NoS, EoW; short EoW_Flag, NoS_Flag, EW_Flags; if (ewDecelTpIndex > 6){ // check for max 6 TP's return false; } _tcsncpy(IDString, way_point.Name.c_str(), 6); // copy at least 6 chars while (_tcslen(IDString) < 6) // fill up with spaces _tcscat(IDString, _T(" ")); #if USESHORTTPNAME > 0 _tcscpy(&IDString[3], _T(" ")); // truncate to short name #endif // prepare lat tmp = way_point.Location.Latitude.value_degrees(); NoS = 'N'; if (tmp < 0) { NoS = 'S'; tmp = -tmp; } DegLat = (int)tmp; MinLat = (tmp - DegLat) * 60 * 1000; // prepare long tmp = way_point.Location.Longitude.value_degrees(); EoW = 'E'; if (tmp < 0) { EoW = 'W'; tmp = -tmp; } DegLon = (int)tmp; MinLon = (tmp - DegLon) * 60 * 1000; // Calc E/W and N/S flags // Clear flags EoW_Flag = 0; // prepare flags NoS_Flag = 0; EW_Flags = 0; if (EoW == 'W') { EoW_Flag = 0x08; } else { EoW_Flag = 0x04; } if (NoS == 'N') { NoS_Flag = 0x01; } else { NoS_Flag = 0x02; } // Do the calculation EW_Flags = (short)(EoW_Flag | NoS_Flag); // setup command string sprintf(EWRecord, "#STP%02X%02X%02X%02X%02X%02X%02X%02X%02X%04X%02X%04X", ewDecelTpIndex, IDString[0], IDString[1], IDString[2], IDString[3], IDString[4], IDString[5], EW_Flags, DegLat, (int)MinLat/10, DegLon, (int)MinLon/10); WriteWithChecksum(port, EWRecord); if (!port->ExpectString("OK\r")) // wait for response return false; ewDecelTpIndex = ewDecelTpIndex + 1; // increase TP index return true; }
void StatusWnd::onCommand(UINT id, HIMC hIMC) { switch( id ) { case ID_CHI_ENG: toggleChiEngMode(hIMC); break; case ID_FULL_HALF: toggleShapeMode(hIMC); break; case ID_MENU: { HMENU menu = LoadMenu( g_dllInst, LPCTSTR(IDR_POPUP)); HMENU popup = GetSubMenu( menu, 0 ); RECT rc; GetWindowRect(hwnd, &rc); rc.left += 9; UINT flag; long y; if((rc.top * 2) > GetSystemMetrics(SM_CYSCREEN) ) { y = rc.top; flag = TPM_BOTTOMALIGN|TPM_LEFTALIGN; } else { y = rc.bottom; flag = TPM_TOPALIGN|TPM_LEFTALIGN; } TrackPopupMenu( popup, flag, rc.left, y, 0, hwnd, NULL); DestroyMenu(menu); break; } case ID_CONFIG: case ID_ABOUT: try { HWND top = hwnd; HWND desktop = GetDesktopWindow(), parent = NULL; while( (parent=GetParent(top)) != desktop && parent ) top = parent; EnableWindow( hwnd, FALSE ); if( id == ID_CONFIG ) ConfigureChewingIME(top); else DialogBox(g_dllInst, LPCTSTR(IDD_ABOUT), top, (DLGPROC)AboutDlgProc); EnableWindow( hwnd, TRUE ); } catch (...) { OutputDebugString("Using die wnd"); } break; case ID_WEBSITE: ShellExecute( NULL, "open", _T("http://chewing.im/"), NULL, NULL, SW_SHOWNORMAL ); break; case ID_GROUP: ShellExecute( NULL, "open", _T("http://groups.google.com/group/chewing"), NULL, NULL, SW_SHOWNORMAL ); break; case ID_BUGREPORT: ShellExecute( NULL, "open", _T("http://code.google.com/p/chewing/issues"), NULL, NULL, SW_SHOWNORMAL ); break; case ID_DICT_BUGREPORT: ShellExecute( NULL, "open", _T("http://of.openfoundry.org/projects/436/rt"), NULL, NULL, SW_SHOWNORMAL ); break; case ID_HASHED: case ID_CHEWING_HELP: case ID_CHECK_NEW_VER: { TCHAR path[MAX_PATH]; GetSystemDirectory( path, MAX_PATH ); _tcscat( path, _T("\\IME\\Chewing\\") ); int showcmd; if( id == ID_CHEWING_HELP ) { _tcscat( path, _T("Chewing.chm")); showcmd = SW_SHOWMAXIMIZED; } else if( id == ID_CHECK_NEW_VER ) { _tcscat( path, _T("Update.exe")); showcmd = SW_SHOWNORMAL; } else { _tcscat( path, _T("HashEd.exe")); showcmd = SW_SHOWNORMAL; } ShellExecute( NULL, "open", path, NULL, NULL, showcmd ); break; } case ID_DICT: case ID_SIMPDICT: case ID_LITTLEDICT: case ID_PROVERBDICT: { LPCTSTR url[]={ _T("http://dict.revised.moe.edu.tw/"), _T("http://dict.concised.moe.edu.tw/main/cover/main.htm"), _T("http://dict.mini.moe.edu.tw/"), _T("http://dict.idioms.moe.edu.tw/sort_pho.htm")}; ShellExecute( NULL, "open", url[ id - ID_DICT ], NULL, NULL, SW_SHOWNORMAL ); break; } } }
BOOL CApplicationPropPage::Validate() { if (!m_bDesktop) { // Make sure that all the characters in the filename are valid. for (unsigned int i = 0;i < _tcslen(m_szAlternateShell);i++) { TCHAR tCurrentChar = m_szAlternateShell[i]; if (tCurrentChar == TCHAR('"') || tCurrentChar == TCHAR('/') || tCurrentChar == TCHAR('*') || tCurrentChar == TCHAR('\\') || tCurrentChar == TCHAR('<') || tCurrentChar == TCHAR('>') || tCurrentChar == TCHAR('|') || tCurrentChar == TCHAR('?') || tCurrentChar == TCHAR(':')) { LPCTSTR pszTitle = LoadStringEx (IDS_INVALID_FILE_NAME_TITLE); LPCTSTR pszMsg = LoadStringEx (IDS_INVALID_FILE_NAME_MESSAGE); TCHAR szMsg [MAX_DISPLAY_STRING] = {0}; _tcscpy (szMsg, pszMsg); _tcscat (szMsg, L"\n\n"); _tcscat (szMsg, L"\t\t"); _tcscat (szMsg, L"\\"); _tcscat (szMsg, L"\""); _tcscat (szMsg, L"/ < > * | ?"); MessageBox (szMsg, pszTitle, MB_ICONINFORMATION | MB_OK); m_wndFileName.SendMessage (EM_SETSEL, 0, -1); m_wndFileName.SetFocus(); return FALSE; } } // Make sure that all the characters in the filename are valid. int i; for (i = 0;i < _tcslen(m_szShellWorkingDirectory);i++) { TCHAR tCurrentChar = m_szShellWorkingDirectory[i]; if (tCurrentChar == TCHAR('*') || tCurrentChar == TCHAR('<') || tCurrentChar == TCHAR('>') || tCurrentChar == TCHAR('|') || tCurrentChar == TCHAR('?')) { LPCTSTR pszTitle = LoadStringEx (IDS_INVALID_FILE_NAME_TITLE); LPCTSTR pszMsg = LoadStringEx (IDS_INVALID_FILE_NAME_MESSAGE); TCHAR szMsg [MAX_DISPLAY_STRING] = {0}; _tcscpy (szMsg, pszMsg); _tcscat (szMsg, L"\n\n"); _tcscat (szMsg, L"\t\t"); _tcscat (szMsg, L"< > * | ?"); MessageBox (szMsg, pszTitle, MB_ICONINFORMATION | MB_OK); m_wndWorkingDir.SendMessage (EM_SETSEL, 0, -1); m_wndWorkingDir.SetFocus(); return FALSE; } } } return TRUE; }
/* Function to iterate over source files and call replace for each of them */ INT recReplace(DWORD dwFlags, TCHAR szSrcPath[MAX_PATH], TCHAR szDestPath[MAX_PATH], BOOL *doMore) { TCHAR tmpDestPath[MAX_PATH], tmpSrcPath[MAX_PATH]; INT filesReplaced=0, i; DWORD dwAttrib = 0; HANDLE hFile; WIN32_FIND_DATA findBuffer; /* Get file handel to the sourcefile(s) */ hFile = FindFirstFile (szSrcPath, &findBuffer); /* Strip the paths back to the folder they are in, so that the diffrent filenames can be added if more than one */ for(i = (_tcslen(szSrcPath) - 1); i > -1; i--) if(szSrcPath[i] != _T('\\')) szSrcPath[i] = _T('\0'); else break; /* Go through all the soursfiles and copy/replace them */ do { if(CheckCtrlBreak(BREAK_INPUT)) { return filesReplaced; } /* Problem with file handler */ if(hFile == INVALID_HANDLE_VALUE) return filesReplaced; /* We do not want to replace any .. . ocr directory */ if(!_tcscmp (findBuffer.cFileName, _T(".")) || !_tcscmp (findBuffer.cFileName, _T(".."))|| findBuffer.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; /* Add filename to destpath */ _tcscpy(tmpDestPath,szDestPath); _tcscat (tmpDestPath, findBuffer.cFileName); dwAttrib = GetFileAttributes(tmpDestPath); /* Check add flag */ if(dwFlags & REPLACE_ADD) { if(IsExistingFile(tmpDestPath)) continue; else dwAttrib = 0; } else { if(!IsExistingFile(tmpDestPath)) continue; } /* Check if file is read only, if so check if that should be ignored */ if(dwAttrib & FILE_ATTRIBUTE_READONLY) { if(!(dwFlags & REPLACE_READ_ONLY)) { ConOutResPrintf(STRING_REPLACE_ERROR5, tmpDestPath); *doMore = FALSE; break; } } /* Add filename to sourcepath, insted of wildcards */ _tcscpy(tmpSrcPath,szSrcPath); _tcscat (tmpSrcPath, findBuffer.cFileName); /* Make the replace */ if(replace(tmpSrcPath,tmpDestPath, dwFlags, doMore)) { filesReplaced++; } else if (!*doMore) { /* The file to be replaced was the same as the source */ filesReplaced = -1; break; } /* Take next sourcefile if any */ }while(FindNextFile (hFile, &findBuffer)); return filesReplaced; }
HRESULT RegisterPlugin(HINSTANCE hInst) { char szMCOUPluginFullPath[MAX_PATH]; if(!GetModuleFileName(hInst, szMCOUPluginFullPath, countof(szMCOUPluginFullPath))) return E_INVALIDARG; // first, delete Outlook plugin cache DeleteOUExtCacheFile(); DeleteECF(); DWORD dwResult; HKEY key; dwResult = RegCreateKeyEx ( HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Exchange\\Client\\Extensions"), 0, 0, 0, KEY_WRITE, 0, &key, 0); if (dwResult != ERROR_SUCCESS) { // KLSTD_TRACE0 ( MCOU_TL_CRITICAL, L"error creating(opening) Extensions registry key\n" ); return S_OK; }; TCHAR szKeyValue[MAX_PATH << 1] = _T("4.0;"); _tcscat (szKeyValue, szMCOUPluginFullPath ); _tcscat (szKeyValue, _T(";1;10000111111100" ) ); dwResult = RegSetValueEx ( key, szPluginName, 0, REG_SZ, (LPBYTE)szKeyValue, strlen(szKeyValue) * sizeof(TCHAR) ); if (dwResult != ERROR_SUCCESS) { // KLSTD_TRACE0 ( MCOU_TL_CRITICAL, L"unable to set registry value\n" ); RegCloseKey ( key ); return E_FAIL; }; dwResult = RegSetValueEx ( key, szSetupKey, 0, REG_SZ, (LPBYTE)szSetupValue, strlen(szSetupValue)*sizeof(TCHAR) ); if (dwResult != ERROR_SUCCESS) { // KLSTD_TRACE0 ( MCOU_TL_CRITICAL, L"unable to set setup registry value\n" ); RegCloseKey ( key ); return E_FAIL; }; RegCloseKey ( key ); CreateECF(szMCOUPluginFullPath); return S_OK; }
INT cmd_replace (LPTSTR param) { LPTSTR *arg; INT argc, i,filesReplaced = 0, nFiles, srcIndex = -1, destIndex = -1; DWORD dwFlags = 0; TCHAR szDestPath[MAX_PATH], szSrcPath[MAX_PATH], tmpSrcPath[MAX_PATH]; BOOL doMore = TRUE; /* Help wanted? */ if (!_tcsncmp (param, _T("/?"), 2)) { ConOutResPaging(TRUE,STRING_REPLACE_HELP1); return 0; } /* Divide the argument in to an array of c-strings */ arg = split (param, &argc, FALSE); nFiles = argc; /* Read options */ for (i = 0; i < argc; i++) { if (arg[i][0] == _T('/')) { if (_tcslen(arg[i]) == 2) { switch (_totupper(arg[i][1])) { case _T('A'): dwFlags |= REPLACE_ADD; break; case _T('P'): dwFlags |= REPLACE_CONFIRM; break; case _T('R'): dwFlags |= REPLACE_READ_ONLY; break; case _T('S'): dwFlags |= REPLACE_SUBDIR; break; case _T('W'): dwFlags |= REPLACE_DISK; break; case _T('U'): dwFlags |= REPLACE_UPDATE; break; default: invalid_switch(arg[i]); return 0; } } else { invalid_switch(arg[i]); freep(arg); return 0; } nFiles--; } else { if(srcIndex == -1) { srcIndex = i; } else if(destIndex == -1) { destIndex = i; } else { invalid_switch(arg[i]); freep(arg); return 0; } } } /* See so that at least source is there */ if (nFiles < 1) { ConOutResPaging(TRUE,STRING_REPLACE_HELP2); ConOutResPaging(TRUE,STRING_REPLACE_HELP3); freep(arg); return 1; } /* Check so that not both update and add switch is added and subdir */ if((dwFlags & REPLACE_UPDATE || dwFlags & REPLACE_SUBDIR) && (dwFlags & REPLACE_ADD)) { ConOutResPaging(TRUE,STRING_REPLACE_ERROR4); ConOutResPaging(TRUE,STRING_REPLACE_HELP7); freep(arg); return 1; } /* If we have a destination get the full path */ if(destIndex != -1) { if(_tcslen(arg[destIndex]) == 2 && arg[destIndex][1] == ':') GetRootPath(arg[destIndex],szDestPath,MAX_PATH); else { /* Check for wildcards in destination directory */ if (_tcschr (arg[destIndex], _T('*')) != NULL || _tcschr (arg[destIndex], _T('?')) != NULL) { ConOutResPrintf(STRING_REPLACE_ERROR2,arg[destIndex]); ConOutResPaging(TRUE,STRING_REPLACE_HELP3); freep(arg); return 1; } getPath(szDestPath, arg[destIndex]); /* Make sure that destination exists */ if(!IsExistingDirectory(szDestPath)) { ConOutResPrintf(STRING_REPLACE_ERROR2, szDestPath); ConOutResPaging(TRUE,STRING_REPLACE_HELP3); freep(arg); return 1; } } } else { /* Dest is current dir */ GetCurrentDirectory(MAX_PATH,szDestPath); } /* Get the full source path */ if(!(_tcslen(arg[srcIndex]) == 2 && arg[srcIndex][1] == ':')) getPath(szSrcPath, arg[srcIndex]); else _tcscpy(szSrcPath,arg[srcIndex]); /* Source does not have wildcards */ if (_tcschr (arg[srcIndex], _T('*')) == NULL && _tcschr (arg[srcIndex], _T('?')) == NULL) { /* Check so that source is not a directory, because that is not allowed */ if(IsExistingDirectory(szSrcPath)) { ConOutResPrintf(STRING_REPLACE_ERROR6, szSrcPath); ConOutResPaging(TRUE,STRING_REPLACE_HELP3); freep(arg); return 1; } /* Check if the file exists */ if(!IsExistingFile(szSrcPath)) { ConOutResPaging(TRUE,STRING_REPLACE_HELP3); freep(arg); return 1; } } /* /w switch is set so wait for any key to be pressed */ if(dwFlags & REPLACE_DISK) { msg_pause(); cgetchar(); } /* Add an extra \ to the destination path if needed */ if(szDestPath[_tcslen(szDestPath) - 1] != _T('\\')) _tcscat(szDestPath, _T("\\")); /* Save source path */ _tcscpy(tmpSrcPath,szSrcPath); /* Replace in dest dir */ filesReplaced += recReplace(dwFlags, tmpSrcPath, szDestPath, &doMore); /* If subdir switch is set replace in the subdirs to */ if(dwFlags & REPLACE_SUBDIR && doMore) { filesReplaced += recFindSubDirs(dwFlags, szSrcPath, szDestPath, &doMore); } /* If source == dest write no more */ if(filesReplaced != -1) { /* No files replaced */ if(filesReplaced==0) { /* Add switch dependent output */ if(dwFlags & REPLACE_ADD) ConOutResPaging(TRUE,STRING_REPLACE_HELP7); else ConOutResPaging(TRUE,STRING_REPLACE_HELP3); } /* Some files replaced */ else { /* Add switch dependent output */ if(dwFlags & REPLACE_ADD) ConOutResPrintf(STRING_REPLACE_HELP8, filesReplaced); else ConOutResPrintf(STRING_REPLACE_HELP4, filesReplaced); } } /* Return memory */ freep(arg); return 1; }
/** * Updates all the dialogs fields. * Should be called on dialog opening as it closes the dialog when the * target does not exist. */ static void Update() { TCHAR tmp[200], tmp_id[7]; // Set the dialog caption _stprintf(tmp, _T("%s (%s)"), _("FLARM Traffic Details"), target_id.Format(tmp_id)); wf->SetCaption(tmp); // Try to find the target in the FLARMnet database /// @todo: make this code a little more usable const FlarmNetRecord *record = FlarmDetails::LookupRecord(target_id); if (record) { // Fill the pilot name field SetFormValue(*wf, _T("prpPilot"), record->pilot); // Fill the frequency field if (!StringIsEmpty(record->frequency)) { _tcscpy(tmp, record->frequency); _tcscat(tmp, _T(" MHz")); SetFormValue(*wf, _T("prpFrequency"), tmp); } else SetFormValue(*wf, _T("prpFrequency"), _T("--")); // Fill the home airfield field SetFormValue(*wf, _T("prpAirport"), record->airfield); // Fill the plane type field SetFormValue(*wf, _T("prpPlaneType"), record->plane_type); } else { // Fill the pilot name field SetFormValue(*wf, _T("prpPilot"), _T("--")); // Fill the frequency field SetFormValue(*wf, _T("prpFrequency"), _T("--")); // Fill the home airfield field SetFormValue(*wf, _T("prpAirport"), _T("--")); // Fill the plane type field const FlarmTraffic* target = CommonInterface::Basic().flarm.traffic.FindTraffic(target_id); const TCHAR* actype; if (target == NULL || (actype = FlarmTraffic::GetTypeString(target->type)) == NULL) actype = _T("--"); SetFormValue(*wf, _T("prpPlaneType"), actype); } // Fill the callsign field (+ registration) // note: don't use target->Name here since it is not updated // yet if it was changed const TCHAR* cs = FlarmDetails::LookupCallsign(target_id); if (cs != NULL && cs[0] != 0) { _tcscpy(tmp, cs); if (record) { _tcscat(tmp, _T(" (")); _tcscat(tmp, record->registration); _tcscat(tmp, _T(")")); } } else _tcscpy(tmp, _T("--")); SetFormValue(*wf, _T("prpCallsign"), tmp); // Update the frequently changing fields too UpdateChanging(CommonInterface::Basic()); }
//----------------------------------------------------------------------------- // Name: GetDirectXVerionViaFileVersions() // Desc: Tries to get the DirectX version by looking at DirectX file versions //----------------------------------------------------------------------------- HRESULT GetDirectXVerionViaFileVersions( DWORD* pdwDirectXVersionMajor, DWORD* pdwDirectXVersionMinor, TCHAR* pcDirectXVersionLetter ) { ULARGE_INTEGER llFileVersion; TCHAR szPath[512]; TCHAR szFile[512]; BOOL bFound = false; if( GetSystemDirectory( szPath, MAX_PATH ) != 0 ) { szPath[MAX_PATH-1]=0; // Switch off the ddraw version _tcscpy( szFile, szPath ); _tcscat( szFile, TEXT("\\ddraw.dll") ); if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) ) { if( CompareLargeInts( llFileVersion, MakeInt64( 4, 2, 0, 95 ) ) >= 0 ) // Win9x version { // flle is >= DX1.0 version, so we must be at least DX1.0 if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 1; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' '); bFound = true; } if( CompareLargeInts( llFileVersion, MakeInt64( 4, 3, 0, 1096 ) ) >= 0 ) // Win9x version { // flle is is >= DX2.0 version, so we must DX2.0 or DX2.0a (no redist change) if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 2; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' '); bFound = true; } if( CompareLargeInts( llFileVersion, MakeInt64( 4, 4, 0, 68 ) ) >= 0 ) // Win9x version { // flle is is >= DX3.0 version, so we must be at least DX3.0 if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 3; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' '); bFound = true; } } // Switch off the d3drg8x.dll version _tcscpy( szFile, szPath ); _tcscat( szFile, TEXT("\\d3drg8x.dll") ); if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) ) { if( CompareLargeInts( llFileVersion, MakeInt64( 4, 4, 0, 70 ) ) >= 0 ) // Win9x version { // d3drg8x.dll is the DX3.0a version, so we must be DX3.0a or DX3.0b (no redist change) if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 3; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT('a'); bFound = true; } } // Switch off the ddraw version _tcscpy( szFile, szPath ); _tcscat( szFile, TEXT("\\ddraw.dll") ); if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) ) { if( CompareLargeInts( llFileVersion, MakeInt64( 4, 5, 0, 155 ) ) >= 0 ) // Win9x version { // ddraw.dll is the DX5.0 version, so we must be DX5.0 or DX5.2 (no redist change) if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 5; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' '); bFound = true; } if( CompareLargeInts( llFileVersion, MakeInt64( 4, 6, 0, 318 ) ) >= 0 ) // Win9x version { // ddraw.dll is the DX6.0 version, so we must be at least DX6.0 if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 6; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' '); bFound = true; } if( CompareLargeInts( llFileVersion, MakeInt64( 4, 6, 0, 436 ) ) >= 0 ) // Win9x version { // ddraw.dll is the DX6.1 version, so we must be at least DX6.1 if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 6; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 1; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' '); bFound = true; } } // Switch off the dplayx.dll version _tcscpy( szFile, szPath ); _tcscat( szFile, TEXT("\\dplayx.dll") ); if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) ) { if( CompareLargeInts( llFileVersion, MakeInt64( 4, 6, 3, 518 ) ) >= 0 ) // Win9x version { // ddraw.dll is the DX6.1 version, so we must be at least DX6.1a if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 6; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 1; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT('a'); bFound = true; } } // Switch off the ddraw version _tcscpy( szFile, szPath ); _tcscat( szFile, TEXT("\\ddraw.dll") ); if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) ) { if( CompareLargeInts( llFileVersion, MakeInt64( 4, 7, 0, 700 ) ) >= 0 ) // Win9x version { // TODO: find win2k version // ddraw.dll is the DX7.0 version, so we must be at least DX7.0 if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 7; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' '); bFound = true; } } // Switch off the dinput version _tcscpy( szFile, szPath ); _tcscat( szFile, TEXT("\\dinput.dll") ); if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) ) { if( CompareLargeInts( llFileVersion, MakeInt64( 4, 7, 0, 716 ) ) >= 0 ) // Win9x version { // ddraw.dll is the DX7.0 version, so we must be at least DX7.0a if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 7; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT('a'); bFound = true; } } // Switch off the ddraw version _tcscpy( szFile, szPath ); _tcscat( szFile, TEXT("\\ddraw.dll") ); if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) ) { if( (HIWORD(llFileVersion.HighPart) == 4 && CompareLargeInts( llFileVersion, MakeInt64( 4, 8, 0, 400 ) ) >= 0) || // Win9x version (HIWORD(llFileVersion.HighPart) == 5 && CompareLargeInts( llFileVersion, MakeInt64( 5, 1, 2258, 400 ) ) >= 0) ) // Win2k/WinXP version { // ddraw.dll is the DX8.0 version, so we must be at least DX8.0 or DX8.0a (no redist change) if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 8; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' '); bFound = true; } } _tcscpy( szFile, szPath ); _tcscat( szFile, TEXT("\\d3d8.dll")); if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) ) { if( (HIWORD(llFileVersion.HighPart) == 4 && CompareLargeInts( llFileVersion, MakeInt64( 4, 8, 1, 881 ) ) >= 0) || // Win9x version (HIWORD(llFileVersion.HighPart) == 5 && CompareLargeInts( llFileVersion, MakeInt64( 5, 1, 2600, 881 ) ) >= 0) ) // Win2k/WinXP version { // d3d8.dll is the DX8.1 version, so we must be at least DX8.1 if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 8; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 1; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' '); bFound = true; } if( (HIWORD(llFileVersion.HighPart) == 4 && CompareLargeInts( llFileVersion, MakeInt64( 4, 8, 1, 901 ) ) >= 0) || // Win9x version (HIWORD(llFileVersion.HighPart) == 5 && CompareLargeInts( llFileVersion, MakeInt64( 5, 1, 2600, 901 ) ) >= 0) ) // Win2k/WinXP version { // d3d8.dll is the DX8.1a version, so we must be at least DX8.1a if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 8; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 1; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT('a'); bFound = true; } } _tcscpy( szFile, szPath ); _tcscat( szFile, TEXT("\\mpg2splt.ax")); if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) ) { if( CompareLargeInts( llFileVersion, MakeInt64( 6, 3, 1, 885 ) ) >= 0 ) // Win9x/Win2k/WinXP version { // quartz.dll is the DX8.1b version, so we must be at least DX8.1b if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 8; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 1; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT('b'); bFound = true; } } _tcscpy( szFile, szPath ); _tcscat( szFile, TEXT("\\dpnet.dll")); if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) ) { if( (HIWORD(llFileVersion.HighPart) == 4 && CompareLargeInts( llFileVersion, MakeInt64( 4, 9, 0, 134 ) ) >= 0) || // Win9x version (HIWORD(llFileVersion.HighPart) == 5 && CompareLargeInts( llFileVersion, MakeInt64( 5, 2, 3677, 134 ) ) >= 0) ) // Win2k/WinXP version { // dpnet.dll is the DX8.2 version, so we must be at least DX8.2 if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 8; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 2; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' '); bFound = true; } } _tcscpy( szFile, szPath ); _tcscat( szFile, TEXT("\\d3d9.dll")); if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) ) { // File exists, but be at least DX9 if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 9; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' '); bFound = true; } } if( !bFound ) { // No DirectX installed if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 0; if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0; if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' '); } return S_OK; }
void FormatTimespanSmart(TCHAR *buffer, int timespan, unsigned max_tokens, const TCHAR *separator) { assert(max_tokens > 0 && max_tokens <= 4); unsigned days, hours, minutes, seconds; CalculateTimespanComponents(abs(timespan), days, hours, minutes, seconds); unsigned token = 0; bool show_days = false, show_hours = false; bool show_minutes = false, show_seconds = false; // Days if (days != 0) { show_days = true; token++; } // Hours if (token < max_tokens) { if (hours != 0) { show_hours = true; token++; } else if (token != 0) { if (token + 1 < max_tokens && minutes != 0) show_hours = true; else if (token + 2 < max_tokens && seconds != 0) show_hours = true; token++; } } // Minutes if (token < max_tokens) { if (minutes != 0 ) { show_minutes = true; token++; } else if (token != 0) { if (token + 1 < max_tokens && seconds != 0) show_minutes = true; token++; } } // Seconds if (token < max_tokens && (seconds != 0 || token == 0)) show_seconds = true; // Output if (timespan < 0) { *buffer = _T('-'); buffer++; } *buffer = _T('\0'); StaticString<16> component_buffer; if (show_days) { component_buffer.Format(_T("%u days"), days); _tcscat(buffer, component_buffer); } if (show_hours) { if (!StringIsEmpty(buffer)) _tcscat(buffer, separator); component_buffer.Format(_T("%u h"), hours); _tcscat(buffer, component_buffer); } if (show_minutes) { if (!StringIsEmpty(buffer)) _tcscat(buffer, separator); component_buffer.Format(_T("%u min"), minutes); _tcscat(buffer, component_buffer); } if (show_seconds) { if (!StringIsEmpty(buffer)) _tcscat(buffer, separator); component_buffer.Format(_T("%u sec"), seconds); _tcscat(buffer, component_buffer); } }
/* Keyword メッセージ処理 */ INT_PTR CPropKeyword::DispatchEvent( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { WORD wNotifyCode; WORD wID; HWND hwndCtl; NMHDR* pNMHDR; int nIndex1; int i; LV_COLUMN lvc; LV_ITEM* plvi; static HWND hwndCOMBO_SET; static HWND hwndLIST_KEYWORD; RECT rc; CDlgInput1 cDlgInput1; wchar_t szKeyWord[MAX_KEYWORDLEN + 1]; LONG_PTR lStyle; LV_DISPINFO* plvdi; LV_KEYDOWN* pnkd; switch( uMsg ){ case WM_INITDIALOG: /* ダイアログデータの設定 Keyword */ SetData( hwndDlg ); // Modified by KEITA for WIN64 2003.9.6 ::SetWindowLongPtr( hwndDlg, DWLP_USER, lParam ); if( wParam == IDOK ){ // 独立ウィンドウ hwndCtl = ::GetDlgItem( hwndDlg, IDOK ); GetWindowRect( hwndCtl, &rc ); i = rc.bottom; // OK,CANCELボタンの下端 GetWindowRect( hwndDlg, &rc ); SetWindowPos( hwndDlg, NULL, 0, 0, rc.right-rc.left, i-rc.top+10, SWP_NOZORDER|SWP_NOMOVE ); std::tstring title = LS(STR_PROPCOMMON); title += _T(" - "); title += LS(STR_PROPCOMMON_KEYWORD); SetWindowText( hwndDlg, title.c_str() ); hwndCOMBO_SET = ::GetDlgItem( hwndDlg, IDC_COMBO_SET ); Combo_SetCurSel( hwndCOMBO_SET, m_nKeywordSet1 ); } else{ hwndCtl = ::GetDlgItem( hwndDlg, IDOK ); ShowWindow( hwndCtl, SW_HIDE ); hwndCtl = ::GetDlgItem( hwndDlg, IDCANCEL ); ShowWindow( hwndCtl, SW_HIDE ); } /* コントロールのハンドルを取得 */ hwndCOMBO_SET = ::GetDlgItem( hwndDlg, IDC_COMBO_SET ); hwndLIST_KEYWORD = ::GetDlgItem( hwndDlg, IDC_LIST_KEYWORD ); ::GetWindowRect( hwndLIST_KEYWORD, &rc ); lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; lvc.cx = rc.right - rc.left; lvc.pszText = const_cast<TCHAR*>(_T("")); lvc.iSubItem = 0; ListView_InsertColumn( hwndLIST_KEYWORD, 0, &lvc ); lStyle = ::GetWindowLongPtr( hwndLIST_KEYWORD, GWL_STYLE ); ::SetWindowLongPtr( hwndLIST_KEYWORD, GWL_STYLE, lStyle | LVS_SHOWSELALWAYS ); /* コントロール更新のタイミング用のタイマーを起動 */ ::SetTimer( hwndDlg, 1, 300, NULL ); return TRUE; case WM_NOTIFY: pNMHDR = (NMHDR*)lParam; pnkd = (LV_KEYDOWN *)lParam; plvdi = (LV_DISPINFO*)lParam; plvi = &plvdi->item; if( hwndLIST_KEYWORD == pNMHDR->hwndFrom ){ switch( pNMHDR->code ){ case NM_DBLCLK: // MYTRACE( _T("NM_DBLCLK \n") ); /* リスト中で選択されているキーワードを編集する */ Edit_List_KeyWord( hwndDlg, hwndLIST_KEYWORD ); return TRUE; case LVN_BEGINLABELEDIT: #ifdef _DEBUG MYTRACE( _T("LVN_BEGINLABELEDIT\n") ); MYTRACE( _T(" plvi->mask =[%xh]\n"), plvi->mask ); MYTRACE( _T(" plvi->iItem =[%d]\n"), plvi->iItem ); MYTRACE( _T(" plvi->iSubItem =[%d]\n"), plvi->iSubItem ); if (plvi->mask & LVIF_STATE) MYTRACE( _T(" plvi->state =[%xf]\n"), plvi->state ); MYTRACE( _T(" plvi->stateMask =[%xh]\n"), plvi->stateMask ); if (plvi->mask & LVIF_TEXT) MYTRACE( _T(" plvi->pszText =[%ts]\n"), plvi->pszText ); MYTRACE( _T(" plvi->cchTextMax=[%d]\n"), plvi->cchTextMax ); if (plvi->mask & LVIF_IMAGE) MYTRACE( _T(" plvi->iImage=[%d]\n"), plvi->iImage ); if (plvi->mask & LVIF_PARAM) MYTRACE( _T(" plvi->lParam=[%xh(%d)]\n"), plvi->lParam, plvi->lParam ); #endif return TRUE; case LVN_ENDLABELEDIT: #ifdef _DEBUG MYTRACE( _T("LVN_ENDLABELEDIT\n") ); MYTRACE( _T(" plvi->mask =[%xh]\n"), plvi->mask ); MYTRACE( _T(" plvi->iItem =[%d]\n"), plvi->iItem ); MYTRACE( _T(" plvi->iSubItem =[%d]\n"), plvi->iSubItem ); if (plvi->mask & LVIF_STATE) MYTRACE( _T(" plvi->state =[%xf]\n"), plvi->state ); MYTRACE( _T(" plvi->stateMask =[%xh]\n"), plvi->stateMask ); if (plvi->mask & LVIF_TEXT) MYTRACE( _T(" plvi->pszText =[%ts]\n"), plvi->pszText ); MYTRACE( _T(" plvi->cchTextMax=[%d]\n"), plvi->cchTextMax ); if (plvi->mask & LVIF_IMAGE) MYTRACE( _T(" plvi->iImage=[%d]\n"), plvi->iImage ); if (plvi->mask & LVIF_PARAM) MYTRACE( _T(" plvi->lParam=[%xh(%d)]\n"), plvi->lParam, plvi->lParam ); #endif if( NULL == plvi->pszText ){ return TRUE; } if( plvi->pszText[0] != _T('\0') ){ if( MAX_KEYWORDLEN < _tcslen( plvi->pszText ) ){ InfoMessage( hwndDlg, LS(STR_PROPCOMKEYWORD_ERR_LEN), MAX_KEYWORDLEN ); return TRUE; } /* n番目のセットにキーワードを編集 */ m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.UpdateKeyWord( m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nCurrentKeyWordSetIdx, plvi->lParam, to_wchar(plvi->pszText) ); }else{ /* n番目のセットのm番目のキーワードを削除 */ m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.DelKeyWord( m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nCurrentKeyWordSetIdx, plvi->lParam ); } /* ダイアログデータの設定 Keyword 指定キーワードセットの設定 */ SetKeyWordSet( hwndDlg, m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nCurrentKeyWordSetIdx ); ListView_SetItemState( hwndLIST_KEYWORD, plvi->iItem, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED ); return TRUE; case LVN_KEYDOWN: // MYTRACE( _T("LVN_KEYDOWN\n") ); switch( pnkd->wVKey ){ case VK_DELETE: /* リスト中で選択されているキーワードを削除する */ Delete_List_KeyWord( hwndDlg, hwndLIST_KEYWORD ); break; case VK_SPACE: /* リスト中で選択されているキーワードを編集する */ Edit_List_KeyWord( hwndDlg, hwndLIST_KEYWORD ); break; } return TRUE; } }else{ switch( pNMHDR->code ){ case PSN_HELP: OnHelp( hwndDlg, IDD_PROP_KEYWORD ); return TRUE; case PSN_KILLACTIVE: DEBUG_TRACE( _T("Keyword PSN_KILLACTIVE\n") ); /* ダイアログデータの取得 Keyword */ GetData( hwndDlg ); return TRUE; //@@@ 2002.01.03 YAZAKI 最後に表示していたシートを正しく覚えていないバグ修正 case PSN_SETACTIVE: m_nPageNum = ID_PROPCOM_PAGENUM_KEYWORD; return TRUE; } } break; case WM_COMMAND: wNotifyCode = HIWORD(wParam); /* 通知コード */ wID = LOWORD(wParam); /* 項目ID、 コントロールID、 またはアクセラレータID */ hwndCtl = (HWND) lParam; /* コントロールのハンドル */ if( hwndCOMBO_SET == hwndCtl){ switch( wNotifyCode ){ case CBN_SELCHANGE: nIndex1 = Combo_GetCurSel( hwndCOMBO_SET ); /* ダイアログデータの設定 Keyword 指定キーワードセットの設定 */ SetKeyWordSet( hwndDlg, nIndex1 ); return TRUE; } }else{ switch( wNotifyCode ){ /* ボタン/チェックボックスがクリックされた */ case BN_CLICKED: switch( wID ){ case IDC_BUTTON_ADDSET: /* セット追加 */ if( MAX_SETNUM <= m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nKeyWordSetNum ){ InfoMessage( hwndDlg, LS(STR_PROPCOMKEYWORD_SETMAX), MAX_SETNUM ); return TRUE; } /* モードレスダイアログの表示 */ szKeyWord[0] = L'\0'; // Oct. 5, 2002 genta 長さ制限の設定を修正.バッファオーバーランしていた. if( !cDlgInput1.DoModal( G_AppInstance(), hwndDlg, LS(STR_PROPCOMKEYWORD_SETNAME1), LS(STR_PROPCOMKEYWORD_SETNAME2), MAX_SETNAMELEN, szKeyWord ) ){ return TRUE; } if( szKeyWord[0] != L'\0' ){ /* セットの追加 */ m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.AddKeyWordSet( szKeyWord, false ); m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nCurrentKeyWordSetIdx = m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nKeyWordSetNum - 1; /* ダイアログデータの設定 Keyword */ SetData( hwndDlg ); } return TRUE; case IDC_BUTTON_DELSET: /* セット削除 */ nIndex1 = Combo_GetCurSel( hwndCOMBO_SET ); if( CB_ERR == nIndex1 ){ return TRUE; } /* 削除対象のセットを使用しているファイルタイプを列挙 */ static TCHAR pszLabel[1024]; _tcscpy( pszLabel, _T("") ); for( i = 0; i < GetDllShareData().m_nTypesCount; ++i ){ std::auto_ptr<STypeConfig> type(new STypeConfig()); CDocTypeManager().GetTypeConfig( CTypeConfig(i), *type ); // 2002/04/25 YAZAKI STypeConfig全体を保持する必要はないし、m_pShareDataを直接見ても問題ない。 if( nIndex1 == m_Types_nKeyWordSetIdx[i].index[0] || nIndex1 == m_Types_nKeyWordSetIdx[i].index[1] || nIndex1 == m_Types_nKeyWordSetIdx[i].index[2] || nIndex1 == m_Types_nKeyWordSetIdx[i].index[3] || nIndex1 == m_Types_nKeyWordSetIdx[i].index[4] || nIndex1 == m_Types_nKeyWordSetIdx[i].index[5] || nIndex1 == m_Types_nKeyWordSetIdx[i].index[6] || nIndex1 == m_Types_nKeyWordSetIdx[i].index[7] || nIndex1 == m_Types_nKeyWordSetIdx[i].index[8] || nIndex1 == m_Types_nKeyWordSetIdx[i].index[9] ){ _tcscat( pszLabel, _T("・") ); _tcscat( pszLabel, type->m_szTypeName ); _tcscat( pszLabel, _T("(") ); _tcscat( pszLabel, type->m_szTypeExts ); _tcscat( pszLabel, _T(")") ); _tcscat( pszLabel, _T("\n") ); } } if( IDCANCEL == ::MYMESSAGEBOX( hwndDlg, MB_OKCANCEL | MB_ICONQUESTION, GSTR_APPNAME, LS(STR_PROPCOMKEYWORD_SETDEL), m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.GetTypeName( nIndex1 ), pszLabel ) ){ return TRUE; } /* 削除対象のセットを使用しているファイルタイプのセットをクリア */ for( i = 0; i < GetDllShareData().m_nTypesCount; ++i ){ // 2002/04/25 YAZAKI STypeConfig全体を保持する必要はない。 for( int j = 0; j < MAX_KEYWORDSET_PER_TYPE; j++ ){ if( nIndex1 == m_Types_nKeyWordSetIdx[i].index[j] ){ m_Types_nKeyWordSetIdx[i].index[j] = -1; } else if( nIndex1 < m_Types_nKeyWordSetIdx[i].index[j] ){ m_Types_nKeyWordSetIdx[i].index[j]--; } } } /* n番目のセットを削除 */ m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.DelKeyWordSet( m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nCurrentKeyWordSetIdx ); /* ダイアログデータの設定 Keyword */ SetData( hwndDlg ); return TRUE; case IDC_BUTTON_KEYSETRENAME: // キーワードセットの名称変更 // モードレスダイアログの表示 wcscpy( szKeyWord, m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.GetTypeName( m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nCurrentKeyWordSetIdx ) ); { BOOL bDlgInputResult = cDlgInput1.DoModal( G_AppInstance(), hwndDlg, LS(STR_PROPCOMKEYWORD_RENAME1), LS(STR_PROPCOMKEYWORD_RENAME2), MAX_SETNAMELEN, szKeyWord ); if( !bDlgInputResult ){ return TRUE; } } if( szKeyWord[0] != L'\0' ){ m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.SetTypeName( m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nCurrentKeyWordSetIdx, szKeyWord ); // ダイアログデータの設定 Keyword SetData( hwndDlg ); } return TRUE; case IDC_CHECK_KEYWORDCASE: /* キーワードの英大文字小文字区別 */ // m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_bKEYWORDCASEArr[ m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nCurrentKeyWordSetIdx ] = ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_KEYWORDCASE ); //MIK 2000.12.01 case sense m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.SetKeyWordCase(m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nCurrentKeyWordSetIdx, ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_KEYWORDCASE )); //MIK 2000.12.01 case sense return TRUE; case IDC_BUTTON_ADDKEYWORD: /* キーワード追加 */ /* n番目のセットのキーワードの数を返す */ if( !m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.CanAddKeyWord( m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nCurrentKeyWordSetIdx ) ){ InfoMessage( hwndDlg, LS(STR_PROPCOMKEYWORD_KEYMAX) ); return TRUE; } /* モードレスダイアログの表示 */ szKeyWord[0] = L'\0'; if( !cDlgInput1.DoModal( G_AppInstance(), hwndDlg, LS(STR_PROPCOMKEYWORD_KEYADD1), LS(STR_PROPCOMKEYWORD_KEYADD2), MAX_KEYWORDLEN, szKeyWord ) ){ return TRUE; } if( szKeyWord[0] != L'\0' ){ /* n番目のセットにキーワードを追加 */ if( 0 == m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.AddKeyWord( m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nCurrentKeyWordSetIdx, szKeyWord ) ){ // ダイアログデータの設定 Keyword 指定キーワードセットの設定 SetKeyWordSet( hwndDlg, m_Common.m_sSpecialKeyword.m_CKeyWordSetMgr.m_nCurrentKeyWordSetIdx ); } } return TRUE; case IDC_BUTTON_EDITKEYWORD: /* キーワード編集 */ /* リスト中で選択されているキーワードを編集する */ Edit_List_KeyWord( hwndDlg, hwndLIST_KEYWORD ); return TRUE; case IDC_BUTTON_DELKEYWORD: /* キーワード削除 */ /* リスト中で選択されているキーワードを削除する */ Delete_List_KeyWord( hwndDlg, hwndLIST_KEYWORD ); return TRUE; // From Here 2005.01.26 Moca case IDC_BUTTON_KEYCLEAN: Clean_List_KeyWord( hwndDlg, hwndLIST_KEYWORD ); return TRUE; // To Here 2005.01.26 Moca case IDC_BUTTON_IMPORT: /* インポート */ /* リスト中のキーワードをインポートする */ Import_List_KeyWord( hwndDlg, hwndLIST_KEYWORD ); return TRUE; case IDC_BUTTON_EXPORT: /* エクスポート */ /* リスト中のキーワードをエクスポートする */ Export_List_KeyWord( hwndDlg, hwndLIST_KEYWORD ); return TRUE; // 独立ウィンドウで使用する case IDOK: EndDialog( hwndDlg, IDOK ); break; case IDCANCEL: EndDialog( hwndDlg, IDCANCEL ); break; } break; /* BN_CLICKED */ } } break; /* WM_COMMAND */ case WM_TIMER: nIndex1 = ListView_GetNextItem( hwndLIST_KEYWORD, -1, LVNI_ALL | LVNI_SELECTED ); if( -1 == nIndex1 ){ ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_BUTTON_EDITKEYWORD ), FALSE ); ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_BUTTON_DELKEYWORD ), FALSE ); }else{ ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_BUTTON_EDITKEYWORD ), TRUE ); ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_BUTTON_DELKEYWORD ), TRUE ); } break; case WM_DESTROY: ::KillTimer( hwndDlg, 1 ); break; //@@@ 2001.02.04 Start by MIK: Popup Help case WM_HELP: { HELPINFO *p = (HELPINFO *)lParam; MyWinHelp( (HWND)p->hItemHandle, HELP_WM_HELP, (ULONG_PTR)(LPVOID)p_helpids ); // 2006.10.10 ryoji MyWinHelpに変更に変更 } return TRUE; /*NOTREACHED*/ //break; //@@@ 2001.02.04 End //@@@ 2001.12.22 Start by MIK: Context Menu Help //Context Menu case WM_CONTEXTMENU: MyWinHelp( hwndDlg, HELP_CONTEXTMENU, (ULONG_PTR)(LPVOID)p_helpids ); // 2006.10.10 ryoji MyWinHelpに変更に変更 return TRUE; //@@@ 2001.12.22 End } return FALSE; }
BOOL InitializeSystemResourceLists( IN HREGKEY hRegKey ) /*++ Routine Description: InitializeSystemResourceLists recursively walks the resource map in the registry and builds the SYSTEM_RESOURCE lists. This is a data structure that links all resources of the same type together, as well as linking all resources belonging to a specific device/driver together. Lastly each resource is independently linked to the device/driver that owns it. This leds to a 'mesh' of linked lists with back pointers to the owning device/driver object. Arguments: hRegKey - Supplies a handle to a REGKEY object where the search is to continue. Return Value: BOOL - returns TRUE if the resource lists are succesfully built. --*/ { BOOL Success; HREGKEY hRegSubkey; DbgHandleAssert( hRegKey ); // // While there are still more device/driver resource descriptors... // while( QueryNextValue( hRegKey )) { PCM_FULL_RESOURCE_DESCRIPTOR FullResource; LPSYSTEM_RESOURCES SystemResource; LPDEVICE Device; LPTSTR Extension; DWORD Count; DWORD i; DWORD j; // // Based on the type of key, prepare to walk the list of // RESOURCE_DESCRIPTORS (the list may be one in length). // if( hRegKey->Type == REG_FULL_RESOURCE_DESCRIPTOR ) { Count = 1; FullResource = ( PCM_FULL_RESOURCE_DESCRIPTOR ) hRegKey->Data; } else if( hRegKey->Type == REG_RESOURCE_LIST ) { Count = (( PCM_RESOURCE_LIST ) hRegKey->Data )->Count; FullResource = (( PCM_RESOURCE_LIST ) hRegKey->Data )->List; } else { DbgAssert( FALSE ); continue; } // // Allocate a DEVICE object. // Device = AllocateObject( DEVICE, 1 ); DbgPointerAssert( Device ); if( Device == NULL ) { Success = DestroySystemResourceLists( _SystemResourceLists ); DbgAssert( Success ); return FALSE; } // // Allocate a buffer for the device/driver name. The maximum size of // the name will be the number of characters in both the key and // value name. // Device->Name = AllocateObject( TCHAR, _tcslen( hRegKey->Name ) + _tcslen( hRegKey->ValueName ) + sizeof( TCHAR ) ); DbgPointerAssert( Device->Name ); if( Device->Name == NULL ) { Success = DestroySystemResourceLists( _SystemResourceLists ); DbgAssert( Success ); return FALSE; } // // Rationalize the device name such that it is of the form Device.Raw // or Device.Translated. // Device->Name[ 0 ] = TEXT( '\0' ); if( ( _tcsnicmp( hRegKey->ValueName, TEXT( ".Raw" ), 4 ) == 0 ) || ( _tcsnicmp( hRegKey->ValueName, TEXT( ".Translated" ), 11 ) == 0 )) { _tcscpy( Device->Name, hRegKey->Name ); } _tcscat( Device->Name, hRegKey->ValueName ); // // Based on the device name, determine if the resource descriptors // should be added to the RAW or TRANSLATED lists. // if( Extension = _tcsstr( Device->Name, TEXT( ".Raw" ))) { SystemResource = &_SystemResourceLists[ RAW ]; } else if( Extension = _tcsstr( Device->Name, TEXT( ".Translated" ))) { SystemResource = &_SystemResourceLists[ TRANSLATED ]; } else { DbgAssert( FALSE ); Success = DestroySystemResourceLists( _SystemResourceLists ); DbgAssert( Success ); return FALSE; } // // Strip off the extension (.Raw or .Translated) from the device name. // Device->Name[ Extension - Device->Name ] = TEXT( '\0' ); // // Set the signature in the DEVICE object. // SetSignature( Device ); // // If the DEVICE object list is empty, add the device to the beginning // of the list else add it to the end of the list. // if( SystemResource->DeviceHead == NULL ) { SystemResource->DeviceHead = Device; SystemResource->DeviceTail = Device; } else { LPDEVICE ExistingDevice; // // See if the DEVICE object is already in the list. // ExistingDevice = SystemResource->DeviceHead; while( ExistingDevice ) { if( _tcsicmp( ExistingDevice->Name, Device->Name ) == 0 ) { break; } ExistingDevice = ExistingDevice->Next; } // // If the DEVICE object is not already in the list, add it else // free the DEICE object. // if( ExistingDevice == NULL ) { SystemResource->DeviceTail->Next = Device; SystemResource->DeviceTail = Device; } else { Success = FreeObject( Device ); DbgAssert( Success ); } } // // NULL terminate the DEVICE object list. // SystemResource->DeviceTail->Next = NULL; // // For each CM_FULL_RESOURCE DESCRIPTOR in the current value... // for( i = 0; i < Count; i++ ) { PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialResourceDescriptor; // // For each CM_PARTIAL_RESOURCE_DESCRIPTOR in the list... // for( j = 0; j < FullResource->PartialResourceList.Count; j++ ) { LPRESOURCE_DESCRIPTOR ResourceDescriptor; LPRESOURCE_DESCRIPTOR* Head; LPRESOURCE_DESCRIPTOR* Tail; // // Allocate a RESOURCE_DESCRIPTOR object. // ResourceDescriptor = AllocateObject( RESOURCE_DESCRIPTOR, 1 ); DbgPointerAssert( ResourceDescriptor ); if( ResourceDescriptor == NULL ) { Success = DestroySystemResourceLists( _SystemResourceLists ); DbgAssert( Success ); return FALSE; } // // Get a pointer to the current CM_PARTIAL_RESOURCE_DESCRIPTOR // in the current CM_FULLRESOURCE_DESCRIPTOR in the list. // PartialResourceDescriptor = &( FullResource[ i ].PartialResourceList.PartialDescriptors[ j ]); // // Based on the resource type grab the pointers to the head and // tail of the appropriate list. // switch( PartialResourceDescriptor->Type ) { case CmResourceTypePort: Head = &SystemResource->PortHead; Tail = &SystemResource->PortTail; break; case CmResourceTypeInterrupt: Head = &SystemResource->InterruptHead; Tail = &SystemResource->InterruptTail; break; case CmResourceTypeMemory: Head = &SystemResource->MemoryHead; Tail = &SystemResource->MemoryTail; break; case CmResourceTypeDma: Head = &SystemResource->DmaHead; Tail = &SystemResource->DmaTail; break; case CmResourceTypeDeviceSpecific: // // Since device specific data is not be collected, free the // associated RESOURCCE_DESCRIPTOR object. // Success = FreeObject( ResourceDescriptor ); DbgAssert( Success ); break; default: DbgPrintf(( L"Winmsd : Unknown PartialResourceDescriptor->Type == %1!d!\n", PartialResourceDescriptor->Type )); continue; } // // If the list is empty add the RESOURCE_DESCRIPTOR object to // the beginning of the list, else add it to the end. // if( *Head == NULL ) { *Head = ResourceDescriptor; *Tail = ResourceDescriptor; } else { ( *Tail )->NextSame = ResourceDescriptor; *Tail = ResourceDescriptor; } // // NULL terminate the list. // ( *Tail )->NextSame = NULL; // // Make a copy of the actual resource descriptor data. // CopyMemory( &ResourceDescriptor->CmResourceDescriptor, PartialResourceDescriptor, sizeof( CM_PARTIAL_RESOURCE_DESCRIPTOR ) ); // // Note the owner (device/driver) of this resource descriptor. // ResourceDescriptor->Owner = SystemResource->DeviceTail; // // The RESOURCE_DESCRIPTOR is complete so set its signature. // SetSignature( ResourceDescriptor ); // // Add the RESOURCE_DESCRIPTOR to the list of resources owned // by the current DEVICE. // if( SystemResource->DeviceTail->ResourceDescriptorHead == NULL ) { SystemResource->DeviceTail->ResourceDescriptorHead = ResourceDescriptor; SystemResource->DeviceTail->ResourceDescriptorTail = ResourceDescriptor; } else { SystemResource->DeviceTail->ResourceDescriptorTail->NextDiff = ResourceDescriptor; SystemResource->DeviceTail->ResourceDescriptorTail = ResourceDescriptor; } // // NULL terminate the list. // SystemResource->DeviceTail->ResourceDescriptorTail->NextDiff = NULL; } // // Get the next CM_FULL_RESOURCE_DESCRIPTOR from the list. // FullResource = ( PCM_FULL_RESOURCE_DESCRIPTOR )( PartialResourceDescriptor + 1 ); } } // // Traverse the list of keys in the resource descriptor portion of the // registry and continue building the lists. // while(( hRegSubkey = QueryNextSubkey( hRegKey )) != NULL ) { Success = InitializeSystemResourceLists( hRegSubkey ); DbgAssert( Success ); if( Success == FALSE ) { Success = DestroySystemResourceLists( _SystemResourceLists ); DbgAssert( Success ); return FALSE; } Success = CloseRegistryKey( hRegSubkey ); DbgAssert( Success ); if( Success == FALSE ) { Success = DestroySystemResourceLists( _SystemResourceLists ); DbgAssert( Success ); return FALSE; } } // // Set the signatures in both of the fully initialized lists. // SetSignature( &_SystemResourceLists[ RAW ]); SetSignature( &_SystemResourceLists[ TRANSLATED ]); return TRUE; }
/* * Unregister the service with the Windows SCM * Input - ServiceName */ int UnregisterService (LPCSTR lpszServiceName, int quiet) { TCHAR MsgErrorString[MAX_STR_SIZE]; /* Message or Error string */ SC_HANDLE hSCManager = NULL; /* SCM handle */ SC_HANDLE hService = NULL; /* Service Handle */ SERVICE_STATUS sStatus; TCHAR szRegAppLogKey[] = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\"; TCHAR szRegKey[512]; int exitStatus = 0; /* HKEY hKey = NULL; ?* Key to registry entry */ TRY { /* * Open Service Control Manager */ hSCManager = OpenSCManager (NULL, NULL, SC_MANAGER_CREATE_SERVICE); if (hSCManager == NULL) { ProcessError (EVENTLOG_ERROR_TYPE, _T ("Can't open SCM (Service Control Manager)"), 1, quiet); exitStatus = SERVICE_ERROR_SCM_OPEN; LEAVE; } /* * Open registered service */ hService = OpenService (hSCManager, lpszServiceName, SERVICE_ALL_ACCESS); if (hService == NULL) { _snprintf (MsgErrorString, sizeof(MsgErrorString), "%s %s", _T ("Can't open service"), lpszServiceName); ProcessError (EVENTLOG_ERROR_TYPE, MsgErrorString, 1, quiet); exitStatus = SERVICE_ERROR_OPEN_SERVICE; LEAVE; } /* * Query service status * If running stop before deleting */ if (QueryServiceStatus (hService, &sStatus)) { if (sStatus.dwCurrentState == SERVICE_RUNNING || sStatus.dwCurrentState == SERVICE_PAUSED) { ControlService (hService, SERVICE_CONTROL_STOP, &sStatus); } }; /* * Delete the service */ if (DeleteService (hService) == FALSE) { _snprintf (MsgErrorString, sizeof(MsgErrorString), "%s %s", _T ("Can't delete service"), lpszServiceName); /* * Log message to eventlog */ ProcessError (EVENTLOG_ERROR_TYPE, MsgErrorString, 0, quiet); LEAVE; } /* * Log "Service deleted successfully " message to eventlog */ _snprintf (MsgErrorString, sizeof(MsgErrorString), "%s %s", lpszServiceName, _T ("service deleted")); ProcessError (EVENTLOG_INFORMATION_TYPE, MsgErrorString, 0, quiet); /* * Delete registry entries for EventLog */ _tcscpy (szRegKey, szRegAppLogKey); _tcscat (szRegKey, lpszServiceName); RegDeleteKey (HKEY_LOCAL_MACHINE, szRegKey); } /* * Delete the handles */ FINALLY { if (hService) CloseServiceHandle (hService); if (hSCManager) CloseServiceHandle (hSCManager); } return (exitStatus); }
int DOSNEAR FASTCALL ValidateSwitches(USHORT cmd, SWITCHTAB valid_list[]) { USHORT match; int comp_result; USHORT candidate; /* most recent NEAR match */ USHORT i,j; TCHAR * good_one; /* which element (cmd_line or trans) of the valid_list */ int needed; TCHAR FAR * sepptr; for (i = 0; SwitchList[i]; i++) { sepptr = _tcschr(SwitchList[i], ':'); if (sepptr) *sepptr = NULLC; _tcsupr(SwitchList[i]); if (sepptr) *sepptr = ':'; candidate = 0; match = 0; for (j = 0; valid_list[j].cmd_line; j++) { comp_result = sw_compare(valid_list[j].cmd_line, SwitchList[i]); if (comp_result == 0) { candidate = j; match = 1; break; } else if (comp_result == 1) { match++; candidate = j; } } if (match == 0) { if (! _tcscmp(swtxt_SW_HELP, SwitchList[i])) help_help(cmd, ALL); if (! _tcscmp(swtxt_SW_SYNTAX, SwitchList[i])) help_help(cmd, USAGE_ONLY); IStrings[0] = SwitchList[i]; ErrorPrint(APE_SwUnkSw, 1); help_help(cmd, USAGE_ONLY); } else if (match > 1) { IStrings[0] = SwitchList[i]; ErrorPrint(APE_SwAmbSw, 1); help_help(cmd, USAGE_ONLY); } switch(valid_list[candidate].arg_ok) { case NO_ARG: if (sepptr) { ErrorPrint(APE_InvalidSwitchArg, 0); help_help(cmd, USAGE_ONLY); } break; case ARG_OPT: break; case ARG_REQ: if (!sepptr) { ErrorPrint(APE_InvalidSwitchArg, 0); help_help(cmd, USAGE_ONLY); } break; } /* (expansion || translation) required ? */ if (comp_result || valid_list[candidate].translation) { if (valid_list[candidate].translation) good_one = valid_list[candidate].translation; else good_one = valid_list[candidate].cmd_line; needed = _tcslen(good_one); if (sepptr) needed += _tcslen(sepptr); if ((SwitchList[i] = calloc(needed+1, sizeof(TCHAR))) == NULL) ErrorExit(NERR_InternalError); _tcscpy(SwitchList[i], good_one); if (sepptr) _tcscat(SwitchList[i], sepptr); } } return 1; }