testexecmgmt/ucc/Source/MobileTermination/CPppFrame.cpp
changeset 0 3da2a79470a7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecmgmt/ucc/Source/MobileTermination/CPppFrame.cpp	Mon Mar 08 15:04:18 2010 +0800
@@ -0,0 +1,219 @@
+/*
+* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+* System Includes
+*
+*/
+
+
+
+#include <string.h>
+#include <assert.h>
+
+
+/*******************************************************************************
+ *
+ * Local Includes
+ *
+ ******************************************************************************/
+#include "CPppFrame.h"
+
+
+/*******************************************************************************
+ *
+ * Definitions
+ *
+ ******************************************************************************/
+
+
+/*******************************************************************************
+ *
+ * PUBLIC METHODS: Constructor / Destructor
+ *
+ ******************************************************************************/
+CPppFrame::CPppFrame( char *aFrameName, int aRemoveHDLCFraming )
+{	
+	int slen;
+
+	// check params
+	assert( aFrameName != NULL );
+	slen = strlen(aFrameName);
+	assert( slen < MAXFRAMENAME );
+
+	// init members
+	strcpy( iFrameName, aFrameName );
+	iCurrentFrameSize = 0;
+	iCurrentBufferSize = 0;
+	iFrameBufferStatus = FS_EMPTY;
+	iRemoveHDLCFraming = aRemoveHDLCFraming;
+	iEscapedChar = 0;
+}
+
+
+CPppFrame::~CPppFrame()
+{
+}
+
+
+/*******************************************************************************
+ *
+ * PUBLIC METHODS: AddByteToFrame
+ *
+ ******************************************************************************/
+TFrameError CPppFrame::AddByteToFrame( char c )
+{
+	int escaped_char_flag_on_entry;
+
+	// check state
+	assert( iFrameBufferStatus != FS_COMPLETE );
+
+	// save the escaped char flag in case we have to restore it 
+	escaped_char_flag_on_entry = iEscapedChar;
+
+	// (1)  undo hdlc frameing if configured to do so
+	if( iRemoveHDLCFraming != 0 ) {
+
+		// check to see if this is the escape char, if so we set a flag and stop processing this byte
+		if( (c == 0x7D) && (iEscapedChar == 0) ) {
+			iEscapedChar = 1;
+			return FE_NONE;
+		}
+
+		// if this byte was escaped then we have to XOR it with 0x20, then continue processesing
+		if( iEscapedChar == 1 ) {
+			iEscapedChar = 0;
+			c = c ^ 0x20;
+		}
+	}
+
+	// sanity checks between hdlc and non
+	assert( iEscapedChar == 0 );
+
+	// (2) process the byte as normal
+
+	// if this is the start of the frame then set the length, state, and copy the char. Note that PPP
+	// only requires one frame sequence (0x7e) between two adjacent frames. We take this flag as the
+	// end of the previous frame, which means that a frame may not have an openning frame sequence. The
+	// upshot of all this is that any byte may start a new frame.
+	if( iFrameBufferStatus == FS_EMPTY ) {
+	  assert( iCurrentFrameSize == 0 );
+	  assert( iCurrentBufferSize == 0 );
+	  (iFrameBuffer)[0] = c;
+	  iCurrentFrameSize = iCurrentBufferSize = 1;
+	  iFrameBufferStatus = FS_IN_PROGRESS;
+	  return FE_NONE;
+	} 
+
+	// If we are in a frame then buffer the byte. If there is no room then discard the byte and return 
+	// a warning. One byte is always kept for the end of frame sequence.
+	if( (iFrameBufferStatus == FS_IN_PROGRESS) && (c != 0x7E) ) {
+	  if( iCurrentBufferSize < (MAXFRAMESIZE-1) ) {
+	    (iFrameBuffer)[iCurrentBufferSize] = c;
+		iCurrentFrameSize++;
+		iCurrentBufferSize++;
+		return FE_NONE;
+	  } else {
+	    iEscapedChar = escaped_char_flag_on_entry;
+		return FE_OVERFLOW;
+	  }
+	}
+
+	// If we are in a frame and this is then buffer it and update the state
+	if( (iFrameBufferStatus == FS_IN_PROGRESS) && (c == 0x7E) ) {
+
+		// save the final byte
+		assert( iCurrentBufferSize < MAXFRAMESIZE );
+		(iFrameBuffer)[iCurrentBufferSize] = c;
+		iCurrentFrameSize++;
+		iCurrentBufferSize++;
+
+		// update the state
+		iFrameBufferStatus = FS_COMPLETE;
+		return FE_NONE;
+	}
+
+	// done (just to keep compiler happy)
+	return FE_NONE;
+}
+
+
+/*******************************************************************************
+ *
+ * PUBLIC METHODS: ClearFrame
+ *
+ ******************************************************************************/
+TFrameError CPppFrame::ClearFrame()
+{
+	iCurrentBufferSize = 0;
+	iCurrentFrameSize = 0;
+	iFrameBufferStatus = FS_EMPTY;
+	return FE_NONE;
+}
+
+
+/*******************************************************************************
+ *
+ * PUBLIC METHODS: ClearFrameMemoryButNotState
+ *
+ ******************************************************************************/
+TFrameError CPppFrame::ClearFrameMemoryButNotState()
+{
+	iCurrentBufferSize = 0;
+	return FE_NONE;
+}
+
+/*******************************************************************************
+ *
+ * PUBLIC METHODS: GetFrameStatus
+ *
+ ******************************************************************************/
+TFrameStatus CPppFrame::GetFrameStatus()
+{
+	return iFrameBufferStatus;
+}
+
+
+/*******************************************************************************
+ *
+ * PUBLIC METHODS: GetOverflowCount
+ *
+ ******************************************************************************/
+int CPppFrame::GetOverflowCount()
+{
+	return 0;
+}
+
+
+/*******************************************************************************
+ *
+ * PUBLIC METHODS: GetFrameBuffer
+ *
+ ******************************************************************************/
+char *CPppFrame::GetFrameBuffer( int *aLen )
+{
+	assert( aLen != NULL );
+	*aLen = iCurrentBufferSize;
+	return (char*)iFrameBuffer;
+}
+
+
+/*******************************************************************************
+ *
+ * PUBLIC METHODS: GetFrameName
+ *
+ ******************************************************************************/
+char *CPppFrame::GetFrameName()
+{
+	return iFrameName;
+}