Example #1
0
        public override void ServerToClient(WfProcessDescriptor server, ref WfClientProcessDescriptor client)
        {
            server.NullCheck("server");

            if (client == null)
            {
                client = new WfClientProcessDescriptor();
            }

            base.ServerToClient(server, ref client);

            WfClientRelativeLinkDescriptorCollectionConverter.Instance.ServerToClient(server.RelativeLinks, client.RelativeLinks);
            WfClientVariableDescriptorCollectionConverter.Instance.ServerToClient(server.Variables, client.Variables);
            WfClientResourceDescriptorCollectionConverter.Instance.ServerToClient(server.CancelEventReceivers, client.CancelEventReceivers);

            foreach (WfActivityDescriptor actDesp in server.Activities)
            {
                WfClientActivityDescriptor cad = null;

                WfClientActivityDescriptorConverter.Instance.ServerToClient(actDesp, ref cad);

                client.Activities.Add(cad);
            }

            TransitionsServerToClient(server, client);
        }
Example #2
0
        public override WfClientProcessDescriptor Build(string processKey, string processName)
        {
            this.CreateParams.Key  = processKey;
            this.CreateParams.Name = processName;

            WfClientProcessDescriptor processDesp = base.Build(processKey, processName);

            processDesp.Variables.AddOrSetValue("ClientDynamicProcess", "True", WfClientVariableDataType.Boolean);

            MergeProperties(processDesp.Properties, this.CreateParams.Properties);

            WfClientActivityDescriptor dynamicActivityDesp = CreateDynamicActivityDescriptor(this.CreateParams.ActivityMatrix);

            processDesp.Activities.Add(dynamicActivityDesp);

            WfClientTransitionDescriptor transitionSN = new WfClientTransitionDescriptor(processDesp.InitialActivity.Key, dynamicActivityDesp.Key)
            {
                Key = "L1"
            };

            processDesp.InitialActivity.ToTransitions.Add(transitionSN);

            WfClientTransitionDescriptor transitionNC = new WfClientTransitionDescriptor(dynamicActivityDesp.Key, processDesp.CompletedActivity.Key)
            {
                Key = "L2"
            };

            dynamicActivityDesp.ToTransitions.Add(transitionNC);

            return(processDesp);
        }
Example #3
0
        public void ServerToClient(IWfMainStreamActivityDescriptor server, ref WfClientMainStreamActivityDescriptor client)
        {
            server.NullCheck("server");

            WfClientActivityDescriptor clientActDesp = null;

            WfClientActivityDescriptorConverter.Instance.ServerToClient((WfActivityDescriptor)server.Activity, ref clientActDesp);

            if (client == null)
            {
                client = new WfClientMainStreamActivityDescriptor(clientActDesp);
            }

            client.Level = server.Level;

            foreach (WfActivityDescriptor actDesp in server.AssociatedActivities)
            {
                WfClientActivityDescriptor cad = null;

                WfClientActivityDescriptorConverter.Instance.ServerToClient(actDesp, ref cad);

                client.AssociatedActivities.Add(cad);
            }

            FillStatusAndAssignees(client, server);
        }
        /// <summary>
        /// 创建一个带动态矩阵资源的流程定义
        /// </summary>
        /// <returns></returns>
        public static WfClientProcessDescriptor CreateClientProcessWithActivityMatrixResourceDescriptor()
        {
            WfClientProcessDescriptor processDesp = CreateSimpleClientProcessWithoutLines();

            WfClientActivityDescriptor actDesp = ActivityDescriptorHelper.CreateSimpleClientActivity("N1", "活动矩阵", WfClientActivityType.NormalActivity);

            actDesp.Properties.AddOrSetValue("IsDynamic", true);
            actDesp.Resources.Add(GetClientActivityMatrixResourceDescriptor());

            processDesp.Activities.Add(actDesp);

            WfClientTransitionDescriptor transitionToN1 = new WfClientTransitionDescriptor(processDesp.InitialActivity.Key, "N1")
            {
                Key = "L1"
            };

            processDesp.InitialActivity.ToTransitions.Add(transitionToN1);

            WfClientTransitionDescriptor transitionToCompleted = new WfClientTransitionDescriptor(actDesp.Key, processDesp.CompletedActivity.Key)
            {
                Key = "L2"
            };

            processDesp.Activities["N1"].ToTransitions.Add(transitionToCompleted);

            return(processDesp);
        }
Example #5
0
        public WorkBook ClientDynamicProcessToExcel(WfClientProcessDescriptor client)
        {
            bool isDynamic = client.Variables.GetValue("ClientDynamicProcess", false);

            ExceptionHelper.TrueThrow <ArgumentException>(isDynamic == false,
                                                          Translator.Translate(Define.DefaultCulture, "非动态活动流程不能导出{0}", client.Key));

            WorkBook wb = WorkBook.CreateNew();

            wb.Sheets.Clear();

            WorkSheet workSheet = null;
            Row       titleRow  = null;

            #region 流程定义信息
            workSheet = new WorkSheet(wb, "Process");
            titleRow  = new Row(1)
            {
                Height = 30d
            };
            titleRow.Style.Fill.SetBackgroundColor(Color.LightGray, ExcelFillStyle.Solid);
            titleRow.Style.Font.Size = 20;
            workSheet.Rows.Add(titleRow);
            workSheet.Cells[titleRow.Index, 1].Value = "流程属性";

            CreateCommonHeaderRow(client, workSheet);

            FillCommonSheetData(client, workSheet);
            wb.Sheets.Add(workSheet);
            #endregion

            #region 矩阵信息
            WfClientActivityDescriptor activity = client.Activities.Find(w => w.Resources.Count > 0 && w.Resources[0] is WfClientActivityMatrixResourceDescriptor);
            if (activity == null)
            {
                return(wb);
            }

            WfClientActivityMatrixResourceDescriptor matrix = activity.Resources[0] as WfClientActivityMatrixResourceDescriptor;

            workSheet = new WorkSheet(wb, "Matrix");

            titleRow = new Row(1)
            {
                Height = 30d
            };
            titleRow.Style.Fill.SetBackgroundColor(Color.LightGray, ExcelFillStyle.Solid);
            titleRow.Style.Font.Size = 20;
            workSheet.Rows.Add(titleRow);
            workSheet.Cells[titleRow.Index, 1].Value = "角色属性";

            CreateMatrixHeaderRow(matrix, workSheet);

            FillMatrixSheetData(matrix, workSheet);
            wb.Sheets.Add(workSheet);
            #endregion

            return(wb);
        }
        public WfClientActivity(WfClientActivityDescriptor descriptor)
        {
            _Descriptor = descriptor;

            this._ProcessDescKey = descriptor.Process.Key;
            this._ActivityDescKey = descriptor.Key;
            this._StartTime = DateTime.Now;
        }
        private static WfClientActivityDescriptor CreateDynamicActivityDescriptor(WfClientActivityMatrixResourceDescriptor activityMatrix)
        {
            WfClientActivityDescriptor dynamicActivityDesp = new WfClientActivityDescriptor(WfClientActivityType.NormalActivity) { Key = "N1", Name = "审批" };

            dynamicActivityDesp.Properties.AddOrSetValue("IsDynamic", "True");

            dynamicActivityDesp.Resources.Add(activityMatrix);

            return dynamicActivityDesp;
        }
        public static WfClientActivityDescriptor CreateSimpleClientActivityWithUser(string key, string name, string userKey, WfClientActivityType actType)
        {
            WfClientActivityDescriptor actDesp = CreateSimpleClientActivity(key, name, actType);

            actDesp.Resources.Add(new WfClientUserResourceDescriptor(Consts.Users[userKey]));
            actDesp.EnterEventReceivers.Add(new WfClientUserResourceDescriptor(Consts.Users[userKey]));
            actDesp.LeaveEventReceivers.Add(new WfClientUserResourceDescriptor(Consts.Users[userKey]));

            return(actDesp);
        }
        /// <summary>
        /// 创建一个不带资源的简单活动
        /// </summary>
        /// <param name="key"></param>
        /// <param name="name"></param>
        /// <param name="actType"></param>
        /// <returns></returns>
        public static WfClientActivityDescriptor CreateSimpleClientActivity(string key, string name, WfClientActivityType actType)
        {
            WfClientActivityDescriptor actDesp = new WfClientActivityDescriptor(actType);

            actDesp.Key = key;
            actDesp.Name = name;

            actDesp.RelativeLinks.Add(new WfClientRelativeLinkDescriptor("AR1") { Category = "Activity", Url = "http://www.ak47.com" });

            return actDesp;
        }
Example #10
0
        private static WfClientActivityDescriptor CreateDynamicActivityDescriptor(WfClientActivityMatrixResourceDescriptor activityMatrix)
        {
            WfClientActivityDescriptor dynamicActivityDesp = new WfClientActivityDescriptor(WfClientActivityType.NormalActivity)
            {
                Key = "N1", Name = "审批"
            };

            dynamicActivityDesp.Properties.AddOrSetValue("IsDynamic", "True");

            dynamicActivityDesp.Resources.Add(activityMatrix);

            return(dynamicActivityDesp);
        }
        /// <summary>
        /// 创建一个不带资源的简单活动
        /// </summary>
        /// <param name="key"></param>
        /// <param name="name"></param>
        /// <param name="actType"></param>
        /// <returns></returns>
        public static WfClientActivityDescriptor CreateSimpleClientActivity(string key, string name, WfClientActivityType actType)
        {
            WfClientActivityDescriptor actDesp = new WfClientActivityDescriptor(actType);

            actDesp.Key  = key;
            actDesp.Name = name;

            actDesp.RelativeLinks.Add(new WfClientRelativeLinkDescriptor("AR1")
            {
                Category = "Activity", Url = "http://www.ak47.com"
            });

            return(actDesp);
        }
Example #12
0
        public void StandardServerActivitiesToClient()
        {
            WfActivityDescriptor serverActDesp = PrepareServerActivity("N1");

            serverActDesp.Output();

            WfClientActivityDescriptor clientActDesp = null;

            WfClientActivityDescriptorConverter.Instance.ServerToClient(serverActDesp, ref clientActDesp);

            clientActDesp.Output();
            clientActDesp.Variables.Output();

            clientActDesp.AssertActivityDescriptor(serverActDesp);
        }
        public override IDictionary <string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            Dictionary <string, object> dictionary = (Dictionary <string, object>)base.Serialize(obj, serializer);
            WfClientActivityDescriptor  actDesp    = (WfClientActivityDescriptor)obj;

            dictionary["activityType"] = actDesp.ActivityType;
            dictionary.AddNonDefaultValue("condition", actDesp.Condition);

            dictionary.Add("variables", actDesp.Variables);
            dictionary.Add("resources", actDesp.Resources);
            dictionary.Add("enterEventReceivers", actDesp.EnterEventReceivers);
            dictionary.Add("leaveEventReceivers", actDesp.LeaveEventReceivers);
            dictionary.Add("transition", actDesp.ToTransitions);
            dictionary.Add("branchProcessTemplates", actDesp.BranchProcessTemplates);
            dictionary.Add("relativeLinks", actDesp.RelativeLinks);

            return(dictionary);
        }
        public override object Deserialize(IDictionary <string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            WfClientActivityDescriptor actDesp = (WfClientActivityDescriptor)base.Deserialize(dictionary, type, serializer);

            actDesp.Condition = JSONSerializerExecute.Deserialize <WfClientConditionDescriptor>(dictionary.GetValue("condition", (object)null));

            JSONSerializerExecute.FillDeserializedCollection <WfClientVariableDescriptor>(dictionary.GetValue("variables", (object)null), actDesp.Variables);
            JSONSerializerExecute.FillDeserializedCollection <WfClientResourceDescriptor>(dictionary.GetValue("resources", (object)null), actDesp.Resources);

            JSONSerializerExecute.FillDeserializedCollection <WfClientResourceDescriptor>(dictionary.GetValue("enterEventReceivers", (object)null), actDesp.EnterEventReceivers);
            JSONSerializerExecute.FillDeserializedCollection <WfClientResourceDescriptor>(dictionary.GetValue("leaveEventReceivers", (object)null), actDesp.LeaveEventReceivers);

            JSONSerializerExecute.FillDeserializedCollection <WfClientTransitionDescriptor>(dictionary.GetValue("transition", (object)null), actDesp.ToTransitions);
            JSONSerializerExecute.FillDeserializedCollection <WfClientBranchProcessTemplateDescriptor>(dictionary.GetValue("branchProcessTemplates", (object)null), actDesp.BranchProcessTemplates);
            JSONSerializerExecute.FillDeserializedCollection <WfClientRelativeLinkDescriptor>(dictionary.GetValue("relativeLinks", (object)null), actDesp.RelativeLinks);

            return(actDesp);
        }
Example #15
0
        private static void TransitionsServerToClient(WfProcessDescriptor server, WfClientProcessDescriptor client)
        {
            foreach (IWfActivityDescriptor sa in server.Activities)
            {
                foreach (WfTransitionDescriptor st in sa.ToTransitions)
                {
                    WfClientTransitionDescriptor ct = null;

                    WfClientTransitionDescriptorConverter.Instance.ServerToClient(st, ref ct);

                    WfClientActivityDescriptor fromActDesp = client.Activities[sa.Key];

                    if (fromActDesp != null)
                    {
                        fromActDesp.ToTransitions.Add(ct);
                    }
                }
            }
        }
        public WfClientActivity ServerToClient(IWfActivity server, ref WfClientActivity client)
        {
            if (server != null)
            {
                if (client == null)
                {
                    client = new WfClientActivity();
                }

                client.ID = server.ID;

                if (server.Descriptor != null)
                {
                    client.DescriptorKey = server.Descriptor.Key;
                }

                client.LoadingType              = server.LoadingType.ToClientDataLoadingType();
                client.StartTime                = server.StartTime;
                client.EndTime                  = server.EndTime;
                client.MainStreamActivityKey    = server.MainStreamActivityKey;
                client.BranchProcessReturnValue = server.BranchProcessReturnValue.ToClientBranchProcessReturnType();
                client.BranchProcessGroupsCount = server.BranchProcessGroups.Count;
                client.Operator                 = (WfClientUser)server.Operator.ToClientOguObject();
                client.Status = server.Status.ToClientActivityStatus();

                WfClientAssigneeCollectionConverter.Instance.ServerToClient(server.Assignees, client.Assignees);
                WfClientAssigneeCollectionConverter.Instance.ServerToClient(server.Candidates, client.Candidates);

                if (this._ConvertDescriptor)
                {
                    WfClientActivityDescriptor clientActDesp = null;

                    WfClientActivityDescriptorConverter.Instance.ServerToClient((WfActivityDescriptor)server.Descriptor, ref clientActDesp);
                    client.Descriptor = clientActDesp;
                }
            }
            else
            {
                client = null;
            }

            return(client);
        }
Example #17
0
        public static WfClientProcessInfo PrepareBranchProcesses()
        {
            WfClientProcessDescriptor processDesp = ProcessDescriptorHelper.CreateSimpleClientProcessWithoutLines();

            //增加子节点
            WfClientActivityDescriptor branchActDesp = new WfClientActivityDescriptor(WfClientActivityType.NormalActivity);

            branchActDesp.Key  = "N1";
            branchActDesp.Name = "CFO";

            branchActDesp.Properties.AddOrSetValue("AutoStartBranchProcesses", true);
            branchActDesp.Properties.AddOrSetValue("AutoStartBranchApprovalProcess", true);
            branchActDesp.Properties.AddOrSetValue("AutoStartBranchProcessExecuteSequence", 0);

            //增加审批人
            branchActDesp.Resources.Add(new WfClientUserResourceDescriptor(Consts.Users["Requestor"]));
            branchActDesp.Resources.Add(new WfClientUserResourceDescriptor(Consts.Users["Approver1"]));
            branchActDesp.Resources.Add(new WfClientUserResourceDescriptor(Consts.Users["CEO"]));

            processDesp.Activities.Add(branchActDesp);

            //线
            WfClientTransitionDescriptor transition = new WfClientTransitionDescriptor(processDesp.InitialActivity.Key, branchActDesp.Key);

            transition.Key = "L1";
            processDesp.InitialActivity.ToTransitions.Add(transition);

            WfClientTransitionDescriptor transition2 = new WfClientTransitionDescriptor(branchActDesp.Key, processDesp.CompletedActivity.Key);

            transition2.Key = "L2";
            branchActDesp.ToTransitions.Add(transition2);

            WfClientProcessDescriptorServiceProxy.Instance.SaveDescriptor(processDesp);

            //启动参数
            WfClientProcessStartupParams clientStartupParams = ProcessRuntimeHelper.PrepareClientProcessStartupParams(processDesp.Key);

            //流程实例
            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();
            WfClientProcessInfo    process        = WfClientProcessRuntimeServiceProxy.Instance.StartWorkflow(clientStartupParams);

            return(WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(process.ID, runtimeContext));
        }
Example #18
0
        public static void AssertActivityDescriptor(this WfClientActivityDescriptor cad, WfClientActivityDescriptor sad)
        {
            cad.AreSame(sad);
            Assert.AreEqual(cad.ActivityType, sad.ActivityType);

            cad.Condition.AreSame(sad.Condition);
            cad.Variables.AssertCollection(sad.Variables);
            cad.Resources.AssertResources(sad.Resources);
            cad.EnterEventReceivers.AssertResources(sad.EnterEventReceivers);
            cad.LeaveEventReceivers.AssertResources(sad.LeaveEventReceivers);

            cad.ToTransitions.AssertCollection(sad.ToTransitions);
            cad.ToTransitions.ForEach(ct => ct.IsValid());
            sad.ToTransitions.ForEach(st => st.IsValid());

            cad.GetFromTransitions().AssertCollection(sad.GetFromTransitions());
            cad.GetFromTransitions().ForEach(ct => ct.IsValid());
            sad.GetFromTransitions().ForEach(st => st.IsValid());

            cad.RelativeLinks.AssertRelativeLinks(sad.RelativeLinks);
        }
        public static void AssertActivityDescriptor(this WfClientActivityDescriptor cad, WfClientActivityDescriptor sad)
        {
            cad.AreSame(sad);
            Assert.AreEqual(cad.ActivityType, sad.ActivityType);

            cad.Condition.AreSame(sad.Condition);
            cad.Variables.AssertCollection(sad.Variables);
            cad.Resources.AssertResources(sad.Resources);
            cad.EnterEventReceivers.AssertResources(sad.EnterEventReceivers);
            cad.LeaveEventReceivers.AssertResources(sad.LeaveEventReceivers);

            cad.ToTransitions.AssertCollection(sad.ToTransitions);
            cad.ToTransitions.ForEach(ct => ct.IsValid());
            sad.ToTransitions.ForEach(st => st.IsValid());

            cad.GetFromTransitions().AssertCollection(sad.GetFromTransitions());
            cad.GetFromTransitions().ForEach(ct => ct.IsValid());
            sad.GetFromTransitions().ForEach(st => st.IsValid());

            cad.RelativeLinks.AssertRelativeLinks(sad.RelativeLinks);
        }
        private static WfClientActivityDescriptor PrepareClientActivity(string key)
        {
            WfClientActivityDescriptor actDesp = new WfClientActivityDescriptor(WfClientActivityType.InitialActivity);

            actDesp.Key = key;
            actDesp.Name = key;

            actDesp.Condition.Expression = "Amount > 1000";
            actDesp.Variables.AddOrSetValue("ActKey", key);
            actDesp.Variables.AddOrSetValue("ActName", key);

            actDesp.Resources.Add(new WfClientUserResourceDescriptor(new WfClientUser(ActivityConverterTest.UserID)));
            actDesp.Resources.Add(new WfClientDepartmentResourceDescriptor(new WfClientOrganization(ActivityConverterTest.OrganizationID)));
            actDesp.Resources.Add(new WfClientGroupResourceDescriptor(new WfClientGroup(ActivityConverterTest.GroupID)));
            actDesp.Resources.Add(new WfClientRoleResourceDescriptor(ActivityConverterTest.RoleFullCodeName));
            actDesp.Resources.Add(new WfClientActivityOperatorResourceDescriptor(ActivityConverterTest.ResActivityKey));
            actDesp.Resources.Add(new WfClientActivityAssigneesResourceDescriptor(ActivityConverterTest.ResActivityKey));
            actDesp.Resources.Add(new WfClientDynamicResourceDescriptor("ConditionResource", "Amount > 1000"));
            actDesp.BranchProcessTemplates.Add(BranchProcessTemplateConverterTest.PrepareClientBranchProcessTemplate());

            return actDesp;
        }
Example #21
0
        private static WfClientActivityDescriptor PrepareClientActivity(string key)
        {
            WfClientActivityDescriptor actDesp = new WfClientActivityDescriptor(WfClientActivityType.InitialActivity);

            actDesp.Key  = key;
            actDesp.Name = key;

            actDesp.Condition.Expression = "Amount > 1000";
            actDesp.Variables.AddOrSetValue("ActKey", key);
            actDesp.Variables.AddOrSetValue("ActName", key);

            actDesp.Resources.Add(new WfClientUserResourceDescriptor(new WfClientUser(ActivityConverterTest.UserID)));
            actDesp.Resources.Add(new WfClientDepartmentResourceDescriptor(new WfClientOrganization(ActivityConverterTest.OrganizationID)));
            actDesp.Resources.Add(new WfClientGroupResourceDescriptor(new WfClientGroup(ActivityConverterTest.GroupID)));
            actDesp.Resources.Add(new WfClientRoleResourceDescriptor(ActivityConverterTest.RoleFullCodeName));
            actDesp.Resources.Add(new WfClientActivityOperatorResourceDescriptor(ActivityConverterTest.ResActivityKey));
            actDesp.Resources.Add(new WfClientActivityAssigneesResourceDescriptor(ActivityConverterTest.ResActivityKey));
            actDesp.Resources.Add(new WfClientDynamicResourceDescriptor("ConditionResource", "Amount > 1000"));
            actDesp.BranchProcessTemplates.Add(BranchProcessTemplateConverterTest.PrepareClientBranchProcessTemplate());

            return(actDesp);
        }
Example #22
0
        public static WfClientProcessInfo PrepareBranchProcesses()
        {
            WfClientProcessDescriptor processDesp = ProcessDescriptorHelper.CreateSimpleClientProcessWithoutLines();

            //增加子节点
            WfClientActivityDescriptor branchActDesp = new WfClientActivityDescriptor(WfClientActivityType.NormalActivity);
            branchActDesp.Key = "N1";
            branchActDesp.Name = "CFO";

            branchActDesp.Properties.AddOrSetValue("AutoStartBranchProcesses", true);
            branchActDesp.Properties.AddOrSetValue("AutoStartBranchApprovalProcess", true);
            branchActDesp.Properties.AddOrSetValue("AutoStartBranchProcessExecuteSequence", 0);

            //增加审批人
            branchActDesp.Resources.Add(new WfClientUserResourceDescriptor(Consts.Users["Requestor"]));
            branchActDesp.Resources.Add(new WfClientUserResourceDescriptor(Consts.Users["Approver1"]));
            branchActDesp.Resources.Add(new WfClientUserResourceDescriptor(Consts.Users["CEO"]));

            processDesp.Activities.Add(branchActDesp);

            //线
            WfClientTransitionDescriptor transition = new WfClientTransitionDescriptor(processDesp.InitialActivity.Key, branchActDesp.Key);
            transition.Key = "L1";
            processDesp.InitialActivity.ToTransitions.Add(transition);

            WfClientTransitionDescriptor transition2 = new WfClientTransitionDescriptor(branchActDesp.Key, processDesp.CompletedActivity.Key);
            transition2.Key = "L2";
            branchActDesp.ToTransitions.Add(transition2);

            WfClientProcessDescriptorServiceProxy.Instance.SaveDescriptor(processDesp);

            //启动参数
            WfClientProcessStartupParams clientStartupParams = ProcessRuntimeHelper.PrepareClientProcessStartupParams(processDesp.Key);

            //流程实例
            WfClientRuntimeContext runtimeContext = new WfClientRuntimeContext();
            WfClientProcessInfo process = WfClientProcessRuntimeServiceProxy.Instance.StartWorkflow(clientStartupParams);

            return WfClientProcessRuntimeServiceProxy.Instance.MoveToNextDefaultActivity(process.ID, runtimeContext);
        }
Example #23
0
 public WfClientInitialActivity(WfClientActivityDescriptor descriptor) : base(descriptor)
 {
 }
 public WfClientNormalActivity(WfClientActivityDescriptor descriptor) : base(descriptor)
 {
 }
        public WfClientInitialActivity(WfClientActivityDescriptor descriptor): base(descriptor)
		{
		}
        public WfClientCompletedActivity(WfClientActivityDescriptor descriptor): base(descriptor)
		{
		}