예제 #1
0
파일: Region.cs 프로젝트: afrog33k/eAd
        /// <summary>
        /// Sets the next media node. Should be used either from a mediaComplete event, or an options reset from
        /// the parent.
        /// </summary>
        private bool SetNextMediaNode()
        {
            int playingSequence = currentSequence;

            // What if there are no media nodes?
            if (options.mediaNodes.Count == 0)
            {
                System.Diagnostics.Debug.WriteLine("No media nodes to display", "Region - SetNextMediaNode");
                hasExpired = true;
                return(false);
            }

            if (options.mediaNodes.Count == 1 && currentSequence != -1)
            {
                //dont bother discarding this media, keep all the same details, but still trigger an expired event
                System.Diagnostics.Debug.WriteLine("Media Expired:" + options.ToString() + " . Nothing else to show", "Region - SetNextMediaNode");
                hasExpired = true;

                DurationElapsedEvent();
                return(true);
            }

            // Move the sequence on
            currentSequence++;

            if (currentSequence >= options.mediaNodes.Count)
            {
                currentSequence = 0; //zero it

                hasExpired = true;   //we have expired (want to raise an expired event to the parent)

                System.Diagnostics.Debug.WriteLine("Media Expired:" + options.ToString() + " . Reached the end of the sequence. Starting from the beginning.", "Region - SetNextMediaNode");

                DurationElapsedEvent();

                // We want to continue on to show the next media (unless the duration elapsed event triggers a region change)
                if (layoutExpired)
                {
                    return(true);
                }
            }

            //Zero out the options that are persisted
            options.text             = "";
            options.documentTemplate = "";
            options.copyrightNotice  = "";
            options.scrollSpeed      = 30;
            options.updateInterval   = 6;
            options.Uri        = "";
            options.direction  = "none";
            options.javaScript = "";
            options.Dictionary = new MediaDictionary();

            // Get a media node
            bool validNode   = false;
            int  numAttempts = 0;

            while (!validNode)
            {
                numAttempts++;

                // Get the media node for this sequence
                LayoutRegionMedia medium = options.mediaNodes[currentSequence];



                if (medium.Id != null)
                {
                    options.mediaid = medium.Id;
                }

                // Check isnt blacklisted
                if (blackList.BlackListed(options.mediaid))
                {
                    Debug.WriteLine(String.Format("The File [{0}] has been blacklisted", options.mediaid), "Region - SetNextMediaNode");

                    // Increment and Loop
                    currentSequence++;

                    if (currentSequence >= options.mediaNodes.Count)
                    {
                        currentSequence = 0; //zero it

                        hasExpired = true;   //we have expired (want to raise an expired event to the parent)

                        Debug.WriteLine("Media Expired:" + options.ToString() + " . Reached the end of the sequence. Starting from the beginning.", "Region - SetNextMediaNode");

                        DurationElapsedEvent();

                        // We want to continue on to show the next media (unless the duration elapsed event triggers a region change)
                        if (layoutExpired)
                        {
                            return(true);
                        }
                    }
                }
                else
                {
                    validNode = true;

                    // New version has a different schema - the right way to do it would be to pass the <options> and <raw> nodes to
                    // the relevant media class - however I dont feel like engineering such a change so the alternative is to
                    // parse all the possible media type nodes here.

                    // Type and Duration will always be on the media node
                    options.FileType = medium.Type;

                    //TODO: Check the type of node we have, and make sure it is supported.

                    if (medium.Duration != -1)
                    {
                        options.Duration = medium.Duration;
                    }
                    else
                    {
                        options.Duration = 60;
                        System.Diagnostics.Trace.WriteLine("Duration is Empty, using a default of 60.",
                                                           "Region - SetNextMediaNode");
                    }

                    // We cannot have a 0 duration here... not sure why we would... but
                    if (options.Duration == 0 && options.FileType != "Video")
                    {
                        int emptyLayoutDuration = int.Parse(Settings.Default.emptyLayoutDuration.ToString());
                        options.Duration = (emptyLayoutDuration == 0) ? 10 : emptyLayoutDuration;
                    }

                    // There will be some stuff on option nodes
                    if (medium.Options != null)
                    {
                        options.direction = medium.Options.Direction;
                        // Add this to the options object
                        options.Dictionary.Add("direction", medium.Options.Direction);
                        options.Uri = medium.Options.Uri;
                        options.Dictionary.Add("Uri", medium.Options.Uri);
                        options.copyrightNotice = medium.Options.Copyright;
                        options.Dictionary.Add("copyrightNotice", medium.Options.Copyright);
                        options.scrollSpeed = medium.Options.ScrollSpeed;
                        if (medium.Options != null)
                        {
                            options.Dictionary.Add("ScrollSpeed",
                                                   (medium.Options.ScrollSpeed).ToString());
                        }
                        if (medium.Options.ScrollSpeed == -1)
                        {
                            System.Diagnostics.Trace.WriteLine("Non integer scrollSpeed in XLF",
                                                               "Region - SetNextMediaNode");
                        }
                        options.updateInterval = medium.Options.UpdateInterval;
                        if (medium.Options.UpdateInterval == -1)
                        {
                            System.Diagnostics.Trace.WriteLine("Non integer updateInterval in XLF",
                                                               "Region - SetNextMediaNode");
                        }
                    }
                    // And some stuff on Raw nodes

                    if (medium.Raw != null)
                    {
                        if (!String.IsNullOrEmpty(medium.Raw.Text))
                        {
                            options.text = medium.Raw.Text;
                        }

                        if (!String.IsNullOrEmpty(medium.Raw.Text))
                        {
                            options.documentTemplate = medium.Raw.DocumentTemplate;
                        }
                        if (!String.IsNullOrEmpty(medium.Raw.EmbedHtml))
                        {
                            options.text = medium.Raw.EmbedHtml;
                        }

                        if (!String.IsNullOrEmpty(medium.Raw.EmbedScript))
                        {
                            options.javaScript = medium.Raw.EmbedScript;
                        }
                    }
                    // Is this a file based media node?
                    if (options.FileType == "Video" || options.FileType == "flash" || options.FileType == "Image" || options.FileType == "powerpoint")
                    {
                        // Use the cache manager to determine if the file is valid
                        validNode = _cacheManager.IsValidPath(options.Uri);
                    }
                }

                if (numAttempts > options.mediaNodes.Count)
                {
                    // There are no valid nodes in this region, so just signify that the region is ending, and show nothing.
                    System.Diagnostics.Trace.WriteLine("No Valid media nodes to display", "Region - SetNextMediaNode");

                    hasExpired = true;
                    return(false);
                }
            }

            System.Diagnostics.Debug.WriteLine("New media detected " + options.FileType, "Region - SetNextMediaNode");

            // Remove the old one if we have found a valid node - otherwise keep it
            if ((validNode && playingSequence != -1) && playingSequence != currentSequence)
            {
                System.Diagnostics.Debug.WriteLine("Trying to dispose of the current media", "Region - SetNextMediaNode");
                // Dispose of the current media
                try
                {
                    //       media.AnimateAway(MediaCanvas);
                    ThreadPool.QueueUserWorkItem((r) =>
                    {
                        Thread.Sleep(2500);
                        if (media != null && media.Parent != null)
                        {
                            if (media.OldOne != null)
                            {
                                media.OldOne.AnimateAway(MediaCanvas);
                            }
                        }
                        else
                        {
                            if (media != null && media.OldOne != null)
                            {
                                media.OldOne.AnimateAway(MediaCanvas);
                            }
                            if (media != null)
                            {
                                media.AnimateAway(MediaCanvas);
                            }
                        }
                    });
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine("No media to remove");
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                }

                try
                {
                    // Here we say that this media is expired
                    _stat.ToDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

                    // Record this stat event in the statLog object
                    _statLog.RecordStat(_stat);
                }
                catch
                {
                    System.Diagnostics.Trace.WriteLine("No Stat record when one was expected", LogType.Error.ToString());
                }
            }

            return(true);
        }