2

私は現在、MonoTouch を使用した iOS アプリの開発に忙しくしています。

外部アクセサリに接続して EASession を確立するときは、NSInputStream と NSOutputStream を、入力ストリームと出力ストリームの両方で System.IO.Stream を使用する別のメソッドに渡す必要があります。

プラットフォームに依存しないように作成されたいくつかの C# ライブラリを使用しているため、これをどのように進めればよいかわかりません。したがって、メソッドを変更して NSInputStream/NSOutputStream を期待することはできません。

これらのストリームを System.IO.Stream に変換する最良の方法は何ですか?

ありがとう

4

2 に答える 2

2

現在、NSInputStream/NSOutputStream を System.IO.Stream に変換する組み込みの方法はありませんが、次のような独自の System.IO.Stream ラッパーを簡単に作成できます。

class MyInputStream : System.IO.Stream
{
    NSInputStream input_stream;
    public MyInputStream (NSInputStream str)
    {
        input_stream = str;
    }

    public override void Flush ()
    {
        throw new NotSupportedException ();
    }

    public override int Read (byte[] buffer, int offset, int count)
    {
        if (offset != 0)
            throw new NotSupportedException ();
        return input_stream.Read (buffer, count);
    }

    public override long Seek (long offset, System.IO.SeekOrigin origin)
    {
        throw new NotSupportedException ();
    }

    public override void SetLength (long value)
    {
        throw new NotSupportedException ();
    }

    public override void Write (byte[] buffer, int offset, int count)
    {
        throw new NotSupportedException ();
    }

    public override bool CanRead {
        get {
            return true;
        }
    }

    public override bool CanSeek {
        get {
            return false;
        }
    }

    public override bool CanWrite {
        get {
            return false;
        }
    }

    public override long Length {
        get {
            throw new NotSupportedException ();
        }
    }

    public override long Position {
        get {
            throw new NotSupportedException ();
        }
        set {
            throw new NotSupportedException ();
        }
    }
}
于 2013-04-24T11:16:34.550 に答える
1

これで正常に動作するようになりました。誰か提案があれば教えてください。

InputStream は非常に簡単ですが、OutputStream は少し異なります。以下のコードでは、Write() メソッドと WriteByte() メソッドの両方を呼び出すことができます。これがどのように機能するかを人々が確認できるように、 Console.WriteLine() に残しました。

入力ストリーム:

class CustomInputStream : System.IO.Stream
{

    NSInputStream input_stream;

    public CustomInputStream (NSInputStream str)
    {
        input_stream = str;
    }

    public override void Flush ()
    {
        throw new NotSupportedException ();
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        if (offset != 0)
            throw new NotSupportedException ();
        return input_stream.Read (buffer, (uint)count);
    }

    public override long Seek (long offset, System.IO.SeekOrigin origin)
    {
        throw new NotSupportedException ();
    }

    public override void SetLength (long value)
    {
        throw new NotSupportedException ();
    }

    public override void Write (byte[] buffer, int offset, int count)
    {
        throw new NotSupportedException ();
    }

    public override bool CanRead {
        get {
            return true;
        }
    }

    public override bool CanSeek {
        get {
            return false;
        }
    }

    public override bool CanWrite {
        get {
            return false;
        }
    }

    public override long Length {
        get {
            throw new NotSupportedException ();
        }
    }

    public override long Position {
        get {
            throw new NotSupportedException ();
        }
        set {
            throw new NotSupportedException ();
        }
    }

}

出力ストリーム:

class CustomOutputStream : System.IO.Stream
{

    NSOutputStream output_stream;
    List<byte> buffer;

    public CustomOutputStream (NSOutputStream str)
    {
        output_stream = str;
        buffer = new List<byte>();
    }

    public override void Flush ()
    {
        Write(buffer.ToArray(),0,buffer.Count);
        buffer.Clear();
    }

    public override int Read (byte[] buffer, int offset, int count)
    {       
            throw new NotSupportedException ();
    }

    public override long Seek (long offset, System.IO.SeekOrigin origin)
    {
        throw new NotSupportedException ();
    }

    public override void SetLength (long value)
    {
        throw new NotSupportedException ();
    }

    public override void Write (byte[] buffer, int offset, int count)
    {
        if (offset != 0)
            throw new NotSupportedException ();

        int sent = 0;
        var stillToSend = new byte[buffer.Length-offset];
        buffer.CopyTo(stillToSend, offset);

        Console.WriteLine("out while begin (buffer: {0})",buffer.LongLength);   
        while (count > 0)
        {       
            if (output_stream.HasSpaceAvailable()) 
            {   
                Console.WriteLine("in while has space");
                var bytesWritten = output_stream.Write(buffer, (uint)count);
                if (bytesWritten == -1)
                {
                    Console.WriteLine(@"write error");
                    break;
                }
                else if (bytesWritten > 0)
                {
                    Console.WriteLine("Bytes written: "+ bytesWritten.ToString());
                    count -= bytesWritten;
                    if (0 == count)
                        break;

                    var temp = new List<byte>();
                    for (var i=bytesWritten; i<stillToSend.Length; i++)
                    {
                        temp.Add(stillToSend[i]);
                    }
                    stillToSend = temp.ToArray();
                }
            }
            else 
            {
                Console.WriteLine("in while has NO space");
            }
        }


    }
    public override void WriteByte (byte value)
    {

        buffer.Add(value);

    }

    public override bool CanRead {
        get {
            return false;

        }
    }


    public override bool CanSeek {
        get {
            return false;
        }
    }

    public override bool CanWrite {
        get {
            return true;
        }
    }

    public override long Length {
        get {
            throw new NotSupportedException ();
        }
    }

    public override long Position {
        get {
            throw new NotSupportedException ();
        }
        set {
            throw new NotSupportedException ();
        }
    }

}
于 2013-06-11T09:46:04.160 に答える