/* Copyright (c) 1997-1999 Microsoft Corporation Module Name: sdpadtex.cpp Abstract: Author: */ #include "sdppch.h" #include "sdpadtex.h" #include "sdpltran.h" #include #include // line transition states enum PHONE_TRANSITION_STATES { PHONE_START, PHONE_ONLY_ADDRESS, PHONE_OPEN_ADDRESS, PHONE_OPEN_TEXT, PHONE_CLOSED_ADDRESS, PHONE_CLOSED_TEXT }; // table for phone number line transitions const LINE_TRANSITION g_PhoneStartTransitions[] = { {CHAR_NEWLINE, PHONE_ONLY_ADDRESS}, {CHAR_LEFT_ANGLE, PHONE_OPEN_ADDRESS}, {CHAR_LEFT_PAREN, PHONE_OPEN_TEXT} }; /* no transitions */ const LINE_TRANSITION *g_PhoneOnlyAddressTransitions = NULL; const LINE_TRANSITION g_PhoneOpenAddressTransitions[] = { {CHAR_RIGHT_ANGLE, PHONE_CLOSED_ADDRESS} }; const LINE_TRANSITION g_PhoneOpenTextTransitions[] = { {CHAR_RIGHT_PAREN, PHONE_CLOSED_TEXT} }; const LINE_TRANSITION g_PhoneClosedAddressTransitions[] = { {CHAR_NEWLINE, LINE_END} }; const LINE_TRANSITION g_PhoneClosedTextTransitions[] = { {CHAR_NEWLINE, LINE_END} }; LINE_TRANSITION_INFO g_PhoneTransitionInfo[] = { LINE_TRANSITION_ENTRY(PHONE_START, g_PhoneStartTransitions), LINE_TRANSITION_ENTRY(PHONE_ONLY_ADDRESS, g_PhoneOnlyAddressTransitions), LINE_TRANSITION_ENTRY(PHONE_OPEN_ADDRESS, g_PhoneOpenAddressTransitions), LINE_TRANSITION_ENTRY(PHONE_OPEN_TEXT, g_PhoneOpenTextTransitions), LINE_TRANSITION_ENTRY(PHONE_CLOSED_ADDRESS, g_PhoneClosedAddressTransitions), LINE_TRANSITION_ENTRY(PHONE_CLOSED_TEXT, g_PhoneClosedTextTransitions) }; // line transition states enum EMAIL_TRANSITION_STATES { EMAIL_START, EMAIL_ONLY_ADDRESS, EMAIL_OPEN_ADDRESS, EMAIL_OPEN_TEXT, EMAIL_CLOSED_ADDRESS, EMAIL_CLOSED_TEXT }; // table for email line transitions const LINE_TRANSITION g_EmailStartTransitions[] = { {CHAR_NEWLINE, EMAIL_ONLY_ADDRESS}, {CHAR_LEFT_ANGLE, EMAIL_OPEN_ADDRESS}, {CHAR_LEFT_PAREN, EMAIL_OPEN_TEXT} }; /* no transitions */ const LINE_TRANSITION *g_EmailOnlyAddressTransitions = NULL; const LINE_TRANSITION g_EmailOpenAddressTransitions[] = { {CHAR_RIGHT_ANGLE, EMAIL_CLOSED_ADDRESS} }; const LINE_TRANSITION g_EmailOpenTextTransitions[] = { {CHAR_RIGHT_PAREN, EMAIL_CLOSED_TEXT} }; const LINE_TRANSITION g_EmailClosedAddressTransitions[] = { {CHAR_NEWLINE, LINE_END} }; const LINE_TRANSITION g_EmailClosedTextTransitions[] = { {CHAR_NEWLINE, LINE_END} }; LINE_TRANSITION_INFO g_EmailTransitionInfo[] = { LINE_TRANSITION_ENTRY(EMAIL_START, g_EmailStartTransitions), LINE_TRANSITION_ENTRY(EMAIL_ONLY_ADDRESS, g_EmailOnlyAddressTransitions), LINE_TRANSITION_ENTRY(EMAIL_OPEN_ADDRESS, g_EmailOpenAddressTransitions), LINE_TRANSITION_ENTRY(EMAIL_OPEN_TEXT, g_EmailOpenTextTransitions), LINE_TRANSITION_ENTRY(EMAIL_CLOSED_ADDRESS, g_EmailClosedAddressTransitions), LINE_TRANSITION_ENTRY(EMAIL_CLOSED_TEXT, g_EmailClosedTextTransitions) }; static SDP_LINE_TRANSITION g_EmailTransition( g_EmailTransitionInfo, sizeof(g_EmailTransitionInfo)/sizeof(LINE_TRANSITION_INFO) ); static SDP_LINE_TRANSITION g_PhoneTransition( g_PhoneTransitionInfo, sizeof(g_PhoneTransitionInfo)/sizeof(LINE_TRANSITION_INFO) ); void SDP_ADDRESS_TEXT::InternalReset( ) { m_Address.Reset(); m_Text.Reset(); } HRESULT SDP_ADDRESS_TEXT::SetAddressTextValues( IN BSTR AddressBstr, IN BSTR TextBstr ) { HRESULT HResult = m_Address.SetBstr(AddressBstr); if ( FAILED(HResult) ) { return HResult; } // the text string can be NULL if ( NULL == TextBstr ) { // check if the field and separator char arrays need to be modified if ( m_FieldArray.GetSize() != 1 ) { // reset text m_Text.Reset(); // clear the field and separator char arrays m_FieldArray.RemoveAll(); m_SeparatorCharArray.RemoveAll(); try { // set as (address, '\n') m_FieldArray.SetAtGrow(0, &m_Address); m_SeparatorCharArray.SetAtGrow(0, CHAR_NEWLINE); } catch(...) { m_FieldArray.RemoveAll(); m_SeparatorCharArray.RemoveAll(); return E_OUTOFMEMORY; } } } else { // try to set the text bstr HResult = m_Text.SetBstr(TextBstr); if ( FAILED(HResult) ) { return HResult; } // check if field and separator char arrays need to be modified if ( m_FieldArray.GetSize() != 3 ) { // clear the field and separator char arrays m_FieldArray.RemoveAll(); m_SeparatorCharArray.RemoveAll(); try { // set as (address, '('), (text, ')'), (NULL, '\n') m_FieldArray.Add(&m_Address); m_SeparatorCharArray.Add(CHAR_LEFT_PAREN); m_FieldArray.Add(&m_Text); m_SeparatorCharArray.Add(CHAR_RIGHT_PAREN); m_FieldArray.Add(NULL); m_SeparatorCharArray.Add(CHAR_NEWLINE); } catch(...) { m_FieldArray.RemoveAll(); m_SeparatorCharArray.RemoveAll(); return E_OUTOFMEMORY; } } } return S_OK; } SDP_EMAIL::SDP_EMAIL( ) : SDP_ADDRESS_TEXT(SDP_INVALID_EMAIL_FIELD, EMAIL_STRING, &g_EmailTransition) { } BOOL SDP_EMAIL::GetField( OUT SDP_FIELD *&Field, OUT BOOL &AddToArray ) { // add in all cases by default AddToArray = TRUE; switch(m_LineState) { case EMAIL_ONLY_ADDRESS: case EMAIL_OPEN_TEXT: case EMAIL_CLOSED_ADDRESS: { Field = &m_Address; } break; case EMAIL_OPEN_ADDRESS: case EMAIL_CLOSED_TEXT: { Field = &m_Text; } break; default: { SetLastError(m_ErrorCode); return FALSE; } break; }; return TRUE; } SDP_PHONE::SDP_PHONE( ) : SDP_ADDRESS_TEXT(SDP_INVALID_PHONE_FIELD, PHONE_STRING, &g_PhoneTransition) { } BOOL SDP_PHONE::GetField( OUT SDP_FIELD *&Field, OUT BOOL &AddToArray ) { // add in all cases by default AddToArray = TRUE; switch(m_LineState) { case PHONE_ONLY_ADDRESS: case PHONE_OPEN_TEXT: case PHONE_CLOSED_ADDRESS: { Field = &m_Address; } break; case PHONE_OPEN_ADDRESS: case PHONE_CLOSED_TEXT: { Field = &m_Text; } break; default: { SetLastError(m_ErrorCode); return FALSE; } break; }; return TRUE; } SDP_VALUE * SDP_PHONE_LIST::CreateElement( ) { SDP_PHONE *SdpPhone; try { SdpPhone = new SDP_PHONE(); } catch(...) { SdpPhone = NULL; } if (NULL == SdpPhone) { return NULL; } if ( !SdpPhone->SetCharacterSet(m_CharacterSet) ) { delete SdpPhone; return NULL; } return SdpPhone; } SDP_VALUE * SDP_EMAIL_LIST::CreateElement( ) { SDP_EMAIL *SdpEmail; try { SdpEmail = new SDP_EMAIL(); } catch(...) { SdpEmail = NULL; } if(NULL == SdpEmail) { return NULL; } if ( !SdpEmail->SetCharacterSet(m_CharacterSet) ) { delete SdpEmail; return NULL; } return SdpEmail; }