void parseBuffer()
 {
     scPacket pck = new scPacket();
     if (pck.parseRawData(m_buffer))
     {
         m_buffer.RemoveRange(0, pck.getSize());
         handlePacket(pck);
     }
     else
     {
         // check pck error
         if ((PACKET_TYPE)pck.getPacketType() == PACKET_TYPE.ERR_INVALID_PACKET)
         {
             kick("got an invalid packet!");
         }
     }
 }
        void handlePacket(scPacket pck)
        {
            switch ((PACKET_TYPE)pck.getPacketType())
            {
                case PACKET_TYPE.C_HANDSHAKE:
                    if (m_state == CLIENT_STATE.HANDHAKE)
                    {
                        Console.WriteLine("got handshake");
                        sendAcceptPacket();
                        m_state = CLIENT_STATE.ONLINE;
                        m_latency = 0;
                        m_sendTime = unixtime.getCurrentTime();
                    }
                    else
                    {
                        // kick the client for sending wrong packets!
                        kick("Handshake recieved from client, but it is already online!");
                    }
                    break;
                case PACKET_TYPE.C_GET_ONLINE_CLIENTS:
                    if (m_state == CLIENT_STATE.ONLINE)
                    {
                        Console.WriteLine("got GET_ONLINE_CLIENTS packet!");
                        sendOnlineSockets();
                    }
                    else
                    {
                        kick("got packet GET_ONLINE_CLIENTS, but client is not online!!");
                    }
                    break;
                case PACKET_TYPE.C_UPDATE_SOCKET_STATE:
                    if (m_state == CLIENT_STATE.ONLINE)
                    {
                        Console.WriteLine("got UPDATE_SOCKET_STATE packet!");
                        short sockId = pck.readShort();
                        byte state = pck.readByte();
                        if (Program.getRoot().setRelayState(sockId, state))
                        {
                            Console.WriteLine("updated socket {0} to state {1}", sockId, state);
                            updateSocket(sockId, state);
                            sendSockUpdateToAll(sockId, state);
                        }
                        else
                        {
                            Console.WriteLine("failed updated socket {0} to state {1}", sockId, state);
                        }
                    }
                    else
                    {
                        kick("got packet UPDATE_SOCKET_STATE, but client is not online!!");
                    }
                    break;
                case PACKET_TYPE.C_SOCKET_POWER_UPDATE:
                    if (m_state != CLIENT_STATE.ONLINE)
                    {
                        kick("got packet C_SOCKET_POWER_UPDATE but client is not online!");
                        return;
                    }
                    short socketid = pck.readShort();
                    int watt = pck.readLong();
                    watt = watt < 0 ? 0 : watt;
                    Console.WriteLine("C_SOCKET_POWER_UPDATE watt{0}, sockid{1}", watt, socketid);
                    updateSocketPowerUsage(socketid, watt);
                    sendWattUsageUpdate(socketid, watt);
                    break;
                case PACKET_TYPE.C_REQUEST_SOCKET_INFO:
                    if (m_state != CLIENT_STATE.ONLINE)
                    {
                        kick("got packet C_REQUEST_POWER_UPDATE but client is not online");
                        return;
                    }
                    short sockid = pck.readShort();
                    sendSocketPowerInfo(sockid);
                    Console.WriteLine("got packet C_REQUEST_SOCKET_UPDATE sockid {0}", sockid);
                    break;
                case PACKET_TYPE.SC_PING:
                    if (m_state != CLIENT_STATE.ONLINE)
                    {
                        kick("got packet SC_PING, but client is not online!");
                        return;
                    }

                    string msg = pck.readString();
                    if (msg != m_message)
                    {
                        kick("got ping packet, but the strings are not equal!");
                        return;
                    }
                    m_latency = unixtime.getDifferenceMilisecond(m_packetSend, DateTime.Now);
                    m_sendTime = unixtime.getCurrentTime();
                    m_waitingForPing = false;
                    Console.WriteLine("got ping packet latency {0} ms", m_latency);
                    break;
                case PACKET_TYPE.SC_SEND_XML:
                    if (m_state != CLIENT_STATE.ONLINE)
                    {
                        kick("got packet SC_SEND_XML, but client is not online!");
                        return;
                    }
                    string xml = pck.readString();
                    Program.getRoot().saveXML(xml);
                    // send the xml file to all clients
                    // its the same packet, so just send it
                    Program.getRoot().sendToAll(pck);
                    Console.WriteLine("got SC_SEND_XML lenght {0}", xml.Length);
                    break;
                case PACKET_TYPE.C_GET_XML:
                    if (m_state != CLIENT_STATE.ONLINE)
                    {
                        kick("got packet C_GET_XML, but client is not online!");
                        return;
                    }
                    xml = Program.getRoot().getXML();
                    scPacket packet = new scPacket(PACKET_TYPE.SC_SEND_XML);
                    packet.writeString(xml);
                    sendPacket(packet);
                    Console.WriteLine("got C_GET_XML");
                    break;
                case PACKET_TYPE.SC_SEND_PICTURE:
                    if (m_state != CLIENT_STATE.ONLINE)
                    {
                        kick("got packet SC_SEND_PICTURE, but client is not online!");
                        return;
                    }
                    string name = pck.readString();
                    int dataLen = pck.readLong();
                    byte[] data = new byte[dataLen];
                    for (int i = 0; i < dataLen; i++)
                        data[i] = pck.readByte();
                    Program.getRoot().setPicture(name, data);
                    // send this packet to all clients
                    Program.getRoot().sendToAll(pck);
                    Console.WriteLine("got packet SC_SEND_PICTURE name[{0}] = byte[{1}]", name, dataLen);
                    break;
                case PACKET_TYPE.C_GET_PICTURE:
                    if (m_state != CLIENT_STATE.ONLINE)
                    {
                        kick("got packet SC_SEND_PICTURE, but client is not online!");
                        return;
                    }
                    name = pck.readString();
                    data = Program.getRoot().getPicture(name);
                    packet = new scPacket(PACKET_TYPE.SC_SEND_PICTURE);
                    packet.writeString(name);
                    if (data == null)
                    {
                        packet.writeLong(0);
                    }
                    else
                    {
                        packet.writeLong(data.Length);
                        Console.WriteLine("data lenght {0}", data.Length);
                        if (data.Length > 0)
                        {
                            for (int i = 0; i < data.Length; i++)
                                packet.writeByte(data[i]);
                        }
                    }
                    sendPacket(packet);
                    Console.WriteLine("got C_GET_PICTURE name = {0}", name);
                    break;
                default:
                    Console.WriteLine("unknown packet recieved");
                    break;
            }
        }