// ----------------------------------------------- //
		
		// FIXME: Ok, this is a real hack, it has half-support for buying multiple songs
		// but doenst really allow it yet. Will overwrite the song with the last one downloaded.
		protected virtual void ThreadWorker()
		{
			user_event = new ActiveUserEvent (String.Format (Catalog.GetString ("Purchasing {0} - {1}"), track.Artist, track.Title));
			
			user_event.CanCancel = false;
			user_event.Icon = IconThemeUtils.LoadIcon("document-save", 22); // FIXME: Get a nice icon
			
			user_event.Header = Catalog.GetString ("Purchasing");
			user_event.Message = String.Format ("{0} - {1}", track.Artist, track.Title);

			ArrayList songs = new ArrayList ();
			try {
				songs = plugin.Store.Buy (track.Data);
			} catch (Exception ex) {
				// FIXME: Error handling correct?
				user_event.Dispose ();
				HigMessageDialog.RunHigMessageDialog (null,
								      0,
								      MessageType.Error,
								      ButtonsType.Ok,
								      "Purchase Error",
								      String.Format ("There was an error while performing the purchase: {0}", ex.Message)); 				
				return;
			}

			Hashtable song, meta;

			for (int i = 0; i < songs.Count; i++) {
				song = (Hashtable) songs[i];
				meta = song[ "metaData" ] != null ? (Hashtable)song ["metaData"] : song;
				
				user_event.Header = String.Format (Catalog.GetString ("Downloading {0} of {1}"), i+1, songs.Count);
				user_event.Message = String.Format (Catalog.GetString ("{0} - {1}"), track.Artist, track.Title);

				try {
					byte [] buffer = plugin.Store.DownloadSong (song, new FairStore.Progress (ProgressUpdate));
					
					FileStream fs = new FileStream (MusicStorePlugin.GetLibraryPathForTrack (track), FileMode.CreateNew);
	                    		BinaryWriter bw = new BinaryWriter (fs);
                    			bw.Write (buffer);
                    			bw.Close ();
                    			fs.Close ();
				} catch (Exception ex) {
					// FIXME: Error handling correct?
					user_event.Dispose ();
					HigMessageDialog.RunHigMessageDialog (null,
									      0,
									      MessageType.Error,
									      ButtonsType.Ok,
									      "Download Error",
									      String.Format ("There was an error while performing the download: {0}", ex.Message)); 
					return;
				}
			}
			user_event.Dispose ();
		}
        // ----------------------------------------------- //
        // FIXME: Ok, this is a real hack, it has half-support for buying multiple songs
        // but doenst really allow it yet. Will overwrite the song with the last one downloaded.
        protected virtual void ThreadWorker()
        {
            user_event = new ActiveUserEvent (String.Format (Catalog.GetString ("Purchasing {0} - {1}"), track.Artist, track.Title));

            user_event.CanCancel = false;
            user_event.Icon = IconThemeUtils.LoadIcon("document-save", 22); // FIXME: Get a nice icon

            user_event.Header = Catalog.GetString ("Purchasing");
            user_event.Message = String.Format ("{0} - {1}", track.Artist, track.Title);

            ArrayList songs = new ArrayList ();
            try {
                songs = plugin.Store.Buy (track.Data);
            } catch (Exception ex) {
                // FIXME: Error handling correct?
                user_event.Dispose ();
                HigMessageDialog.RunHigMessageDialog (null,
                                      0,
                                      MessageType.Error,
                                      ButtonsType.Ok,
                                      "Purchase Error",
                                      String.Format ("There was an error while performing the purchase: {0}", ex.Message));
                return;
            }

            Hashtable song, meta;

            for (int i = 0; i < songs.Count; i++) {
                song = (Hashtable) songs[i];
                meta = song[ "metaData" ] != null ? (Hashtable)song ["metaData"] : song;

                user_event.Header = String.Format (Catalog.GetString ("Downloading {0} of {1}"), i+1, songs.Count);
                user_event.Message = String.Format (Catalog.GetString ("{0} - {1}"), track.Artist, track.Title);

                try {
                    byte [] buffer = plugin.Store.DownloadSong (song, new FairStore.Progress (ProgressUpdate));

                    FileStream fs = new FileStream (MusicStorePlugin.GetLibraryPathForTrack (track), FileMode.CreateNew);
                                BinaryWriter bw = new BinaryWriter (fs);
                                bw.Write (buffer);
                                bw.Close ();
                                fs.Close ();
                } catch (Exception ex) {
                    // FIXME: Error handling correct?
                    user_event.Dispose ();
                    HigMessageDialog.RunHigMessageDialog (null,
                                          0,
                                          MessageType.Error,
                                          ButtonsType.Ok,
                                          "Download Error",
                                          String.Format ("There was an error while performing the download: {0}", ex.Message));
                    return;
                }
            }
            user_event.Dispose ();
        }
 private static void CreateUserEventProxy(object o, EventArgs args)
 {
     if (userEvent == null)
     {
         userEvent                  = new ActiveUserEvent(Catalog.GetString("Download"));
         userEvent.Icon             = IconThemeUtils.LoadIcon(Stock.Network, 22);
         userEvent.Header           = Catalog.GetString("Downloading Files");
         userEvent.Message          = Catalog.GetString("Initializing downloads");
         userEvent.CancelRequested += OnUserEventCancelRequestedHandler;
         cancel_requested           = false;
     }
 }
        private void ThreadedImport()
        {
            query = new Query();
            query.AddDomain(QueryDomain.Neighborhood);
            query.MaxHits = 10000; // ugh?

            QueryPart_Property file_part = new QueryPart_Property();

            file_part.Type  = PropertyType.Keyword;
            file_part.Key   = "beagle:HitType";
            file_part.Value = "File";
            query.AddPart(file_part);

            QueryPart_Or query_part_union = new QueryPart_Or();

            foreach (string mimetype in supported_mime_types)
            {
                QueryPart_Property part = new QueryPart_Property();
                part.Type  = PropertyType.Keyword;
                part.Key   = "beagle:MimeType";
                part.Value = mimetype;
                query_part_union.Add(part);
            }

            query.AddPart(query_part_union);

            query.HitsAddedEvent += OnHitsAdded;
            query.FinishedEvent  += OnFinished;

            user_event                  = new ActiveUserEvent(Catalog.GetString("Import from Beagle"));
            user_event.Header           = Catalog.GetString("Importing from Beagle");
            user_event.Message          = Catalog.GetString("Running query...");
            user_event.Icon             = Icon;
            user_event.CancelRequested += OnCancelRequested;

            try {
                query.SendAsyncBlocking();
            } catch (Exception e) {
                DisposeQuery();
                LogCore.Instance.PushError(Catalog.GetString("Could not query Beagle Daemon"),
                                           e.Message, true);
                return;
            }

            if (SourceManager.ActiveSource is LibrarySource)
            {
                LibrarySource.Instance.Activate();
            }
        }
        private void DestroyUserEvent()
        {
            lock (update_sync)
            {
                if (userEvent != null)
                {
                    if (!userEvent.IsCancelRequested)
                    {
                        Thread.Sleep(500);
                    }

                    userEvent.Dispose();
                    userEvent = null;
                }
            }
        }
        private static void DestroyUserEvent(bool canceled)
        {
            // TODO:  Track down deadlock.
            // Issue appears when run on main thread during app shutdown.
            //ThreadAssist.ProxyToMain ( delegate {
            if (userEvent != null)
            {
                if (!canceled)
                {
                    Thread.Sleep(250);
                }

                userEvent.Dispose();
                userEvent        = null;
                cancel_requested = false;
            }
            //});
        }
        private void CreateUserEvent()
        {
            lock (update_sync)
            {
                if (userEvent == null)
                {
                    userEvent = new ActiveUserEvent(Catalog.GetString("Podcast Feed Update"));

                    userEvent.Icon = PodcastPixbufs.PodcastIcon22;

                    userEvent.Header   = Catalog.GetString("Updating");
                    userEvent.Message  = Catalog.GetString("Preparing to update feeds");
                    userEvent.Progress = 0.0;

                    userEvent.CancelRequested += OnUserEventCancelRequestedHandler;
                }
            }
        }
        private void DisposeQuery()
        {
            if (query != null)
            {
                query.HitsAddedEvent -= OnHitsAdded;
                query.FinishedEvent  -= OnFinished;
                query.Close();
                query = null;
            }

            if (user_event != null)
            {
                user_event.Dispose();
                user_event = null;
            }

            thread = null;
        }
        private static void DestroyUserEvent(bool canceled)
        {
            // TODO:  Track down deadlock.
            // Issue appears when run on main thread during app shutdown.
            //ThreadAssist.ProxyToMain ( delegate {
            if(userEvent != null)
            {
                if (!canceled)
                {
                    Thread.Sleep (250);
                }

                userEvent.Dispose ();
                userEvent = null;
                cancel_requested = false;
            }
            //});
        }
 private static void CreateUserEventProxy(object o, EventArgs args)
 {
     if(userEvent == null) {
         userEvent = new ActiveUserEvent(Catalog.GetString("Download"));
         userEvent.Icon = IconThemeUtils.LoadIcon (Stock.Network, 22);
         userEvent.Header = Catalog.GetString ("Downloading Files");
         userEvent.Message = Catalog.GetString ("Initializing downloads");
         userEvent.CancelRequested += OnUserEventCancelRequestedHandler;
         cancel_requested = false;
     }
 }
        private void DestroyUserEvent()
        {
            lock (update_sync)
            {
                if (userEvent != null)
                {
                    if (!userEvent.IsCancelRequested)
                    {
                        Thread.Sleep (500);
                    }

                    userEvent.Dispose();
                    userEvent = null;
                }
            }
        }
        private void CreateUserEvent()
        {
            lock (update_sync)
            {
                if (userEvent == null)
                {
                    userEvent = new ActiveUserEvent (Catalog.GetString("Podcast Feed Update"));

                    userEvent.Icon = PodcastPixbufs.PodcastIcon22;

                    userEvent.Header = Catalog.GetString ("Updating");
                    userEvent.Message = Catalog.GetString ("Preparing to update feeds");
                    userEvent.Progress = 0.0;

                    userEvent.CancelRequested += OnUserEventCancelRequestedHandler;
                }
            }
        }