diff -r 000000000000 -r 3da2a79470a7 testexecmgmt/ucc/Source/MobileTermination/CPppFrame.cpp --- /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 +#include + + +/******************************************************************************* + * + * 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; +}