unit DViewCustomCttSchResult; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, VirtualTrees, Vcl.Buttons, System.ImageList, Vcl.ImgList, PngImageList, Vcl.WinXPanels, Vcl.Imaging.pngimage, Vcl.StdCtrls, Vcl.Menus, Tocsg.Fasoo; type TDlgViewCustomCttSchResult = class(TForm) pnMain: TPanel; pnClient: TPanel; lbTotalFile2: TLabel; imgComment: TImage; imgMiss: TImage; imgDel: TImage; vtList: TVirtualStringTree; cbViewCate: TComboBox; pnTop: TPanel; imgClose: TImage; lbTitle: TLabel; imgBtnList2: TPngImageList; imgBtnList: TPngImageList; popFun: TPopupMenu; miOpen: TMenuItem; miPosGo: TMenuItem; N1: TMenuItem; miDrm: TMenuItem; miDelete: TMenuItem; N3: TMenuItem; miCopyCB: TMenuItem; pnEgTop: TPanel; pnEgBottom: TPanel; pnEgLeft: TPanel; pnEgRight: TPanel; Label4: TLabel; lbEgLT: TLabel; lbEgRB: TLabel; miExportCSV: TMenuItem; SaveDialog: TSaveDialog; procedure vtListGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); procedure vtListFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure vtListGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: TImageIndex); procedure vtListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); procedure vtListHeaderClick(Sender: TVTHeader; HitInfo: TVTHeaderHitInfo); procedure vtListCompareNodes(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); procedure pnTopMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure imgCloseMouseLeave(Sender: TObject); procedure imgCloseMouseEnter(Sender: TObject); procedure imgCloseMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure imgCloseClick(Sender: TObject); procedure vtListBeforeCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect); procedure imgCommentMouseEnter(Sender: TObject); procedure imgCommentMouseLeave(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure miDrmClick(Sender: TObject); procedure miDeleteClick(Sender: TObject); procedure vtListContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); procedure miOpenClick(Sender: TObject); procedure miPosGoClick(Sender: TObject); procedure miCopyCBClick(Sender: TObject); procedure vtListPaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType); procedure cbViewCateChange(Sender: TObject); procedure pnEgTopMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure pnEgRightMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure pnEgLeftMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure pnEgBottomMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Label4MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure lbEgLTMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure lbEgLBMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure lbEgRBMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure miExportCSVClick(Sender: TObject); procedure popFunPopup(Sender: TObject); private { Private declarations } FileImageList_: TPngImageList; FIconIdxList_: TStringList; sOptFile_, sHlpExe_: String; nRecentCate_: Integer; bWaitCheckCompleted_: Boolean; AipExtList_: TStringList; fas_: TTgFasoo; procedure RefreshList; procedure SetImgBtn(img: TImage; nImgIdx: Integer); procedure SetImgBtn2(nImgIdx: Integer); procedure UpdateEntVisible; public { Public declarations } Constructor Create(aOwner: TComponent); override; Destructor Destroy; override; procedure CreateParams(var Params: TCreateParams); override; procedure process_WM_COPYDATA(var msg: TMessage); Message WM_COPYDATA; end; var DlgViewCustomCttSchResult: TDlgViewCustomCttSchResult; implementation uses Tocsg.Shell, Tocsg.Path, GlobalDefine, Tocsg.VTUtil, superobject, Tocsg.Strings, Tocsg.Safe, Tocsg.Files, Tocsg.Convert, VirtualTrees.Types, System.Math, System.DateUtils, Tocsg.Encrypt, DefineHelper, Tocsg.Process, DProgCttSchTask, Tocsg.Exception, Condition, Tocsg.Export, ManagerService, CttSchDefine, Define, ManagerModel, Tocsg.FileInfo, Tocsg.AIP, Tocsg.Fasoo.Global, Soap.EncdDecd; resourcestring RS_JuminNum = '주민등록번호'; RS_Passport = '여권번호'; RS_PhoneNum = '전화번호'; RS_Email = '이메일주소'; RS_Drug = '환각성약물'; RS_BanDrug = '금지약물'; RS_Addr = '주소'; RS_CarNum = '차량번호'; RS_MedicalNum = '의료보장번호'; RS_CustomPtrn = '지정 패턴'; RS_CustomKwd = '지정 키워드'; RS_CopyDB = '클립보드에 복사 되었습니다.'; RS_SelFile = '파일을 선택해 주십시오.'; RS_Limit1000 = '1000개 미만으로 선택해 주십시오.'; RS_FailCopyCB = '클립보드 복사를 실패했습니다.'; RS_SelQuaran = '격리 할 파일을 선택해 주십시오.'; RS_Q_SelQuaran = '선택한 파일들을 격리 하시겠습니까?'; RS_SelDelFile = '완전삭제 할 파일을 선택해 주십시오.'; RS_Q_Delete = '선택된 파일들을 완전삭제 하시겠습니까?'; RS_SelDrmFile = 'DRM을 적용할 파일을 선택해 주십시오.'; RS_Q_EncDRM = '선택된 파일들을 DRM 적용 하시겠습니까?'; RS_Vul = '취약'; RS_Enc = '암호화됨'; RS_Delete = '삭제됨'; RS_Quarantine = '격리됨'; RS_Q_ExceptSelFile = '선택한 파일을 예외로 등록하시겠습니까?'; RS_SelExceptFile = '예외 할 파일을 선택해 주십시오.'; RS_TotalFileCnt = '전체 파일 수 : '; RS_Except = '예외됨'; RS_Caution = '위험'; RS_Warning = '경고'; RS_Attention = '주의'; RS_Normal = '일반'; {$R *.dfm} { TDlgViewCustomCttSchResult } Constructor TDlgViewCustomCttSchResult.Create(aOwner: TComponent); procedure InitCtrls; var hSysIcons: THandle; begin FIconIdxList_ := TStringList.Create; FIconIdxList_.CaseSensitive := false; FileImageList_ := TPngImageList.Create(Self); // FileImageList_.BlendColor := clHighlight; vtList.Images := FileImageList_; // FileImageList_.ShareImages := true; // hSysIcons := GetShellImageHandle; // if hSysIcons <> 0 then // begin // FileImageList_.Handle := hSysIcons; // vtList.Images := FileImageList_; // end; SetImgBtn(imgComment, imgComment.Tag); SetImgBtn(imgMiss, imgMiss.Tag); SetImgBtn(imgDel, imgDel.Tag); SetImgBtn2(0); cbViewCate.ItemIndex := 0; end; begin Inherited Create(aOwner); sHlpExe_ := GetRunExePathDir + DIR_CONF + EXE_HLP; sOptFile_ := GetRunExePathDir + DIR_CONF + DAT_PARAM; // sExpPath_ := GetRunExePathDir + DIR_CTTSCHRST + sScanId_ + '.' + DAT_CTTSCHRSTDATA_EXP; AipExtList_ := TStringList.Create; AipExtList_.CaseSensitive := false; SplitString(AIP_EXTS, '|', AipExtList_); if CUSTOMER_TYPE = CUSTOMER_SCD then miDrm.Visible := false else miDrm.Visible := not NotUseDRM; imgComment.Visible := miDrm.Visible; cbViewCate.Visible := miDrm.Visible; ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD); nRecentCate_ := 0; bWaitCheckCompleted_ := false; fas_ := nil; if UseFasooDecrypt then begin var bLoadFas: Boolean := true; case CUSTOMER_TYPE of CUSTOMER_LOTTEMART : SetDSD_CODE(DSD_CODE_LOTTEMART); CUSTOMER_WELFND : SetDSD_CODE(DSD_CODE_WFND); CUSTOMER_WELFNI : SetDSD_CODE(DSD_CODE_WFNI); // CUSTOMER_CJONS : SetDSD_CODE(DSD_CODE_CJ); CUSTOMER_GIORDANO : SetDSD_CODE(DSD_CODE_GIORDANO); else bLoadFas := false; end; if bLoadFas then begin var sFsDir: String := GetRunExePathDir + 'fsdinit'; if not DirectoryExists(sFsDir) then sFsDir := GetRunExePathDir + DIR_CONF + 'fsdinit'; fas_ := TTgFasoo.Create(sFsDir); end; end; InitCtrls; RefreshList; end; procedure TDlgViewCustomCttSchResult.CreateParams(var Params: TCreateParams); begin // BorderStyle := bsNone; Inherited; // if WindowState = TWindowState.wsNormal then // begin // Params.ExStyle := Params.ExStyle or WS_EX_STATICEDGE; // Params.Style := Params.Style or WS_SIZEBOX; // end; Params.ExStyle := WS_EX_APPWINDOW; end; Destructor TDlgViewCustomCttSchResult.Destroy; begin if fas_ <> nil then FreeAndNil(fas_); FreeAndNil(AipExtList_); FreeAndNil(FIconIdxList_); Inherited; end; procedure TDlgViewCustomCttSchResult.UpdateEntVisible; var pNode: PVirtualNode; pData: PRstEnt; nCnt: Integer; begin if not bWaitCheckCompleted_ or (cbViewCate.ItemIndex <> nRecentCate_) then begin nCnt := 0; vtList.BeginUpdate; try pNode := vtList.GetFirst; while pNode <> nil do begin pData := vtList.GetNodeData(pNode); if not bWaitCheckCompleted_ then begin if pData.State = resWait then begin pData.State := resVul; if not IsUseEncOnlyAIP then begin if FileExists(pData.sDir + pData.sFName) then begin try if TTgEncrypt.CheckSign(pData.sDir + pData.sFName, SIG_DRM) then pData.State := resEnc; except // .. end; end; end; end; end; if cbViewCate.ItemIndex <> nRecentCate_ then begin case cbViewCate.ItemIndex of 0 : vtList.IsVisible[pNode] := true; 1 : vtList.IsVisible[pNode] := pData.State = resVul; 2 : vtList.IsVisible[pNode] := pData.State = resEnc; 3 : vtList.IsVisible[pNode] := pData.State = resDel; else vtList.IsVisible[pNode] := false; // 4 : vtList.IsVisible[pNode] := pData.State = resExcept; end; if vtList.IsVisible[pNode] then begin Inc(nCnt); pData.nNodeIdx := nCnt; end; end; pNode := vtList.GetNext(pNode); end; finally vtList.EndUpdate; bWaitCheckCompleted_ := true; nRecentCate_ := cbViewCate.ItemIndex; end; end; end; procedure TDlgViewCustomCttSchResult.FormClose(Sender: TObject; var Action: TCloseAction); begin if FileExists(sOptFile_) then DeleteFile(sOptFile_); Action := caFree; end; procedure TDlgViewCustomCttSchResult.SetImgBtn(img: TImage; nImgIdx: Integer); begin imgBtnList.GetIcon(nImgIdx, img.Picture.Icon); img.Repaint end; procedure TDlgViewCustomCttSchResult.SetImgBtn2(nImgIdx: Integer); begin imgBtnList2.GetIcon(nImgIdx, imgClose.Picture.Icon); imgClose.Repaint end; function ConvPtrnIdToStr(sId: String): String; begin case StrToIntDef(sId, 0) of 1056002 : Result := RS_JuminNum; 1056003 : Result := RS_Passport; 1056004 : Result := RS_PhoneNum; 1056005 : Result := RS_Email; 1056006 : Result := RS_Drug; 1056007 : Result := RS_BanDrug; 1056008 : Result := RS_Addr; 1056009 : Result := RS_CarNum; 1056010 : Result := 'IP'; 1056011 : Result := RS_MedicalNum; 1056012 : Result := RS_CustomPtrn; 1056013 : Result := RS_CustomKwd; else Result := sId; end; end; procedure TDlgViewCustomCttSchResult.imgCloseClick(Sender: TObject); begin Close; end; procedure TDlgViewCustomCttSchResult.imgCloseMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SetImgBtn2(2); end; procedure TDlgViewCustomCttSchResult.imgCloseMouseEnter(Sender: TObject); begin SetImgBtn2(1); end; procedure TDlgViewCustomCttSchResult.imgCloseMouseLeave(Sender: TObject); begin SetImgBtn2(0); end; procedure TDlgViewCustomCttSchResult.imgCommentMouseEnter(Sender: TObject); begin if Sender is TImage then SetImgBtn(TImage(Sender), TImage(Sender).Tag + 1); end; procedure TDlgViewCustomCttSchResult.imgCommentMouseLeave(Sender: TObject); begin if Sender is TImage then SetImgBtn(TImage(Sender), TImage(Sender).Tag); end; procedure TDlgViewCustomCttSchResult.Label4MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND, SC_SIZE + WMSZ_TOPRIGHT, 0); end; end; procedure TDlgViewCustomCttSchResult.lbEgRBMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND, SC_SIZE + WMSZ_BOTTOMRIGHT, 0); end; end; procedure TDlgViewCustomCttSchResult.lbEgLBMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND, SC_SIZE + WMSZ_BOTTOMLEFT, 0); end; end; procedure TDlgViewCustomCttSchResult.lbEgLTMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND, SC_SIZE + WMSZ_TOPLEFT, 0); end; end; procedure TDlgViewCustomCttSchResult.miCopyCBClick(Sender: TObject); var pNode: PVirtualNode; begin case VT_CopyToClipboardSelectedInfo(vtList) of 0 : MessageBox(Handle, PChar(RS_CopyDB), PChar(Caption), MB_ICONINFORMATION or MB_OK); 1 : MessageBox(Handle, PChar(RS_SelFile), PChar(Caption), MB_ICONWARNING or MB_OK); 2 : MessageBox(Handle, PChar(RS_Limit1000), PChar(Caption), MB_ICONWARNING or MB_OK); else MessageBox(Handle, PChar(RS_FailCopyCB), PChar(Caption), MB_ICONWARNING or MB_OK); end; end; procedure TDlgViewCustomCttSchResult.miDeleteClick(Sender: TObject); var pNode: PVirtualNode; EntList: TRstEntList; pData: PRstEnt; dlg: TDlgProgCttSchTask; bRefresh: Boolean; i, nCnt: Integer; begin pNode := vtList.GetFirstSelected; if pNode = nil then begin MessageBox(Handle, PChar(RS_SelDelFile), PChar(Caption), MB_ICONWARNING or MB_OK); exit; end; if MessageBox(Handle, PChar(RS_Q_Delete), PChar(Caption), MB_ICONQUESTION or MB_YESNO) = IDNO then exit; bRefresh := false; Guard(EntList, TRstEntList.Create); vtList.BeginUpdate; try while pNode <> nil do begin pData := vtList.GetNodeData(pNode); if pData.State <> resDel then begin EntList.Add(pData); // 대상에 zip이 있을경우 전체 새로고침 해준다. // 상태 변경 시 적용을 위함 22_1201 17:01:27 kku bRefresh := bRefresh or (Pos(pData.sExt, COMPRESS_EXTS) > 0); end; pNode := vtList.GetNextSelected(pNode); end; if EntList.Count = 0 then exit; Guard(dlg, TDlgProgCttSchTask.Create(Self, cstkDelete, EntList)); dlg.ShowModal; nCnt := 0; for i := 0 to EntList.Count - 1 do begin pData := EntList[i]; if pData.State = resDel then begin Inc(nCnt); // if sTaskId_ <> '' then // gMgSvc.MgCampn.SendCampaignResultSelfAction(sTaskId_, 'SELFDEL', pData.sDir + pData.sFName, i + 1); end; end; finally vtList.EndUpdate; end; if bRefresh then RefreshList; end; procedure TDlgViewCustomCttSchResult.miDrmClick(Sender: TObject); var pNode: PVirtualNode; EntList: TRstEntList; pData: PRstEnt; dlg: TDlgProgCttSchTask; bRefresh: Boolean; i, nEncCnt: Integer; begin pNode := vtList.GetFirstSelected; if pNode = nil then begin MessageBox(Handle, PChar(RS_SelDrmFile), PChar(Caption), MB_ICONWARNING or MB_OK); exit; end; if MessageBox(Handle, PChar(RS_Q_EncDRM), PChar(Caption), MB_ICONQUESTION or MB_YESNO) = IDNO then exit; bRefresh := false; Guard(EntList, TRstEntList.Create); vtList.BeginUpdate; try while pNode <> nil do begin pData := vtList.GetNodeData(pNode); if pData.State <> resEnc then begin EntList.Add(pData); // 대상에 zip이 있을경우 전체 새로고침 해준다. // 상태 변경 시 적용을 위함 22_1201 17:01:27 kku bRefresh := bRefresh or (Pos(pData.sExt, COMPRESS_EXTS) > 0); end; pNode := vtList.GetNextSelected(pNode); end; if EntList.Count = 0 then exit; Guard(dlg, TDlgProgCttSchTask.Create(Self, cstkEnc, EntList)); dlg.ShowModal; nEncCnt := 0; for i := 0 to EntList.Count - 1 do begin pData := EntList[i]; if pData.State = resEnc then begin Inc(nEncCnt); // if sTaskId_ <> '' then // gMgSvc.MgCampn.SendCampaignResultSelfAction(sTaskId_, 'SELFDRM', pData.sDir + pData.sFName, i + 1); end; end; finally vtList.EndUpdate; end; if bRefresh then RefreshList; end; procedure TDlgViewCustomCttSchResult.miExportCSVClick(Sender: TObject); var sExe: String; O: ISuperObject; ProcInfo: TProcessInformation; Label LB_Direct; begin try sExe := GetRunExePathDir + DIR_CONF + EXE_HLP; if FileExists(sExe) then begin O := SO; O.I['RcvWnd'] := Handle; O.I['Cmd'] := HPCMD_SELECT_FILE; O.I['Ctrl'] := 2; O.S['Filter'] := 'CSV File|*.csv'; SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM); ProcInfo := ExecuteAppAsUser('explorer.exe', sExe, '', SW_SHOWNORMAL); if ProcInfo.dwProcessId = 0 then goto LB_Direct; end else begin LB_Direct : SaveDialog.FileName := ''; if gMgSvc.Domain <> '' then begin var sPath: String := 'C:\Users\' + ExtractFileName(gMgSvc.Domain) + '\Desktop'; if DirectoryExists(sPath) then SaveDialog.InitialDir := sPath; end; SaveDialog.Filter := 'CSV File|*.csv'; if SaveDialog.Execute(Handle) then begin if ExportCSV_VT(vtList, SaveDialog.FileName, TEncoding.UTF8, etkSelected) then MessageBox(Handle, PChar('내보내기를 완료 했습니다.'), PChar(Caption), MB_ICONINFORMATION or MB_OK) else MessageBox(Handle, PChar('내보내기 중 오류가 발생했습니다.'), PChar(Caption), MB_ICONWARNING or MB_OK); end; end; except on E: Exception do ETgException.TraceException(Self, E, 'Fail .. miExportCSVClick()'); end; // if SaveDialog.Execute(Handle) then // begin // if ExportCSV_VT(vtList, SaveDialog.FileName, TEncoding.UTF8, etkSelected) then // MessageBox(Handle, PChar('내보내기를 완료 했습니다.'), PChar(Caption), MB_ICONINFORMATION or MB_OK) // else // MessageBox(Handle, PChar('내보내기 중 오류가 발생했습니다.'), PChar(Caption), MB_ICONWARNING or MB_OK); // end; end; procedure TDlgViewCustomCttSchResult.miOpenClick(Sender: TObject); var pNode: PVirtualNode; pData: PRstEnt; O: ISuperObject; begin pNode := vtList.GetFirstSelected; if pNode = nil then exit; pData := vtList.GetNodeData(pNode); if FileExists(sHlpExe_) then begin O := SO; O.I['RcvWnd'] := Handle; O.I['Cmd'] := HPCMD_EXECUTE_FILE; O.S['Path'] := pData.sDir + pData.sFName; SaveJsonObjToFile(O, sOptFile_); {$IFDEF DEBUG} ExecutePath(pData.sDir + pData.sFName); {$ELSE} ExecuteAppAsUser('explorer.exe', sHlpExe_, '', SW_SHOWNORMAL); {$ENDIF} end else ExecutePath(pData.sDir + pData.sFName); end; procedure TDlgViewCustomCttSchResult.miPosGoClick(Sender: TObject); var pNode: PVirtualNode; pData: PRstEnt; O: ISuperObject; begin pNode := vtList.GetFirstSelected; if pNode = nil then exit; pData := vtList.GetNodeData(pNode); if FileExists(sHlpExe_) then begin O := SO; O.I['RcvWnd'] := Handle; O.I['Cmd'] := HPCMD_OPEN_SELECT; O.S['Path'] := pData.sDir + pData.sFName; SaveJsonObjToFile(O, sOptFile_); {$IFDEF DEBUG} ExecutePath(sHlpExe_); {$ELSE} ExecuteAppAsUser('explorer.exe', sHlpExe_, '', SW_SHOWNORMAL); {$ENDIF} end else ExplorerSelectedPath(pData.sDir + pData.sFName); end; procedure TDlgViewCustomCttSchResult.pnEgBottomMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND, SC_SIZE + WMSZ_Bottom, 0); end; end; procedure TDlgViewCustomCttSchResult.pnEgLeftMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND, SC_SIZE + WMSZ_Left, 0); end; end; procedure TDlgViewCustomCttSchResult.pnEgRightMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND, SC_SIZE + WMSZ_RIGHT, 0); end; end; procedure TDlgViewCustomCttSchResult.pnEgTopMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND, SC_SIZE + WMSZ_Top, 0); end; end; procedure TDlgViewCustomCttSchResult.pnTopMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ReleaseCapture; SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0); end; procedure TDlgViewCustomCttSchResult.popFunPopup(Sender: TObject); begin miDrm.Visible := not NotUseDRM; end; procedure TDlgViewCustomCttSchResult.RefreshList; var sFld, sExt, sFName, sFrName, sLine, sPath: String; StrList, DataList, SchList: TStringList; i, c, nCnt: Integer; pData: PRstEnt; EntState: TRstEntState; MgCampExpt: TManagerCampExcept; bCatLine: Boolean; begin MgCampExpt := nil; if gMgSvc.IsNewApi then MgCampExpt := TManagerCampExcept.Create; bWaitCheckCompleted_ := IsUseEncOnlyAIP; vtList.BeginUpdate; try try VT_Clear(vtList); sPath := GetRunExePathDir + DIR_CTTSCHRST_CUSTOM + DAT_CTTSCHRSTDATA_CUSTOM; if not FileExists(sPath) then exit; Guard(StrList, TStringList.Create); StrList.LoadFromFile(sPath, TEncoding.UTF8); Guard(DataList, TStringList.Create); Guard(SchList, TStringList.Create); nCnt := 0; for i := 0 to StrList.Count - 1 do begin if StrList[i] = '' then continue; if bCatLine then begin sLine := sLine + StringReplace(StrList[i], #13#10, ' ', [rfReplaceAll]); bCatLine := false; end else sLine := StringReplace(StrList[i], #13#10, ' ', [rfReplaceAll]); // if ( (sLine[sLine.Length] <> '"') and (i < StrList.Count - 1) and // (StrList[i + 1].Length > 0) and (StrList[i + 1][1] <> '"') and // (Pos('', StrList[i + 1]) = 0 ) ) or // ( (i < StrList.Count - 1) and (StrList[i + 1] = '') ) then // begin // bCatLine := true; // continue; // end; SplitString(sLine, '', DataList, true); if (DataList.Count < 7) or ( (i < StrList.Count - 1) and (Pos('', StrList[i + 1]) = 0) ) then begin bCatLine := true; continue; end; sPath := DataList[2]; sExt := GetFileExt(sPath).ToUpper; if (IsSupportAIP or IsUseEncOnlyAIP) and not FileExists(sPath) then begin // AIP 암호화되어 확장자 변경된거 체크 24_1115 09:47:05 kku var sTmpPath: String := ConvAipEncExt(sPath); if FileExists(sTmpPath) then sPath := sTmpPath else if FileExists(sTmpPath + '.pfile') then sPath := sTmpPath + '.pfile'; end; sFld := ExtractFilePath(sPath); sFName := ExtractFileName(sPath); if DataList.Count >= 5 then sFrName := DataList[4] else sFrName := sFName; c := Pos(' > ', sFName); if c > 0 then SetLength(sFName, c - 1); EntState := resWait; if sPath.StartsWith('\\') or FileExists(sPath) then // 시스템 권한으로 네트워크 파일 존재 유무는 확인 불가능함 24_0610 18:26:31 kku begin if (MgCampExpt = nil) or not MgCampExpt.IsExceptFile(sPath) then begin // if IsUseEncOnlyAIP then // EntState := resVul; end else EntState := resExcept; end else EntState := resDel; if (sFrName.Length > 0) and (sFrName[1] = '*') then begin // 압축파일 내 암호화 파일 표시 25_0530 13:06:26 kku EntState := resEnc; Delete(sFrName, 1, 1); end; // case cbViewCate.ItemIndex of // 1 : if EntState <> resVul then continue; // 2 : if EntState <> resEnc then continue; // 3 : if EntState <> resDel then continue; // 4 : if EntState <> resExcept then continue; // end; pData := VT_AddChildData(vtList); ZeroMemory(pData, SizeOf(TRstEnt)); Inc(nCnt); pData.nImgIdx := -1; pData.nNodeIdx := nCnt; pData.sSchId := DataList[0]; // sSchName := ConvPtrnIdToStr(sSchId); SplitString(pData.sSchId, ';', SchList); for c := 0 to SchList.Count - 1 do SumString(pData.sSchName, ConvPtrnIdToStr(SchList[c]), ','); pData.nHits := StrToIntDef(DataList[1], -1); pData.sFName := sFName; pData.sFrName := sFrName; pData.sDir := sFld; pData.sFoundStr := DataList[3]; pData.sExt := sExt; pData.State := EntState; end; except on E: Exception do ETgException.TraceException(Self, E, 'Fail .. RefreshList()'); end; finally lbTotalFile2.Caption := RS_TotalFileCnt + InsertPointComma(vtList.RootNodeCount, 3); vtList.EndUpdate; if MgCampExpt <> nil then FreeAndNil(MgCampExpt); end; end; procedure TDlgViewCustomCttSchResult.vtListBeforeCellPaint( Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect); begin if (Sender.AbsoluteIndex(Node) mod 2) = 0 then begin TargetCanvas.Brush.Color := $F7F7F7; TargetCanvas.FillRect(CellRect); end; end; procedure TDlgViewCustomCttSchResult.vtListCompareNodes( Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); var pData1, pData2: PRstEnt; llSize1, llSize2: LONGLONG; begin pData1 := Sender.GetNodeData(Node1); pData2 := Sender.GetNodeData(Node2); case Column of 0 : Result := CompareValue(pData1.nNodeIdx, pData2.nNodeIdx); 5 : Result := CompareValue(pData1.nHits, pData2.nHits); else Result := CompareText(vtList.text[Node1, Column], vtList.text[Node2, Column]); end; end; procedure TDlgViewCustomCttSchResult.vtListContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); begin if vtList.GetFirstSelected = nil then Handled := true; end; procedure TDlgViewCustomCttSchResult.vtListFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var pData: PRstEnt; begin pData := Sender.GetNodeData(Node); Finalize(pData^); end; procedure TDlgViewCustomCttSchResult.vtListGetImageIndex( Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: TImageIndex); var pData: PRstEnt; sIPath, sExt: String; begin case Kind of ikNormal, ikSelected: begin if Column = 2 then begin pData := Sender.GetNodeData(Node); if pData.nImgIdx = -1 then begin sExt := GetFileExt(pData.sFName); pData.nImgIdx := FIconIdxList_.IndexOf(sExt); if pData.nImgIdx = -1 then begin sIPath := GetRunExePathDir + DIR_CACHE + sExt + '.ico'; if FileExists(sIPath) then begin var ico: TIcon := TIcon.Create; ico.LoadFromFile(sIPath); pData.nImgIdx := FileImageList_.AddIcon(ico); FIconIdxList_.AddObject(sExt, TObject(pData.nImgIdx)); ico.Free; end else begin var sHlpExe: String := GetRunExePathDir + DIR_CONF + EXE_HLP; var O: ISuperObject := SO; O.I['RcvWnd'] := Handle; O.I['Cmd'] := HPCMD_REQ_FILEICON; O.S['P'] := pData.sDir + pData.sFName; O.I['N'] := LONGLONG(Node); O.S['E'] := sExt; SaveJsonObjToFile(O, GetRunExePathDir + DIR_CONF + DAT_PARAM); {$IFDEF DEBUG} ExecutePath(sHlpExe); {$ELSE} ExecuteAppAsUser('explorer.exe', sHlpExe, '', SW_SHOWNORMAL); {$ENDIF} exit; end; // pData.nImgIdx := AddFileSmallIconToImageList(FileImageList_, pData.sDir + pData.sFName); // if pData.nImgIdx = -1 then // pData.nImgIdx := 0; // FIconIdxList_.AddObject(sExt, TObject(pData.nImgIdx)); end else pData.nImgIdx := LONGLONG(FIconIdxList_.Objects[pData.nImgIdx]); // pData.nImgIdx := GetShellImageIndex_path(pData.sDir + pData.sFName); end; ImageIndex := pData.nImgIdx; end; end; end; end; procedure TDlgViewCustomCttSchResult.vtListGetNodeDataSize( Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin NodeDataSize := SizeOf(TRstEnt); end; procedure TDlgViewCustomCttSchResult.vtListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var pData: PRstEnt; begin pData := Sender.GetNodeData(Node); case Column of 0 : CellText := IntToStr(pData.nNodeIdx); // IntToStr(Node.Index + 1); 1 : begin if pData.State = resWait then begin pData.State := resVul; if not IsUseEncOnlyAIP or (CUSTOMER_TYPE = CUSTOMER_DEV) then begin if FileExists(pData.sDir + pData.sFName) then begin try if fas_ <> nil then begin case fas_.GetFileType(pData.sDir + pData.sFName) of 103, 106 : pData.State := resEnc; end; end else if CUSTOMER_TYPE = CUSTOMER_CJONS then begin case GetFileTypeW_r(pData.sDir + pData.sFName) of 109, // 이거 뭔지 모르지만 GetFileTypeW_r()로 FED5 암호화파일에서 검출됨.. 25_0217 18:54:27 kku 26, 103, 105, 106 : pData.State := resEnc; end; end else if TTgEncrypt.CheckSign(pData.sDir + pData.sFName, SIG_DRM) then pData.State := resEnc; except // .. end; end; end; case CUSTOMER_TYPE of CUSTOMER_GEC, CUSTOMER_HDENG : ; else begin if IsSupportAIP and (pData.State = resVul) and (AipExtList_.IndexOf(pData.sExt) <> -1) then begin // var sTemp: String := GetAipLabel(pData.sDir + pData.sFName); // if (sTemp <> '') and (Pos(RS_Normal, sTemp) = 0) then if IsAipEncryted(pData.sDir + pData.sFName) then pData.State := resEnc; end; end; end; end; case pData.State of resVul : begin case CUSTOMER_TYPE of CUSTOMER_GEC, CUSTOMER_HDENG : begin if pData.nHits >= 50 then CellText := RS_Caution else if pData.nHits >= 10 then CellText := RS_Warning else if pData.nHits >= 1 then CellText := RS_Attention else CellText := RS_Normal; end else CellText := RS_Vul; end; end; resEnc : CellText := RS_Enc; resDel : CellText := RS_Delete; resExcept : CellText := RS_Except; resQuarantine : CellText := RS_Quarantine; end; end; 2 : CellText := pData.sFrName; 3 : CellText := pData.sExt; 4 : CellText := pData.sSchName; 5 : CellText := IntToStr(pData.nHits); 6 : CellText := pData.sFoundStr; 7 : CellText := pData.sDir; end; end; procedure TDlgViewCustomCttSchResult.vtListHeaderClick(Sender: TVTHeader; HitInfo: TVTHeaderHitInfo); begin if HitInfo.Button = mbLeft then begin if HitInfo.Column < 0 then exit; with Sender, Treeview do begin if SortColumn > NoColumn then Columns[SortColumn].Options := Columns[SortColumn].Options + [coParentColor]; // if HitInfo.Column = 0 then // SortColumn := NoColumn // else begin if not bWaitCheckCompleted_ and (HitInfo.Column = 1) then UpdateEntVisible; if (SortColumn = NoColumn) or (SortColumn <> HitInfo.Column) then begin SortColumn := HitInfo.Column; SortDirection := sdAscending; end else if SortDirection = sdAscending then SortDirection := sdDescending else SortDirection := sdAscending; Columns[SortColumn].Color := $00EFEFEF; vtList.BeginUpdate; try vtList.SortTree(SortColumn, SortDirection, False); finally vtList.EndUpdate; end; end; end; end; end; procedure TDlgViewCustomCttSchResult.vtListPaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType); var pData: PRstEnt; begin if not (vsSelected in Node.States) then begin pData := Sender.GetNodeData(Node); case pData.State of resVul : begin if Column = 1 then begin case CUSTOMER_TYPE of CUSTOMER_GEC, CUSTOMER_HDENG : begin if pData.nHits >= 50 then TargetCanvas.Font.Color := $00384EF8 else if pData.nHits >= 10 then TargetCanvas.Font.Color := $002E8EFF; end; end; end; end; resEnc : TargetCanvas.Font.Color := clGreen; resDel, resQuarantine, resExcept : TargetCanvas.Font.Color := clGray; end; end; end; procedure TDlgViewCustomCttSchResult.cbViewCateChange(Sender: TObject); begin // RefreshList; UpdateEntVisible; end; procedure TDlgViewCustomCttSchResult.process_WM_COPYDATA(var msg: TMessage); var dwData: DWORD; pCpData: PCopyDataStruct; O: ISuperObject; sTemp: String; i: Integer; begin msg.Result := 0; dwData := 0; pCpData := PCopyDataStruct(msg.LParam); try dwData := pCpData.dwData; case dwData of HPCMD_SELECT_FILE : begin O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData)); var sPath: String := O.S['Path']; // case O.I['Ctrl'] of // 1 : ; // 2 : ; // end; if ExportCSV_VT(vtList, sPath, TEncoding.UTF8, etkSelected) then MessageBox(Handle, PChar('내보내기를 완료 했습니다.'), PChar(Caption), MB_ICONINFORMATION or MB_OK) else MessageBox(Handle, PChar('내보내기 중 오류가 발생했습니다.'), PChar(Caption), MB_ICONWARNING or MB_OK); // 일반권한으로 실행해서 안 지워진다.. 그래서 후처리 추가 22_0614 12:40:00 kku sPath := GetRunExePathDir + DIR_CONF + DAT_PARAM; if FileExists(sPath) then DeleteFile(sPath); end; HPCMD_REQ_FILEICON : begin O := SO(Copy(PChar(pCpData.lpData), 1, pCpData.cbData)); var pNode: PVirtualNode := PVirtualNode(O.I['N']); var sExt: String := O.S['E']; var pBuf: TBytes := DecodeBase64(O.S['D']); if ForceDirectories(GetRunExePathDir + DIR_CACHE) then begin // vtList.BeginUpdate; // try var ms: TMemoryStream; Guard(ms, TMemoryStream.Create); ms.Write(pBuf[0], Length(pBuf)); var ico: TIcon; Guard(ico, TIcon.Create); ms.Position := 0; ico.LoadFromStream(ms); ms.Position := 0; ms.SaveToFile(GetRunExePathDir + DIR_CACHE + sExt + '.ico'); // var pData: PRstEnt := vtList.GetNodeData(pNode); // pData.nImgIdx := FileImageList_.AddIcon(ico); // FIconIdxList_.AddObject(sExt, TObject(pData.nImgIdx)); // vtList.RepaintNode(pNode); // finally // vtList.EndUpdate; // end; end; end; end; except on E: Exception do ETgException.TraceException(Self, E, Format('Fail .. process_WM_COPYDATA(), dwData=%d', [dwData])); end; end; end.