use std::ptr;
use std::ffi::{CString, CStr};
use std::str;
use traits::Wrappable;
use sfml_types::sfBool;
use csfml_network_sys as ffi;
pub struct Packet {
packet: *mut ffi::sfPacket
}
impl Packet {
pub fn new() -> Option<Packet> {
let pck = unsafe { ffi::sfPacket_create() };
if pck.is_null() {
None
}
else {
Some(Packet {
packet: pck
})
}
}
pub fn clear(&self) {
unsafe {
ffi::sfPacket_clear(self.packet)
}
}
pub fn get_data_size(&self) -> u32 {
unsafe {
ffi::sfPacket_getDataSize(self.packet) as u32
}
}
pub fn end_of_packet(&self) -> bool {
unsafe { ffi::sfPacket_endOfPacket(self.packet) }.to_bool()
}
pub fn can_read(&self) -> bool {
unsafe { ffi::sfPacket_canRead(self.packet) }.to_bool()
}
pub fn read_bool(&self) -> bool {
unsafe { ffi::sfPacket_readBool(self.packet) }.to_bool()
}
pub fn read_i8(&self) -> i8 {
unsafe {
ffi::sfPacket_readInt8(self.packet)
}
}
pub fn read_u8(&self) -> u8 {
unsafe {
ffi::sfPacket_readUint8(self.packet)
}
}
pub fn read_i16(&self) -> i16 {
unsafe {
ffi::sfPacket_readInt16(self.packet)
}
}
pub fn read_u16(&self) -> u16 {
unsafe {
ffi::sfPacket_readUint16(self.packet)
}
}
pub fn read_i32(&self) -> i32 {
unsafe {
ffi::sfPacket_readInt32(self.packet)
}
}
pub fn read_u32(&self) -> u32 {
unsafe {
ffi::sfPacket_readUint32(self.packet)
}
}
pub fn read_f32(&self) -> f32 {
unsafe {
ffi::sfPacket_readFloat(self.packet) as f32
}
}
pub fn read_f64(&self) -> f64 {
unsafe {
ffi::sfPacket_readDouble(self.packet) as f64
}
}
pub fn read_string(&self) -> String {
unsafe {
let string: *mut u8 = ptr::null_mut();
ffi::sfPacket_readString(self.packet, string);
let string = string as *const i8;
str::from_utf8(CStr::from_ptr(string).to_bytes_with_nul()).unwrap().into()
}
}
pub fn write_bool(&self, data: bool) {
unsafe {
ffi::sfPacket_writeBool(self.packet, sfBool::from_bool(data))
}
}
pub fn write_i8(&self, data: i8) {
unsafe {
ffi::sfPacket_writeInt8(self.packet, data)
}
}
pub fn write_u8(&self, data: u8) {
unsafe {
ffi::sfPacket_writeUint8(self.packet, data)
}
}
pub fn write_i16(&self, data: i16) {
unsafe {
ffi::sfPacket_writeInt16(self.packet, data)
}
}
pub fn write_u16(&self, data: u16) {
unsafe {
ffi::sfPacket_writeUint16(self.packet, data)
}
}
pub fn write_i32(&self, data: i32) {
unsafe {
ffi::sfPacket_writeInt32(self.packet, data)
}
}
pub fn write_u32(&self, data: u32) {
unsafe {
ffi::sfPacket_writeUint32(self.packet, data)
}
}
pub fn write_f32(&self, data: f32) {
unsafe {
ffi::sfPacket_writeFloat(self.packet, data)
}
}
pub fn write_f64(&self, data: f64) {
unsafe {
ffi::sfPacket_writeDouble(self.packet, data)
}
}
pub fn write_string(&self, string: &str) {
let c_string = CString::new(string.as_bytes()).unwrap().as_ptr();
unsafe {
ffi::sfPacket_writeString(self.packet, c_string)
}
}
}
impl Clone for Packet {
fn clone(&self) -> Self {
let pck = unsafe { ffi::sfPacket_copy(self.packet) };
if pck.is_null() {
panic!("Packet is null")
} else {
Packet {
packet: pck
}
}
}
}
impl Wrappable<*mut ffi::sfPacket> for Packet {
fn unwrap(&self) -> *mut ffi::sfPacket {
self.packet
}
fn wrap(packet: *mut ffi::sfPacket) -> Packet {
Packet {
packet: packet
}
}
}
impl Drop for Packet {
fn drop(&mut self) {
unsafe {
ffi::sfPacket_destroy(self.packet)
}
}
}