/* $ 14.09.2000 SVS + Функция FarMkTemp - получение имени временного файла с полным путем. Dest - приемник результата Template - шаблон по правилам функции mktemp, например "FarTmpXXXXXX" Вернет требуемый размер приемника. */ int WINAPI FarMkTemp(wchar_t *Dest, DWORD size, const wchar_t *Prefix) { string strDest; if (FarMkTempEx(strDest, Prefix, TRUE) && Dest && size) { xwcsncpy(Dest, strDest, size); } return static_cast<int>(strDest.GetLength()+1); }
static bool WipeFile(const string& Name, int TotalPercent, bool& Cancel, ConsoleTitle* DeleteTitle) { bool Result = false; api::SetFileAttributes(Name,FILE_ATTRIBUTE_NORMAL); api::FileWalker WipeFile; if(WipeFile.Open(Name, FILE_READ_DATA|FILE_WRITE_DATA, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_WRITE_THROUGH|FILE_FLAG_SEQUENTIAL_SCAN)) { const DWORD BufSize=65536; if(WipeFile.InitWalk(BufSize)) { static std::array<BYTE, BufSize> Buf; static bool BufInit = false; if(!BufInit) { Buf.fill(Global->Opt->WipeSymbol); // используем символ заполнитель BufInit = true; } DWORD StartTime=GetTickCount(); do { DWORD Written; WipeFile.Write(Buf.data(), WipeFile.GetChunkSize(), Written); DWORD CurTime=GetTickCount(); if (CurTime-StartTime>(DWORD)Global->Opt->RedrawTimeout) { StartTime=CurTime; if (CheckForEscSilent() && ConfirmAbortOp()) { Cancel=true; return false; } ShellDeleteMsg(Name, DEL_WIPEPROCESS, TotalPercent, WipeFile.GetPercent(), DeleteTitle); } } while(WipeFile.Step()); WipeFile.SetPointer(0,nullptr,FILE_BEGIN); WipeFile.SetEnd(); } WipeFile.Close(); string strTempName; FarMkTempEx(strTempName,nullptr,FALSE); Result = api::MoveFile(Name,strTempName) && api::DeleteFile(strTempName); } return Result; }
int WipeFile(const wchar_t *Name) { unsigned __int64 FileSize; apiSetFileAttributes(Name,FILE_ATTRIBUTE_NORMAL); File WipeFile; if(!WipeFile.Open(Name, GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_WRITE_THROUGH|FILE_FLAG_SEQUENTIAL_SCAN)) { return FALSE; } if (!WipeFile.GetSize(FileSize)) { WipeFile.Close(); return FALSE; } if(FileSize) { const int BufSize=65536; LPBYTE Buf=new BYTE[BufSize]; memset(Buf, Opt.WipeSymbol, BufSize); // используем символ заполнитель DWORD Written; while (FileSize>0) { DWORD WriteSize=(DWORD)Min((unsigned __int64)BufSize,FileSize); WipeFile.Write(Buf,WriteSize,Written); FileSize-=WriteSize; } WipeFile.Write(Buf,BufSize,Written); delete[] Buf; WipeFile.SetPointer(0,nullptr,FILE_BEGIN); WipeFile.SetEnd(); } WipeFile.Close(); string strTempName; FarMkTempEx(strTempName,nullptr,FALSE); if (apiMoveFile(Name,strTempName)) return apiDeleteFile(strTempName); SetLastError((_localLastError = GetLastError())); return FALSE; }
static int WipeDirectory(const string& Name) { string strTempName, strPath; if (FirstSlash(Name.data())) { strPath = Name; DeleteEndSlash(strPath); CutToSlash(strPath); } FarMkTempEx(strTempName,nullptr, FALSE, strPath.empty()?nullptr:strPath.data()); if (!os::MoveFile(Name, strTempName)) { return FALSE; } return os::RemoveDirectory(strTempName); }
int WipeDirectory(const string& Name) { string strTempName, strPath; if (FirstSlash(Name)) { strPath = Name; DeleteEndSlash(strPath); CutToSlash(strPath); } FarMkTempEx(strTempName,nullptr, FALSE, strPath.IsEmpty()?nullptr:strPath.CPtr()); if (!apiMoveFile(Name, strTempName)) { return FALSE; } return apiRemoveDirectory(strTempName); }
int WipeDirectory(const wchar_t *Name) { string strTempName, strPath; if (FirstSlash(Name)) { strPath = Name; DeleteEndSlash(strPath); CutToSlash(strPath); } FarMkTempEx(strTempName,nullptr, FALSE, strPath.IsEmpty()?nullptr:strPath.CPtr()); if (!apiMoveFile(Name, strTempName)) { SetLastError((_localLastError = GetLastError())); return FALSE; } return apiRemoveDirectory(strTempName); }
void FileList::PluginToPluginFiles(int Move) { _ALGO(CleverSysLog clv(L"FileList::PluginToPluginFiles()")); PluginPanelItem *ItemList; int ItemNumber; Panel *AnotherPanel=CtrlObject->Cp()->GetAnotherPanel(this); string strTempDir; if (AnotherPanel->GetMode()!=PLUGIN_PANEL) return; FileList *AnotherFilePanel=(FileList *)AnotherPanel; if (!FarMkTempEx(strTempDir)) return; SaveSelection(); apiCreateDirectory(strTempDir,nullptr); CreatePluginItemList(ItemList,ItemNumber); if (ItemList && ItemNumber>0) { const wchar_t *lpwszTempDir=strTempDir; int PutCode=CtrlObject->Plugins->GetFiles(hPlugin,ItemList,ItemNumber,FALSE,&lpwszTempDir,OPM_SILENT); strTempDir=lpwszTempDir; if (PutCode==1 || PutCode==2) { string strSaveDir; apiGetCurrentDirectory(strSaveDir); FarChDir(strTempDir); PutCode=CtrlObject->Plugins->PutFiles(AnotherFilePanel->hPlugin,ItemList,ItemNumber,FALSE,0); if (PutCode==1 || PutCode==2) { if (!ReturnCurrentFile) ClearSelection(); AnotherPanel->SetPluginModified(); PutDizToPlugin(AnotherFilePanel,ItemList,ItemNumber,FALSE,FALSE,&Diz,&AnotherFilePanel->Diz); if (Move) if (CtrlObject->Plugins->DeleteFiles(hPlugin,ItemList,ItemNumber,OPM_SILENT)) { SetPluginModified(); PutDizToPlugin(this,ItemList,ItemNumber,TRUE,FALSE,nullptr,&Diz); } } else if (!ReturnCurrentFile) PluginClearSelection(ItemList,ItemNumber); FarChDir(strSaveDir); } DeleteDirTree(strTempDir); DeletePluginItemList(ItemList,ItemNumber); Update(UPDATE_KEEP_SELECTION); Redraw(); if (PanelMode==PLUGIN_PANEL) AnotherPanel->Update(UPDATE_KEEP_SELECTION|UPDATE_SECONDARY); else AnotherPanel->Update(UPDATE_KEEP_SELECTION); AnotherPanel->Redraw(); } }
void FileList::PutDizToPlugin(FileList *DestPanel,PluginPanelItem *ItemList, int ItemNumber,int Delete,int Move,DizList *SrcDiz, DizList *DestDiz) { _ALGO(CleverSysLog clv(L"FileList::PutDizToPlugin()")); OpenPanelInfo Info; CtrlObject->Plugins->GetOpenPanelInfo(DestPanel->hPlugin,&Info); if (DestPanel->strPluginDizName.IsEmpty() && Info.DescrFilesNumber>0) DestPanel->strPluginDizName = Info.DescrFiles[0]; if (((Opt.Diz.UpdateMode==DIZ_UPDATE_IF_DISPLAYED && IsDizDisplayed()) || Opt.Diz.UpdateMode==DIZ_UPDATE_ALWAYS) && !DestPanel->strPluginDizName.IsEmpty() && (!Info.HostFile || !*Info.HostFile || DestPanel->GetModalMode() || apiGetFileAttributes(Info.HostFile)!=INVALID_FILE_ATTRIBUTES)) { CtrlObject->Cp()->LeftPanel->ReadDiz(); CtrlObject->Cp()->RightPanel->ReadDiz(); if (DestPanel->GetModalMode()) DestPanel->ReadDiz(); int DizPresent=FALSE; for (int I=0; I<ItemNumber; I++) if (ItemList[I].Flags & PPIF_PROCESSDESCR) { string strName = ItemList[I].FileName; string strShortName = ItemList[I].AlternateFileName; int Code; if (Delete) Code=DestDiz->DeleteDiz(strName,strShortName); else { Code=SrcDiz->CopyDiz(strName,strShortName,strName,strShortName,DestDiz); if (Code && Move) SrcDiz->DeleteDiz(strName,strShortName); } if (Code) DizPresent=TRUE; } if (DizPresent) { string strTempDir; if (FarMkTempEx(strTempDir) && apiCreateDirectory(strTempDir,nullptr)) { string strSaveDir; apiGetCurrentDirectory(strSaveDir); string strDizName=strTempDir+L"\\"+DestPanel->strPluginDizName; DestDiz->Flush(L"", &strDizName); if (Move) SrcDiz->Flush(L""); PluginPanelItem PanelItem; if (FileNameToPluginItem(strDizName,&PanelItem)) CtrlObject->Plugins->PutFiles(DestPanel->hPlugin,&PanelItem,1,FALSE,OPM_SILENT|OPM_DESCR); else if (Delete) { PluginPanelItem pi={}; pi.FileName = xf_wcsdup(DestPanel->strPluginDizName); CtrlObject->Plugins->DeleteFiles(DestPanel->hPlugin,&pi,1,OPM_SILENT); xf_free(pi.FileName); } FarChDir(strSaveDir); DeleteFileWithFolder(strDizName); } } } }
void FileList::ReadDiz(PluginPanelItem *ItemList,int ItemLength,DWORD dwFlags) { if (DizRead) return; DizRead=TRUE; Diz.Reset(); if (PanelMode==NORMAL_PANEL) { Diz.Read(strCurDir); } else { PluginPanelItem *PanelData=nullptr; size_t PluginFileCount=0; OpenPanelInfo Info; CtrlObject->Plugins->GetOpenPanelInfo(hPlugin,&Info); if (!Info.DescrFilesNumber) return; int GetCode=TRUE; /* $ 25.02.2001 VVM + Обработка флага RDF_NO_UPDATE */ if (!ItemList && !(dwFlags & RDF_NO_UPDATE)) { GetCode=CtrlObject->Plugins->GetFindData(hPlugin,&PanelData,&PluginFileCount,0); } else { PanelData=ItemList; PluginFileCount=ItemLength; } if (GetCode) { for (size_t I=0; I<Info.DescrFilesNumber; I++) { PluginPanelItem *CurPanelData=PanelData; for (size_t J=0; J < PluginFileCount; J++, CurPanelData++) { string strFileName = CurPanelData->FileName; if (!StrCmpI(strFileName,Info.DescrFiles[I])) { string strTempDir, strDizName; if (FarMkTempEx(strTempDir) && apiCreateDirectory(strTempDir,nullptr)) { if (CtrlObject->Plugins->GetFile(hPlugin,CurPanelData,strTempDir,strDizName,OPM_SILENT|OPM_VIEW|OPM_QUICKVIEW|OPM_DESCR)) { strPluginDizName = Info.DescrFiles[I]; Diz.Read(L"", &strDizName); DeleteFileWithFolder(strDizName); I=Info.DescrFilesNumber; break; } apiRemoveDirectory(strTempDir); //ViewPanel->ShowFile(nullptr,FALSE,nullptr); } } } } /* $ 25.02.2001 VVM + Обработка флага RDF_NO_UPDATE */ if (!ItemList && !(dwFlags & RDF_NO_UPDATE)) CtrlObject->Plugins->FreeFindData(hPlugin,PanelData,PluginFileCount); } } for (int I=0; I<FileCount; I++) { if (!ListData[I]->DizText) { ListData[I]->DeleteDiz=FALSE; ListData[I]->DizText=(wchar_t*)Diz.GetDizTextAddr(ListData[I]->strName,ListData[I]->strShortName,ListData[I]->FileSize); } } }
bool Panel::MakeListFile(string &strListFileName,bool ShortNames,const wchar_t *Modifers) { bool Ret=false; if (FarMkTempEx(strListFileName)) { File ListFile; if (ListFile.Open(strListFileName,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,nullptr,CREATE_ALWAYS)) { UINT CodePage=CP_OEMCP; LPCVOID Eol="\r\n"; DWORD EolSize=2; if (Modifers && *Modifers) { if (wcschr(Modifers,L'A')) // ANSI { CodePage=CP_ACP; } else { DWORD Signature=0; int SignatureSize=0; if (wcschr(Modifers,L'W')) // UTF16LE { CodePage=CP_UNICODE; Signature=SIGN_UNICODE; SignatureSize=2; Eol=DOS_EOL_fmt; EolSize=2*sizeof(WCHAR); } else { if (wcschr(Modifers,L'U')) // UTF8 { CodePage=CP_UTF8; Signature=SIGN_UTF8; SignatureSize=3; } } if (Signature && SignatureSize) { DWORD NumberOfBytesWritten; ListFile.Write(&Signature,SignatureSize, NumberOfBytesWritten); } } } string strFileName,strShortName; DWORD FileAttr; GetSelName(nullptr,FileAttr); while (GetSelName(&strFileName,FileAttr,&strShortName)) { if (ShortNames) strFileName = strShortName; if (Modifers && *Modifers) { if (wcschr(Modifers,L'F') && PointToName(strFileName) == strFileName.CPtr()) // 'F' - использовать полный путь; //BUGBUG ? { string strTempFileName=strCurDir; if (ShortNames) ConvertNameToShort(strTempFileName,strTempFileName); AddEndSlash(strTempFileName); strTempFileName+=strFileName; //BUGBUG ? strFileName=strTempFileName; } if (wcschr(Modifers,L'Q')) // 'Q' - заключать имена с пробелами в кавычки; QuoteSpaceOnly(strFileName); if (wcschr(Modifers,L'S')) // 'S' - использовать '/' вместо '\' в путях файлов; { size_t Len=strFileName.GetLength(); wchar_t *FileName=strFileName.GetBuffer(); for (size_t i=0; i<Len; i++) { if (FileName[i]==L'\\') { FileName[i]=L'/'; } } strFileName.ReleaseBuffer(); } } LPCVOID Ptr=nullptr; LPSTR Buffer=nullptr; DWORD NumberOfBytesToWrite=0,NumberOfBytesWritten=0; if (CodePage==CP_UNICODE) { Ptr=strFileName.CPtr(); NumberOfBytesToWrite=static_cast<DWORD>(strFileName.GetLength()*sizeof(WCHAR)); } else { int Size=WideCharToMultiByte(CodePage,0,strFileName,static_cast<int>(strFileName.GetLength()),nullptr,0,nullptr,nullptr); if (Size) { Buffer=static_cast<LPSTR>(xf_malloc(Size)); if (Buffer) { NumberOfBytesToWrite=WideCharToMultiByte(CodePage,0,strFileName,static_cast<int>(strFileName.GetLength()),Buffer,Size,nullptr,nullptr); Ptr=Buffer; } } } BOOL Written=ListFile.Write(Ptr,NumberOfBytesToWrite,NumberOfBytesWritten); if (Buffer) xf_free(Buffer); if (Written && NumberOfBytesWritten==NumberOfBytesToWrite) { if (ListFile.Write(Eol,EolSize,NumberOfBytesWritten) && NumberOfBytesWritten==EolSize) { Ret=true; } } else { Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MError),MSG(MCannotCreateListFile),MSG(MCannotCreateListWrite),MSG(MOk)); apiDeleteFile(strListFileName); break; } } ListFile.Close(); } else { Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MError),MSG(MCannotCreateListFile),MSG(MCannotCreateListTemp),MSG(MOk)); } } else { Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MError),MSG(MCannotCreateListFile),MSG(MCannotCreateListTemp),MSG(MOk)); } return Ret; }
void PrintFiles(Panel *SrcPanel) { _ALGO(CleverSysLog clv(L"Alt-F5 (PrintFiles)")); string strPrinterName; DWORD Needed,Returned; int PrinterNumber; DWORD FileAttr; string strSelName; long DirsCount=0; int SelCount=SrcPanel->GetSelCount(); if (!SelCount) { _ALGO(SysLog(L"Error: !SelCount")); return; } // проверка каталогов _ALGO(SysLog(L"Check for FILE_ATTRIBUTE_DIRECTORY")); SrcPanel->GetSelName(nullptr,FileAttr); while (SrcPanel->GetSelName(&strSelName,FileAttr)) { if (TestParentFolderName(strSelName) || (FileAttr & FILE_ATTRIBUTE_DIRECTORY)) DirsCount++; } if (DirsCount==SelCount) return; PRINTER_INFO *pi = nullptr; if (EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS,nullptr,PRINTER_INFO_LEVEL,nullptr,0,&Needed,&Returned) || Needed<=0) return; pi = (PRINTER_INFO *)xf_malloc(Needed); if (!EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS,nullptr,PRINTER_INFO_LEVEL,(LPBYTE)pi,Needed,&Needed,&Returned)) { Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MPrintTitle),MSG(MCannotEnumeratePrinters),MSG(MOk)); xf_free(pi); return; } { _ALGO(CleverSysLog clv2(L"Show Menu")); string strTitle; string strName; if (SelCount==1) { SrcPanel->GetSelName(nullptr,FileAttr); SrcPanel->GetSelName(&strName,FileAttr); TruncStr(strName,50); strSelName=strName; InsertQuote(strSelName); strTitle.Format(MSG(MPrintTo), strSelName.CPtr()); } else { _ALGO(SysLog(L"Correct: SelCount-=DirsCount")); SelCount-=DirsCount; strTitle.Format(MSG(MPrintFilesTo),SelCount); } VMenu PrinterList(strTitle,nullptr,0,ScrY-4); PrinterList.SetFlags(VMENU_WRAPMODE|VMENU_SHOWAMPERSAND); PrinterList.SetPosition(-1,-1,0,0); AddToPrintersMenu(&PrinterList,pi,Returned); PrinterList.Process(); PrinterNumber=PrinterList.Modal::GetExitCode(); if (PrinterNumber<0) { xf_free(pi); _ALGO(SysLog(L"ESC")); return; } int nSize = PrinterList.GetUserDataSize(); wchar_t *PrinterName = strPrinterName.GetBuffer(nSize); PrinterList.GetUserData(PrinterName, nSize); strPrinterName.ReleaseBuffer(); } HANDLE hPrinter; if (!OpenPrinter((wchar_t*)strPrinterName.CPtr(),&hPrinter,nullptr)) { Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MPrintTitle),MSG(MCannotOpenPrinter), strPrinterName,MSG(MOk)); xf_free(pi); _ALGO(SysLog(L"Error: Cannot Open Printer")); return; } { _ALGO(CleverSysLog clv3(L"Print selected Files")); //SaveScreen SaveScr; TPreRedrawFuncGuard preRedrawFuncGuard(PR_PrintMsg); SetCursorType(FALSE,0); PR_PrintMsg(); HANDLE hPlugin=SrcPanel->GetPluginHandle(); int PluginMode=SrcPanel->GetMode()==PLUGIN_PANEL && !CtrlObject->Plugins.UseFarCommand(hPlugin,PLUGIN_FARGETFILE); SrcPanel->GetSelName(nullptr,FileAttr); while (SrcPanel->GetSelName(&strSelName,FileAttr)) { if (TestParentFolderName(strSelName) || (FileAttr & FILE_ATTRIBUTE_DIRECTORY)) continue; int Success=FALSE; LPCWSTR FileName = nullptr; string strTempDir, strTempName; if (PluginMode) { if (FarMkTempEx(strTempDir)) { apiCreateDirectory(strTempDir,nullptr); FileListItem ListItem; if (SrcPanel->GetLastSelectedItem(&ListItem)) { PluginPanelItem PanelItem; FileList::FileListToPluginItem(&ListItem,&PanelItem); if (CtrlObject->Plugins.GetFile(hPlugin,&PanelItem,strTempDir,strTempName,OPM_SILENT)) FileName = strTempName; else apiRemoveDirectory(strTempDir); FileList::FreePluginPanelItem(&PanelItem); } } } else FileName = strSelName; File SrcFile; if(SrcFile.Open(FileName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, nullptr, OPEN_EXISTING)) { DOC_INFO_1 di1 = {const_cast<LPWSTR>(FileName)}; if (StartDocPrinter(hPrinter,1,(LPBYTE)&di1)) { char Buffer[8192]; DWORD Read,Written; Success=TRUE; while (SrcFile.Read(Buffer, sizeof(Buffer), Read) && Read > 0) if (!WritePrinter(hPrinter,Buffer,Read,&Written)) { Success=FALSE; break; } EndDocPrinter(hPrinter); } SrcFile.Close(); } if (!strTempName.IsEmpty()) { DeleteFileWithFolder(strTempName); } if (Success) SrcPanel->ClearLastGetSelection(); else { if (Message(MSG_WARNING|MSG_ERRORTYPE,2,MSG(MPrintTitle),MSG(MCannotPrint), strSelName,MSG(MSkip),MSG(MCancel))) break; } } ClosePrinter(hPrinter); } SrcPanel->Redraw(); xf_free(pi); }
void PrintFiles(FileList* SrcPanel) { _ALGO(CleverSysLog clv(L"Alt-F5 (PrintFiles)")); string strPrinterName; DWORD Needed = 0, Returned; DWORD FileAttr; string strSelName; size_t DirsCount=0; size_t SelCount=SrcPanel->GetSelCount(); if (!SelCount) { _ALGO(SysLog(L"Error: !SelCount")); return; } // проверка каталогов _ALGO(SysLog(L"Check for FILE_ATTRIBUTE_DIRECTORY")); SrcPanel->GetSelName(nullptr,FileAttr); while (SrcPanel->GetSelName(&strSelName,FileAttr)) { if (TestParentFolderName(strSelName) || (FileAttr & FILE_ATTRIBUTE_DIRECTORY)) DirsCount++; } if (DirsCount==SelCount) return; EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, nullptr, PRINTER_INFO_LEVEL, nullptr, 0, &Needed, &Returned); if (!Needed) return; block_ptr<PRINTER_INFO> pi(Needed); if (!EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS,nullptr,PRINTER_INFO_LEVEL,(LPBYTE)pi.get(),Needed,&Needed,&Returned)) { Global->CatchError(); Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MPrintTitle),MSG(MCannotEnumeratePrinters),MSG(MOk)); return; } { _ALGO(CleverSysLog clv2(L"Show Menu")); LangString strTitle; string strName; if (SelCount==1) { SrcPanel->GetSelName(nullptr,FileAttr); SrcPanel->GetSelName(&strName,FileAttr); strSelName = TruncStr(strName,50); strTitle = MPrintTo; strTitle << InsertQuote(strSelName); } else { _ALGO(SysLog(L"Correct: SelCount-=DirsCount")); SelCount-=DirsCount; strTitle = MPrintFilesTo; strTitle << SelCount; } VMenu2 PrinterList(strTitle,nullptr,0,ScrY-4); PrinterList.SetFlags(VMENU_WRAPMODE|VMENU_SHOWAMPERSAND); PrinterList.SetPosition(-1,-1,0,0); AddToPrintersMenu(&PrinterList,pi.get(),Returned); if (PrinterList.Run()<0) { _ALGO(SysLog(L"ESC")); return; } strPrinterName = NullToEmpty(static_cast<const wchar_t*>(PrinterList.GetUserData(nullptr, 0))); } HANDLE hPrinter; if (!OpenPrinter(UNSAFE_CSTR(strPrinterName), &hPrinter,nullptr)) { Global->CatchError(); Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MPrintTitle),MSG(MCannotOpenPrinter), strPrinterName.data(),MSG(MOk)); _ALGO(SysLog(L"Error: Cannot Open Printer")); return; } { _ALGO(CleverSysLog clv3(L"Print selected Files")); SCOPED_ACTION(SaveScreen); auto PR_PrintMsg = [](){ Message(0, 0, MSG(MPrintTitle), MSG(MPreparingForPrinting)); }; SCOPED_ACTION(TPreRedrawFuncGuard)(std::make_unique<PreRedrawItem>(PR_PrintMsg)); SetCursorType(false, 0); PR_PrintMsg(); auto hPlugin=SrcPanel->GetPluginHandle(); int PluginMode=SrcPanel->GetMode()==PLUGIN_PANEL && !Global->CtrlObject->Plugins->UseFarCommand(hPlugin,PLUGIN_FARGETFILE); SrcPanel->GetSelName(nullptr,FileAttr); while (SrcPanel->GetSelName(&strSelName,FileAttr)) { if (TestParentFolderName(strSelName) || (FileAttr & FILE_ATTRIBUTE_DIRECTORY)) continue; int Success=FALSE; string FileName; string strTempDir, strTempName; if (PluginMode) { if (FarMkTempEx(strTempDir)) { api::CreateDirectory(strTempDir,nullptr); auto ListItem = SrcPanel->GetLastSelectedItem(); if (ListItem) { PluginPanelItem PanelItem; FileList::FileListToPluginItem(*ListItem, &PanelItem); if (Global->CtrlObject->Plugins->GetFile(hPlugin,&PanelItem,strTempDir,strTempName,OPM_SILENT)) FileName = strTempName; else api::RemoveDirectory(strTempDir); FreePluginPanelItem(PanelItem); } } } else FileName = strSelName; api::File SrcFile; if(SrcFile.Open(FileName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, nullptr, OPEN_EXISTING)) { DOC_INFO_1 di1 = {UNSAFE_CSTR(FileName)}; if (StartDocPrinter(hPrinter,1,(LPBYTE)&di1)) { char Buffer[8192]; DWORD Read,Written; Success=TRUE; while (SrcFile.Read(Buffer, sizeof(Buffer), Read) && Read > 0) if (!WritePrinter(hPrinter,Buffer,Read,&Written)) { Global->CatchError(); Success=FALSE; break; } EndDocPrinter(hPrinter); } SrcFile.Close(); } if (!strTempName.empty()) { DeleteFileWithFolder(strTempName); } if (Success) SrcPanel->ClearLastGetSelection(); else { if (Message(MSG_WARNING|MSG_ERRORTYPE,2,MSG(MPrintTitle),MSG(MCannotPrint), strSelName.data(),MSG(MSkip),MSG(MCancel))) break; } } ClosePrinter(hPrinter); } SrcPanel->Redraw(); }