|
|
#include "precomp.h"
DEBUG_FILEZONE(ZONE_T120_T123PSTN);
/* PSTNFram.cpp
* * Copyright (c) 1993-1995 by DataBeam Corporation, Lexington, KY * * Abstract: * This is the implementation file for the PSTN Frame class. * * Private Instance Variables: * All of these variables are used for decoding a packet. * * Source_Address - Address of source buffer * Source_Length - Length of source buffer * * Dest_Address - Address of destination buffer * Dest_Length - Length of destination buffer * * Source_Byte_Count - Running Source byte count * Dest_Byte_Count - Running Dest byte count * * Escape_Found - TRUE if the last byte decoded was an ESCAPE * First_Flag_Found - TRUE if the first flag has been found * * Caveats: * None. * * Authors: * James W. Lawwill */ #include "pstnfram.h"
/*
* PSTNFrame::PSTNFrame (void) * * Public * * Functional Description: * PSTN Framer constructor. Initializes internal variable */ PSTNFrame::PSTNFrame (void) { Source_Address = NULL; Source_Length = 0;
Dest_Address = NULL; Dest_Length = 0;
Source_Byte_Count = 0; Dest_Byte_Count = 0;
Escape_Found = FALSE;
First_Flag_Found = FALSE; }
/*
* PSTNFrame::~PSTNFrame(void) * * Public * * Functional Description: * PSTN Framer destructor. This routine does nothing */ PSTNFrame::~PSTNFrame (void) { }
/*
* PacketFrameError PSTNFrame::PacketEncode ( * LPBYTE source_address, * USHORT source_length, * LPBYTE dest_address, * USHORT dest_length, * BOOL prepend_flag, * BOOL append_flag, * USHORT * packet_size) * * Public * * Functional Description: * This function takes the passed in buffer and encodes it. */ PacketFrameError PSTNFrame::PacketEncode ( LPBYTE source_address, USHORT source_length, LPBYTE dest_address, USHORT dest_length, BOOL prepend_flag, BOOL append_flag, USHORT * packet_size) { UChar input_byte; USHORT byte_count; PacketFrameError return_value = PACKET_FRAME_NO_ERROR;
/*
** If the prepend_flag is set, attach a flag to the dest buffer */ if (prepend_flag) { *(dest_address++) = FLAG; *packet_size = 1; } else *packet_size = 0;
byte_count = 0;
/*
** Go thru each byte looking for a FLAG or an ESCAPE, encode this ** properly. */ while ((byte_count < source_length) && (return_value == PACKET_FRAME_NO_ERROR)) { input_byte = *(source_address + byte_count);
switch (input_byte) { case FLAG: case ESCAPE: /*
** If you find a FLAG or an ESCAPE, put an ESCAPE in the ** destination buffer and negate the 6th bit of the input_byte ** */ if (((*packet_size) + 2) > dest_length) { return_value = PACKET_FRAME_DEST_BUFFER_TOO_SMALL; break; } *(dest_address++) = ESCAPE; *(dest_address++) = input_byte & NEGATE_COMPLEMENT_BIT; *packet_size = (*packet_size) + 2; break;
default: if (((*packet_size) + 1) > dest_length) { return_value = PACKET_FRAME_DEST_BUFFER_TOO_SMALL; break; } *(dest_address++) = input_byte; *packet_size = (*packet_size) + 1; break; } byte_count++; }
/*
** Put a FLAG on the end of the packet */ if (append_flag) { *(dest_address++) = FLAG; *packet_size = (*packet_size) + 1; }
return (return_value); }
/*
* PacketFrameError PSTNFrame::PacketDecode ( * LPBYTE source_address, * USHORT source_length, * LPBYTE dest_address, * USHORT dest_length, * USHORT * bytes_accepted, * USHORT * packet_size, * BOOL continue_packet) * * Public * * Functional Description: * This function decodes the input buffer looking for a packet. */ PacketFrameError PSTNFrame::PacketDecode ( LPBYTE source_address, USHORT source_length, LPBYTE dest_address, USHORT dest_length, USHORT * bytes_accepted, USHORT * packet_size, BOOL continue_packet) { UChar input_byte; PacketFrameError return_value = PACKET_FRAME_NO_ERROR;
*bytes_accepted = 0; /*
** Source address is changing */ if (source_address != NULL) { Source_Address = source_address; Source_Length = source_length; Source_Byte_Count = 0; }
/*
** Destination address is changing */ if (dest_address != NULL) { Dest_Address = dest_address; Dest_Length = dest_length; Dest_Byte_Count = 0; }
/*
** Continue working on this packet? */ if (continue_packet == FALSE) Escape_Found = FALSE;
if (First_Flag_Found == FALSE) { /*
** Go thru the input data looking for a starting flag */ while (Source_Byte_Count < Source_Length) { if (*(Source_Address + Source_Byte_Count) == FLAG) { First_Flag_Found = TRUE; Source_Byte_Count++; *bytes_accepted += 1; break; }
Source_Byte_Count++; *bytes_accepted += 1; } } /*
** Go thru the input data stream looking for a FLAG or an ESCAPE */ while ((Source_Byte_Count < Source_Length) && (return_value == PACKET_FRAME_NO_ERROR)) { input_byte = *(Source_Address + Source_Byte_Count);
if (input_byte == FLAG) { /*
** End of packet found */ Escape_Found = FALSE; Source_Byte_Count++; *bytes_accepted += 1;
/*
** If we find a FLAG but the number of bytes in the dest buffer ** is 0, consider it the first flag in the packet and continue. */ if (Dest_Byte_Count == 0) continue; else { /*
** End of packet found, set the packet size and break out */ Dest_Address = NULL; *packet_size = Dest_Byte_Count; return_value = PACKET_FRAME_PACKET_DECODED; break; } }
/*
** If the last byte was an ESCAPE, complement the 6th bit of the input ** byte and continue */ if (Escape_Found) { input_byte ^= COMPLEMENT_BIT; Escape_Found = FALSE; } else { /*
** If the input byte is the ESCAPE, set the flag and continue. */ if (input_byte == ESCAPE) { Escape_Found = TRUE; Source_Byte_Count++; *bytes_accepted += 1; continue; } }
/*
** Put the input byte into our buffer. */ if (Dest_Byte_Count < Dest_Length) { *(Dest_Address + Dest_Byte_Count) = input_byte; Dest_Byte_Count++; } else { First_Flag_Found = FALSE; return_value = PACKET_FRAME_DEST_BUFFER_TOO_SMALL; }
Source_Byte_Count++; *bytes_accepted += 1; }
return (return_value); }
/*
* void PSTNFrame::GetOverhead ( * USHORT original_packet_size, * USHORT * max_packet_size) * * Public * * Functional Description: * This function gives the user some idea of the overhead added by this * process. */ void PSTNFrame::GetOverhead ( USHORT original_packet_size, USHORT * max_packet_size) { /*
** The overhead produced by this framer is 2 times the original packet ** size plus 2 bytes for the flags */ *max_packet_size = (original_packet_size * 2) + 2; }
|