View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000597 | Wishes | Drive Menu | public | 2008-08-26 06:50 | 2013-02-03 00:34 |
Reporter | daniel | Assigned To | alexy | ||
Priority | normal | Severity | feature | Reproducibility | N/A |
Status | closed | Resolution | fixed | ||
Fixed in Version | 2.0 | ||||
Summary | 0000597: Подключение сетевых дисков | ||||
Description | Есть ситуация, когда есть сетевые диски, которые подключены в винде, при перезагрузке остаются но в фаре не видны пока на них через explorer не зайдёшь. Они имеют ещё иконку сетевого диска с крестиком. Вот очень хотелось бы получить функционал в фаре что б эти диски отображались в Drive Menu и пытались переподключиться при их выборе, по надобности запрашивая user/pass, которые сам фар умеет сохранять. | ||||
Tags | No tags attached. | ||||
Build | 843 | ||||
|
FAR получает "список" дисков функцией GetLogicalDrives() (mix.cpp#FarGetLogicalDrives()). Эта функция возвращает в маске 0 для такого диска. Any ideas? |
|
Интересно каким образом ТС или explorer получает список дисков. Было бы хорошо аналогично сделать и в фаре. |
|
хмм... щаз попробуем. есть идея |
2008-08-29 09:17
|
remote_not_connected.patch (7,507 bytes)
Property changes on: . ___________________________________________________________________ Added: svn:ignore + Debug.64.vc Debug.vc *.ncb *.suo copyright.inc Far.exe.manifest far.rc far18.VS2008.vcproj.ROCKNROLL.Administrator.user FarEng.lng FarRus.lng farversion.inc Include lang.hpp lang.ini Index: farwinapi.cpp =================================================================== --- farwinapi.cpp (revision 1958) +++ farwinapi.cpp (working copy) @@ -366,7 +366,7 @@ DWORD dwRemoteNameSize = 0; DWORD dwResult = WNetGetConnectionW(lpwszLocalName, NULL, &dwRemoteNameSize); - if ( dwResult == ERROR_SUCCESS ) + if ( dwResult == ERROR_MORE_DATA ) { wchar_t *lpwszRemoteName = strRemoteName.GetBuffer (dwRemoteNameSize); Index: fn.hpp =================================================================== --- fn.hpp (revision 1958) +++ fn.hpp (working copy) @@ -967,7 +967,7 @@ void __PrepareKMGTbStr(void); string& __stdcall FileSizeToStr(string &strDestStr, unsigned __int64 Size, int Width=-1, int ViewFlags=COLUMN_COMMAS); - +DWORD WINAPI FarGetRemoteDrives(void); DWORD WINAPI FarGetLogicalDrives(void); string &Add_PATHEXT(string &strDest); Index: mix.cpp =================================================================== --- mix.cpp (revision 1958) +++ mix.cpp (working copy) @@ -1174,8 +1174,45 @@ return strDest; } +//��������� ��� � ���� � ���������� �������� +#define FGRD_NR_COUNT 26 /* + FarGetRemoteDrives + ��������� ������ �����, + �� �������� ���� ��� �� ��� � FarGetLogicalDrives +*/ +DWORD WINAPI FarGetRemoteDrives(void) { + HANDLE hNetEnum = 0; + DWORD dwResult = 0; + if( WNetOpenEnum( RESOURCE_REMEMBERED, RESOURCETYPE_DISK, 0, NULL, &hNetEnum ) != NO_ERROR ) { + return dwResult; + } + + DWORD dwCount = FGRD_NR_COUNT; + DWORD dwSize = sizeof( NETRESOURCE ) * FGRD_NR_COUNT; + NETRESOURCE Netresources[FGRD_NR_COUNT]; + ZeroMemory( Netresources, sizeof( NETRESOURCE ) * FGRD_NR_COUNT ); + + if( WNetEnumResource( hNetEnum, &dwCount, Netresources, &dwSize ) != NO_ERROR ) { + WNetCloseEnum( hNetEnum ); + return dwResult; + } + + for( int i = 0; i < dwCount; i++ ) { + NETRESOURCE* pnr = Netresources + i; + TCHAR cLetter; + if( ( cLetter = *pnr->lpLocalName ) != L'\0' ) { + dwResult |= ( 1 << ( cLetter - L'A' ) ); + } + } + + WNetCloseEnum( hNetEnum ); + + return dwResult; +} + +/* FarGetLogicalDrives ������� ������ GetLogicalDrives, � ����� ���� �������� ������ HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer Index: panel.cpp =================================================================== --- panel.cpp (revision 1958) +++ panel.cpp (working copy) @@ -193,6 +193,7 @@ {DRIVE_REMOVABLE,MChangeDriveRemovable}, {DRIVE_FIXED,MChangeDriveFixed}, {DRIVE_REMOTE,MChangeDriveNetwork}, + {DRIVE_REMOTE_NOT_CONNECTED,MChangeDriveNetwork}, {DRIVE_CDROM,MChangeDriveCDROM}, {DRIVE_CD_RW,MChangeDriveCD_RW}, {DRIVE_CD_RWDVD,MChangeDriveCD_RWDVD}, @@ -202,7 +203,35 @@ {DRIVE_RAMDISK,MChangeDriveRAM}, }; +#define USER_PASS_DIALOG_W 35 +#define USER_PASS_DIALOG_H 9 +#define USER_PASS_DIALOG_OK 5 +int RemoteDriveConnectDialog( string &user, string &password ) { + // �������� �� ������� ����� ��������� + static struct DialogDataEx UserPassDlgData[]={ + /* 00 */ DI_DOUBLEBOX, 3, 1,USER_PASS_DIALOG_W - 4,USER_PASS_DIALOG_H-2,0,0,0,0,(wchar_t *)L"Login", + /* 01 */ DI_TEXT, 5, 2, 0, 2,0,0,0,0,(wchar_t *)MNetUserName, + /* 02 */ DI_EDIT, 5, 3,USER_PASS_DIALOG_W - 6, 3,1,NULL, 0, 0, L"", + /* 03 */ DI_TEXT, 5, 4, 0, 5,0,0,0,0,(wchar_t *)MNetUserPassword, + /* 04 */ DI_PSWEDIT, 5, 5,USER_PASS_DIALOG_W - 6, 5,1,NULL,0,0,L"", + /* 05 */ DI_BUTTON, 0,USER_PASS_DIALOG_H-3, 0,USER_PASS_DIALOG_H-3,0,0,DIF_CENTERGROUP,1,(wchar_t *)MOk, + /* 06 */ DI_BUTTON, 0,USER_PASS_DIALOG_H-3, 0,USER_PASS_DIALOG_H-3,0,0,DIF_CENTERGROUP,0,(wchar_t *)MCancel, + }; + MakeDialogItemsEx(UserPassDlgData,UserPassDlg); + Dialog Dlg(UserPassDlg,countof(UserPassDlg)); + Dlg.SetPosition(-1,-1,USER_PASS_DIALOG_W,USER_PASS_DIALOG_H); + Dlg.ClearDone(); + Dlg.Process(); + int nExitCode = Dlg.GetExitCode(); + if( nExitCode == USER_PASS_DIALOG_OK ) { + user = UserPassDlg[2].strData; + password = UserPassDlg[4].strData; + } + return nExitCode; +} + + int Panel::ChangeDiskMenu(int Pos,int FirstCall) { class Guard_Macro_DskShowPosType{ //���� ����-�� @@ -216,11 +245,11 @@ MenuItemEx ChDiskItem; string strDiskType, strRootDir, strDiskLetter; - DWORD Mask,DiskMask; + DWORD Mask,DiskMask,LogicalMask,RemoteMask; int DiskCount,Focus,I; int ShowSpecial=FALSE, SetSelected=FALSE; - Mask = FarGetLogicalDrives(); + Mask = ( LogicalMask = FarGetLogicalDrives() ) | ( RemoteMask = FarGetRemoteDrives() ); for (DiskMask=Mask,DiskCount=0;DiskMask!=0; DiskMask>>=1) DiskCount+=DiskMask & 1; @@ -253,7 +282,11 @@ strMenuText.Format (L"&%c: ",L'A'+I); strRootDir.Format (L"%c:\\",L'A'+I); - DriveType = FAR_GetDriveType(strRootDir,NULL,Opt.ChangeDriveMode & DRIVE_SHOW_CDROM?0x01:0); + if( ( ( 1 << I ) & RemoteMask ) && !( ( 1 << I ) & LogicalMask ) ) { + DriveType = DRIVE_REMOTE_NOT_CONNECTED; + } else { + DriveType = FAR_GetDriveType(strRootDir,NULL,Opt.ChangeDriveMode & DRIVE_SHOW_CDROM?0x01:0); + } if ( Opt.ChangeDriveMode & DRIVE_SHOW_TYPE ) { @@ -284,7 +317,7 @@ int ShowDisk = (DriveType!=DRIVE_REMOVABLE || (Opt.ChangeDriveMode & DRIVE_SHOW_REMOVABLE)) && (!IsDriveTypeCDROM(DriveType) || (Opt.ChangeDriveMode & DRIVE_SHOW_CDROM)) && - (DriveType!=DRIVE_REMOTE || (Opt.ChangeDriveMode & DRIVE_SHOW_REMOTE)); + (DriveType!=DRIVE_REMOTE || DriveType!=DRIVE_REMOTE_NOT_CONNECTED || (Opt.ChangeDriveMode & DRIVE_SHOW_REMOTE)); if ( Opt.ChangeDriveMode & (DRIVE_SHOW_LABEL|DRIVE_SHOW_FILESYSTEM) ) { @@ -979,9 +1012,29 @@ return -1; PanelMenuItem *item = (PanelMenuItem*)ChDisk.GetUserData(NULL,0); - - if (Opt.CloseCDGate && item && !item->bIsPlugin && IsDriveTypeCDROM(item->nDriveType) ) - { + if( item->nDriveType == DRIVE_REMOTE_NOT_CONNECTED ) { + wchar_t wszLocalName[3] = { item->cDrive, L':', L'\0' }; + string sRemote; + DWORD dwReturn = apiWNetGetConnection( wszLocalName, sRemote ); + if( dwReturn == ERROR_CONNECTION_UNAVAIL ) { + DWORD dwResult; + NETRESOURCEW Netresource; + ZeroMemory( &Netresource, sizeof( NETRESOURCEW ) ); + Netresource.dwType = RESOURCETYPE_DISK; + Netresource.lpLocalName = wszLocalName; + Netresource.lpRemoteName = sRemote.GetBuffer(); + DWORD dwReturn = WNetUseConnectionW( NULL, &Netresource, NULL, NULL, 0, NULL, NULL, &dwResult ); + if( dwReturn == ERROR_INVALID_PASSWORD || dwReturn == ERROR_LOGON_FAILURE || dwReturn == ERROR_ACCESS_DENIED ) { + string user, pass; + if( RemoteDriveConnectDialog( user, pass ) == USER_PASS_DIALOG_OK ) { + WNetUseConnectionW( NULL, &Netresource, user.GetBuffer(), pass.GetBuffer(), 0, NULL, NULL, &dwResult ); + } + user.ReleaseBuffer(); + pass.ReleaseBuffer(); + } + sRemote.ReleaseBuffer(); + } + } else if (Opt.CloseCDGate && item && !item->bIsPlugin && IsDriveTypeCDROM(item->nDriveType) ) { strRootDir.Format (L"%c:", item->cDrive); if ( !IsDiskInDrive(strRootDir) ) |
|
Залил патч, который добавляет функциональность которую я щапрашивал, за исключением кэширования паролей. Посмотрите плиззззз. Пожет не соблюдены какие то стили написания фара, но в целом всё работает. |
|
вы патч не смотрели? ещё в пятницу зааплоадил... хотелось бы хоть какой нибудь фидбэк получить... |
|
Нужно бы для начала проверить такой фар в разных сетях... Есть подозрение, что кое-где будет тормоза кидать, когда начнет работать FarGetRemoteDrives(). Хмм... может имеет смысл вместо опроса всего и всея (WNetEnumResource) заюзать WNetGetConnection() для тех дисков, которые в состоянии 0 после FarGetLogicalDrives? Здесь правда вот такая засада может быть (цитата): > В цикле сбора драйвов юзается WNetGetConnection() - эта функция будет тормозить? "Как правило" - нет. В том смысле, что для уже определённых(смапированных) ресурсов времени оно [практически] не занимает. Но - именно "как правило". Поскольку, если по каким-то "внешним" причинам на момент опроса идёт реконнект (может происходить, например, при м-м-м "переактивации" сетевого соединения) то зависнуть в ней [надолго] всё-таки можно :) |
|
И... кстати. В stddlg.cpp есть GetNameAndPasswordW() - это вместо твоего RemoteDriveConnectDialog() :-) |
|
По поводу WNetEnumResource - оно не перечисляет всё и вся, там фильтр стоит на сетевые диски. Поэтому оно быстрей ( поидее ) должно работать чем WNetGetConnection для всех 0 дисков. И ещё ( опять же поидее :) ) WNetEnumResource с такими фильтрами никуда не коннектится, а отдаёт просто локальные данные. А по поводу GetNameAndPasswordW(), уж ивиняйте, код фара первый раз в глаза видел :) В целом патч пойдёт? |
|
http://bugs.farmanager.com/view.php?id=363 не тоже самое? |
|
Ну да, похоже... Не видел этой задачи. Смотрите сами, какая реализация вам больше нравится :) |
|
P.S: Если захотите мою использовать, могу довести до ума. |
|
843 |
Date Modified | Username | Field | Change |
---|---|---|---|
2008-08-26 06:50 | daniel | New Issue | |
2008-08-26 09:33 | vskirdin | Note Added: 0001761 | |
2008-08-26 09:36 | daniel | Note Added: 0001762 | |
2008-08-26 10:15 | vskirdin | Note Added: 0001763 | |
2008-08-29 09:17 | daniel | File Added: remote_not_connected.patch | |
2008-08-29 09:19 | daniel | Note Added: 0001772 | |
2008-09-02 06:03 | daniel | Note Added: 0001788 | |
2008-09-04 03:14 | vskirdin | Note Added: 0001789 | |
2008-09-04 06:38 | vskirdin | Note Added: 0001794 | |
2008-09-04 09:27 | daniel | Note Added: 0001795 | |
2008-10-01 10:03 | dialex | Note Added: 0001857 | |
2008-10-08 17:38 | daniel | Note Added: 0001870 | |
2008-10-08 17:39 | daniel | Note Added: 0001871 | |
2009-04-05 13:50 | alexy | Build | => 843 |
2009-04-05 13:50 | alexy | Note Added: 0002891 | |
2009-04-05 13:50 | alexy | Assigned To | => alexy |
2009-04-05 13:50 | alexy | Status | new => assigned |
2009-04-05 13:50 | alexy | Fixed in Version | => 2.0 |
2009-04-05 13:51 | alexy | Status | assigned => closed |
2009-04-05 13:51 | alexy | Resolution | open => fixed |
2013-02-03 00:34 | alexy | Severity | minor => feature |