View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0000597 | Wishes | Drive Menu | public | 2008-08-26 05: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 08: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 05:50 | daniel | New Issue | |
| 2008-08-26 08:33 | vskirdin | Note Added: 0001761 | |
| 2008-08-26 08:36 | daniel | Note Added: 0001762 | |
| 2008-08-26 09:15 | vskirdin | Note Added: 0001763 | |
| 2008-08-29 08:17 | daniel | File Added: remote_not_connected.patch | |
| 2008-08-29 08:19 | daniel | Note Added: 0001772 | |
| 2008-09-02 05:03 | daniel | Note Added: 0001788 | |
| 2008-09-04 02:14 | vskirdin | Note Added: 0001789 | |
| 2008-09-04 05:38 | vskirdin | Note Added: 0001794 | |
| 2008-09-04 08:27 | daniel | Note Added: 0001795 | |
| 2008-10-01 09:03 | dialex | Note Added: 0001857 | |
| 2008-10-08 16:38 | daniel | Note Added: 0001870 | |
| 2008-10-08 16:39 | daniel | Note Added: 0001871 | |
| 2009-04-05 12:50 | alexy | Build | => 843 |
| 2009-04-05 12:50 | alexy | Note Added: 0002891 | |
| 2009-04-05 12:50 | alexy | Assigned To | => alexy |
| 2009-04-05 12:50 | alexy | Status | new => assigned |
| 2009-04-05 12:50 | alexy | Fixed in Version | => 2.0 |
| 2009-04-05 12:51 | alexy | Status | assigned => closed |
| 2009-04-05 12:51 | alexy | Resolution | open => fixed |
| 2013-02-03 00:34 | alexy | Severity | minor => feature |