Click here to Skip to main content
15,891,763 members
Articles / Multimedia / Audio

Build a Pandora clone with Silverlight 4

Rate me:
Please Sign up or sign in to vote.
4.94/5 (51 votes)
23 Oct 2012Ms-PL23 min read 192.3K   78  
Exercising Silverlight 4 to build a fun, real-world app
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO.IsolatedStorage;
using System.Text;
using System.Linq;
using System.Runtime.Serialization;
using System.Diagnostics.Contracts;

namespace JudahHimango.Chavah
{
    public static class LocalDataStore
    {
        const string clientIdFileName = "clientId";
        const string settingsFileName = "settings";
        
        public static Guid GetClientId()
        {
            var existing = GetExistingIdOrNull();
            return existing.HasValue ? existing.Value : CreateNewId();
        }

        public static LocalSettings GetSettings()
        {
            Contract.Ensures(Contract.Result<LocalSettings>() != null);
            try
            {
                return GetSettingsOrNull() ?? CreateSettings();
            }
            catch
            {
                return CreateSettings();
            }
        }

        private static Guid CreateNewId()
        {
            using (var store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                Contract.Assume(store != null);
                using (var newFile = store.CreateFile(clientIdFileName))
                {
                    Contract.Assume(newFile != null);
                    var id = Guid.NewGuid();
                    var idBytes = id.ToByteArray();
                    Contract.Assume(idBytes != null);
                    newFile.Write(idBytes, 0, idBytes.Length);
                    return id;
                }
            }
        }

        private static LocalSettings GetSettingsOrNull()
        {
            using (var store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                var settingsFilePath = store.GetFileNames(settingsFileName).FirstOrDefault();
                if (settingsFilePath != null)
                {
                    using (var settingsFile = store.OpenFile(settingsFilePath, System.IO.FileMode.Open))
                    {
                        var serializer = new DataContractSerializer(typeof(LocalSettings));
                        return (LocalSettings)serializer.ReadObject(settingsFile);
                    }
                }
            }
            return null;
        }

        private static LocalSettings CreateSettings()
        {
            Contract.Ensures(Contract.Result<LocalSettings>() != null);

            using (var store = GetLocalStore())
            using (var newFile = store.CreateFile(settingsFileName))
            {
                var settings = new LocalSettings();
                var serializer = new DataContractSerializer(typeof(LocalSettings));
                serializer.WriteObject(newFile, settings);
                return settings;
            }
        }

        private static IsolatedStorageFile GetLocalStore()
        {
            Contract.Ensures(Contract.Result<IsolatedStorageFile>() != null);

            var storage = IsolatedStorageFile.GetUserStoreForApplication();
            Contract.Assume(storage != null);
            return storage;
        }

        private static Guid? GetExistingIdOrNull()
        {
            using (var store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                var fileName = store.GetFileNames(clientIdFileName).FirstOrDefault();
                if (fileName != null)
                {
                    using (var file = store.OpenFile(fileName, System.IO.FileMode.Open))
                    {
                        var idBytes = new byte[16];
                        file.Read(idBytes, 0, 16);
                        return new Guid(idBytes);
                    }
                }
            }
            return null;
        }
                
        public static void SaveSettings(LocalSettings localSettings)
        {
            using (var store = IsolatedStorageFile.GetUserStoreForApplication())
            using (var file = store.OpenFile(settingsFileName, System.IO.FileMode.OpenOrCreate))
            {
                var serializer = new DataContractSerializer(typeof(LocalSettings));
                serializer.WriteObject(file, localSettings);
            }
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Microsoft Public License (Ms-PL)


Written By
Software Developer 3M
United States United States
Front end developer, RavenDB enthusiast, blogger, musician, husband, and father of 3.

Comments and Discussions