Пример #1
0
        internal virtual ReturnCode init(Subscriber subscriber, DataReaderQos drQos, ITopicDescriptionImpl aTopic, string drName)
        {
            ReturnCode result = DDS.ReturnCode.Ok;

            MyDomainId = subscriber.MyDomainId;

            using (OpenSplice.CustomMarshalers.DataReaderQosMarshaler qosMarshaler =
                       new OpenSplice.CustomMarshalers.DataReaderQosMarshaler())
            {
                result = qosMarshaler.CopyIn(drQos);
                if (result == ReturnCode.Ok)
                {
                    using (SequenceStringToCValueArrMarshaler paramsMarshaler = new SequenceStringToCValueArrMarshaler())
                    {
                        string[] _params = aTopic.rlReq_TopicExpressionParameters;
                        result = paramsMarshaler.CopyIn(_params);
                        if (result == ReturnCode.Ok)
                        {
                            IntPtr uReader = User.DataReader.NewBySQL(
                                subscriber.rlReq_UserPeer,
                                drName,
                                aTopic.rlReq_TopicExpression,
                                paramsMarshaler.UserPtr,
                                _params == null ? 0 : Convert.ToUInt32(_params.Length),
                                qosMarshaler.UserPtr);
                            if (uReader != IntPtr.Zero)
                            {
                                result = base.init(uReader);
                            }
                            else
                            {
                                ReportStack.Report(result, "Could not allocate memory.");
                                result = DDS.ReturnCode.OutOfResources;
                            }
                        }
                        else
                        {
                            ReportStack.Report(result, "Could not create DataReader.");
                        }
                    }
                }
                else
                {
                    ReportStack.Report(result, "Could not copy DataReaderQos.");
                }
            }
            if (result == ReturnCode.Ok)
            {
                this.subscriber = subscriber;
                this.topic      = aTopic;
                aTopic.wlReq_IncrNrUsers();
            }

            return(result);
        }
Пример #2
0
        internal ReturnCode ValidateFilter(string filterExpression, string[] filterParameters)
        {
            ReturnCode result  = DDS.ReturnCode.BadParameter;
            int        length  = (filterParameters != null) ? filterParameters.Length : 0;
            IntPtr     qExpr   = IntPtr.Zero;
            IntPtr     qParams = IntPtr.Zero;

            ReportStack.Start();
            if (length < 100)
            {
                qExpr = DDS.OpenSplice.Kernel.Parser.parse(filterExpression);
                if (qExpr != IntPtr.Zero && length > 0)
                {
                    SequenceStringToCValueArrMarshaler.CopyIn(filterParameters, ref qParams);
                }
                else
                {
                    ReportStack.Report(result, "ContentFilteredTopic cannot be created. Invalid expression: " + filterExpression);
                }
            }
            else
            {
                ReportStack.Report(result, "ContentFilteredTopic cannot be created. Too many parameters " + length + " (max = 99)");
            }

            if (qExpr != IntPtr.Zero)
            {
                if (User.Topic.ContentFilterValidate2(rlReq_UserPeer, qExpr, qParams) != 0)
                {
                    result = DDS.ReturnCode.Ok;
                }
                else
                {
                    ReportStack.Report(result, "ContentFilteredTopic cannot be created. Filter invalid: " + filterExpression);
                }
                if (qParams != IntPtr.Zero)
                {
                    SequenceStringToCValueArrMarshaler.CleanupIn(ref qParams, length);
                }
                q.dispose(qExpr);
            }
            ReportStack.Flush(this, result != ReturnCode.Ok);
            return(result);
        }