bool CPluginW2800::GetPanelInfo(GetPanelDirFlags Flags, CEPanelInfo* pInfo) { if (!InfoW2800 || !InfoW2800->PanelControl) return false; HANDLE hPanel = (Flags & gpdf_Active) ? PANEL_ACTIVE : PANEL_PASSIVE; PanelInfo pasv = {sizeof(pasv)}, actv = {sizeof(actv)}; PanelInfo* p; if (Flags & (gpdf_Left|gpdf_Right)) { InfoW2800->PanelControl(PANEL_ACTIVE, FCTL_GETPANELINFO, 0, &actv); InfoW2800->PanelControl(PANEL_PASSIVE, FCTL_GETPANELINFO, 0, &pasv); PanelInfo* pLeft = (actv.Flags & PFLAGS_PANELLEFT) ? &actv : &pasv; PanelInfo* pRight = (actv.Flags & PFLAGS_PANELLEFT) ? &pasv : &actv; p = (Flags & gpdf_Left) ? pLeft : pRight; hPanel = ((p->Flags & PFLAGS_FOCUS) == PFLAGS_FOCUS) ? PANEL_ACTIVE : PANEL_PASSIVE; } else { hPanel = (Flags & gpdf_Active) ? PANEL_ACTIVE : PANEL_PASSIVE; InfoW2800->PanelControl(hPanel, FCTL_GETPANELINFO, 0, &actv); p = &actv; } if (Flags & ppdf_GetItems) { static PanelInfo store; store = *p; pInfo->panelInfo = &store; } else { pInfo->panelInfo = NULL; } pInfo->bVisible = ((p->Flags & PFLAGS_VISIBLE) == PFLAGS_VISIBLE); pInfo->bFocused = ((p->Flags & PFLAGS_FOCUS) == PFLAGS_FOCUS); pInfo->bPlugin = ((p->Flags & PFLAGS_PLUGIN) == PFLAGS_PLUGIN); pInfo->nPanelType = (int)p->PanelType; pInfo->rcPanelRect = p->PanelRect; pInfo->ItemsNumber = p->ItemsNumber; pInfo->SelectedItemsNumber = p->SelectedItemsNumber; pInfo->CurrentItem = p->CurrentItem; if ((Flags & gpdf_NoHidden) && !pInfo->bVisible) return false; if (pInfo->szCurDir) { GetPanelDir(pInfo->bFocused ? gpdf_Active : gpdf_Passive, pInfo->szCurDir, BkPanelInfo_CurDirMax); } if (pInfo->bPlugin) { if (pInfo->szFormat) { PanelControl(hPanel, FCTL_GETPANELFORMAT, BkPanelInfo_FormatMax, pInfo->szFormat); // Если "Формат" панели получить не удалось - попробуем взять "префикс" плагина if (!*pInfo->szFormat) PanelControl(hPanel, FCTL_GETPANELPREFIX, BkPanelInfo_FormatMax, pInfo->szFormat); } if (pInfo->szHostFile) { PanelControl(hPanel, FCTL_GETPANELHOSTFILE, BkPanelInfo_HostFileMax, pInfo->szHostFile); } } else { if (pInfo->szFormat) pInfo->szFormat[0] = 0; if (pInfo->szHostFile) pInfo->szHostFile[0] = 0; } return true; }
void ProcessDragFromW995() { if (!InfoW995 || !InfoW995->AdvControl) return; WindowInfo WInfo; WInfo.Pos = 0; _ASSERTE(GetCurrentThreadId() == gnMainThreadId); InfoW995->AdvControl(InfoW995->ModuleNumber, ACTL_GETSHORTWINDOWINFO, (void*)&WInfo); if (!WInfo.Current) { int ItemsCount=0; //WriteFile(hPipe, &ItemsCount, sizeof(int), &cout, NULL); OutDataAlloc(sizeof(ItemsCount)); OutDataWrite(&ItemsCount,sizeof(ItemsCount)); return; } PanelInfo PInfo = {}; WCHAR *szCurDir = NULL; InfoW995->Control(PANEL_ACTIVE, FCTL_GETPANELINFO, NULL, (LONG_PTR)&PInfo); if ((PInfo.PanelType == PTYPE_FILEPANEL || PInfo.PanelType == PTYPE_TREEPANEL) && PInfo.Visible) { szCurDir = GetPanelDir(PANEL_ACTIVE); if (!szCurDir) { _ASSERTE(szCurDir!=NULL); int ItemsCount=0; OutDataWrite(&ItemsCount, sizeof(int)); OutDataWrite(&ItemsCount, sizeof(int)); // смена формата return; } int nDirLen=0, nDirNoSlash=0; if (szCurDir[0]) { nDirLen=lstrlen(szCurDir); if (nDirLen>0) if (szCurDir[nDirLen-1]!=L'\\') nDirNoSlash=1; } // Это только предполагаемый размер, при необходимости он будет увеличен OutDataAlloc(sizeof(int)+PInfo.SelectedItemsNumber*((MAX_PATH+2)+sizeof(int))); //Maximus5 - новый формат передачи int nNull=0; // ItemsCount //WriteFile(hPipe, &nNull, sizeof(int), &cout, NULL); OutDataWrite(&nNull/*ItemsCount*/, sizeof(int)); if (PInfo.SelectedItemsNumber<=0) { //if (nDirLen > 3 && szCurDir[1] == L':' && szCurDir[2] == L'\\') // Проверка того, что мы стоим на ".." if (PInfo.CurrentItem == 0 && PInfo.ItemsNumber > 0) { if (!nDirNoSlash) szCurDir[nDirLen-1] = 0; else nDirLen++; int nWholeLen = nDirLen + 1; OutDataWrite(&nWholeLen, sizeof(int)); OutDataWrite(&nDirLen, sizeof(int)); OutDataWrite(szCurDir, sizeof(WCHAR)*nDirLen); } // Fin OutDataWrite(&nNull/*ItemsCount*/, sizeof(int)); } else { PluginPanelItem **pi = (PluginPanelItem**)calloc(PInfo.SelectedItemsNumber, sizeof(PluginPanelItem*)); bool *bIsFull = (bool*)calloc(PInfo.SelectedItemsNumber, sizeof(bool)); int ItemsCount=PInfo.SelectedItemsNumber, i; int nMaxLen=MAX_PATH+1, nWholeLen=1; // сначала посчитать максимальную длину буфера for(i=0; i<ItemsCount; i++) { size_t sz = InfoW995->Control(PANEL_ACTIVE, FCTL_GETSELECTEDPANELITEM, i, NULL); if (!sz) continue; pi[i] = (PluginPanelItem*)calloc(sz, 1); // размер возвращается в байтах if (!InfoW995->Control(PANEL_ACTIVE, FCTL_GETSELECTEDPANELITEM, i, (LONG_PTR)(pi[i]))) { free(pi[i]); pi[i] = NULL; continue; } if (!pi[i]->FindData.lpwszFileName) { _ASSERTE(pi[i]->FindData.lpwszFileName!=NULL); free(pi[i]); pi[i] = NULL; continue; } if (i == 0 && ((pi[i]->FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) && !lstrcmpW(pi[i]->FindData.lpwszFileName, L"..")) { free(pi[i]); pi[i] = NULL; continue; } int nLen=nDirLen+nDirNoSlash; if ((pi[i]->FindData.lpwszFileName[0] == L'\\' && pi[i]->FindData.lpwszFileName[1] == L'\\') || (ISALPHA(pi[i]->FindData.lpwszFileName[0]) && pi[i]->FindData.lpwszFileName[1] == L':' && pi[i]->FindData.lpwszFileName[2] == L'\\')) { nLen = 0; bIsFull[i] = TRUE; } // это уже полный путь! nLen += lstrlenW(pi[i]->FindData.lpwszFileName); if (nLen>nMaxLen) nMaxLen = nLen; nWholeLen += (nLen+1); } nMaxLen += nDirLen; //WriteFile(hPipe, &nWholeLen, sizeof(int), &cout, NULL); OutDataWrite(&nWholeLen, sizeof(int)); WCHAR* Path = new WCHAR[nMaxLen+1]; for (i=0; i<ItemsCount; i++) { //WCHAR Path[MAX_PATH+1]; //ZeroMemory(Path, MAX_PATH+1); //Maximus5 - засада с корнем диска и возможностью overflow //StringCchPrintf(Path, countof(Path), L"%s\\%s", szCurDir, PInfo.SelectedItems[i]->FindData.lpwszFileName); Path[0]=0; if (!pi[i] || !pi[i]->FindData.lpwszFileName) continue; //этот элемент получить не удалось int nLen=0; if (nDirLen>0 && !bIsFull[i]) { lstrcpy(Path, szCurDir); if (nDirNoSlash) { Path[nDirLen]=L'\\'; Path[nDirLen+1]=0; } nLen = nDirLen+nDirNoSlash; } lstrcpy(Path+nLen, pi[i]->FindData.lpwszFileName); nLen += lstrlen(pi[i]->FindData.lpwszFileName); nLen++; //WriteFile(hPipe, &nLen, sizeof(int), &cout, NULL); OutDataWrite(&nLen, sizeof(int)); //WriteFile(hPipe, Path, sizeof(WCHAR)*nLen, &cout, NULL); OutDataWrite(Path, sizeof(WCHAR)*nLen); } for(i=0; i<ItemsCount; i++) { if (pi[i]) free(pi[i]); } free(pi); pi = NULL; free(bIsFull); delete [] Path; Path=NULL; // Конец списка //WriteFile(hPipe, &nNull, sizeof(int), &cout, NULL); OutDataWrite(&nNull, sizeof(int)); } SafeFree(szCurDir); } else { int ItemsCount=0; OutDataWrite(&ItemsCount, sizeof(int)); OutDataWrite(&ItemsCount, sizeof(int)); // смена формата } //free(szCurDir); }
void ProcessDragToW995() { if (!InfoW995 || !InfoW995->AdvControl) return; WindowInfo WInfo = {}; //WInfo.Pos = 0; WInfo.Pos = -1; // попробуем работать в диалогах и редакторе _ASSERTE(GetCurrentThreadId() == gnMainThreadId); InfoW995->AdvControl(InfoW995->ModuleNumber, ACTL_GETSHORTWINDOWINFO, (void*)&WInfo); if (!WInfo.Current) { int ItemsCount=0; if (gpCmdRet==NULL) OutDataAlloc(sizeof(ItemsCount)); OutDataWrite(&ItemsCount,sizeof(ItemsCount)); return; } int nStructSize; if ((WInfo.Type == WTYPE_DIALOG) || (WInfo.Type == WTYPE_EDITOR)) { // разрешить дроп в виде текста ForwardedPanelInfo DlgInfo = {}; DlgInfo.NoFarConsole = TRUE; nStructSize = sizeof(DlgInfo); if (gpCmdRet==NULL) OutDataAlloc(nStructSize+sizeof(nStructSize)); OutDataWrite(&nStructSize, sizeof(nStructSize)); OutDataWrite(&DlgInfo, nStructSize); return; } else if (WInfo.Type != WTYPE_PANELS) { // Иначе - дроп не разрешен int ItemsCount=0; if (gpCmdRet==NULL) OutDataAlloc(sizeof(ItemsCount)); OutDataWrite(&ItemsCount,sizeof(ItemsCount)); return; } nStructSize = sizeof(ForwardedPanelInfo)+4; // потом увеличим на длину строк //InfoW995->AdvControl(InfoW995->ModuleNumber, ACTL_FREEWINDOWINFO, (void*)&WInfo); PanelInfo PAInfo = {}, PPInfo = {}; ForwardedPanelInfo *pfpi=NULL; //ZeroMemory(&fpi, sizeof(fpi)); BOOL lbAOK = FALSE, lbPOK = FALSE; WCHAR *szPDir = NULL; WCHAR *szADir = NULL; //if (!(lbAOK=InfoW995->Control(PANEL_ACTIVE, FCTL_GETPANELSHORTINFO, &PAInfo))) lbAOK=InfoW995->Control(PANEL_ACTIVE, FCTL_GETPANELINFO, 0, (LONG_PTR)&PAInfo) && (szADir = GetPanelDir(PANEL_ACTIVE)); if (lbAOK && szADir) nStructSize += (lstrlen(szADir))*sizeof(WCHAR); //-V103 lbPOK=InfoW995->Control(PANEL_PASSIVE, FCTL_GETPANELINFO, 0, (LONG_PTR)&PPInfo) && (szPDir = GetPanelDir(PANEL_PASSIVE)); if (lbPOK && szPDir) nStructSize += (lstrlen(szPDir))*sizeof(WCHAR); // Именно WCHAR! не TCHAR //-V103 pfpi = (ForwardedPanelInfo*)calloc(nStructSize,1); if (!pfpi) { int ItemsCount=0; //WriteFile(hPipe, &ItemsCount, sizeof(int), &cout, NULL); if (gpCmdRet==NULL) OutDataAlloc(sizeof(ItemsCount)); OutDataWrite(&ItemsCount,sizeof(ItemsCount)); SafeFree(szADir); SafeFree(szPDir); return; } pfpi->ActivePathShift = sizeof(ForwardedPanelInfo); pfpi->pszActivePath = (WCHAR*)(((char*)pfpi)+pfpi->ActivePathShift); pfpi->PassivePathShift = pfpi->ActivePathShift+2; // если ActivePath заполнится - увеличим if (lbAOK) { pfpi->ActiveRect=PAInfo.PanelRect; if (!PAInfo.Plugin && (PAInfo.PanelType == PTYPE_FILEPANEL || PAInfo.PanelType == PTYPE_TREEPANEL) && PAInfo.Visible) { if (szADir[0]) { lstrcpyW(pfpi->pszActivePath, szADir); pfpi->PassivePathShift += lstrlenW(pfpi->pszActivePath)*2; } } } pfpi->pszPassivePath = (WCHAR*)(((char*)pfpi)+pfpi->PassivePathShift); if (lbPOK) { pfpi->PassiveRect=PPInfo.PanelRect; if (!PPInfo.Plugin && (PPInfo.PanelType == PTYPE_FILEPANEL || PPInfo.PanelType == PTYPE_TREEPANEL) && PPInfo.Visible) { if (szPDir[0]) lstrcpyW(pfpi->pszPassivePath, szPDir); } } // Собственно, пересылка информации //WriteFile(hPipe, &nStructSize, sizeof(nStructSize), &cout, NULL); //WriteFile(hPipe, pfpi, nStructSize, &cout, NULL); if (gpCmdRet==NULL) OutDataAlloc(nStructSize+4); OutDataWrite(&nStructSize, sizeof(nStructSize)); OutDataWrite(pfpi, nStructSize); free(pfpi); pfpi=NULL; SafeFree(szADir); SafeFree(szPDir); }
bool CPluginW995::GetPanelInfo(GetPanelDirFlags Flags, CEPanelInfo* pInfo) { if (!InfoW995 || !InfoW995->Control) return false; _ASSERTE(gFarVersion.dwBuild >= 1657); HANDLE hPanel = (Flags & gpdf_Active) ? PANEL_ACTIVE : PANEL_PASSIVE; PanelInfo pasv = {}, actv = {}; PanelInfo* p; if (Flags & (gpdf_Left|gpdf_Right)) { InfoW995->Control(PANEL_ACTIVE, FCTL_GETPANELINFO, 0, (LONG_PTR)&actv); InfoW995->Control(PANEL_PASSIVE, FCTL_GETPANELINFO, 0, (LONG_PTR)&pasv); PanelInfo* pLeft = (actv.Flags & PFLAGS_PANELLEFT) ? &actv : &pasv; PanelInfo* pRight = (actv.Flags & PFLAGS_PANELLEFT) ? &pasv : &actv; p = (Flags & gpdf_Left) ? pLeft : pRight; hPanel = (p->Focus) ? PANEL_ACTIVE : PANEL_PASSIVE; } else { hPanel = (Flags & gpdf_Active) ? PANEL_ACTIVE : PANEL_PASSIVE; InfoW995->Control(hPanel, FCTL_GETPANELINFO, 0, (LONG_PTR)&actv); p = &actv; } if (Flags & ppdf_GetItems) { static PanelInfo store; store = *p; pInfo->panelInfo = &store; } else { pInfo->panelInfo = NULL; } pInfo->bVisible = p->Visible; pInfo->bFocused = p->Focus; pInfo->bPlugin = p->Plugin; pInfo->nPanelType = p->PanelType; pInfo->rcPanelRect = p->PanelRect; pInfo->ItemsNumber = p->ItemsNumber; pInfo->SelectedItemsNumber = p->SelectedItemsNumber; pInfo->CurrentItem = p->CurrentItem; if ((Flags & gpdf_NoHidden) && !pInfo->bVisible) return false; if (pInfo->szCurDir) { GetPanelDir(pInfo->bFocused ? gpdf_Active : gpdf_Passive, pInfo->szCurDir, BkPanelInfo_CurDirMax); } if (pInfo->bPlugin) { if (pInfo->szFormat) PanelControl(hPanel, FCTL_GETPANELFORMAT, BkPanelInfo_FormatMax, pInfo->szFormat); if (pInfo->szHostFile) PanelControl(hPanel, FCTL_GETPANELHOSTFILE, BkPanelInfo_HostFileMax, pInfo->szHostFile); } else { if (pInfo->szFormat) pInfo->szFormat[0] = 0; if (pInfo->szHostFile) pInfo->szHostFile[0] = 0; } return true; }