Esempio n. 1
0
        // ユーザ情報パケット待ち受け
        private void Exec_UserInfo(ref ServerChildJob job, byte[] bytes)
        {
            UserInfoPacket packet = new UserInfoPacket();
            if (WWProtocolV1Helper.GetUserInfoPacket(ref packet, bytes))
            {
                try
                {
                    job.userName = packet.name;
                    job.userComment = packet.comment;

                    // ユーザ情報をDbに登録
                    Sqlite3.sqlite3_exec(job.mainDb, "BEGIN", 0, 0, 0);
                    int rc = Sqlite3.sqlite3_exec(
                        job.mainDb,
                        "INSERT INTO user (id, room_id, name, comment) value (" +
                        job.socketID.ToString() + ", " +
                        job.roomID.ToString() + ", " +
                        "'" + job.userName + "', " +
                        "'" + job.userComment + "')",
                        0, 0, 0);
                    if (rc != Sqlite3.SQLITE_OK)
                    {
                        Exception e = new Exception("sqlite3_exec error.");
                        throw e;
                    }
                    Sqlite3.sqlite3_exec(job.mainDb, "COMMIT", 0, 0, 0);

                    // OKパケットをクライアントへ送信
                    byte[] okPacket = WWProtocolV1Helper.CreateOkPacket(++job.packetNum);
                    job.sendBuffer.Add(new ArraySegment<byte>(okPacket));
                }
                catch (Exception e)
                {
                    job.WriteLog(TraceEventType.Error, e.Message);

                    // 途中でエラー発生ならロールバック
                    Sqlite3.sqlite3_exec(job.mainDb, "ROLLBACK", 0, 0, 0);
                }
            }
        }
Esempio n. 2
0
        public static bool GetUserInfoPacket(ref UserInfoPacket packet, byte[] bytes)
        {
            if (IsCmdV1(bytes) && GetCmd(bytes) == Cmd.CMD_USER_INFO)
            {
                uint nameLen;
                nameLen = (uint)bytes[9] << 24;
                nameLen |= (uint)bytes[10] << 16;
                nameLen |= (uint)bytes[11] << 8;
                nameLen |= (uint)bytes[12];

                uint commentLen;
                commentLen = (uint)bytes[9 + nameLen + 2] << 24;
                commentLen |= (uint)bytes[10 + nameLen + 2] << 16;
                commentLen |= (uint)bytes[11 + nameLen + 2] << 8;
                commentLen |= (uint)bytes[12 + nameLen + 2];

                byte[] nameBytes = new byte[nameLen];
                Array.Copy(bytes, 14, nameBytes, 0, nameLen);
                byte[] commentBytes = new byte[commentLen];
                Array.Copy(bytes, 14 + nameLen + 2, commentBytes, 0, commentLen);

                packet.name = Encoding.Unicode.GetString(nameBytes);
                packet.comment = Encoding.Unicode.GetString(commentBytes);

                return true;
            }
            return false;
        }