// ユーザ情報パケット待ち受け 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); } } }
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; }