public UcwaAppCommunication(UcwaApp app)
 {
     this.ucwaApp  = app;
     this.Resource = new UcwaResourceCommunication(
         this.ucwaApp.ApplicationResource.GetEmbeddedResource("communication"));
     this.ucwaApp.OnEventsReceived += new UcwaAppEventsReceivedEventHandler(ProcessEvents);
 }
        async void ProcessCommunicationEvents(IEnumerable <UcwaEvent> events)
        {
            foreach (var e in events)
            {
                ShowProcessProgress(string.Format(eventMessageFormat, e.Name, e.Type, e.Sender));
                switch (e.Name)
                {
                case "communication":
                    this.Resource = new UcwaResourceCommunication(e.Resource);
                    ShowProcessProgress("\tResource: " + this.Resource.Name + "\r\n\tState =" + this.Resource.State + "\r\n\t" + this.Resource.ThreadId);
                    break;

                case "messagingInvitation":
                    this.messagingInvite = new UcwaResourceMessageInvitation(e);
                    NotifyResourceStateChange(messagingInvite.State.ToLower(), messagingInvite.Name);

                    //ShowProcessProgress("\tResource: " + this.messagingInvite.Name + "\r\n\tState: " + this.messagingInvite.State
                    //    + "\r\n\tDirection: " + messagingInvite.Direction + "\r\n\tThreadId: " + messagingInvite.ThreadId
                    //    + "\r\n\tmessagingUri:" + messagingInvite.messagingUri + "\r\n\tOperationId:" + messagingInvite.OperationId
                    //    + "\r\n\ttoUri:" + messagingInvite.toUri + "\r\n\tfromUri: " + messagingInvite.fromUri
                    //    + "\r\n\tStatus: " + messagingInvite.Status + ""
                    //    );

                    if (messagingInvite.Direction.ToLower() == "incoming")
                    {
                        // Must cache the following Uris, otherwise, they may not be available on later messagingInvitation events
                        if (messagingInvite.acceptUri != null)
                        {
                            messagingInviteAcceptUri = messagingInvite.acceptUri;
                        }
                        if (messagingInvite.declineUri != null)
                        {
                            messagingInviteDeclineUri = messagingInvite.declineUri;
                        }
                        if (messagingInvite.ThreadId != null)
                        {
                            threadId = messagingInvite.ThreadId;
                        }
                        if (messagingInvite.ContainsResource("from"))
                        {
                            var from = new UcwaResourceParticipant(
                                await messagingInvite.GetContainedResource("from", ucwaApp.Transport));
                            NotifyMessagingInvite(this.messagingInvite.Subject, this.messagingInvite.Importance,
                                                  from.DisplayName, this.messagingInvite.Message, this.messagingInvite.ThreadId);
                        }
                        else
                        {
                            ShowProcessProgress("WARN: messagingInvite does not specify valid 'from' resource");
                        }
                    }
                    break;

                case "conversation":
                    if (e.Type.ToLower() == "deleted")
                    {
                        NotifyResourceStateChange("deleted", e.Name);
                    }
                    else
                    if (e.Resource != null)
                    {
                        var conv = new UcwaResourceConversation(e.Resource);
                        {
                            this.conversation = conv;
                            NotifyResourceStateChange(conversation.State.ToLower(), conversation.Name);
                        }
                        ShowProcessProgress("\tThreadId: " + conv.ThreadId + "\r\n\tUri: " + conv.Uri + "" + conv.State
                                            + "\r\n\tParticipanCount: " + conv.ParticipantCount + "\r\n\tmessagingUri: " + conv.messagingUri);
                    }
                    else
                    {
                        this.ShowProcessProgress("WARN: conversation added event does not contain the corresponding resource.");
                    }
                    break;

                default:
                    break;
                }
            }
        }