Ejemplo n.º 1
0
        private void OnHTTPResponse(IAsyncResult result)
        {
            AsyncHttpResponse state = (AsyncHttpResponse)result.AsyncState;
            var success             = false;

            try
            {
                state.Request.EndGetResponse(result);
                success = true;
            }
            catch (WebException)
            {
                if (state.AssociatedAccount.Protocol == "https")
                {
                    // try to fetch certificate
                    try
                    {
                        var tls = new TLSHandshake();
                        tls.SetServerNameExtension(state.AssociatedAccount.Hostname);
                        var socket = new StreamSocket();
                        socket.Connect(state.AssociatedAccount.Hostname, state.AssociatedAccount.GetPort(true));
                        socket.Write(tls.CreateClientHello());

                        DateTime startTime = DateTime.Now;
                        while (true)
                        {
                            var data = socket.Read();
                            if (data.Length > 0)
                            {
                                var cert = tls.FindPacket(data, TLSHandshake.TLS_HANDSHAKE_CERTIFICATE);
                                if (cert.Length > 0)
                                {
                                    var details = tls.GetCertificateDetails(cert);
                                    if (details.Count > 0)
                                    {
                                        var certDetails = details[0];
                                        if (certDetails.ContainsKey("CN"))
                                        {
                                            Dispatcher.BeginInvoke(() =>
                                            {
                                                MessageBox.Show("EditAccountPage_Connection_Rejected".Translate(state.AssociatedAccount.Hostname, certDetails["CN"], certDetails["ValidAfter"], certDetails["ValidTo"]), "EditAccountPage_Connection_Rejected_Caption".Translate(), MessageBoxButton.OK);
                                                _overlay.Hide();
                                            });
                                            return;
                                        }
                                    }
                                    break;
                                }
                            }

                            if (DateTime.Now.Subtract(startTime).TotalSeconds > 5)
                            {
                                break;
                            }
                        }
                    }
                    catch (Exception)
                    {
                        // Host not reachable, no SSL host or TLS version not supported
                    }
                }
            }
            catch (Exception)
            {
                // HTTPWebRequest has failed
            }

            if (success)
            {
                // Testing DAV
                //TODO: Add your additional connection test statement here
                // To complete the test all fragments must have been fired.
                EventCollector collector = new EventCollector()
                {
                    Complete = () =>
                    {
                        OnConnectTestComplete(success, state.AssociatedAccount);
                    }
                };
                collector.WaitFor(state.AssociatedAccount.WebDAVPath);
                collector.WaitFor(state.AssociatedAccount.CalDAVPath);

                // define paths to test
                Queue <string> pathsToTest = new Queue <string>();
                pathsToTest.Enqueue(state.AssociatedAccount.WebDAVPath);
                pathsToTest.Enqueue(state.AssociatedAccount.CalDAVPath);

                // create master instance
                WebDAV davTest = new WebDAV(state.AssociatedAccount.GetUri(), state.AssociatedAccount.GetCredentials());

                // call tests
                while (pathsToTest.Count > 0)
                {
                    var path = pathsToTest.Dequeue();
                    davTest.StartRequest(DAVRequestHeader.CreateListing(path), path, (requestResult, userObj) =>
                    {
                        if (requestResult.Status != ServerStatus.MultiStatus)
                        {
                            // all other states are fail states
                            success = false;
                            Dispatcher.BeginInvoke(() =>
                            {
                                MessageBox.Show("EditAccountPage_CheckingConnection_DAVTestFailed".Translate(userObj, requestResult.StatusText), "Error_Caption".Translate(), MessageBoxButton.OK);
                            });
                        }
                        collector.Raise(userObj);
                    });
                }
            }
            else
            {
                OnConnectTestComplete(success, state.AssociatedAccount);
            }
        }
Ejemplo n.º 2
0
        private void FetchStructureComplete(DAVRequestResult result, object userObj)
        {
            if (result.Status == ServerStatus.MultiStatus && !result.Request.ErrorOccured && result.Items.Count > 0)
            {
                bool _firstItem = false;
                // display all items linear
                // we cannot wait till an item is displayed, instead for a fluid
                // behaviour we should calculate fadeIn-delays.
                int delayStart = 0;
                int delayStep  = 50; // ms

                foreach (DAVRequestResult.Item item in result.Items)
                {
                    File fileItem = new File()
                    {
                        FileName         = item.LocalReference,
                        FilePath         = item.Reference,
                        FileSize         = item.ContentLength,
                        FileType         = item.ContentType,
                        FileCreated      = item.CreationDate,
                        FileLastModified = item.LastModified,
                        IsDirectory      = item.ResourceType == ResourceType.Collection
                    };

                    bool display = true;

                    Dispatcher.BeginInvoke(() =>
                    {
                        switch (_views[_viewIndex])
                        {
                        case "detail":
                            if (!_firstItem)
                            {
                                _firstItem = true;

                                // Root
                                if (fileItem.IsDirectory)
                                {
                                    if (item.Reference == _workingAccount.WebDAVPath)
                                    {
                                        // cannot go up further
                                        display = false;
                                    }
                                    else
                                    {
                                        fileItem.IsRootItem = true;
                                        fileItem.FilePath   = fileItem.FileParentPath;
                                    }
                                }
                            }

                            if (display)
                            {
                                FileDetailViewControl detailControl = new FileDetailViewControl()
                                {
                                    DataContext = fileItem,
                                    Opacity     = 0,
                                    Background  = new SolidColorBrush()
                                    {
                                        Color = Colors.Transparent
                                    },
                                };

                                DetailList.Items.Add(detailControl);
                                detailControl.Delay(delayStart, () =>
                                {
                                    detailControl.FadeIn(100);
                                });
                                delayStart += delayStep;
                            }
                            break;

                        case "tile":
                            if (!_firstItem)
                            {
                                _firstItem = true;

                                // Root
                                if (fileItem.IsDirectory)
                                {
                                    if (item.Reference == _workingAccount.WebDAVPath)
                                    {
                                        // cannot go up further
                                        display = false;
                                    }
                                    else
                                    {
                                        fileItem.IsRootItem = true;
                                        fileItem.FilePath   = fileItem.FileParentPath;
                                    }
                                }
                            }

                            if (display)
                            {
                                FileMultiTileViewControl multiControl = new FileMultiTileViewControl(_workingAccount, fileItem, true)
                                {
                                    Width   = 200,
                                    Height  = 200,
                                    Opacity = 0,
                                    Margin  = new Thickness(0, 0, 10, 10),
                                };
                                multiControl.Tap += new EventHandler <System.Windows.Input.GestureEventArgs>(TileListSelectionChanged);

                                // sometimes the exception "wrong parameter" is thrown - but why???
                                TileView.Children.Add(multiControl);
                                multiControl.Delay(delayStart, () =>
                                {
                                    multiControl.FadeIn(100);
                                });
                            }

                            break;
                        }
                    });
                }

                Dispatcher.BeginInvoke(() =>
                {
                    _overlay.Hide();
                });
            }
            else
            {
                Dispatcher.BeginInvoke(() =>
                {
                    _overlay.Hide();
                    if (result.Status == ServerStatus.Unauthorized)
                    {
                        MessageBox.Show("FetchFile_Unauthorized".Translate(), "Error_Caption".Translate(), MessageBoxButton.OK);
                    }
                    else
                    {
                        MessageBox.Show("FetchFile_Unexpected_Result".Translate(), "Error_Caption".Translate(), MessageBoxButton.OK);
                    }
                });
            }
        }