Exemplo n.º 1
0
        public Signpost(FieldListNavigator nav)
        {
            if (Core.CSLVersion == WaveCSLVersion.Version5)
            {
                nav.FindNext(NaviAgentFieldID.SignpostSpec);
                FieldList spec = nav.Current.AsFieldList();

                if (spec != null)
                {
                    ID = spec[NaviAgentFieldID.Signpost].AsInteger() ?? FieldList.FieldNotFound;

                    if (ID == FieldList.FieldNotFound)
                    {
                        nav.FindNext(NaviAgentFieldID.FrameID);
                        FrameID = nav.Current.AsString();

                        nav.FindNext(NaviAgentFieldID.SignpostName);
                        Name = nav.Current.AsString();
                    }
                }
            }
            else
            {
                nav.FindNext(NaviAgentFieldID.ActionPayload);
                ID = nav.Current.AsNumber() ?? FieldList.FieldNotFound;
            }
        }
Exemplo n.º 2
0
        public void Unpack(FieldList source)
        {
            // set id (saving this as a definition ID for now)
            DefinitionID = source[NaviAgentFieldID.ActionSetID].AsInteger() ?? -1;

            // saving anchors
            List <ByteField> anchorData = source.GetItems <ByteField>(NaviAgentFieldID.AnchorID);

            if (anchorData.Count > 0)
            {
                // add available anchors
                foreach (ByteField field in anchorData)
                {
                    Anchors.Add((Anchor)field.Data);
                }
            }
            else
            {
                // add default anchor ("fire")
                Anchors.Add(Anchor.Fire);
            }

            // save action label
            Label = source[NaviAgentFieldID.ActionSetLabel].AsString();

            // adding actions
            FieldListNavigator nav = new FieldListNavigator(source);

            while (1 == 1)
            {
                ActionBase action   = null;
                byte       actionID = 0;

                if (nav.FindNext(NaviAgentFieldID.ActionRef))
                {
                    actionID = nav.Current.AsByte() ?? 0;
                }

                if (!nav.FindNext(NaviAgentFieldID.ActionTypeID))
                {
                    break;
                }

                ActionType actionType = (ActionType)(nav.Current.AsInteger() ?? (int)ActionType.Invalid);

                switch (actionType)
                {
                    #region Navigation

                case ActionType.GotoNodeVolatile:
                    break;

                case ActionType.GotoNodeStable:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string         uri        = Core.Navigation.CheckURI(nav.Current.AsString());
                    NodeTransition transition = NodeTransition.None;
                    bool           isPopup    = false;

                    if (nav.FindNext(NaviAgentFieldID.ActionPayload))
                    {
                        transition = (NodeTransition)(nav.Current.AsInteger() ?? (int)NodeTransition.None);

                        if (nav.FindNext(NaviAgentFieldID.ActionPopUp))
                        {
                            isPopup = nav.Current.AsBoolean() ?? false;
                        }
                    }

                    action = new GotoNodeStableAction(actionID, uri, transition, isPopup);
                    break;
                }

                case ActionType.GotoNodeStableSSP:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    short signpost = nav.Current.AsShort() ?? -1;

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    NodeTransition transition = (NodeTransition)(nav.Current.AsInteger() ?? (int)NodeTransition.None);

                    nav.FindNext(NaviAgentFieldID.ActionPopUp);
                    bool isPopup = nav.Current.AsBoolean() ?? false;

                    action = new GotoNodeStableSSPAction(actionID, signpost, transition, isPopup);
                    break;
                }

                case ActionType.GotoNodeInFrame:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string uri = Core.Navigation.CheckURI(nav.Current.AsString());

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    NodeTransition transition = (NodeTransition)(nav.Current.AsInteger() ?? (int)NodeTransition.None);

                    nav.FindNext(NaviAgentFieldID.ActionPopUp);
                    bool isPopup = nav.Current.AsBoolean() ?? false;

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string frameID = nav.Current.AsString();

                    action = new GotoNodeInFrameAction(actionID, uri, frameID, transition, isPopup);
                    break;
                }

                case ActionType.GotoBack:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    NodeTransition transition = (NodeTransition)(nav.Current.AsInteger() ?? (int)NodeTransition.None);

                    action = new GotoBackAction(actionID, transition);
                    break;
                }

                case ActionType.GotoApplicationHome:
                {
                    nav.FindNext(NaviAgentFieldID.ApplicationURN);
                    string uri = nav.Current.AsText();

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    NodeTransition transition = (NodeTransition)(nav.Current.AsInteger() ?? (int)NodeTransition.None);

                    nav.FindNext(NaviAgentFieldID.ActionPopUp);
                    bool isPopup = nav.Current.AsBoolean() ?? false;

                    action = new GotoApplicationHomeAction(actionID, uri, transition, isPopup);
                    break;
                }

                case ActionType.GotoApplicationNode:
                {
                    string urn = null, uri = null;

                    nav.FindNext(NaviAgentFieldID.ActionPayload);

                    FieldList fl = nav.Current as FieldList;

                    if (fl != null)
                    {
                        urn = fl[NaviAgentFieldID.ApplicationURN].AsText();
                        uri = fl[MessageOutFieldID.ItemURI].AsText();
                    }

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    NodeTransition transition = (NodeTransition)(nav.Current.AsInteger() ?? (int)NodeTransition.None);

                    nav.FindNext(NaviAgentFieldID.ActionPopUp);
                    bool isPopup = nav.Current.AsBoolean() ?? false;

                    action = new GotoApplicationNodeAction(actionID, urn, uri, transition, isPopup);
                    break;
                }

                case ActionType.Refresh:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string frameID = nav.Current.AsString();

                    if (!String.IsNullOrEmpty(frameID))
                    {
                        action = new RefreshAction(actionID, frameID);
                    }
                    break;
                }

                case ActionType.ClearBackStack:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string frameID = nav.Current.AsString();

                    if (!String.IsNullOrEmpty(frameID))
                    {
                        action = new ClearBackstackAction(actionID, frameID);
                    }
                    break;
                }

                    #endregion

                    #region Media playback and control

                case ActionType.PlayMedia:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);

                    action = new PlayMediaAction(actionID, nav.Current.AsString());
                    break;
                }

                case ActionType.PlayMediaSSP:
                    goto default;

                case ActionType.PlayMediaWithAd:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string mediaCRef = nav.Current.AsString();

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string adCRef = nav.Current.AsString();

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    int delay = nav.Current.AsInteger() ?? 0;

                    action = new PlayMediaWithAdAction(actionID, mediaCRef, adCRef, delay);
                    break;
                }

                case ActionType.StopMedia:
                case ActionType.FullScreenVideo:
                case ActionType.MediaListPlayMedia:
                    goto default;

                    #endregion

                    #region Slot content

                case ActionType.SetSlotContent:
                {
                    Signpost sp = new Signpost(nav);

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    FieldList fl = nav.Current.AsFieldList();

                    if (fl != null)
                    {
                        DisplayDataCollection dc = DisplayData.Parse(fl);

                        if (dc.Count > 0)
                        {
                            action = new SetSlotContentAction(actionID, sp, dc[0]);
                        }
                    }

                    break;
                }

                case ActionType.SetSlotContentSSP:
                case ActionType.PrefetchContent:
                    goto default;

                    #endregion

                    #region Forms

                case ActionType.SubmitForm:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);

                    FieldList fl = nav.Current as FieldList;

                    if (fl != null)
                    {
                        int            formID      = fl[NaviAgentFieldID.FormID].AsInteger() ?? -1;
                        string         formURL     = fl[NaviAgentFieldID.FormRequestURL].AsString();
                        NodeTransition transition  = (NodeTransition)(fl[NaviAgentFieldID.FormTransition].AsInteger() ?? (int)NodeTransition.None);
                        bool           waitForNode = fl[NaviAgentFieldID.FormRequiresNoWait].AsBoolean() ?? true;
                        bool           popUp       = fl[NaviAgentFieldID.ActionPopUp].AsBoolean() ?? false;

                        action = new SubmitFormAction(actionID, formID, formURL, transition, waitForNode, popUp);
                    }

                    break;
                }

                case ActionType.SubmitFormToFrame:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);

                    FieldList fl = nav.Current as FieldList;

                    if (fl != null)
                    {
                        string         frameID    = fl[NaviAgentFieldID.FrameID].AsString();
                        int            formID     = fl[NaviAgentFieldID.FormID].AsInteger() ?? -1;
                        string         formURL    = fl[NaviAgentFieldID.FormRequestURL].AsString();
                        NodeTransition transition = (NodeTransition)(fl[NaviAgentFieldID.FormTransition].AsInteger() ?? (int)NodeTransition.None);
                        bool           popUp      = fl[NaviAgentFieldID.ActionPopUp].AsBoolean() ?? false;

                        action = new SubmitFormToFrameAction(actionID, frameID, formID, formURL, transition, popUp);
                    }

                    break;
                }

                case ActionType.UploadContentAndSubmitForm:
                    goto default;

                    #endregion

                    #region Visibility

                case ActionType.SetVisibility:
                {
                    Signpost sn = new Signpost(nav);

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    bool isVisible = nav.Current.AsBoolean() ?? true;

                    action = new SetVisibilityAction(actionID, sn, isVisible);
                    break;
                }

                case ActionType.ToggleVisibility:
                {
                    action = new ToggleVisibilityAction(actionID, new Signpost(nav));
                    break;
                }

                    #endregion

                    #region Data channels

                case ActionType.SubscribeToDataChannel:
                case ActionType.SubscribeToDataChannelSSP:
                case ActionType.UnsubscribeFromChannel:
                case ActionType.ApplyFilterToDataChannel:
                    goto default;

                    #endregion

                    #region Downloads

                case ActionType.StartBackgroundDownload:
                case ActionType.StopBackgroundDownload:
                case ActionType.BackgroundDownloadWithEndNode:
                case ActionType.BackgroundHTTPRequest:
                    goto default;

                    #endregion

                    #region Telephony

                case ActionType.TelephonySendSMSWithMessage:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string phoneNumber = nav.Current.AsText();

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string message = nav.Current.AsText();

                    if (!String.IsNullOrEmpty(phoneNumber) && !String.IsNullOrEmpty(message))
                    {
                        action = new TelephonySendSMSWithMessageAction(actionID, phoneNumber, message);
                    }

                    break;
                }

                case ActionType.TelephonyMakeCall:
                    goto default;

                case ActionType.TelephonySendSMSSSP:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);

                    FieldList fld = nav.Current as FieldList;

                    if ((fld != null) && (fld.Count >= 2))
                    {
                        short?signpost1 = fld[0].AsShort();
                        short?signpost2 = fld[1].AsShort();

                        if (signpost1.HasValue && signpost2.HasValue)
                        {
                            action = new TelephonySendSMSSSPAction(actionID, signpost1.Value, signpost2.Value);
                        }
                    }

                    break;
                }

                    #endregion

                    #region E-mail

                case ActionType.SendEmail:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string to = nav.Current.AsText();

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string subject = nav.Current.AsText();

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string body = nav.Current.AsText();

                    if (!String.IsNullOrEmpty(to) && !String.IsNullOrEmpty(subject) && (body != null))
                    {
                        action = new SendMailAction(actionID, to, subject, body);
                    }

                    break;
                }

                case ActionType.SendEmailSSP:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    int toSignpost = nav.Current.AsNumber() ?? Signpost.Invalid;

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    int subjectSignpost = nav.Current.AsNumber() ?? Signpost.Invalid;

                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    int bodySignpost = nav.Current.AsNumber() ?? Signpost.Invalid;

                    if ((toSignpost != Signpost.Invalid) && (subjectSignpost != Signpost.Invalid) && (bodySignpost != Signpost.Invalid))
                    {
                        action = new SendMailSSPAction(actionID, toSignpost, subjectSignpost, bodySignpost);
                    }

                    break;
                }

                    #endregion

                    #region Browser

                case ActionType.ConnectOpenBrowser:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string url = nav.Current.AsText();

                    if (!String.IsNullOrEmpty(url))
                    {
                        action = new OpenBrowserAction(actionID, url);
                    }

                    break;
                }

                case ActionType.OpenEmbeddedBrowser:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string url = nav.Current.AsText();

                    if (!String.IsNullOrEmpty(url))
                    {
                        action = new OpenBrowserEmbeddedAction(actionID, url);
                    }

                    break;
                }

                    #endregion

                    #region Contacts

                case ActionType.GetContact:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    short signpost = (short)(nav.Current.AsNumber() ?? -1);

                    if (signpost >= 0)
                    {
                        action = new GetContactAction(actionID, signpost);
                    }

                    break;
                }

                case ActionType.GetContactNoThumbnail:
                    break;

                case ActionType.SetContact:
                case ActionType.GetAllContacts:
                    goto default;

                    #endregion

                    #region Mapping and location sharing

                case ActionType.ToggleMapPin:
                case ActionType.SetMapPin:
                case ActionType.ShowMap:
                    goto default;

                case ActionType.SetLocationSharing:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);

                    action = new SetLocationSharingAction(actionID, nav.Current.AsBoolean() ?? false);
                    break;
                }

                    #endregion

                    #region Social

                case ActionType.PublishOnOnlineCommunity:
                {
                    // social network ID
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    SocialNetwork target = (SocialNetwork)(nav.Current.AsNumber() ?? (int)SocialNetwork.Unknown);

                    // message
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    string messageData = nav.Current.AsString();

                    if (messageData != null)
                    {
                        action = new PublishOnSocialNetworkAction(actionID, target, messageData);
                    }

                    break;
                }

                case ActionType.PublishOnOnlineCommunitySSP:
                {
                    // social network ID signpost
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    SocialNetwork target = (SocialNetwork)(nav.Current.AsNumber() ?? (int)SocialNetwork.Unknown);

                    // message signpost
                    nav.FindNext(NaviAgentFieldID.ActionPayload);
                    int messageSignpost = nav.Current.AsNumber() ?? Signpost.Invalid;

                    if (messageSignpost != Signpost.Invalid)
                    {
                        action = new PublishOnSocialNetworkSSPAction(actionID, target, messageSignpost);
                    }

                    break;
                }

                    #endregion

                    #region Get media

                case ActionType.GetPhotoFromCamera:
                case ActionType.GetPhotoFromFile:
                case ActionType.GetVideoFromCamera:
                case ActionType.GetVideoFromFile:
                case ActionType.GetAudioFromRecorder:
                case ActionType.GetAudioFromFile:
                    goto default;

                    #endregion

                    #region Vectors

                case ActionType.VectorSetAllObjectState:
                case ActionType.VectorSetObjectState:
                case ActionType.VectorSetAllObjectStateSSP:
                case ActionType.VectorSetObjectStateSSP:
                    goto default;

                    #endregion

                    #region EPG

                case ActionType.EPGViewportUp:
                case ActionType.EPGViewportDown:
                case ActionType.EPGViewportForward:
                case ActionType.EPGViewportBackward:
                case ActionType.EPGViewportForward24Hours:
                case ActionType.EPGViewportBackward24Hours:
                case ActionType.EPGViewportGotoChannel:
                case ActionType.EPGSubmitForm:
                case ActionType.EPGSetSlotContent:
                case ActionType.EPGPlayMedia:
                case ActionType.EPGSendSMS:
                    DebugHelper.Out("EPG functionality is not supported.");
                    break;

                    #endregion

                    #region UI

                case ActionType.IncreaseFontSize:
                case ActionType.DecreaseFontSize:
                    goto default;

                    #endregion

                    #region State management

                case ActionType.SetStateSSP:
                case ActionType.ToggleStateSSP:
                    goto default;

                    #endregion

                    #region Application

                case ActionType.Quit:
                    action = new QuitAction(actionID);
                    break;

                case ActionType.SaveApplicationToFavourites:
                case ActionType.WaveSendAuditEvent:
                case ActionType.SendCredentials:
                case ActionType.ToggleBacklight:
                case ActionType.ToggleInactivityTimer:
                    goto default;

                    #endregion

                    #region Custom

                case ActionType.Custom:
                {
                    nav.FindNext(NaviAgentFieldID.ActionPayload);

                    FieldList fl = nav.Current as FieldList;

                    if (fl != null)
                    {
                        List <string> strings = new List <string>();

                        foreach (IFieldBase field in fl)
                        {
                            if (field is StringField)
                            {
                                strings.Add(field.AsString());
                            }
                        }

                        action = new CustomAction(actionID, strings);
                    }

                    break;
                }

                    #endregion

                default:
                    DebugHelper.Out("Unsupported action type: {0}", actionType);
                    break;
                }

                if (action != null)
                {
                    Actions.Add(action);
                }
            }

            // done!
            IsUnpacked = true;
        }
Exemplo n.º 3
0
        public static DisplayDataCollection Parse(FieldList source)
        {
            DisplayDataCollection res = new DisplayDataCollection();

            if ((source != null) && (source.Count > 0))
            {
                FieldListNavigator nav = new FieldListNavigator(source);

                if (nav.FindFirst(MessageOutFieldID.SlotDisplayDataTypeID))
                {
                    while (nav.CurrentID == (short)MessageOutFieldID.SlotDisplayDataTypeID)
                    {
                        DisplayType dt       = (DisplayType)(nav.Current.AsByte() ?? (byte)DisplayType.Null);
                        object      data     = null;
                        short?      signpost = null;

                        if ((nav.Next != null) && (nav.Next.FieldID == (short)MessageOutFieldID.SlotDisplayData))
                        {
                            switch (dt)
                            {
                            case DisplayType.Null:
                                data = null;
                                break;

                            case DisplayType.String:
                                data = nav.Next.AsString() ?? String.Empty;
                                break;

                            case DisplayType.Integer:
                                data = nav.Next.AsNumber() ?? 0;
                                break;

                            case DisplayType.ContentReference:
                            {
                                FieldList fl = nav.Next as FieldList;

                                if (fl != null)
                                {
                                    data = new ContentReference(fl);
                                }

                                break;
                            }

                            case DisplayType.MediaMetaData:
                            {
                                FieldList fl = nav.Next as FieldList;

                                if (fl != null)
                                {
                                    data = new MediaMetaData(fl);
                                }

                                break;
                            }
                            }
                        }

                        // signpost
                        if ((nav.NextNext != null) && (nav.NextNext.FieldID == (short)NaviAgentFieldID.Signpost))
                        {
                            signpost = nav.NextNext.AsShort() ?? -1;

                            if (signpost < 0)
                            {
                                signpost = null;
                            }
                        }

                        res.Add(new DisplayData(dt, data, signpost));

                        if (!nav.FindNext(MessageOutFieldID.SlotDisplayDataTypeID))
                        {
                            break;
                        }
                    }
                }
            }

            return(res);
        }