{-# LANGUAGE GeneralizedNewtypeDeriving, MultiParamTypeClasses, DeriveDataTypeable #-}
module Data.UDP
	( UDPPort(..)
	, UDPHeader (..)
	) where

import Data.Serialize
import Data.Serialize.Get
import Data.Serialize.Put
import Data.CSum
import Data.Header
import Text.PrettyPrint.HughesPJClass
import Data.Data
import Data.Word

newtype UDPPort = UDPPort Word16 deriving (Eq, Ord, Show, Read, Num, Bounded, Data, Typeable)

instance Pretty UDPPort where
	pPrint (UDPPort p) = text (show p)

instance Serialize UDPPort where
	put (UDPPort p) = putWord16be p
	get = getWord16be >>= return . UDPPort

data UDPHeader =
	UDPHdr  { srcPort	:: UDPPort
		, dstPort	:: UDPPort
		, payloadLength :: Int
		, checksum	:: CSum
	} deriving (Eq, Ord, Show, Read, Data, Typeable)

instance Serialize UDPHeader where
	put (UDPHdr s d l c) = do
		put s
		put d
		putWord16be $ fromIntegral l
		put c
	get = do
		s <- get
		d <- get
		l <- getWord16be >>= return . fromIntegral
		c <- get
		return $ UDPHdr s d l c