per-user-registry-20040320
[openafs.git] / src / WINNT / client_config / dlg_automap.cpp
index 752807b..5cce7a3 100644 (file)
@@ -1,10 +1,21 @@
+/*
+ * Copyright 2000, International Business Machines Corporation and others.
+ * All Rights Reserved.
+ * 
+ * This software has been released under the terms of the IBM Public
+ * License.  For details, see the LICENSE file in the top-level source
+ * directory or online at http://www.openafs.org/dl/license10.html
+ */
+
 extern "C" {
 #include <afs/param.h>
 #include <afs/stds.h>
+#include <afs/fs_utils.h>
 }
 
 #include "afs_config.h"
 #include <stdio.h>
+#include <lanahelper.h>
 
 /*
  * DEFINITIONS ________________________________________________________________
@@ -23,7 +34,6 @@ enum DDDACTION  { DDD_ADD, DDD_REMOVE };
  * PROTOTYPES _________________________________________________________________
  *
  */
-
 void AutoMap_OnInitDialog (HWND hDlg);
 void AutoMap_OnAdd (HWND hDlg);
 void AutoMap_OnSelect (HWND hDlg);
@@ -203,13 +213,14 @@ BOOL UpdateRegistry(DRIVEMAP *pDrive, BOOL bRemove)
    TCHAR szValueName[128];
    HKEY hKey;
    LONG result;
+   DWORD dwDispo;
 
    if (!pDrive)
       return FALSE;
 
-   _stprintf(szKeyName, TEXT("%s\\GlobalAutoMapper"), AFSConfigKeyName);
+   _stprintf(szKeyName, TEXT("%s\\GlobalAutoMapper"), AFSDConfigKeyName);
 
-   if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_SET_VALUE, &hKey) != ERROR_SUCCESS)
+   if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, &dwDispo) != ERROR_SUCCESS)
       return FALSE;
 
    _stprintf(szValueName, TEXT("%c:"), pDrive->chDrive);
@@ -227,29 +238,39 @@ BOOL UpdateRegistry(DRIVEMAP *pDrive, BOOL bRemove)
 
 BOOL DefineDosDrive(DRIVEMAP *pDrive, DDDACTION dddAction)
 {
-   TCHAR szAfsPath[MAX_PATH];
-   TCHAR szDrive[3] = TEXT("?:");
+    // TCHAR szAfsPath[MAX_PATH];
+    // TCHAR szDrive[3] = TEXT("?:");
    BOOL fResult = FALSE;
 
    if (!pDrive)
       return FALSE;
 
-   szDrive[0] = pDrive->chDrive;
-   _stprintf(szAfsPath, TEXT("\\Device\\LanmanRedirector\\%s\\%s-AFS\\%s"), szDrive, szHostName, pDrive->szSubmount);
-
    if (dddAction == DDD_REMOVE) {
-      fResult = DefineDosDevice(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, szDrive, szAfsPath);
-      if (!fResult)
-         Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), GetLastError());
+       if (!(fResult=(DisMountDOSDrive(pDrive->chDrive)==NO_ERROR)))
+           Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), GetLastError());
    } else if (dddAction == DDD_ADD) {
-      fResult = DefineDosDevice(DDD_RAW_TARGET_PATH, szDrive, szAfsPath);
-      if (!fResult)
-         Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), GetLastError());
+       if (!(fResult=(MountDOSDrive(pDrive->chDrive, pDrive->szSubmount,FALSE)==NO_ERROR)))
+          Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), GetLastError());
    }
-
+   /*
+     Replace this code with Drive mapping routine that doesn't require different formats for each OS
+     szDrive[0] = pDrive->chDrive;
+     _stprintf(szAfsPath, TEXT("\\Device\\LanmanRedirector\\%s\\%s-AFS\\%s"), szDrive, szHostName, pDrive->szSubmount);
+
+     if (dddAction == DDD_REMOVE) {
+         fResult = DefineDosDevice(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, szDrive, szAfsPath);
+        if (!fResult)
+             Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), GetLastError());
+     } else if (dddAction == DDD_ADD) {
+          fResult = DefineDosDevice(DDD_RAW_TARGET_PATH, szDrive, szAfsPath);
+         if (!fResult)
+             Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), GetLastError());
+     }
+
+    */
    if (fResult)
-         UpdateRegistry(pDrive, dddAction == DDD_REMOVE);
-
+       UpdateRegistry(pDrive, dddAction == DDD_REMOVE);
+   
    return fResult;
 }   
 
@@ -428,7 +449,13 @@ void AutoMapEdit_OnInitDialog (HWND hDlg)
    SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
 
    TCHAR szMapping[ MAX_PATH ];
-   AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : TEXT("/afs")), TRUE, FALSE);
+#ifdef NOLANA
+   AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : cm_slash_mount_root), TRUE, FALSE);
+#else
+    memset(szMapping, '\0', sizeof(szMapping));
+    szMapping[0] = '\\';
+    lana_GetNetbiosName(&szMapping[1], LANA_NETBIOS_NAME_FULL);
+#endif
    SetDlgItemText (hDlg, IDC_PATH, szMapping);
    SetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount);
 
@@ -456,12 +483,25 @@ void AutoMapEdit_OnOK (HWND hDlg)
       return;
       }
 
-   if ( (lstrncmpi (pMap->szMapping, TEXT("/afs"), lstrlen(TEXT("/afs")))) &&
-        (lstrncmpi (pMap->szMapping, TEXT("\\afs"), lstrlen(TEXT("\\afs")))) )
+#ifdef NOLANA
+    if ( (lstrncmpi (pMap->szMapping, cm_slash_mount_root, lstrlen(cm_slash_mount_root))) &&
+         (lstrncmpi (pMap->szMapping, cm_back_slash_mount_root, lstrlen(cm_back_slash_mount_root))) )
+    {
+        Message (MB_ICONHAND, GetErrorTitle(), IDS_BADMAP_DESC);
+        return;
+    }
+#else
+   TCHAR szName[MAX_PATH];
+   memset(szName, '\0', sizeof(szName));
+   szName[0] = '\\';
+   lana_GetNetbiosName(&szName[1], LANA_NETBIOS_NAME_FULL);
+
+   if ( lstrncmpi (pMap->szMapping, szName, lstrlen(szName) ))
       {
       Message (MB_ICONHAND, GetErrorTitle(), IDS_BADMAP_DESC);
       return;
       }
+#endif
 
    // First get a proper submount
    if (pMap->szSubmount[0]) {