public async void UploadPictures() { if (oneDriveConnector.isLoggedIn) { // Stop timer to allow time for uploading pictures in case next timer tick overlaps with this ongoing one AppController.uploadPicturesTimer.Stop(); try { QueryOptions querySubfolders = new QueryOptions(); querySubfolders.FolderDepth = FolderDepth.Deep; StorageFolder cacheFolder = KnownFolders.PicturesLibrary; cacheFolder = await cacheFolder.GetFolderAsync(AppSettings.FolderName); var result = cacheFolder.CreateFileQueryWithOptions(querySubfolders); var files = await result.GetFilesAsync(0, MaxPictureUpload); foreach (StorageFile file in files) { try { await uploadWithRetry(file); } catch (Exception ex) { Debug.WriteLine("UploadPictures(): " + ex.Message); // Log telemetry event about this exception var events = new Dictionary <string, string> { { "OneDrive", ex.Message } }; events.Add("File Failure", "File name: " + file.Name); TelemetryHelper.TrackEvent("FailedToUploadPicture", events); TelemetryHelper.TrackException(ex); } } } catch (Exception ex) { Debug.WriteLine("Exception in UploadPictures() " + ex.Message); // Log telemetry event about this exception var events = new Dictionary <string, string> { { "OneDrive", ex.Message } }; events.Add("Setup routine failure", "Exception thrown getting file list from pictures library"); TelemetryHelper.TrackEvent("FailedToUploadPicture", events); TelemetryHelper.TrackException(ex); } finally { AppController.uploadPicturesTimer.Start(); } } }
public async void DeleteExpiredPictures() { try { string folder = string.Format(AppSettings.ImageNameFormat, App.Controller.XmlSettings.OneDriveFolderPath, DateTime.Now.Subtract(TimeSpan.FromDays(App.Controller.XmlSettings.StorageDuration)).ToString("yyyy_MM_dd")); //List pictures in old day folder KeyValuePair <HttpResponseMessage, IList <string> > responseItems = await oneDriveConnector.ListFilesAsync(folder); List <string> pictures = new List <string>(responseItems.Value); if (pictures != null) { //Delete all pictures from the day foreach (string picture in pictures) { try { await deleteWithRetry(picture, folder); } catch (Exception ex) { Debug.WriteLine("Exception in deleteExpiredPictures() " + ex.Message); // Log telemetry event about this exception var events = new Dictionary <string, string> { { "OneDrive", ex.Message } }; events.Add("File Failure", "File name: " + picture); TelemetryHelper.TrackEvent("FailedToDeletePicture", events); TelemetryHelper.TrackException(ex); } } } } catch (Exception ex) { Debug.WriteLine("Exception in deleteExpiredPictures() " + ex.Message); // Log telemetry event about this exception var events = new Dictionary <string, string> { { "OneDrive", ex.Message } }; events.Add("Setup routine failure", "Exception thrown getting file list from OneDrive"); TelemetryHelper.TrackEvent("FailedToDeletePicture", events); TelemetryHelper.TrackException(ex); } }
private async Task writeResponseAsync(string request, IOutputStream os, StreamSocketInformation socketInfo) { try { string[] requestParts = request.Split('/'); #region Request for the root page, so redirect to home page if (request.Equals("/")) { await redirectToPage(NavConstants.HOME_PAGE, os); } #endregion #region Request for the home page else if (request.Contains(NavConstants.HOME_PAGE)) { // Generate the default config page string html = await helper.GenerateStatusPage(); await WebHelper.WriteToStream(html, os); } #endregion #region Request for the settings page else if (request.Contains(NavConstants.SETTINGS_PAGE)) { // Process the GET parameters if (request.Contains("?")) { // Format the URI with the get parameters Uri uri = new Uri("http://1.2.3.4:8000" + request); // Take the parameters from the URL and put it into Settings helper.ParseUriIntoSettings(uri); await AppSettings.SaveAsync(App.Controller.XmlSettings, "Settings.xml"); // This is an event that lets us know what the controller is done restarting after the settings are applied AutoResetEvent ase = new AutoResetEvent(false); // Dispose and Initialize need to be called on UI thread because of DispatcherTimers await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => { try { // Restart the controller to apply new settings App.Controller.Dispose(); await App.Controller.Initialize(); // Create the settings page and add a confirmation message that the settings were applied successfully string html = helper.GeneratePage("Security System Config", "Security System Config", helper.CreateHtmlFormFromSettings(), "<span style='color:Green'>Configuration saved!</span><br><br>"); await WebHelper.WriteToStream(html, os); } catch (Exception ex) { Debug.WriteLine("Error restarting controller: " + ex.Message); } // Signal that the restart is done ase.Set(); }); // Wait for controller restart to finish ase.WaitOne(); } else { // Generate the default config page string html = helper.GeneratePage("Security System Config", "Security System Config", helper.CreateHtmlFormFromSettings()); await WebHelper.WriteToStream(html, os); } } #endregion #region Request for the OneDrive page else if (request.Contains(NavConstants.ONEDRIVE_PAGE)) { // Take in the parameters and try to login to OneDrive if (request.Contains("?")) { // I just put some arbitrary IP and port just so I have a correctly formatted URI, it's not important to have an actual IP + port Uri uri = new Uri("http://1.2.3.4:8000" + request); await helper.ParseOneDriveUri(uri); var oneDrive = App.Controller.Storage as OneDrive; if (oneDrive != null) { if (oneDrive.IsLoggedIn()) { // Save tokens to settings file if we successfully logged in await AppSettings.SaveAsync(App.Controller.XmlSettings, "Settings.xml"); } } } // Generate page and write to stream string html = helper.GenerateOneDrivePage(); await WebHelper.WriteToStream(html, os); } #endregion #region Request for gallery page else if (request.Contains(NavConstants.GALLERY_PAGE)) { string html = ""; var storageType = App.Controller.Storage.GetType(); // If the storage type is OneDrive, generate page with link to OneDrive if (storageType == typeof(OneDrive)) { html = helper.GeneratePage("Gallery", "Gallery", "<b>" + storageType.Name + "</b> is set as your storage provider. " + "Please view your pictures on <a href='http://www.onedrive.com' target='_blank'>OneDrive</a>.<br><br>" + "To view your pictures here, please select <b>" + StorageProvider.Local + "</b> as your storage provider."); } // Otherwise show the gallery for the files on the device else { StorageFolder folder = KnownFolders.PicturesLibrary; int page = 1; int pageSize = 30; // Parse GET parameters if (request.Contains("?")) { Uri uri = new Uri("http://1.2.3.4:8000" + request); var parameters = helper.ParseGetParametersFromUrl(uri); try { // Find the folder that's specified in the parameters folder = await StorageFolder.GetFolderFromPathAsync(parameters["folder"]); if (parameters.ContainsKey("page")) { try { page = Convert.ToInt32(parameters["page"]); } catch (Exception) { } } if (parameters.ContainsKey("pageSize")) { try { pageSize = Convert.ToInt32(parameters["pageSize"]); } catch (Exception) { } } } catch (Exception ex) { Debug.WriteLine("Exception finding folder: " + ex.Message); folder = await folder.GetFolderAsync(AppSettings.FolderName); // Log telemetry event about this exception var events = new Dictionary <string, string> { { "WebServer", ex.Message } }; TelemetryHelper.TrackEvent("FailedToGetFolderFromPath", events); } } else { folder = await folder.GetFolderAsync(AppSettings.FolderName); } // Generate gallery page and write to stream string galleryHtml = await helper.GenerateGallery(folder, page, pageSize); html = helper.GeneratePage("Gallery", "Gallery", galleryHtml); } await WebHelper.WriteToStream(html, os); } #endregion #region Request for API else if (request.Contains("api")) { try { if (requestParts.Length > 2) { switch (requestParts[2].ToLower()) { // An image from the gallery was requested case "gallery": var temp = request.Split(new string[] { "gallery/" }, StringSplitOptions.None); // HTML decode the file path string decodedPath = WebUtility.UrlDecode(temp[1]); // Retrieve the file StorageFile file = await StorageFile.GetFileFromPathAsync(decodedPath); // Write the file to the stream await WebHelper.WriteFileToStream(file, os); break; } } }catch (Exception ex) { Debug.WriteLine("Exception in web API: " + ex.Message); // Log telemetry event about this exception var events = new Dictionary <string, string> { { "WebServer", ex.Message } }; TelemetryHelper.TrackEvent("FailedToProcessApiRequest", events); } } // Request for a file that is in the Assets\Web folder (e.g. logo, css file) #endregion #region Generate the Action page else if (request.Contains(NavConstants.ACTION_PAGE)) { Debug.WriteLine("Action page requested."); //await redirectToPage(NavConstants.HOME_PAGE, os); string html; string result = String.Empty; // Process the GET parameters if (request.Contains("?")) { // Format the URI with the get parameters Uri uri = new Uri("http://1.2.3.4:8000" + request); Dictionary <string, string> parameters = helper.ParseGetParametersFromUrl(uri); foreach (string key in parameters.Keys) { Debug.WriteLine("{0} = {1}", key, parameters[key]); } switch (parameters["myaction"]) { case "takephoto": Debug.WriteLine("Manually Taking photo..."); await App.Controller.Camera.TriggerCapture(); Debug.WriteLine("Photo capture done."); html = helper.GeneratePage("Actions", "Manual actions", helper.GenerationActionPage(), result = "<span style='color:Green'>Photo taken.</span><br><br>"); //await WebHelper.WriteToStream(html, os); break; case "sendknownimages": Debug.WriteLine("Registgering known images with Cortana FaceAPI....."); if (App.Controller.FaceClient == null) { result = "<span style='color:Red'>The FaceAPI key has not been set or is incorrect. Go to the Settings page and review the setting.</span><br><br>"; } else { //await App.Controller.FaceClient.RegisterKnownUsersAsync(); //result = "<span style='color:Green'>Known image upload complete</span><br><br>"; } break; default: break; } } html = helper.GeneratePage("Actions", "Manual actions", helper.GenerationActionPage(), result); await WebHelper.WriteToStream(html, os); } #endregion #region Return assets from web folder or error is nothing else matches else { using (Stream resp = os.AsStreamForWrite()) { bool exists = true; try { var folder = Windows.ApplicationModel.Package.Current.InstalledLocation; // Map the requested path to Assets\Web folder string filePath = @"Assets\Web" + request.Replace('/', '\\'); // Open the file and write it to the stream using (Stream fs = await folder.OpenStreamForReadAsync(filePath)) { string header = String.Format("HTTP/1.1 200 OK\r\n" + "Content-Length: {0}\r\n{1}" + "Connection: close\r\n\r\n", fs.Length, ((request.Contains("css")) ? "Content-Type: text/css\r\n" : "")); byte[] headerArray = Encoding.UTF8.GetBytes(header); await resp.WriteAsync(headerArray, 0, headerArray.Length); await fs.CopyToAsync(resp); } } catch (FileNotFoundException ex) { exists = false; // Log telemetry event about this exception var events = new Dictionary <string, string> { { "WebServer", ex.Message } }; TelemetryHelper.TrackEvent("FailedToOpenStream", events); } // Send 404 not found if can't find file if (!exists) { byte[] headerArray = Encoding.UTF8.GetBytes( "HTTP/1.1 404 Not Found\r\n" + "Content-Length:0\r\n" + "Connection: close\r\n\r\n"); await resp.WriteAsync(headerArray, 0, headerArray.Length); } await resp.FlushAsync(); } } #endregion } catch (FaceAPIException fex) { #region Track error for debugging Debug.WriteLine("Exception in FaceAPI code: " + fex.Message); #endregion #region Display error to user try { // Try to send an error page back if there was a problem servicing the request string html = helper.GeneratePage("Error", "Error", "There's been an error: " + fex.Message + "<br><br>"); await WebHelper.WriteToStream(html, os); } catch (Exception e) { TelemetryHelper.TrackException(e); } #endregion } catch (Exception ex) { #region Track error for debugging Debug.WriteLine("Exception in writeResponseAsync(): " + ex.Message); Debug.WriteLine(ex.StackTrace); // Log telemetry event about this exception //var events = new Dictionary<string, string> { { "WebServer", ex.Message } }; //TelemetryHelper.TrackEvent("FailedToWriteResponse", events); #endregion #region Display error to user try { // Try to send an error page back if there was a problem servicing the request string html = helper.GeneratePage("Error", "Error", "There's been an error: " + ex.Message + "<br><br>" + ex.StackTrace); await WebHelper.WriteToStream(html, os); } catch (Exception e) { TelemetryHelper.TrackException(e); } #endregion } }