void PluginPanelItemToFindDataEx(const PluginPanelItem& Src, os::FAR_FIND_DATA& Dest) { Dest.dwFileAttributes = Src.FileAttributes; Dest.ftCreationTime = Src.CreationTime; Dest.ftLastAccessTime = Src.LastAccessTime; Dest.ftLastWriteTime = Src.LastWriteTime; Dest.ftChangeTime = Src.ChangeTime; Dest.nFileSize = Src.FileSize; Dest.nAllocationSize = Src.AllocationSize; Dest.strFileName = NullToEmpty(Src.FileName); Dest.strAlternateFileName = NullToEmpty(Src.AlternateFileName); }
/* SaveForbid - принудительно запретить запись добавляемой строки. Используется на панели плагина */ void History::AddToHistory(const string& Str, history_record_type Type, const GUID* Guid, const wchar_t *File, const wchar_t *Data, bool SaveForbid) { _ASSERTE(this!=NULL); if (!m_EnableAdd || SaveForbid) return; if (Global->CtrlObject->Macro.IsExecuting() && Global->CtrlObject->Macro.IsHistoryDisable((int)m_TypeHistory)) return; if (m_TypeHistory!=HISTORYTYPE_DIALOG && (m_TypeHistory!=HISTORYTYPE_FOLDER || !Guid || *Guid == FarGuid) && Str.empty()) return; bool Lock = false; string strName(Str),strGuid,strFile(NullToEmpty(File)),strData(NullToEmpty(Data)); if(Guid) strGuid=GuidToStr(*Guid); unsigned __int64 DeleteId = 0; const bool ignore_data = m_TypeHistory == HISTORYTYPE_CMD; if (m_RemoveDups) // удалять дубликаты? { DWORD index=0; string strHName,strHGuid,strHFile,strHData; history_record_type HType; bool HLock; unsigned __int64 id; unsigned __int64 Time; while (HistoryCfgRef()->Enum(index++,m_TypeHistory,m_HistoryName,&id,strHName,&HType,&HLock,&Time,strHGuid,strHFile,strHData)) { if (EqualType(Type,HType)) { typedef int (*CompareFunction)(const string&, const string&); CompareFunction CaseSensitive = StrCmp, CaseInsensitive = StrCmpI; CompareFunction CmpFunction = (m_RemoveDups == 2 ? CaseInsensitive : CaseSensitive); if (!CmpFunction(strName, strHName) && !CmpFunction(strGuid, strHGuid) && !CmpFunction(strFile, strHFile) && (ignore_data || !CmpFunction(strData, strHData))) { Lock = Lock || HLock; DeleteId = id; break; } } } } HistoryCfgRef()->DeleteAndAddAsync(DeleteId, m_TypeHistory, m_HistoryName, strName, Type, Lock, strGuid, strFile, strData); //Async - should never be used in a transaction ResetPosition(); }
void GenerateArchiveName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask,bool Archiving) { // Must be enough space for archive name plus all stuff in mask plus // extra overhead produced by mask 'N' (archive number) characters. // One 'N' character can result in several numbers if we process more // than 9 archives. wchar NewName[NM+MAX_GENERATE_MASK+20]; uint ArcNumber=1; while (true) // Loop for 'N' (archive number) processing. { wcsncpyz(NewName,ArcName,ASIZE(NewName)); bool ArcNumPresent=false; GenArcName(NewName,GenerateMask,ArcNumber,ArcNumPresent); if (!ArcNumPresent) break; if (!FileExist(NewName)) { if (!Archiving && ArcNumber>1) { // If we perform non-archiving operation, we need to use the last // existing archive before the first unused name. So we generate // the name for (ArcNumber-1) below. wcsncpyz(NewName,NullToEmpty(ArcName),ASIZE(NewName)); GenArcName(NewName,GenerateMask,ArcNumber-1,ArcNumPresent); } break; } ArcNumber++; } wcsncpyz(ArcName,NewName,MaxSize); }
PluginSettings::PluginSettings(const GUID& Guid, bool Local): PluginsCfg(nullptr) { const auto pPlugin = Global->CtrlObject->Plugins->FindPlugin(Guid); if (pPlugin) { string strGuid = GuidToStr(Guid); PluginsCfg = ConfigProvider().CreatePluginsConfig(strGuid, Local); m_Keys.emplace_back(PluginsCfg->CreateKey(HierarchicalConfig::root_key(), strGuid, &pPlugin->GetTitle())); if (!Global->Opt->ReadOnlyConfig) { DizList Diz; string strDbPath = Local ? Global->Opt->LocalProfilePath : Global->Opt->ProfilePath; AddEndSlash(strDbPath); strDbPath += L"PluginsData\\"; Diz.Read(strDbPath); string strDbName = strGuid + L".db"; string Description = string(pPlugin->GetTitle()) + L" (" + pPlugin->GetDescription() + L")"; if(Description != NullToEmpty(Diz.GetDizTextAddr(strDbName, L"", 0))) { Diz.AddDizText(strDbName, L"", Description); Diz.Flush(strDbPath); } } } }
TVar::TVar(const wchar_t* v): inum(), dnum(), str(NullToEmpty(v)), vType(vtString) { }
string Panel::GetTitle() const { if (m_PanelMode == panel_mode::NORMAL_PANEL) return m_ShowShortNames? ConvertNameToShort(m_CurDir) : m_CurDir; OpenPanelInfo Info; GetOpenPanelInfo(&Info); return string(trim(string_view(NullToEmpty(Info.PanelTitle)))); }
/** This function should never be called since the file name should never be changed */ bool File::Rename(const char *NewName,const wchar *NewNameW) { // we do not need to rename if names are already same bool Success=strcmp(FileName,NewName)==0; if (Success && *FileNameW!=0 && *NullToEmpty(NewNameW)!=0) Success=wcscmp(FileNameW,NewNameW)==0; if (!Success) Success=RenameFile(FileName,FileNameW,NewName,NewNameW); if (Success) { // renamed successfully, storing the new name strcpy(FileName,NewName); wcscpy(FileNameW,NullToEmpty(NewNameW)); } return(Success); }
void FindFile::SetMask(const char *FindMask) { strcpy(FindFile::FindMask,NullToEmpty(FindMask)); #ifndef __BIONIC__ if (*FindMaskW==0) CharToWide(FindMask,FindMaskW); #endif FirstCall=true; }
static BencArray *SerializeFavData(FileFavs *fav) { BencArray *res = new BencArray(); for (size_t i = 0; i < fav->favNames.Count(); i++) { FavName *fn = fav->favNames.At(i); res->Add(fn->pageNo); res->Add(NullToEmpty(fn->name)); } return res; }
bool StringList::GetString(char *Str,wchar *StrW,int MaxLength) { char *StrPtr; wchar *StrPtrW; if (Str==NULL || !GetString(&StrPtr,&StrPtrW)) return(false); strncpy(Str,StrPtr,MaxLength); if (StrW!=NULL) strncpyw(StrW,NullToEmpty(StrPtrW),MaxLength); return(true); }
/* Стандартный диалог ввода пароля. Умеет сам запоминать последнего юзвера и пароль. Name - сюда будет помещен юзвер (max 256 символов!!!) Password - сюда будет помещен пароль (max 256 символов!!!) Title - заголовок диалога (может быть nullptr) HelpTopic - тема помощи (может быть nullptr) Flags - флаги (GNP_*) */ int GetNameAndPassword(const string& Title, string &strUserName, string &strPassword,const wchar_t *HelpTopic,DWORD Flags) { static string strLastName, strLastPassword; int ExitCode; /* 0 1 2 3 4 5 6 7 0123456789012345678901234567890123456789012345678901234567890123456789012345 |0 | |1 +------------------------------- Title -------------------------------+ | |2 | User name | | |3 | *******************************************************************| | |4 | User password | | |5 | ******************************************************************* | | |6 +---------------------------------------------------------------------+ | |7 | [ Ok ] [ Cancel ] | | |8 +---------------------------------------------------------------------+ | |9 | */ FarDialogItem PassDlgData[]= { {DI_DOUBLEBOX, 3, 1,72, 8,0,nullptr,nullptr,0,NullToEmpty(Title.data())}, {DI_TEXT, 5, 2, 0, 2,0,nullptr,nullptr,0,MSG(MNetUserName)}, {DI_EDIT, 5, 3,70, 3,0,L"NetworkUser",nullptr,DIF_FOCUS|DIF_USELASTHISTORY|DIF_HISTORY,(Flags&GNP_USELAST)?strLastName.data():strUserName.data()}, {DI_TEXT, 5, 4, 0, 4,0,nullptr,nullptr,0,MSG(MNetUserPassword)}, {DI_PSWEDIT, 5, 5,70, 5,0,nullptr,nullptr,0,(Flags&GNP_USELAST)?strLastPassword.data():strPassword.data()}, {DI_TEXT, -1, 6, 0, 6,0,nullptr,nullptr,DIF_SEPARATOR,L""}, {DI_BUTTON, 0, 7, 0, 7,0,nullptr,nullptr,DIF_DEFAULTBUTTON|DIF_CENTERGROUP,MSG(MOk)}, {DI_BUTTON, 0, 7, 0, 7,0,nullptr,nullptr,DIF_CENTERGROUP,MSG(MCancel)}, }; auto PassDlg = MakeDialogItemsEx(PassDlgData); { auto Dlg = Dialog::create(PassDlg); Dlg->SetPosition(-1,-1,76,10); Dlg->SetId(GetNameAndPasswordId); if (HelpTopic) Dlg->SetHelp(HelpTopic); Dlg->Process(); ExitCode=Dlg->GetExitCode(); } if (ExitCode!=6) return FALSE; // запоминаем всегда. strUserName = PassDlg[2].strData; strLastName = strUserName; strPassword = PassDlg[4].strData; strLastPassword = strPassword; return TRUE; }
bool Panel::GetShortcutInfo(ShortcutInfo& ShortcutInfo) const { bool result=true; if (m_PanelMode == panel_mode::PLUGIN_PANEL) { const auto ph = GetPluginHandle(); ShortcutInfo.PluginGuid = ph->plugin()->Id(); OpenPanelInfo Info; Global->CtrlObject->Plugins->GetOpenPanelInfo(ph, &Info); ShortcutInfo.PluginFile = NullToEmpty(Info.HostFile); ShortcutInfo.ShortcutFolder = NullToEmpty(Info.CurDir); ShortcutInfo.PluginData = NullToEmpty(Info.ShortcutData); if(!(Info.Flags&OPIF_SHORTCUT)) result=false; } else { ShortcutInfo.PluginGuid=FarGuid; ShortcutInfo.PluginFile.clear(); ShortcutInfo.PluginData.clear(); ShortcutInfo.ShortcutFolder = m_CurDir; } return result; }
UnicodeString& Append(const wchar_t* Str) { return Append(Str, StrLength(NullToEmpty(Str))); }
bool Plugin::SaveToCache() { PluginInfo Info = {sizeof(Info)}; GetPluginInfo(&Info); auto& PlCache = *ConfigProvider().PlCacheCfg(); SCOPED_ACTION(auto)(PlCache.ScopedTransaction()); PlCache.DeleteCache(m_strCacheName); unsigned __int64 id = PlCache.CreateCache(m_strCacheName); { bool bPreload = (Info.Flags & PF_PRELOAD); PlCache.SetPreload(id, bPreload); WorkFlags.Change(PIWF_PRELOADED, bPreload); if (bPreload) { PlCache.EndTransaction(); return true; } } { string strCurPluginID; os::FAR_FIND_DATA fdata; os::GetFindDataEx(m_strModuleName, fdata); strCurPluginID = str_printf( L"%I64x%x%x", fdata.nFileSize, fdata.ftCreationTime.dwLowDateTime, fdata.ftLastWriteTime.dwLowDateTime ); PlCache.SetSignature(id, strCurPluginID); } for (size_t i = 0; i < Info.DiskMenu.Count; i++) { PlCache.SetDiskMenuItem(id, i, Info.DiskMenu.Strings[i], GuidToStr(Info.DiskMenu.Guids[i])); } for (size_t i = 0; i < Info.PluginMenu.Count; i++) { PlCache.SetPluginsMenuItem(id, i, Info.PluginMenu.Strings[i], GuidToStr(Info.PluginMenu.Guids[i])); } for (size_t i = 0; i < Info.PluginConfig.Count; i++) { PlCache.SetPluginsConfigMenuItem(id, i, Info.PluginConfig.Strings[i], GuidToStr(Info.PluginConfig.Guids[i])); } PlCache.SetCommandPrefix(id, NullToEmpty(Info.CommandPrefix)); PlCache.SetFlags(id, Info.Flags); PlCache.SetMinFarVersion(id, &MinFarVersion); PlCache.SetGuid(id, m_strGuid); PlCache.SetVersion(id, &PluginVersion); PlCache.SetTitle(id, strTitle); PlCache.SetDescription(id, strDescription); PlCache.SetAuthor(id, strAuthor); m_model->SaveExportsToCache(PlCache, id, Exports); return true; }
int PASCAL ProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName,wchar *DestPathW,wchar *DestNameW) { DataSet *Data=(DataSet *)hArcData; try { Data->Cmd.DllError=0; if (Data->OpenMode==RAR_OM_LIST || Data->OpenMode==RAR_OM_LIST_INCSPLIT || Operation==RAR_SKIP && !Data->Arc.Solid) { if (Data->Arc.Volume && Data->Arc.GetHeaderType()==FILE_HEAD && (Data->Arc.NewLhd.Flags & LHD_SPLIT_AFTER)!=0) if (MergeArchive(Data->Arc,NULL,false,'L')) { Data->Extract.SignatureFound=false; Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); return(0); } else return(ERAR_EOPEN); Data->Arc.SeekToNext(); } else { Data->Cmd.DllOpMode=Operation; if (DestPath!=NULL || DestName!=NULL) { #ifdef _WIN_ALL OemToCharA(NullToEmpty(DestPath),Data->Cmd.ExtrPath); #else strcpy(Data->Cmd.ExtrPath,NullToEmpty(DestPath)); #endif AddEndSlash(Data->Cmd.ExtrPath); #ifdef _WIN_ALL OemToCharA(NullToEmpty(DestName),Data->Cmd.DllDestName); #else strcpy(Data->Cmd.DllDestName,NullToEmpty(DestName)); #endif } else { *Data->Cmd.ExtrPath=0; *Data->Cmd.DllDestName=0; } if (DestPathW!=NULL || DestNameW!=NULL) { wcsncpy(Data->Cmd.ExtrPathW,NullToEmpty(DestPathW),NM-2); AddEndSlash(Data->Cmd.ExtrPathW); wcsncpy(Data->Cmd.DllDestNameW,NullToEmpty(DestNameW),NM-1); if (*Data->Cmd.DllDestNameW!=0 && *Data->Cmd.DllDestName==0) WideToChar(Data->Cmd.DllDestNameW,Data->Cmd.DllDestName); } else { *Data->Cmd.ExtrPathW=0; *Data->Cmd.DllDestNameW=0; } strcpy(Data->Cmd.Command,Operation==RAR_EXTRACT ? "X":"T"); Data->Cmd.Test=Operation!=RAR_EXTRACT; bool Repeat=false; Data->Extract.ExtractCurrentFile(&Data->Cmd,Data->Arc,Data->HeaderSize,Repeat); // Now we process extra file information if any. // // Archive can be closed if we process volumes, next volume is missing // and current one is already removed or deleted. So we need to check // if archive is still open to avoid calling file operations on // the invalid file handle. Some of our file operations like Seek() // process such invalid handle correctly, some not. while (Data->Arc.IsOpened() && Data->Arc.ReadHeader()!=0 && Data->Arc.GetHeaderType()==NEWSUB_HEAD) { Data->Extract.ExtractCurrentFile(&Data->Cmd,Data->Arc,Data->HeaderSize,Repeat); Data->Arc.SeekToNext(); } Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); } } catch (RAR_EXIT ErrCode) { return(Data->Cmd.DllError!=0 ? Data->Cmd.DllError:RarErrorToDll(ErrCode)); } return(Data->Cmd.DllError); }
int _MakePath1(DWORD Key, string &strPathName, const wchar_t *Param2,int ShortNameAsIs) { int RetCode=FALSE; int NeedRealName=FALSE; strPathName.clear(); switch (Key) { case KEY_CTRLALTBRACKET: // Вставить сетевое (UNC) путь из левой панели case KEY_RCTRLRALTBRACKET: case KEY_CTRLRALTBRACKET: case KEY_RCTRLALTBRACKET: case KEY_CTRLALTBACKBRACKET: // Вставить сетевое (UNC) путь из правой панели case KEY_RCTRLRALTBACKBRACKET: case KEY_CTRLRALTBACKBRACKET: case KEY_RCTRLALTBACKBRACKET: case KEY_ALTSHIFTBRACKET: // Вставить сетевое (UNC) путь из активной панели case KEY_RALTSHIFTBRACKET: case KEY_ALTSHIFTBACKBRACKET: // Вставить сетевое (UNC) путь из пассивной панели case KEY_RALTSHIFTBACKBRACKET: NeedRealName=TRUE; case KEY_CTRLBRACKET: // Вставить путь из левой панели case KEY_RCTRLBRACKET: case KEY_CTRLBACKBRACKET: // Вставить путь из правой панели case KEY_RCTRLBACKBRACKET: case KEY_CTRLSHIFTBRACKET: // Вставить путь из активной панели case KEY_RCTRLSHIFTBRACKET: case KEY_CTRLSHIFTBACKBRACKET: // Вставить путь из пассивной панели case KEY_RCTRLSHIFTBACKBRACKET: case KEY_CTRLSHIFTNUMENTER: // Текущий файл с пасс.панели case KEY_RCTRLSHIFTNUMENTER: case KEY_SHIFTNUMENTER: // Текущий файл с актив.панели case KEY_CTRLSHIFTENTER: // Текущий файл с пасс.панели case KEY_RCTRLSHIFTENTER: case KEY_SHIFTENTER: // Текущий файл с актив.панели { Panel *SrcPanel=nullptr; FilePanels *Cp=Global->CtrlObject->Cp(); switch (Key) { case KEY_CTRLALTBRACKET: case KEY_RCTRLRALTBRACKET: case KEY_CTRLRALTBRACKET: case KEY_RCTRLALTBRACKET: case KEY_CTRLBRACKET: case KEY_RCTRLBRACKET: SrcPanel=Cp->LeftPanel; break; case KEY_CTRLALTBACKBRACKET: case KEY_RCTRLRALTBACKBRACKET: case KEY_CTRLRALTBACKBRACKET: case KEY_RCTRLALTBACKBRACKET: case KEY_CTRLBACKBRACKET: case KEY_RCTRLBACKBRACKET: SrcPanel=Cp->RightPanel; break; case KEY_SHIFTNUMENTER: case KEY_SHIFTENTER: case KEY_ALTSHIFTBRACKET: case KEY_RALTSHIFTBRACKET: case KEY_CTRLSHIFTBRACKET: case KEY_RCTRLSHIFTBRACKET: SrcPanel=Cp->ActivePanel(); break; case KEY_CTRLSHIFTNUMENTER: case KEY_RCTRLSHIFTNUMENTER: case KEY_CTRLSHIFTENTER: case KEY_RCTRLSHIFTENTER: case KEY_ALTSHIFTBACKBRACKET: case KEY_RALTSHIFTBACKBRACKET: case KEY_CTRLSHIFTBACKBRACKET: case KEY_RCTRLSHIFTBACKBRACKET: SrcPanel=Cp->PassivePanel(); break; } if (SrcPanel) { if (Key == KEY_SHIFTENTER || Key == KEY_CTRLSHIFTENTER || Key == KEY_RCTRLSHIFTENTER || Key == KEY_SHIFTNUMENTER || Key == KEY_CTRLSHIFTNUMENTER || Key == KEY_RCTRLSHIFTNUMENTER) { string strShortFileName; SrcPanel->GetCurName(strPathName,strShortFileName); if (SrcPanel->GetShowShortNamesMode()) // учтем короткость имен :-) strPathName = strShortFileName; } else { if (!(SrcPanel->GetType()==FILE_PANEL || SrcPanel->GetType()==TREE_PANEL)) return FALSE; strPathName = SrcPanel->GetCurDir(); if (SrcPanel->GetMode()!=PLUGIN_PANEL) { if (NeedRealName) SrcPanel->CreateFullPathName(strPathName, strPathName, FILE_ATTRIBUTE_DIRECTORY, strPathName, TRUE, ShortNameAsIs); if (SrcPanel->GetShowShortNamesMode() && ShortNameAsIs) ConvertNameToShort(strPathName,strPathName); } else { FileList *SrcFilePanel=(FileList *)SrcPanel; OpenPanelInfo Info; Global->CtrlObject->Plugins->GetOpenPanelInfo(SrcFilePanel->GetPluginHandle(),&Info); FileList::AddPluginPrefix(SrcFilePanel,strPathName); if (Info.HostFile && *Info.HostFile) { strPathName += Info.HostFile; strPathName += L"/"; } strPathName += NullToEmpty(Info.CurDir); } AddEndSlash(strPathName); } if (Global->Opt->QuotedName"EDNAME_INSERT) QuoteSpace(strPathName); if (Param2) strPathName += Param2; RetCode=TRUE; } } break; } return RetCode; }
int Panel::SetPluginCommand(int Command,int Param1,void* Param2) { _ALGO(CleverSysLog clv(L"Panel::SetPluginCommand")); _ALGO(SysLog(L"(Command=%s, Param1=[%d/0x%08X], Param2=[%d/0x%08X])",_FCTL_ToName(Command),(int)Param1,Param1,(int)Param2,Param2)); int Result=FALSE; ProcessingPluginCommand++; switch (Command) { case FCTL_SETVIEWMODE: Result = Parent()->ChangePanelViewMode(shared_from_this(), Param1, Parent()->IsTopWindow()); break; case FCTL_SETSORTMODE: { int Mode=Param1; if ((Mode>SM_DEFAULT) && (Mode < SM_COUNT)) { SetSortMode(panel_sort(Mode - 1)); // Уменьшим на 1 из-за SM_DEFAULT Result=TRUE; } break; } case FCTL_SETSORTORDER: { ChangeSortOrder(Param1 != 0); Result=TRUE; break; } case FCTL_SETDIRECTORIESFIRST: { ChangeDirectoriesFirst(Param1 != 0); Result=TRUE; break; } case FCTL_CLOSEPANEL: if (m_PanelMode == panel_mode::PLUGIN_PANEL) { string folder=NullToEmpty((const wchar_t *)Param2); SetCurDir(folder,true); if (folder.empty()) Update(UPDATE_KEEP_SELECTION); Redraw(); } Result=TRUE; break; case FCTL_GETPANELINFO: { PanelInfo *Info=(PanelInfo *)Param2; if(!CheckStructSize(Info)) break; *Info = {}; Info->StructSize = sizeof(PanelInfo); UpdateIfRequired(); Info->OwnerGuid=FarGuid; Info->PluginHandle=nullptr; switch (GetType()) { case panel_type::FILE_PANEL: Info->PanelType=PTYPE_FILEPANEL; break; case panel_type::TREE_PANEL: Info->PanelType=PTYPE_TREEPANEL; break; case panel_type::QVIEW_PANEL: Info->PanelType=PTYPE_QVIEWPANEL; break; case panel_type::INFO_PANEL: Info->PanelType=PTYPE_INFOPANEL; break; } int X1,Y1,X2,Y2; GetPosition(X1,Y1,X2,Y2); Info->PanelRect.left=X1; Info->PanelRect.top=Y1; Info->PanelRect.right=X2; Info->PanelRect.bottom=Y2; Info->ViewMode=GetViewMode(); Info->SortMode = static_cast<OPENPANELINFO_SORTMODES>((GetSortMode() < panel_sort::COUNT? SM_UNSORTED - static_cast<int>(panel_sort::UNSORTED) : 0) + static_cast<int>(GetSortMode())); Info->Flags |= Global->Opt->ShowHidden? PFLAGS_SHOWHIDDEN : 0; Info->Flags |= Global->Opt->Highlight? PFLAGS_HIGHLIGHT : 0; Info->Flags |= GetSortOrder()? PFLAGS_REVERSESORTORDER : 0; Info->Flags |= GetSortGroups()? PFLAGS_USESORTGROUPS : 0; Info->Flags |= GetSelectedFirstMode()? PFLAGS_SELECTEDFIRST : 0; Info->Flags |= GetDirectoriesFirst()? PFLAGS_DIRECTORIESFIRST : 0; Info->Flags |= (GetMode() == panel_mode::PLUGIN_PANEL)? PFLAGS_PLUGIN : 0; Info->Flags |= IsVisible()? PFLAGS_VISIBLE : 0; Info->Flags |= IsFocused()? PFLAGS_FOCUS : 0; Info->Flags |= Parent()->IsLeft(this)? PFLAGS_PANELLEFT : 0; if (GetType() == panel_type::FILE_PANEL) { FileList *DestFilePanel=(FileList *)this; if (Info->Flags&PFLAGS_PLUGIN) { Info->OwnerGuid = DestFilePanel->GetPluginHandle()->plugin()->Id(); Info->PluginHandle = DestFilePanel->GetPluginHandle()->panel(); static int Reenter=0; if (!Reenter) { Reenter++; OpenPanelInfo PInfo; DestFilePanel->GetOpenPanelInfo(&PInfo); if (PInfo.Flags & OPIF_REALNAMES) Info->Flags |= PFLAGS_REALNAMES; if (PInfo.Flags & OPIF_DISABLEHIGHLIGHTING) Info->Flags &= ~PFLAGS_HIGHLIGHT; if (PInfo.Flags & OPIF_USECRC32) Info->Flags |= PFLAGS_USECRC32; if (PInfo.Flags & OPIF_SHORTCUT) Info->Flags |= PFLAGS_SHORTCUT; Reenter--; } } DestFilePanel->PluginGetPanelInfo(*Info); } if (!(Info->Flags&PFLAGS_PLUGIN)) // $ 12.12.2001 DJ - на неплагиновой панели - всегда реальные имена Info->Flags |= PFLAGS_REALNAMES; Result=TRUE; break; } case FCTL_GETPANELPREFIX: { string strTemp; if (GetType() == panel_type::FILE_PANEL && GetMode() == panel_mode::PLUGIN_PANEL) { PluginInfo PInfo = {sizeof(PInfo)}; FileList *DestPanel = ((FileList*)this); if (DestPanel->GetPluginInfo(&PInfo)) strTemp = NullToEmpty(PInfo.CommandPrefix); } if (Param1&&Param2) xwcsncpy((wchar_t*)Param2, strTemp.c_str(), Param1); Result=(int)strTemp.size()+1; break; } case FCTL_GETPANELHOSTFILE: case FCTL_GETPANELFORMAT: { string strTemp; if (GetType() == panel_type::FILE_PANEL) { FileList *DestFilePanel=(FileList *)this; static int Reenter=0; if (!Reenter && GetMode() == panel_mode::PLUGIN_PANEL) { Reenter++; OpenPanelInfo PInfo; DestFilePanel->GetOpenPanelInfo(&PInfo); switch (Command) { case FCTL_GETPANELHOSTFILE: strTemp=NullToEmpty(PInfo.HostFile); break; case FCTL_GETPANELFORMAT: strTemp=NullToEmpty(PInfo.Format); break; } Reenter--; } } if (Param1&&Param2) xwcsncpy((wchar_t*)Param2, strTemp.c_str(), Param1); Result=(int)strTemp.size()+1; break; } case FCTL_GETPANELDIRECTORY: { static int Reenter=0; if(!Reenter) { Reenter++; ShortcutInfo Info; GetShortcutInfo(Info); Result = static_cast<int>(aligned_sizeof<FarPanelDirectory>()); const auto folderOffset = Result; Result+=static_cast<int>(sizeof(wchar_t)*(Info.ShortcutFolder.size()+1)); const auto pluginFileOffset = Result; Result+=static_cast<int>(sizeof(wchar_t)*(Info.PluginFile.size()+1)); const auto pluginDataOffset = Result; Result+=static_cast<int>(sizeof(wchar_t)*(Info.PluginData.size()+1)); const auto dirInfo = static_cast<FarPanelDirectory*>(Param2); if(Param1>=Result && CheckStructSize(dirInfo)) { dirInfo->StructSize=sizeof(FarPanelDirectory); dirInfo->PluginId=Info.PluginGuid; dirInfo->Name = static_cast<wchar_t*>(static_cast<void*>(static_cast<char*>(Param2) + folderOffset)); dirInfo->Param = static_cast<wchar_t*>(static_cast<void*>(static_cast<char*>(Param2) + pluginDataOffset)); dirInfo->File = static_cast<wchar_t*>(static_cast<void*>(static_cast<char*>(Param2) + pluginFileOffset)); *std::copy(ALL_CONST_RANGE(Info.ShortcutFolder), const_cast<wchar_t*>(dirInfo->Name)) = L'\0'; *std::copy(ALL_CONST_RANGE(Info.PluginData), const_cast<wchar_t*>(dirInfo->Param)) = L'\0'; *std::copy(ALL_CONST_RANGE(Info.PluginFile), const_cast<wchar_t*>(dirInfo->File)) = L'\0'; } Reenter--; } break; } case FCTL_GETCOLUMNTYPES: case FCTL_GETCOLUMNWIDTHS: if (GetType() == panel_type::FILE_PANEL) { string strColumnTypes,strColumnWidths; ((FileList *)this)->PluginGetColumnTypesAndWidths(strColumnTypes,strColumnWidths); if (Command==FCTL_GETCOLUMNTYPES) { if (Param1&&Param2) xwcsncpy((wchar_t*)Param2,strColumnTypes.c_str(),Param1); Result=(int)strColumnTypes.size()+1; } else { if (Param1&&Param2) xwcsncpy((wchar_t*)Param2,strColumnWidths.c_str(),Param1); Result=(int)strColumnWidths.size()+1; } } break; case FCTL_GETPANELITEM: { if (GetType() == panel_type::FILE_PANEL && CheckNullOrStructSize(static_cast<FarGetPluginPanelItem*>(Param2))) Result = static_cast<int>(static_cast<FileList*>(this)->PluginGetPanelItem(Param1, static_cast<FarGetPluginPanelItem*>(Param2))); break; } case FCTL_GETSELECTEDPANELITEM: { if (GetType() == panel_type::FILE_PANEL && CheckNullOrStructSize(static_cast<FarGetPluginPanelItem*>(Param2))) Result = static_cast<int>(static_cast<FileList*>(this)->PluginGetSelectedPanelItem(Param1, static_cast<FarGetPluginPanelItem*>(Param2))); break; } case FCTL_GETCURRENTPANELITEM: { if (GetType() == panel_type::FILE_PANEL && CheckNullOrStructSize(static_cast<FarGetPluginPanelItem*>(Param2))) { PanelInfo Info; const auto DestPanel = static_cast<FileList*>(this); DestPanel->PluginGetPanelInfo(Info); Result = static_cast<int>(DestPanel->PluginGetPanelItem(static_cast<int>(Info.CurrentItem), static_cast<FarGetPluginPanelItem*>(Param2))); } break; } case FCTL_BEGINSELECTION: { if (GetType() == panel_type::FILE_PANEL) { ((FileList *)this)->PluginBeginSelection(); Result=TRUE; } break; } case FCTL_SETSELECTION: { if (GetType() == panel_type::FILE_PANEL) { ((FileList *)this)->PluginSetSelection(Param1, Param2 != nullptr); Result=TRUE; } break; } case FCTL_CLEARSELECTION: { if (GetType() == panel_type::FILE_PANEL) { static_cast<FileList*>(this)->PluginClearSelection(Param1); Result=TRUE; } break; } case FCTL_ENDSELECTION: { if (GetType() == panel_type::FILE_PANEL) { ((FileList *)this)->PluginEndSelection(); Result=TRUE; } break; } case FCTL_UPDATEPANEL: Update(Param1?UPDATE_KEEP_SELECTION:0); if (GetType() == panel_type::QVIEW_PANEL) UpdateViewPanel(); Result=TRUE; break; case FCTL_REDRAWPANEL: { PanelRedrawInfo *Info=(PanelRedrawInfo *)Param2; if (CheckStructSize(Info)) { m_CurFile=static_cast<int>(Info->CurrentItem); m_CurTopFile=static_cast<int>(Info->TopPanelItem); } // $ 12.05.2001 DJ перерисовываемся только в том случае, если мы - текущее окно if (Parent()->IsTopWindow()) Redraw(); Result=TRUE; break; } case FCTL_SETPANELDIRECTORY: { const auto dirInfo = static_cast<const FarPanelDirectory*>(Param2); if (CheckStructSize(dirInfo)) { Result = ExecShortcutFolder(NullToEmpty(dirInfo->Name), dirInfo->PluginId, NullToEmpty(dirInfo->File), NullToEmpty(dirInfo->Param), false, false, true); // restore current directory to active panel path if (!IsFocused()) { Parent()->ActivePanel()->SetCurPath(); } } break; } case FCTL_SETACTIVEPANEL: { if (IsVisible()) { Parent()->SetActivePanel(this); Result=TRUE; } break; } } ProcessingPluginCommand--; return Result; }
int PASCAL ProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName,wchar *DestPathW,wchar *DestNameW) { DataSet *Data=(DataSet *)hArcData; //try //{ Data->Cmd.DllError=0; if (Data->OpenMode==RAR_OM_LIST || Data->OpenMode==RAR_OM_LIST_INCSPLIT || Operation==RAR_SKIP && !Data->Arc.Solid) { if (Data->Arc.Volume && Data->Arc.GetHeaderType()==FILE_HEAD && (Data->Arc.NewLhd.Flags & LHD_SPLIT_AFTER)!=0) if (MergeArchive(Data->Arc,NULL,false,'L')) { Data->Extract.SignatureFound=false; Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); return(0); } else return(ERAR_EOPEN); Data->Arc.SeekToNext(); } else { Data->Cmd.DllOpMode=Operation; if (DestPath!=NULL || DestName!=NULL) { #ifdef _WIN_32 OemToChar(NullToEmpty(DestPath),Data->Cmd.ExtrPath); #else strcpy(Data->Cmd.ExtrPath,NullToEmpty(DestPath)); #endif AddEndSlash(Data->Cmd.ExtrPath); #ifdef _WIN_32 OemToChar(NullToEmpty(DestName),Data->Cmd.DllDestName); #else strcpy(Data->Cmd.DllDestName,NullToEmpty(DestName)); #endif } else { *Data->Cmd.ExtrPath=0; *Data->Cmd.DllDestName=0; } if (DestPathW!=NULL || DestNameW!=NULL) { strncpyw(Data->Cmd.ExtrPathW,NullToEmpty(DestPathW),NM-2); AddEndSlash(Data->Cmd.ExtrPathW); strncpyw(Data->Cmd.DllDestNameW,NullToEmpty(DestNameW),NM-1); if (*Data->Cmd.DllDestNameW!=0 && *Data->Cmd.DllDestName==0) WideToChar(Data->Cmd.DllDestNameW,Data->Cmd.DllDestName); } else { *Data->Cmd.ExtrPathW=0; *Data->Cmd.DllDestNameW=0; } strcpy(Data->Cmd.Command,Operation==RAR_EXTRACT ? "X":"T"); Data->Cmd.Test=Operation!=RAR_EXTRACT; bool Repeat=false; Data->Extract.ExtractCurrentFile(&Data->Cmd,Data->Arc,Data->HeaderSize,Repeat); while (Data->Arc.ReadHeader()!=0 && Data->Arc.GetHeaderType()==NEWSUB_HEAD) { Data->Extract.ExtractCurrentFile(&Data->Cmd,Data->Arc,Data->HeaderSize,Repeat); Data->Arc.SeekToNext(); } Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); } //} //catch (int ErrCode) //{ // return(RarErrorToDll(ErrCode)); //} return(Data->Cmd.DllError); }
UnicodeString & UnicodeString::operator=(const wchar_t * Str) { Init(Str, wcslen(NullToEmpty(Str))); return *this; }
AnsiString & AnsiString::operator=(const wchar_t * lpwszData) { Init(lpwszData, wcslen(NullToEmpty(lpwszData))); return *this; }
BaseFormat& BaseFormat::operator<<(LPCWSTR Data) { Data = NullToEmpty(Data); return Put(Data, StrLength(Data)); }
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(); }
DialogBuilder::DialogBuilder(LNGID TitleMessageId, const wchar_t *HelpTopic, Dialog::dialog_handler handler): m_HelpTopic(NullToEmpty(HelpTopic)), m_Mode(0), m_IdExist(false), m_handler(handler) { AddBorder(DialogBuilder::GetLangString(TitleMessageId)); }
UnicodeString& Copy(const wchar_t *Str) { return Copy(Str, StrLength(NullToEmpty(Str))); }
UnicodeString& Insert(size_t Pos, const wchar_t* Str) { return Insert(Pos, Str, StrLength(NullToEmpty(Str))); }
int PASCAL ProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName,wchar *DestPathW,wchar *DestNameW, string sParfileName) { DataSet *Data=(DataSet *)hArcData; try { Data->Arc.m_sParfileName = sParfileName; if (Data->OpenMode==RAR_OM_LIST || Operation==RAR_SKIP && !Data->Arc.Solid) { if (/*Data->OpenMode==RAR_OM_LIST && */Data->Arc.Volume && Data->Arc.GetHeaderType()==FILE_HEAD && (Data->Arc.NewLhd.Flags & LHD_SPLIT_AFTER)!=0) if (MergeArchive(Data->Arc,NULL,false,'L')) { Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); return(0); } else return(ERAR_EOPEN); Data->Arc.SeekToNext(); } else { if (DestPath!=NULL || DestName!=NULL) { OemToChar(NullToEmpty(DestPath),Data->Cmd.ExtrPath); OemToChar(NullToEmpty(DestName),Data->Cmd.ArcName); AddEndSlash(Data->Cmd.ExtrPath); } else { *Data->Cmd.ExtrPath=0; } if (DestPathW!=NULL || DestNameW!=NULL) { strncpyw(Data->Cmd.ExtrPathW,NullToEmpty(DestPathW),NM-2); AddEndSlash(Data->Cmd.ExtrPathW); } else { *Data->Cmd.ExtrPathW=0; } strcpy(Data->Cmd.Command,Operation==RAR_EXTRACT ? "X":"T"); Data->Cmd.Test=Operation!=RAR_EXTRACT; bool Repeat=false; Data->Extract.ExtractCurrentFile(&Data->Cmd,Data->Arc,Data->HeaderSize,Repeat); while (Data->Arc.ReadHeader()!=0 && Data->Arc.GetHeaderType()==NEWSUB_HEAD) { Data->Extract.ExtractCurrentFile(&Data->Cmd,Data->Arc,Data->HeaderSize,Repeat); Data->Arc.SeekToNext(); } Data->Arc.Seek(Data->Arc.CurBlockPos,SEEK_SET); } } catch (int ErrCode) { return(RarErrorToDll(ErrCode)); } catch(...) { return -1; } return 0; }
UnicodeString& Replace(size_t Pos, size_t Len, const wchar_t* Str) { return Replace(Pos, Len, Str, StrLength(NullToEmpty(Str))); }
void ShowProcessList() { static bool Active = false; if (Active) return; Active = true; VMenu2 ProcList(MSG(MProcessListTitle),nullptr,0,ScrY-4); ProcList.SetFlags(VMENU_WRAPMODE); ProcList.SetPosition(-1,-1,0,0); static bool bShowImage = false; struct ProcInfo pi={&ProcList,bShowImage}; if (EnumWindows(EnumWindowsProc,(LPARAM)&pi)) { ProcList.AssignHighlights(FALSE); ProcList.SetBottomTitle(MSG(MProcessListBottom)); ProcList.SortItems(TaskSort); ProcList.Run([&](int Key)->int { int KeyProcessed = 1; switch (Key) { case KEY_F1: { Help Hlp(L"TaskList"); break; } case KEY_NUMDEL: case KEY_DEL: { HWND ProcWnd=*static_cast<HWND*>(ProcList.GetUserData(nullptr,0)); if (ProcWnd) { wchar_t_ptr Title; int LenTitle=GetWindowTextLength(ProcWnd); if (LenTitle) { Title.reset(LenTitle + 1); if (Title && (LenTitle=GetWindowText(ProcWnd, Title.get(), LenTitle+1))) Title[LenTitle]=0; } DWORD ProcID; GetWindowThreadProcessId(ProcWnd,&ProcID); if (!Message(MSG_WARNING,2,MSG(MKillProcessTitle),MSG(MAskKillProcess), NullToEmpty(Title.get()),MSG(MKillProcessWarning),MSG(MKillProcessKill),MSG(MCancel))) { if (KillProcess(ProcID)) Sleep(500); else { Global->CatchError(); Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MKillProcessTitle),MSG(MCannotKillProcess),MSG(MOk)); } } } } case KEY_CTRLR: case KEY_RCTRLR: { ProcList.DeleteItems(); if (!EnumWindows(EnumWindowsProc,(LPARAM)&pi)) ProcList.Close(-1); else ProcList.SortItems(TaskSort); break; } case KEY_F2: { pi.bShowImage=(bShowImage=!bShowImage); int SelectPos=ProcList.GetSelectPos(); ProcList.DeleteItems(); if (!EnumWindows(EnumWindowsProc,(LPARAM)&pi)) ProcList.Close(-1); else { ProcList.SortItems(TaskSort); ProcList.SetSelectPos(SelectPos); } break; } default: KeyProcessed = 0; } return KeyProcessed; }); if (ProcList.GetExitCode()>=0) { HWND ProcWnd=*static_cast<HWND*>(ProcList.GetUserData(nullptr,0)); if (ProcWnd) { //SetForegroundWindow(ProcWnd); // Allow SetForegroundWindow on Win98+. DWORD dwMs; // Remember the current value. BOOL bSPI = SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &dwMs, 0); if (bSPI) // Reset foreground lock timeout bSPI = SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0); SetForegroundWindow(ProcWnd); if (bSPI) // Restore old value SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, ToPtr(dwMs), 0); WINDOWPLACEMENT wp; wp.length=sizeof(wp); if (!GetWindowPlacement(ProcWnd,&wp) || wp.showCmd!=SW_SHOWMAXIMIZED) ShowWindowAsync(ProcWnd,SW_RESTORE); } } } Active = false; }