www.pudn.com > CSharpTFTPClient1[1].0.0.0.zip > TFTPPacket.cs


//--------------------------------------------------------------------------------// 
//                                                                                // 
// Copyright © 2007 John Leitch                                                   // 
//                                                                                // 
// Distributed under the terms of the GNU General Public License                  // 
//                                                                                // 
// This file is part of Open Source TFTP Client.                                  // 
//                                                                                // 
// Open Source TFTP Client is free software: you can redistribute it and/or       // 
// modify it under the terms of the GNU General Public License version 3 as       // 
// published by the Free Software Foundation.                                     // 
//                                                                                // 
// Open Source TFTP Client is distributed in the hope that it will be useful,     // 
// but WITHOUT ANY WARRANTY; without even the implied warranty of                 // 
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General      // 
// Public License for more details.                                               // 
//                                                                                // 
// You should have received a copy of the GNU General Public License              // 
// along with Open Source TFTP Client.  If not, see http://www.gnu.org/licenses/. // 
//                                                                                // 
//--------------------------------------------------------------------------------// 
 
namespace TFTPC 
{ 
    internal class TFTPPacket 
    { 
        internal class Read 
        { 
            internal static TFTP.OpCodes OpCode(byte[] ReceivedData) 
            { 
                TFTP.OpCodes opCode = new TFTP.OpCodes(); 
                switch (ReceivedData[1]) 
                { 
                    case 3: 
                        opCode = TFTP.OpCodes.DATA; 
                        break; 
                    case 4: 
                        opCode = TFTP.OpCodes.ACK; 
                        break; 
                    case 5: 
                        opCode = TFTP.OpCodes.ERROR; 
                        break; 
                    case 6: 
                        opCode = TFTP.OpCodes.OACK; 
                        break; 
                } 
                return opCode; 
            }             
            internal static int TSize(byte[] ReceivedData) 
            { 
                int h, tSize = 0; 
                string searchStr, decPacket = System.Text.Encoding.ASCII.GetString(ReceivedData); 
                char[] splitChar = {'\0'}; 
                string[] splitPacket = decPacket.Split(splitChar); 
 
                for(h=0; h < splitPacket.Length - 1; h++) 
                { 
                    searchStr = splitPacket[h].ToLower(); 
                    if (searchStr == "tsize") 
                    { 
                        tSize = int.Parse(splitPacket[h + 1]); 
                    } 
                }                 
                return tSize; 
            } 
            internal static bool CheckBlock(byte[] SentData, byte[] ReceivedData) 
            { 
                if (ReceivedData[2] == SentData[2] && ReceivedData[3] == SentData[3]) 
                {                
                    return true; 
                } 
                return false; 
            } 
 
            internal class Error 
            { 
                short codeProperty; 
                string messageProperty; 
 
                internal Error(byte[] ReceivedData) 
                { 
                    string code; 
                    code = ReceivedData[2].ToString() + ReceivedData[3].ToString(); 
                    Code = short.Parse(code); 
 
                    Message = ""; 
                    for (int h = 4; h < ReceivedData.Length; h++) 
                    { 
                        if (ReceivedData[h] == 0) 
                        { 
                            break; 
                        } 
                        Message += (char)ReceivedData[h]; 
                    }                     
                } 
                internal short Code 
                { 
                    get 
                    { 
                        return codeProperty; 
                    } 
                    set 
                    { 
                        codeProperty = value; 
                    } 
                } 
                internal string Message 
                { 
                    get 
                    { 
                        return messageProperty; 
                    } 
                    set 
                    { 
                        messageProperty = value; 
                    } 
                } 
            } 
        } 
        internal class Create 
        { 
            internal static byte[] Request 
                (TFTP.OpCodes OpCode, string RemoteFileName, TFTP.Modes Mode, int BlockSize, 
                long TransferSize, int Timeout) 
            { 
                // Request packet structure 
                // ----------------------------------------------------------------------------- 
                // |OpCode|FileName|0|Mode|0|BlkSize|0|BSVal|0|TSize|0|TSVal|0|Timeout|0|TVal|0| 
                // ----------------------------------------------------------------------------- 
                int len; 
                 
                string packetStr = ""; 
                string mode = Mode.ToString().ToLower(); 
                string blockSize = BlockSize.ToString(); 
                string nullChar = "\0"; 
                 
                byte[] packet;                 
 
                // Create packet as a string 
                switch (OpCode) 
                { 
                    case TFTP.OpCodes.RRQ: 
                        packetStr = nullChar + (char)1; 
                        break; 
                    case TFTP.OpCodes.WRQ: 
                        packetStr = nullChar + (char)2; 
                        break; 
                } 
 
                packetStr += RemoteFileName + nullChar + mode + nullChar + "blksize" + 
                    nullChar + BlockSize.ToString() + nullChar + "tsize" + nullChar + 
                    TransferSize.ToString() + nullChar + "timeout" + nullChar + 
                    Timeout.ToString() + nullChar ; 
                 
                len = packetStr.Length; 
                packet = new byte[len]; 
 
                // Encode packet as ASCII bytes 
                packet = System.Text.Encoding.ASCII.GetBytes(packetStr);                                 
                return packet; 
            }             
            internal static byte[] Ack(int Block1, int Block2) 
            { 
                // ACK packet structure 
                // ---------- 
                // |04|Block| 
                // ---------- 
                byte[] packet = new byte[4]; 
                packet[0] = 0; 
                packet[1] = (byte)TFTP.OpCodes.ACK; 
                packet[2] = (byte)Block1; 
                packet[3] = (byte)Block2; 
                return packet; 
            } 
            internal static byte[] Data(byte[] SendData, int Block1, int Block2) 
            { 
                // DATA packet structure 
                // ---------- 
                // |03|Block| 
                // ---------- 
                byte[] packet = new byte[SendData.Length + 4]; 
                //packet[0] = 0; 
                packet[1] = (byte)TFTP.OpCodes.DATA; 
                packet[2] = (byte)Block1; 
                packet[3] = (byte)Block2; 
                for(int h = 4; h < SendData.Length + 4; h++) 
                { 
                    packet[h] = SendData[h - 4]; 
                } 
                return packet; 
            } 
        } 
        internal class Modify 
        { 
            internal static int[] IncrementBock(byte[] ReceivedData, int[] Block) 
            { 
                if (ReceivedData[3] == 255) 
                { 
                    if (ReceivedData[2] < 255) 
                    { 
                        Block[0] = (int)ReceivedData[2] + 1; Block[1] = 0; 
                    } 
                    else 
                    { 
                        Block[0] = 0; Block[1] = 0; 
                    } 
                } 
                else 
                { 
                    Block[1] = (int)ReceivedData[3] + 1; 
                } 
                return Block; 
            } 
        } 
    } 
}