view daemon/IncomingTcpConnection.cs @ 51:486683ead53f

bug survey
author riono <e165729@ie.u-ryukyu.ac.jp>
date Tue, 11 Jan 2022 20:02:18 +0900
parents 476b6efeca5b
children ef3fd58af531
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) {
            //TODO: Data長がわからないので1024で仮置き → ぴったしで読み込む必要がある
            byte[] streamData = new byte[1000000];
            
            
            int length = 0;
            try {
               length = connection.stream.Read(streamData);
               //Console.WriteLine("call:" + connection.stream.Position);

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

            // データはRemotemessage(Command), length, dataの順で入っている
            //int dataLength = connection.socket.Receive(deserializeCommand);

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

            RemoteMessage msg = MessagePackSerializer.Deserialize<RemoteMessage>(streamData);
            CommandType type = CommandTypeExt.GetCommandTypeFormId(msg.type);

            try {
                byte[] data;

                switch (type) {
                    case CommandType.PUT:
                        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にセット
                        data = msg.data;

                        // 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("call: " + e.StackTrace);
            } 
        }
    }
}
}