public override DialogResult ShowMagicDialog ()
		{
			var message = type == CredentialType.ProxyCredentials
				? GettextCatalog.GetString (
					"{0} needs credentials to access the proxy server {1}.",
					BrandingService.ApplicationName,
					uri.Host
				)
				: GettextCatalog.GetString (
					"{0} needs credentials to access {1}.",
					BrandingService.ApplicationName,
					uri.Host
				);

			var credUiInfo = new Native.CredentialUiInfo {
				MessageText = message,
				CaptionText = GettextCatalog.GetString ("Credentials Required"),
				StructureSize = Marshal.SizeOf (typeof (Native.CredentialUiInfo)),
				ParentWindow = GdkWin32.HgdiobjGet (IdeApp.Workbench.RootWindow.GdkWindow)
			};

			var save = false;

			StringBuilder username = new StringBuilder (current != null ? current.UserName : string.Empty, 100), 
			              password = new StringBuilder (current != null ? current.Password : string.Empty, 100),
			              domain = new StringBuilder (100);
			int maxUsername = 100, maxPassword = 100, maxDomain = 100;

			var windowsVersion = Environment.OSVersion.Version;

			// Vista or higher = 6.x+, XP = 5.x
			if (windowsVersion.Major >= 6) {
				int outputSize, authPackage = 0;
				IntPtr output;

				var pinnedArray = new GCHandle ();
				uint packedAuthBufferLength = 0;

				if (current != null) {
					// Have creds? Pack them into the buffer and predisplay them.
					const int credPackGenericCredentials = 4;
					Native.CredPackAuthenticationBuffer (credPackGenericCredentials, current.UserName, current.Password,
						IntPtr.Zero, ref packedAuthBufferLength);
					// Now we know the size of the buffer, allocate a byte[] and pin it
					var packedAuthBufferBytes = new byte[packedAuthBufferLength];
					// Free the dummy handle from before
					if (pinnedArray.IsAllocated)
						pinnedArray.Free ();
					pinnedArray = GCHandle.Alloc (packedAuthBufferBytes, GCHandleType.Pinned);
					Native.CredPackAuthenticationBuffer (credPackGenericCredentials, current.UserName, current.Password, pinnedArray.AddrOfPinnedObject (), ref packedAuthBufferLength);
				}

				var authBuffer = current == null ? IntPtr.Zero : pinnedArray.AddrOfPinnedObject (); ;
				var returnCode = Native.CredUIPromptForWindowsCredentials (ref credUiInfo, 0, ref authPackage, authBuffer, packedAuthBufferLength,
					out output, out outputSize, ref save, Native.CredentialsUiWindowsFlags.Generic);

				// Unpin the array if we held it before
				if (authBuffer != IntPtr.Zero)
					pinnedArray.Free ();

				if (returnCode != Native.WindowsCredentialPromptReturnCode.NoError)
					return DialogResult.Cancel;

				if (!Native.CredUnPackAuthenticationBuffer (0, output, outputSize, username, ref maxUsername, domain, ref maxDomain, password, ref maxPassword))
					return DialogResult.Cancel;

				Native.CoTaskMemFree (output);

				Username = username.ToString ();
				Password = password.ToString ();
				Domain = domain.ToString ();

				return DialogResult.OK;
			} else {
				const Native.CredentialsUiFlags flags = Native.CredentialsUiFlags.AlwaysShowUi | Native.CredentialsUiFlags.GenericCredentials;
				var returnCode = Native.CredUIPromptForCredentials (ref credUiInfo, BrandingService.ApplicationName, IntPtr.Zero, 0,
					username, maxUsername, password, maxPassword, ref save, flags);
				Username = username.ToString ();
				Password = password.ToString ();
				Domain = string.Empty;

				return returnCode == Native.CredUiReturnCodes.NoError ? DialogResult.OK : DialogResult.Cancel;
			}
		}
        public override DialogResult ShowMagicDialog()
        {
            var message = type == CredentialType.ProxyCredentials
                                ? GettextCatalog.GetString(
                "{0} needs credentials to access the proxy server {1}.",
                BrandingService.ApplicationName,
                uri.Host
                )
                                : GettextCatalog.GetString(
                "{0} needs credentials to access {1}.",
                BrandingService.ApplicationName,
                uri.Host
                );

            var credUiInfo = new Native.CredentialUiInfo {
                MessageText   = message,
                CaptionText   = GettextCatalog.GetString("Credentials Required"),
                StructureSize = Marshal.SizeOf(typeof(Native.CredentialUiInfo)),
                ParentWindow  = GdkWin32.HgdiobjGet(IdeApp.Workbench.RootWindow.GdkWindow)
            };

            var save = false;

            StringBuilder username = new StringBuilder(current != null ? current.UserName : string.Empty, 100),
                          password = new StringBuilder(current != null ? current.Password : string.Empty, 100),
                          domain = new StringBuilder(100);
            int maxUsername = 100, maxPassword = 100, maxDomain = 100;

            var windowsVersion = Environment.OSVersion.Version;

            // Vista or higher = 6.x+, XP = 5.x
            if (windowsVersion.Major >= 6)
            {
                int    outputSize, authPackage = 0;
                IntPtr output;

                var  pinnedArray            = new GCHandle();
                uint packedAuthBufferLength = 0;

                if (current != null)
                {
                    // Have creds? Pack them into the buffer and predisplay them.
                    const int credPackGenericCredentials = 4;
                    Native.CredPackAuthenticationBuffer(credPackGenericCredentials, current.UserName, current.Password,
                                                        IntPtr.Zero, ref packedAuthBufferLength);
                    // Now we know the size of the buffer, allocate a byte[] and pin it
                    var packedAuthBufferBytes = new byte[packedAuthBufferLength];
                    // Free the dummy handle from before
                    if (pinnedArray.IsAllocated)
                    {
                        pinnedArray.Free();
                    }
                    pinnedArray = GCHandle.Alloc(packedAuthBufferBytes, GCHandleType.Pinned);
                    Native.CredPackAuthenticationBuffer(credPackGenericCredentials, current.UserName, current.Password, pinnedArray.AddrOfPinnedObject(), ref packedAuthBufferLength);
                }

                var authBuffer = current == null ? IntPtr.Zero : pinnedArray.AddrOfPinnedObject();;
                var returnCode = Native.CredUIPromptForWindowsCredentials(ref credUiInfo, 0, ref authPackage, authBuffer, packedAuthBufferLength,
                                                                          out output, out outputSize, ref save, Native.CredentialsUiWindowsFlags.Generic);

                // Unpin the array if we held it before
                if (authBuffer != IntPtr.Zero)
                {
                    pinnedArray.Free();
                }

                if (returnCode != Native.WindowsCredentialPromptReturnCode.NoError)
                {
                    return(DialogResult.Cancel);
                }

                if (!Native.CredUnPackAuthenticationBuffer(0, output, outputSize, username, ref maxUsername, domain, ref maxDomain, password, ref maxPassword))
                {
                    return(DialogResult.Cancel);
                }

                Native.CoTaskMemFree(output);

                Username = username.ToString();
                Password = password.ToString();
                Domain   = domain.ToString();

                return(DialogResult.OK);
            }
            else
            {
                const Native.CredentialsUiFlags flags = Native.CredentialsUiFlags.AlwaysShowUi | Native.CredentialsUiFlags.GenericCredentials;
                var returnCode = Native.CredUIPromptForCredentials(ref credUiInfo, BrandingService.ApplicationName, IntPtr.Zero, 0,
                                                                   username, maxUsername, password, maxPassword, ref save, flags);
                Username = username.ToString();
                Password = password.ToString();
                Domain   = string.Empty;

                return(returnCode == Native.CredUiReturnCodes.NoError ? DialogResult.OK : DialogResult.Cancel);
            }
        }