audio_file2.rs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. use session::Session;
  2. use stream;
  3. use util::FileId;
  4. use byteorder::{BigEndian, WriteBytesExt};
  5. use std::io::Write;
  6. const CHUNK_SIZE: usize = 0x20000;
  7. pub enum Response<H> {
  8. // Wait(H),
  9. Continue(H),
  10. Seek(H, usize),
  11. Close,
  12. }
  13. pub trait Handler : Sized + Send + 'static {
  14. fn on_header(self, header_id: u8, header_data: &[u8], session: &Session) -> Response<Self>;
  15. fn on_data(self, offset: usize, data: &[u8], session: &Session) -> Response<Self>;
  16. fn on_eof(self, session: &Session) -> Response<Self>;
  17. fn on_error(self, session: &Session);
  18. }
  19. pub struct AudioFile<H: Handler> {
  20. handler: H,
  21. file_id: FileId,
  22. offset: usize,
  23. }
  24. impl <H: Handler> AudioFile<H> {
  25. pub fn new(file_id: FileId, offset: usize, handler: H, session: &Session) {
  26. let handler = AudioFile {
  27. handler: handler,
  28. file_id: file_id,
  29. offset: offset,
  30. };
  31. session.stream(Box::new(handler));
  32. }
  33. }
  34. impl <H: Handler> stream::Handler for AudioFile<H> {
  35. fn on_create(self, channel_id: stream::ChannelId, session: &Session) -> stream::Response<Self> {
  36. debug!("Got channel {}", channel_id);
  37. let mut data: Vec<u8> = Vec::new();
  38. data.write_u16::<BigEndian>(channel_id).unwrap();
  39. data.write_u8(0).unwrap();
  40. data.write_u8(1).unwrap();
  41. data.write_u16::<BigEndian>(0x0000).unwrap();
  42. data.write_u32::<BigEndian>(0x00000000).unwrap();
  43. data.write_u32::<BigEndian>(0x00009C40).unwrap();
  44. data.write_u32::<BigEndian>(0x00020000).unwrap();
  45. data.write(&self.file_id.0).unwrap();
  46. data.write_u32::<BigEndian>(self.offset as u32 / 4).unwrap();
  47. data.write_u32::<BigEndian>((self.offset + CHUNK_SIZE) as u32 / 4).unwrap();
  48. session.send_packet(0x8, &data).unwrap();
  49. stream::Response::Continue(self)
  50. }
  51. fn on_header(mut self, header_id: u8, header_data: &[u8], session: &Session) -> stream::Response<Self> {
  52. match self.handler.on_header(header_id, header_data, session) {
  53. Response::Continue(handler) => {
  54. self.handler = handler;
  55. stream::Response::Continue(self)
  56. }
  57. Response::Seek(handler, offset) => {
  58. self.handler = handler;
  59. self.offset = offset;
  60. stream::Response::Spawn(self)
  61. }
  62. Response::Close => stream::Response::Close,
  63. }
  64. }
  65. fn on_data(mut self, data: &[u8], session: &Session) -> stream::Response<Self> {
  66. match self.handler.on_data(self.offset, data, session) {
  67. Response::Continue(handler) => {
  68. self.handler = handler;
  69. self.offset += data.len();
  70. stream::Response::Continue(self)
  71. }
  72. Response::Seek(handler, offset) => {
  73. self.handler = handler;
  74. self.offset = offset;
  75. stream::Response::Spawn(self)
  76. }
  77. Response::Close => stream::Response::Close,
  78. }
  79. }
  80. fn on_close(self, _session: &Session) -> stream::Response<Self> {
  81. // End of chunk, request a new one
  82. stream::Response::Spawn(self)
  83. }
  84. fn on_error(mut self, session: &Session) -> stream::Response<Self> {
  85. match self.handler.on_eof(session) {
  86. Response::Continue(_) => stream::Response::Close,
  87. Response::Seek(handler, offset) => {
  88. self.handler = handler;
  89. self.offset = offset;
  90. stream::Response::Spawn(self)
  91. }
  92. Response::Close => stream::Response::Close,
  93. }
  94. }
  95. fn box_on_create(self: Box<Self>, channel_id: stream::ChannelId, session: &Session) -> stream::Response<Box<stream::Handler>> {
  96. self.on_create(channel_id, session).boxed()
  97. }
  98. fn box_on_header(self: Box<Self>, header_id: u8, header_data: &[u8], session: &Session) -> stream::Response<Box<stream::Handler>> {
  99. self.on_header(header_id, header_data, session).boxed()
  100. }
  101. fn box_on_data(self: Box<Self>, data: &[u8], session: &Session) -> stream::Response<Box<stream::Handler>> {
  102. self.on_data(data, session).boxed()
  103. }
  104. fn box_on_error(self: Box<Self>, session: &Session) -> stream::Response<Box<stream::Handler>> {
  105. self.on_error(session).boxed()
  106. }
  107. fn box_on_close(self: Box<Self>, session: &Session) -> stream::Response<Box<stream::Handler>> {
  108. self.on_close(session).boxed()
  109. }
  110. }