Example #1
0
        /// <summary>
        /// Generates a SubscriptionInfo object from the Subscription object
        /// </summary>
        /// <returns>A SubscriptionInfo object</returns>
        public SubscriptionMsg GenerateSubscriptionMessage()
        {
            SubscriptionMsg subMsg = new SubscriptionMsg();

            subMsg.DomainID             = this.DomainID;
            subMsg.FromID               = this.FromIdentity;
            subMsg.FromName             = this.FromName;
            subMsg.ToID                 = this.ToIdentity;
            subMsg.SharedCollectionID   = this.SubscriptionCollectionID;
            subMsg.SharedCollectionType = this.SubscriptionCollectionType;
            subMsg.SharedCollectionName = this.SubscriptionCollectionName;
            subMsg.AccessRights         = (int)this.SubscriptionRights;
            subMsg.SubscriptionID       = this.MessageID;

            Collection collection = Store.GetStore().GetCollectionByID(subMsg.SharedCollectionID);

            if (collection != null)
            {
                DirNode dirNode = collection.GetRootDirectory();
                if (dirNode != null)
                {
                    subMsg.DirNodeID   = dirNode.ID;
                    subMsg.DirNodeName = dirNode.Name;
                }
            }

            return(subMsg);
        }
Example #2
0
 public POBoxStatus AckSubscription(SubscriptionMsg subMsg)
 {
     object[] results = this.Invoke("AckSubscription", new object[] {
         subMsg
     });
     return((POBoxStatus)(results[0]));
 }
Example #3
0
        /// <summary>
        /// Handle when delivered
        /// </summary>
        /// <param name="poBox">POBox reference</param>
        /// <param name="subscription">subscription </param>
        /// <returns>True if successfull, else false</returns>
        private bool DoDelivered(POBox poBox, Subscription subscription)
        {
            bool         result    = false;
            POBoxService poService = new POBoxService();

            log.Debug("  calling the PO Box server to get subscription state");
            log.Debug("  domainID: " + subscription.DomainID);
            log.Debug("  fromID:   " + subscription.FromIdentity);
            log.Debug("  SubID:    " + subscription.MessageID);

            // Resolve the PO Box location for the inviter
            Uri poUri = DomainProvider.ResolvePOBoxLocation(subscription.DomainID, subscription.FromIdentity);

            if (poUri != null)
            {
                poService.Url = poUri.ToString() + poServiceLabel;
                log.Debug("  connecting to the Post Office Service : " + poService.Url);
            }
            else
            {
                log.Debug("  Could not resolve the PO Box location for: " + subscription.FromIdentity);
                return(result);
            }

            try
            {
                WebState webState =
                    new WebState(
                        subscription.DomainID,
                        subscription.SubscriptionCollectionID,
                        subscription.ToIdentity);

                webState.InitializeWebClient(poService, subscription.DomainID);
            }
            catch (NeedCredentialsException)
            {
                log.Debug("  no credentials - back to sleep");
                return(result);
            }

            try
            {
                SubscriptionInformation subInfo =
                    poService.GetSubscriptionInfo(
                        subscription.DomainID,
                        subscription.FromIdentity,
                        subscription.MessageID,
                        subscription.SubscriptionCollectionID);

                switch (subInfo.Status)
                {
                case POBoxStatus.Success:
                {
                    log.Debug("  subInfo.FromName: " + subInfo.FromName);
                    log.Debug("  subInfo.ToName: " + subInfo.ToName);
                    log.Debug("  subInfo.State: " + subInfo.State.ToString());
                    log.Debug("  subInfo.Disposition: " + subInfo.Disposition.ToString());

                    if (subInfo.Disposition == ( int )SubscriptionDispositions.Accepted)
                    {
                        log.Debug("  creating collection...");

                        // Check to make sure the collection proxy doesn't already exist.
                        if (poBox.StoreReference.GetCollectionByID(subscription.SubscriptionCollectionID) == null)
                        {
                            SubscriptionDetails details = new SubscriptionDetails();
                            details.DirNodeID   = subInfo.DirNodeID;
                            details.DirNodeName = subInfo.DirNodeName;

                            subscription.SubscriptionRights = (Access.Rights)subInfo.AccessRights;
                            subscription.AddDetails(details);
                            poBox.Commit(subscription);

                            // create slave stub
                            subscription.ToMemberNodeID = subInfo.ToNodeID;
                            subscription.CreateSlave(poBox.StoreReference);
                        }

                        // acknowledge the message which removes the originator's subscription.
                        SubscriptionMsg subMsg   = subscription.GenerateSubscriptionMessage();
                        POBoxStatus     wsStatus = poService.AckSubscription(subMsg);
                        if ((wsStatus == POBoxStatus.Success) ||
                            (wsStatus == POBoxStatus.AlreadyAccepted))
                        {
                            // done with the subscription - move to local subscription to the ready state
                            log.Debug("  moving subscription to ready state.");
                            subscription.SubscriptionState = SubscriptionStates.Ready;
                            poBox.Commit(subscription);
                            result = true;
                        }
                        else
                        {
                            log.Debug("  failed acknowledging a subscription");
                            log.Debug("  status = {0}", wsStatus.ToString());
                            log.Debug("  deleting the local subscription");

                            poBox.Commit(poBox.Delete(subscription));
                            result = true;
                        }
                    }
                    break;
                }

                case POBoxStatus.AlreadyAccepted:
                {
                    log.Debug("  the subscription has already been accepted by another client.");
                    result = CreateCollectionProxy(poBox, subscription);
                    break;
                }

                case POBoxStatus.InvalidState:
                {
                    log.Debug("  invalid state");
                    break;
                }

                default:
                {
                    log.Debug("  server error = {0}. Deleting subscription.", subInfo.Status.ToString());
                    poBox.Commit(poBox.Delete(subscription));
                    result = true;
                    break;
                }
                }
            }
            catch (Exception e)
            {
                log.Error("  DoDelivered failed with an exception");
                log.Error(e.Message);
                log.Error(e.StackTrace);
            }

            return(result);
        }
Example #4
0
        /// <summary>
        /// Do Replied for the invitation
        /// </summary>
        /// <param name="poBox">POBox from which reply will go </param>
        /// <param name="subscription">Subscription</param>
        /// <returns>True if successfull else false</returns>
        private bool DoReplied(POBox poBox, Subscription subscription)
        {
            log.Debug("DoReplied");
            log.Debug("  calling the PO Box server to accept/reject subscription");
            log.Debug("  domainID: " + subscription.DomainID);
            log.Debug("  fromID:   " + subscription.FromIdentity);
            log.Debug("  toID:     " + subscription.ToIdentity);
            log.Debug("  SubID:    " + subscription.MessageID);

            bool         result    = false;
            POBoxService poService = new POBoxService();
            POBoxStatus  wsStatus  = POBoxStatus.UnknownError;

            // Resolve the PO Box location for the inviter
            Uri poUri = DomainProvider.ResolvePOBoxLocation(subscription.DomainID, subscription.FromIdentity);

            if (poUri != null)
            {
                poService.Url = poUri.ToString() + poServiceLabel;
                log.Debug("  connecting to the Post Office Service : " + poService.Url);
            }
            else
            {
                log.Debug("  could not resolve the PO Box location for: " + subscription.FromIdentity);
                return(result);
            }

            try
            {
                WebState webState =
                    new WebState(
                        subscription.DomainID,
                        subscription.SubscriptionCollectionID,
                        subscription.ToIdentity);

                webState.InitializeWebClient(poService, subscription.DomainID);
            }
            catch (NeedCredentialsException)
            {
                log.Debug("  no credentials - back to sleep");
                return(result);
            }

            // Add a new member to the domain if one doesn't exist already.  This is needed
            // for Workgroup Domains.  If the user doesn't exist, the upcoming call to
            // ResolvePOBoxLocation will fail.
            Domain domain = Store.GetStore().GetDomain(subscription.DomainID);

            if (domain.ConfigType == Domain.ConfigurationType.Workgroup)
            {
                Member member = domain.GetMemberByName(subscription.FromName);
                if (member == null)
                {
                    log.Debug("  added workgroup member {0}", subscription.FromName);
                    member = new Member(subscription.FromName, subscription.FromIdentity, subscription.SubscriptionRights);
                    domain.Commit(member);
                }
            }

            try
            {
                if (subscription.SubscriptionDisposition == SubscriptionDispositions.Accepted)
                {
                    log.Debug("  disposition is accepted!");

                    SubscriptionMsg subMsg = subscription.GenerateSubscriptionMessage();
                    wsStatus = poService.AcceptedSubscription(subMsg);
                    switch (wsStatus)
                    {
                    case POBoxStatus.Success:
                    {
                        log.Debug("  successfully accepted subscription.");
                        subscription.SubscriptionState = SubscriptionStates.Delivered;
                        poBox.Commit(subscription);
                        break;
                    }

                    case POBoxStatus.NotPosted:
                    {
                        log.Debug("  waiting for subscription to be posted.");
                        break;
                    }

                    case POBoxStatus.AlreadyAccepted:
                    {
                        log.Debug("  subscription already accepted from a different client.");
                        result = CreateCollectionProxy(poBox, subscription);
                        break;
                    }

                    case POBoxStatus.AlreadyDeclined:
                    case POBoxStatus.UnknownCollection:
                    case POBoxStatus.UnknownSubscription:
                    case POBoxStatus.UnknownPOBox:
                    case POBoxStatus.UnknownIdentity:
                    {
                        log.Debug("  failed accepting a subscription");
                        log.Debug("  status = {0}", wsStatus.ToString());
                        log.Debug("  deleting the local subscription");

                        // Delete the subscription and return true so the thread
                        // controlling the subscription will die off.
                        poBox.Commit(poBox.Delete(subscription));
                        result = true;
                        break;
                    }

                    default:
                    {
                        log.Debug("  failed Accepting a subscription.  Status: " + wsStatus.ToString());
                        break;
                    }
                    }
                }
                else if (subscription.SubscriptionDisposition == SubscriptionDispositions.Declined)
                {
                    log.Debug("  disposition is declined");

                    SubscriptionMsg subMsg = subscription.GenerateSubscriptionMessage();
                    wsStatus = poService.DeclinedSubscription(subMsg);
                    switch (wsStatus)
                    {
                    case POBoxStatus.Success:
                    {
                        // This subscription is done!
                        log.Debug("  successfully declined subscription {0}", subscription.ID);
                        result = true;
                        break;
                    }

                    case POBoxStatus.AlreadyAccepted:
                    {
                        log.Debug("  subscription already accepted from a different client.");

                        // If the collection has already been accepted on another client, we cannot
                        // automatically accept it here because we don't know where to root the
                        // the collection in the file system.
                        result = true;
                        break;
                    }

                    case POBoxStatus.AlreadyDeclined:
                    case POBoxStatus.UnknownIdentity:
                    case POBoxStatus.UnknownCollection:
                    case POBoxStatus.UnknownPOBox:
                    {
                        log.Debug("  failed declining a subscription");
                        log.Debug("  status = {0}", wsStatus.ToString());
                        log.Debug("  deleting the local subscription");

                        // Delete the subscription and return true so the thread
                        // controlling the subscription will die off.
                        poBox.Commit(poBox.Delete(subscription));
                        result = true;
                        break;
                    }

                    default:
                    {
                        log.Debug("  failed declining a subscription.  Status: " + wsStatus.ToString());
                        break;
                    }
                    }
                }
            }
            catch (Exception e)
            {
                log.Error("  DoReplied failed updating originator's PO box");
                log.Error(e.Message);
                log.Error(e.StackTrace);
            }

            return(result);
        }
Example #5
0
 public System.IAsyncResult BeginAckSubscription(SubscriptionMsg subMsg, System.AsyncCallback callback, object asyncState)
 {
     return(this.BeginInvoke("AckSubscription", new object[] {
         subMsg
     }, callback, asyncState));
 }