view daemon/IncomingTcpConnection.cs @ 56:dc3f59937772

remote dynamic
author riono <e165729@ie.u-ryukyu.ac.jp>
date Tue, 25 Jan 2022 16:46:26 +0900
parents e75e143b92e7
children 959096e8786b
line wrap: on
line source

using System;
using System.IO;
using Christie_net.codegear;
using Christie_net.datagear;
using Christie_net.datagear.command;
using Christie_net.datagear.dg;
using MessagePack;
using CommandType = Christie_net.datagear.command.CommandType;


namespace Christie_net.daemon {
public class IncomingTcpConnection {
    private RemoteDataGearManager manager;
    private CodeGearManager cgm;
    private Connection connection;

    public IncomingTcpConnection(Connection connection) {
        this.connection = connection;
        this.cgm = connection.cgm;
    }

    public void SetManager(RemoteDataGearManager manager) {
        this.manager = manager;
    }

    public void Run() {
        while (true) {
            // データはRemotemessage length, Remotemessage(Command), data length, dataの順で入っている
            byte[] remoteMessageSizeArray = new byte[1];
            byte[] remoteMessage;
            byte[] dataSizeArray = new byte[1];
            byte[] data;

            int dataLen;
            int length = 0;
            try {
                // get RemoteMessage.class size
                connection.stream.Read(remoteMessageSizeArray, 0, 1);
                int remoteMsglen = MessagePackSerializer.Deserialize<int>(remoteMessageSizeArray);

                remoteMessage = new byte[remoteMsglen];
                
                // get RemoteMessage
                connection.stream.Read(remoteMessage, 0, remoteMsglen);
                RemoteMessage msg = MessagePackSerializer.Deserialize<RemoteMessage>(remoteMessage);
                CommandType type = CommandTypeExt.GetCommandTypeFormId(msg.type);

                // Debug
                //Console.WriteLine("length:" + msg.key + " " + msg.type);

                //Console.WriteLine("call:" + connection.stream.Position);

                // int dataSize = connection.stream.Read()

                switch (type) {
                    case CommandType.PUT:
                        // get data size
                        connection.stream.Read(dataSizeArray, 0, 1);
                        dataLen = MessagePackSerializer.Deserialize<int>(dataSizeArray);
                        data = new byte[dataLen];
                        
                        // get data
                        connection.stream.Read(data, 0, dataLen);
                        //data = msg.data;

                        try {
                            MessagePackDataGear<object> dg =
                                new MessagePackDataGear<object>(data, Type.GetType(msg.clazz));

                            cgm.GetLocalDGM().Put(msg.key, dg);
                        } catch (TypeLoadException e) {
                            Console.WriteLine(e.StackTrace);
                        }

                        break;

                    case CommandType.REMOTEPEEK:
                    case CommandType.REMOTETAKE:
                        try {
                            Command cm = new CommandBuilder().Init(type).FromDgmName(msg.fromDmgName)
                                .Key(msg.key)
                                .Clazz(Type.GetType(msg.clazz))
                                .Connection(connection).Build();
                            cgm.GetLocalDGM().RunCommand(cm);
                        } catch (TypeLoadException e) {
                            Console.WriteLine(e.StackTrace);
                        } catch (Exception e) {
                            Console.WriteLine(e);
                        }

                        break;

                    case CommandType.REPLY: // 待っていたwaitlistに渡してcsにセット
                        // get data size
                        connection.stream.Read(dataSizeArray, 0, 1);
                        dataLen = MessagePackSerializer.Deserialize<int>(dataSizeArray);
                        data = new byte[dataLen];
                        
                        // get data
                        connection.stream.Read(data, 0, dataLen);

                        // data = new byte[MessagePackSerializer.Deserialize<int>(streamData)];
                        // connection.socket.Receive(data);

                        try {
                            MessagePackDataGear<object> dg =
                                new MessagePackDataGear<object>(data, Type.GetType(msg.clazz));
                            cgm.GetDGM(msg.fromDmgName).ResolveWaitCommand(msg.key, dg);
                        } catch (TypeLoadException e) {
                            Console.WriteLine(e.StackTrace);
                        }

                        break;

                    default:
                        break;
                }
            } catch (Exception e) {
                Console.WriteLine(e.StackTrace);
            }
        }
    }
}
}