示例#1
0
        public void GetImageAsync(FacebookImageDimensions requestedSize, GetImageSourceAsyncCallback callback)
        {
            Verify.IsNotNull(callback, "callback");

            Assert.IsNotNull(SourceService);
            Assert.IsNotNull(SourceService.WebGetter);

            SmallUri ss = _GetSmallUriFromRequestedSize(requestedSize);

            if (ss == default(SmallUri))
            {
                callback(this, new GetImageSourceCompletedEventArgs(new InvalidOperationException("The requested image doesn't exist"), false, this));
            }

            BitmapSource img;

            if (_TryGetFromWeakCache(requestedSize, out img))
            {
                callback(this, new GetImageSourceCompletedEventArgs(img, this));
            }

            var userState = new _ImageCallbackState {
                Callback = callback, RequestedSize = requestedSize
            };

            SourceService.WebGetter.GetImageSourceAsync(this, userState, ss, _AddWeakCacheCallback);
        }
示例#2
0
        /// <summary>
        /// Starts download of requested image
        /// </summary>
        /// <param name="requestedSize">Size of the image</param>
        /// <param name="callback">Callback that will be called when download completes</param>
        public void GetImageAsync(FacebookImageDimensions requestedSize, GetImageSourceAsyncCallback callback)
        {
#if !SILVERLIGHT
            dispatcher = Dispatcher.CurrentDispatcher;
#else
            dispatcher = System.Windows.Deployment.Current.Dispatcher;
#endif
            Uri = _normal;
            switch (requestedSize)
            {
            case FacebookImageDimensions.Big: Uri = _big; break;

            case FacebookImageDimensions.Small: Uri = _small; break;

            case FacebookImageDimensions.Square: Uri = _square; break;
            }

            if (Uri == null)
            {
                callback(this, new GetImageSourceCompletedEventArgs(new InvalidOperationException(), false, this));
                return;
            }


            WebClientHelper wc = new WebClientHelper(callback);
            wc.RequestCompleted += new EventHandler <RequestCompletedEventArgs>(wc_RequestCompleted);
            wc.SendRequest(Uri, null, null);
        }
示例#3
0
        void wc_RequestCompleted(object sender, RequestCompletedEventArgs e)
        {
            WebClientHelper wc = sender as WebClientHelper;

            ContentType = wc.ContentType;

            dispatcher.BeginInvoke(new Action(() =>
            {
                GetImageSourceCompletedEventArgs eventArgs;

                if (e.Error != null)
                {
                    eventArgs = new GetImageSourceCompletedEventArgs(e.Error, false, this);
                }
                else
                {
                    try
                    {
                        eventArgs = CreateBitmapFromStream(e.Response);
                    }
                    finally
                    {
                        e.Response.Close();
                    }
                }

                GetImageSourceAsyncCallback callback = (GetImageSourceAsyncCallback)e.UserState;
                callback(this, eventArgs);
            }));
        }
示例#4
0
        private void _ProcessNextLocalRequest(object unused)
        {
            while (_asyncPhotoPool != null)
            {
                // Retrieve the next data request for processing.
                GetImageSourceAsyncCallback callback = null;
                object   userState = null;
                object   sender    = null;
                SmallUri ssUri     = default(SmallUri);

                lock (_localLock)
                {
                    while (_activePhotoRequests.Count > 0)
                    {
                        _DataRequest nextDataRequest = _activePhotoRequests.Pop();
                        Assert.IsTrue(nextDataRequest.Callback is GetImageSourceAsyncCallback);
                        if (!nextDataRequest.Canceled)
                        {
                            sender    = nextDataRequest.Sender;
                            callback  = (GetImageSourceAsyncCallback)nextDataRequest.Callback;
                            userState = nextDataRequest.UserState;
                            ssUri     = nextDataRequest.SmallUri;
                            break;
                        }
                    }

                    if (ssUri == default(SmallUri))
                    {
                        Assert.AreEqual(0, _activePhotoRequests.Count);
                        return;
                    }
                }

                Assert.IsNotNull(callback);
                GetImageSourceCompletedEventArgs callbackArgs = null;
                string localCachePath = null;
                try
                {
                    localCachePath = _GetCacheLocation(ssUri);
                    if (localCachePath == null)
                    {
                        callbackArgs = new GetImageSourceCompletedEventArgs(new FileNotFoundException(), false, userState);
                    }
                    else
                    {
                        using (Stream imageStream = File.Open(localCachePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                        {
                            callbackArgs = new GetImageSourceCompletedEventArgs(_GetBitmapSourceFromStream(imageStream), userState);
                        }
                    }
                }
                catch (Exception e)
                {
                    if (!string.IsNullOrEmpty(localCachePath))
                    {
                        // If the cache is bad try removing the file so we can fetch it correctly next time.
                        try
                        {
                            File.Delete(localCachePath);
                        }
                        catch { }
                    }
                    callbackArgs = new GetImageSourceCompletedEventArgs(e, false, userState);
                }

                _callbackDispatcher.BeginInvoke(callback, sender, callbackArgs);
            }
        }
示例#5
0
        public void GetImageSourceAsync(object sender, object userState, SmallUri ssUri, GetImageSourceAsyncCallback callback)
        {
            //Verify.UriIsAbsolute(uri, "uri");
            Verify.IsNotNull(sender, "sender");
            // UserState may be null.
            // Verify.IsNotNull(userState, "userState");
            Verify.IsNotNull(callback, "callback");

            if (_disposed)
            {
                callback(this, new GetImageSourceCompletedEventArgs(new ObjectDisposedException("this"), false, userState));
                return;
            }

            if (default(SmallUri) == ssUri)
            {
                callback(this, new GetImageSourceCompletedEventArgs(new ArgumentException("The requested image doesn't exist.", "ssUri"), false, userState));
                return;
            }

            // Make asynchronous request to get ImageSource object from the data feed.
            var imageRequest = new _DataRequest
            {
                Sender    = sender,
                UserState = userState,
                SmallUri  = ssUri,
                Callback  = callback,
            };

            bool needToCache = _GetCacheLocation(ssUri) == null;

            if (needToCache)
            {
                bool needToQueue = false;
                lock (_webLock)
                {
                    needToQueue = !_asyncWebRequestPool.HasPendingRequests;
                    _activeWebRequests.Push(imageRequest);
                }

                if (needToQueue)
                {
                    _asyncWebRequestPool.QueueRequest(_ProcessNextWebRequest, null);
                    _asyncWebRequestPool.QueueRequest(_ProcessNextWebRequest, null);
                }
            }
            else
            {
                bool needToQueue = false;
                lock (_localLock)
                {
                    needToQueue = !_asyncPhotoPool.HasPendingRequests;
                    _activePhotoRequests.Push(imageRequest);
                }

                if (needToQueue)
                {
                    _asyncPhotoPool.QueueRequest(_ProcessNextLocalRequest, null);
                }
            }
        }
        /// <summary>
        /// Starts download of requested image
        /// </summary>
        /// <param name="requestedSize">Size of the image</param>
        /// <param name="callback">Callback that will be called when download completes</param>
        public void GetImageAsync(FacebookImageDimensions requestedSize, GetImageSourceAsyncCallback callback)
        {
            #if !SILVERLIGHT
            dispatcher = Dispatcher.CurrentDispatcher;
            #else
            dispatcher = System.Windows.Deployment.Current.Dispatcher;
            #endif
            Uri = _normal;
            switch (requestedSize)
            {
                case FacebookImageDimensions.Big: Uri = _big; break;
                case FacebookImageDimensions.Small: Uri = _small; break;
                case FacebookImageDimensions.Square: Uri = _square; break;
            }

            if (Uri == null)
            {
                callback(this, new GetImageSourceCompletedEventArgs(new InvalidOperationException(), false, this));
                return;
            }

            WebClientHelper wc = new WebClientHelper(callback);
            wc.RequestCompleted += new EventHandler<RequestCompletedEventArgs>(wc_RequestCompleted);
            wc.SendRequest(Uri, null, null);
        }