/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #pragma once namespace Apache { namespace Qpid { namespace Interop { using namespace System; using namespace System::Runtime::InteropServices; using namespace qpid::client; using namespace qpid::framing; using namespace std; // This class provides memory streaming of the message body contents // between native and managed space. To avoid additional memory copies // in native space, it reads and writes directly to the low level Qpid // frames. public ref class MessageBodyStream : System::IO::Stream { private: bool isInputStream; long long length; long long position; // the boost smart pointer that keeps the message body frames in memory FrameSet::shared_ptr *frameSetpp; int fragmentCount; int fragmentIndex; const char* currentFragment; int fragmentPosition; int fragmentLength; array^ fragments; int maxFrameContentSize; AMQFrame* currentFramep; void* headerBodyp; bool disposed; bool finalizing; void Cleanup(); internal: // incoming message MessageBodyStream(FrameSet::shared_ptr *fspp); // outgoing message MessageBodyStream(int maxFrameSize); void pushCurrentFrame(bool last); public: ~MessageBodyStream(); !MessageBodyStream(); virtual void Close() override; virtual int Read( [InAttribute] [OutAttribute] array^ buffer, int offset, int count) override; virtual void Write( array^ buffer, int offset, int count) override; IntPtr GetFrameSet(); IntPtr GetHeader(); virtual void Flush() override {} // noop // TODO: see CanSeek below. virtual long long Seek( long long offset, System::IO::SeekOrigin origin) override {throw gcnew System::NotSupportedException(); } // TODO: see CanSeek below. virtual void SetLength( long long value) override {throw gcnew System::NotSupportedException(); } virtual property long long Length { long long get() override { return length; } }; virtual property long long Position { long long get() override { return position; } void set(long long p) override { throw gcnew System::NotSupportedException(); } }; virtual property bool CanRead { bool get () override { return isInputStream; } } virtual property bool CanWrite { bool get () override { return !isInputStream; } } // Note: this class must return true to signal that the Length property works. // Required by the raw message encoder. // "If a class derived from Stream does not support seeking, calls to Length, // SetLength, Position, and Seek throw a NotSupportedException". virtual property bool CanSeek { bool get () override { return true; } } virtual property bool CanTimeout { bool get () override { return isInputStream; } } }; }}} // namespace Apache::Qpid::Interop