Пример #1
0
        public void TestReadStringCodeSetOk()
        {
            byte[]         testData    = new byte[] { 0, 0, 0, 5, 65, 66, 67, 68, 0 };
            CdrInputStream inputStream = PrepareStream(testData);
            string         result      = inputStream.ReadString();

            Assert.AreEqual("ABCD", result, "read string");
        }
Пример #2
0
        private static void ParseIOR(CdrInputStream cdrStream, out string typId, List <IorProfile> profiles)
        {
            typId = cdrStream.ReadString();
            ulong nrOfProfiles = cdrStream.ReadULong();

            for (ulong i = 0; i < nrOfProfiles; i++)
            {
                profiles.Add(ParseProfile(cdrStream));
            }
        }
Пример #3
0
 protected string ReadRepositoryId(CdrInputStream cdrStream)
 {
     return cdrStream.ReadString();
 }
Пример #4
0
 private static void ParseIOR(CdrInputStream cdrStream, out string typId, List<IorProfile> profiles)
 {
     typId = cdrStream.ReadString();
     ulong nrOfProfiles = cdrStream.ReadULong();
     for (ulong i = 0; i < nrOfProfiles; i++)
     {
         profiles.Add(ParseProfile(cdrStream));
     }
 }
        /// <summary>
        /// Deserialises the Giop Message body for a request
        /// </summary>
        /// <param name="cdrStream"></param>
        /// <param name="version"></param>
        /// <returns></returns>
        internal IMessage DeserialiseRequest(CdrInputStream cdrStream, GiopVersion version,
                                             GiopConnectionDesc conDesc, IInterceptionOption[] interceptionOptions) {
            MethodCall methodCallInfo = null;
            GiopServerRequest serverRequest = new GiopServerRequest(conDesc, interceptionOptions);
            serverRequest.Version = version;
            try {
                ServiceContextList cntxColl = null;
                if (version.IsBeforeGiop1_2()) { // GIOP 1.0 / 1.1
                    cntxColl = DeserialiseContext(cdrStream); // Service context deser
                }
                
                // read the request-ID and set it as a message property
                uint requestId = cdrStream.ReadULong(); 
                serverRequest.RequestId = requestId;
                Trace.WriteLine("received a message with reqId: " + requestId);
                // read response-flags:
                byte respFlags = cdrStream.ReadOctet(); Debug.WriteLine("response-flags: " + respFlags);
                cdrStream.ReadPadding(3); // read reserved bytes
                serverRequest.ResponseFlags = respFlags;
                
                // decode the target of this request
                byte[] objectKey;
                serverRequest.RequestUri = ReadTarget(cdrStream, version, out objectKey);
                serverRequest.ObjectKey = objectKey;
                serverRequest.RequestMethodName = cdrStream.ReadString();
                Trace.WriteLine("call for .NET object: " + serverRequest.RequestUri + 
                                ", methodName: " + serverRequest.RequestMethodName);

                if (version.IsBeforeGiop1_2()) { // GIOP 1.0 / 1.1
                    uint principalLength = cdrStream.ReadULong();
                    cdrStream.ReadOpaque((int)principalLength);
                } else {
                    cntxColl = DeserialiseContext(cdrStream); // Service context deser
                }
                PerformCodeSetEstablishmentServer(version, conDesc, cntxColl);
                // set codeset for stream
                SetCodeSet(cdrStream, conDesc);
                // request header deserialised

                serverRequest.RequestServiceContext = cntxColl;
                serverRequest.InterceptReceiveRequestServiceContexts();
                serverRequest.SetThreadScopeCurrentFromPICurrent(); // copy request scope picurrent to thread scope pi-current
                
                serverRequest.ResolveTargetType(); // determine the .net target object type and check if target object is available
                ArgumentsSerializer argSer =
                    m_argSerFactory.Create(serverRequest.ServerTypeType);
                MethodInfo called =
                    argSer.GetMethodInfoFor(serverRequest.RequestMethodName);
                serverRequest.ResolveCalledMethod(called); // set target method and handle special cases
                IDictionary contextElements;
                DeserialiseRequestBody(cdrStream, version, serverRequest, argSer, out contextElements);
                methodCallInfo = new MethodCall(serverRequest.Request);
                if (contextElements != null) {
                    AddContextElementsToCallContext(methodCallInfo.LogicalCallContext, contextElements);
                }
                serverRequest.UpdateWithFinalRequest(methodCallInfo);
                serverRequest.InterceptReceiveRequest(); // all information now available
                return methodCallInfo;
            } catch (Exception e) {
                // an Exception encountered during deserialisation
                try {
                    cdrStream.SkipRest(); // skip rest of the message, to not corrupt the stream
                } catch (Exception) {
                    // ignore exception here, already an other exception leading to problems
                }
                ReturnMessage exceptionResponse;
                exceptionResponse = new ReturnMessage(e, methodCallInfo);
                throw new RequestDeserializationException(e, serverRequest.Request, exceptionResponse);
                // send exception interception point will be called when serialising exception response
            }
        }