예제 #1
0
        public async void LoadData(Account account) {
            _account = account;
            AccountName = _account.Name;

            var webDav = new WebDAVClient(_account.GetUri(), await _accountService.GetCredentials(_account));
            try {
                var files = await webDav.GetEntries(_account.WebDAVPath, true);
                Files = new ObservableCollection<WebDAVFile>
                    // except current folder
                    (files.Where(x => x.FilePath.ToString() != _account.WebDAVPath));
            } catch {

            }
        }
예제 #2
0
        private async 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
                var davTest = new WebDAVClient(state.AssociatedAccount.GetUri(), await App.AccountService.GetCredentials(state.AssociatedAccount));

                // call tests
                while (pathsToTest.Count > 0) {
                    var path = pathsToTest.Dequeue();
                    try {
                        await davTest.GetEntries(path, false);
                    } catch {
                        // all other states are fail states
                        success = false;
                        Dispatcher.BeginInvoke(() => {
                            //TODO: fix message
                            MessageBox.Show("EditAccountPage_CheckingConnection_DAVTestFailed".Translate(path, "requestResult.StatusText"), "Error_Caption".Translate(), MessageBoxButton.OK);
                        });
                    }

                    collector.Raise(path);
                }
            } else {
                OnConnectTestComplete(success, state.AssociatedAccount);
            }

        }
예제 #3
0
        private async Task QueryStructure() {
            var dav = new WebDAVClient(_workingAccount.GetUri(), await App.AccountService.GetCredentials(_workingAccount));
            try {
                var entries = await dav.GetEntries(_workingPath, true);
                if (entries.Count == 0) throw new Exception("No entries found");

                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 (var item in entries) {
                    File fileItem = new File() {
                        FileName = item.FileName,
                        FilePath = item.FilePath.ToString(),
                        FileSize = item.Size,
                        FileType = item.MimeType,
                        FileCreated = item.Created,
                        FileLastModified = item.LastModified,
                        IsDirectory = item.IsDirectory
                    };

                    bool display = true;


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

                                // Root
                                if (fileItem.IsDirectory) {
                                    if (item.FilePath.ToString() == _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.FilePath.ToString() == _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;
                    }
                }

                progress.IsVisible = false;
            } catch (Exception ex) {
                progress.IsVisible = false;
                var webException = ex as WebException;
                var webResponse = webException != null ? webException.Response as HttpWebResponse : null;
                if (webException != null &&
                    webException.Status == WebExceptionStatus.ProtocolError &&
                    webResponse != null &&
                    webResponse.StatusCode == HttpStatusCode.Unauthorized) {
                    MessageBox.Show("FetchFile_Unauthorized".Translate(), "Error_Caption".Translate(), MessageBoxButton.OK);
                } else {
                    MessageBox.Show("FetchFile_Unexpected_Result".Translate(), "Error_Caption".Translate(), MessageBoxButton.OK);
                }
            }
        }