/* Copyright (c) 1997-1999 Microsoft Corporation Module Name: sdpenc.cpp Abstract: Author: */ #include "sdppch.h" #include "sdpenc.h" #include "sdpltran.h" // line transition states enum ENCRYPTION_TRANSITION_STATES { ENCRYPTION_START, ENCRYPTION_KEY_TYPE, ENCRYPTION_KEY_TYPE_END, ENCRYPTION_KEY_DATA_END }; // table for connection line transitions const LINE_TRANSITION g_EncryptionStartTransitions[] = { {CHAR_NEWLINE, ENCRYPTION_KEY_TYPE_END }, {CHAR_COLON, ENCRYPTION_KEY_TYPE } }; const LINE_TRANSITION g_EncryptionKeyTypeTransitions[] = { {CHAR_NEWLINE, ENCRYPTION_KEY_DATA_END } }; /* no transitions */ const LINE_TRANSITION *g_EncryptionKeyTypeEndTransitions= NULL; /* no transitions */ const LINE_TRANSITION *g_EncryptionKeyDataEndTransitions= NULL; LINE_TRANSITION_INFO g_EncryptionTransitionInfo[] = { LINE_TRANSITION_ENTRY(ENCRYPTION_START, g_EncryptionStartTransitions), LINE_TRANSITION_ENTRY(ENCRYPTION_KEY_TYPE, g_EncryptionKeyTypeTransitions), LINE_TRANSITION_ENTRY(ENCRYPTION_KEY_TYPE_END, g_EncryptionKeyTypeEndTransitions), LINE_TRANSITION_ENTRY(ENCRYPTION_KEY_DATA_END, g_EncryptionKeyDataEndTransitions) }; SDP_LINE_TRANSITION g_EncryptionTransition( g_EncryptionTransitionInfo, sizeof(g_EncryptionTransitionInfo)/sizeof(LINE_TRANSITION_INFO) ); SDP_ENCRYPTION_KEY::SDP_ENCRYPTION_KEY( ) : SDP_VALUE(SDP_INVALID_ENCRYPTION_KEY_FIELD, KEY_STRING, &g_EncryptionTransition) {} void SDP_ENCRYPTION_KEY::InternalReset( ) { m_KeyType.Reset(); m_KeyData.Reset(); } HRESULT SDP_ENCRYPTION_KEY::SetKey( IN BSTR KeyType, IN BSTR *KeyData ) { // set the key type field HRESULT ToReturn = m_KeyType.SetBstr(KeyType); if ( FAILED(ToReturn) ) { return ToReturn; } // if required, set the key data field if ( NULL != KeyData ) { ToReturn = m_KeyData.SetBstr(*KeyData); if ( FAILED(ToReturn) ) { return ToReturn; } } else { m_KeyData.Reset(); } m_FieldArray.RemoveAll(); m_SeparatorCharArray.RemoveAll(); if ( NULL != KeyData ) { try { // set the field/separator chars m_FieldArray.SetAtGrow(0, &m_KeyType); m_SeparatorCharArray.SetAtGrow(0, CHAR_COLON); m_FieldArray.SetAtGrow(1, &m_KeyData); m_SeparatorCharArray.SetAtGrow(1, CHAR_NEWLINE); } catch(...) { m_FieldArray.RemoveAll(); m_SeparatorCharArray.RemoveAll(); return E_OUTOFMEMORY; } } else { try { // set the field/separator chars m_FieldArray.SetAtGrow(0, &m_KeyType); m_SeparatorCharArray.SetAtGrow(0, CHAR_NEWLINE); } catch(...) { m_FieldArray.RemoveAll(); m_SeparatorCharArray.RemoveAll(); return E_OUTOFMEMORY; } } return S_OK; } BOOL SDP_ENCRYPTION_KEY::GetField( OUT SDP_FIELD *&Field, OUT BOOL &AddToArray ) { // add in all cases by default AddToArray = TRUE; switch(m_LineState) { case ENCRYPTION_KEY_TYPE: case ENCRYPTION_KEY_TYPE_END: { Field = &m_KeyType; } break; case ENCRYPTION_KEY_DATA_END: { Field = &m_KeyData; } break; default: { SetLastError(m_ErrorCode); return FALSE; } break; }; return TRUE; }