diff -r 000000000000 -r a4daefaec16c callcontinuity/vccutils/src/vccmiscutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/callcontinuity/vccutils/src/vccmiscutils.cpp Mon Jan 18 20:12:36 2010 +0200 @@ -0,0 +1,187 @@ +/* +* Copyright (c) 2007 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: Implementation of Miscallaneous service functions +* +*/ + + + +#include +#include +#include +#include +#include +//#include + +#include "vccmiscutils.h" +#include "rubydebug.h" + +_LIT( KVCCSIPScheme, "sip" ); +_LIT( KVCCSIPSScheme, "sips" ); +_LIT( KVCCHTTPScheme, "http" ); +_LIT( KVCCHTTPSScheme, "https" ); + +const TUint KAt = '@'; + +const TInt KVCCMinVDNLength = 5; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Checks if 16 bit reference is valid URI (VDI). +// --------------------------------------------------------------------------- +// +EXPORT_C TInt TVCCMiscUtils::URIValidL( const TDesC16& aURI ) + { + RUBY_DEBUG_BLOCK( "TVCCMiscUtils::URIValidL()" ); + + TUriParser parser; + // Check if uri contains multiple @ characters + TUint atcount( 0 ); + for( TUint i(0); i1 ) + { + return KErrUnknown; + } + + + // Parse the URI + TInt err = parser.Parse( aURI ); + + if ( !err ) + { + // Check for invalid characters + // 0x00-0x1F and > 0x7F), space (0x20), delimiter characters ('<', '>', + // '#', '%', '"') and unwise characters ('{', '}', '|', '\', '^', '[', + // ']', '`') are illegal + if ( !UriUtils::HasInvalidChars( aURI ) ) + { + // Check if scheme is valid + if ( parser.IsSchemeValid() ) + { + // Extract the scheme for comparing + const TDesC& scheme = parser.Extract( EUriScheme ); + + // SIP or SIPS scheme + if ( scheme.Compare( KVCCSIPScheme ) == 0 || + scheme.Compare( KVCCSIPSScheme ) == 0 ) + { + err = parser.Validate(); + } + // HTTP or HTTPS scheme + else if ( scheme.Compare( KVCCHTTPScheme ) == 0 || + scheme.Compare( KVCCHTTPSScheme ) == 0 ) + { + // Do nothing at the moment. + } + else + { + err = KErrUnknown; + } + } + // No scheme, maybe a host type + else + { + UriUtils::TUriHostType type = UriUtils::HostType( aURI ); + + switch ( type ) + { + case UriUtils::EIPv6Host: + case UriUtils::EIPv4Host: + case UriUtils::ETextHost: + break; + default: + { + err = KErrUnknown; + break; + } + } // switch + } // else + } // if invalid characters + else + { + err = KErrNotSupported; + } + } + + return err; + } + +// --------------------------------------------------------------------------- +// Checks if reference is valid VDN. +// --------------------------------------------------------------------------- +// +EXPORT_C TBool TVCCMiscUtils::VDNValidL( const TDesC16& aVDN ) + { + RUBY_DEBUG_BLOCK( "TVCCMiscUtils::VDNValidL()" ); + + TBool retVal( ETrue ); + TLex input( aVDN ); + TInt numCount( 0 ); + + // Is the string empty + if ( aVDN.Length() > 0 ) + { + input.Mark(); + + // Deal with the '+' -sign at the beginning of the string + if (input.Peek() == '+') + { + // Step forward + input.Inc(); + } + + for ( ;; numCount++ ) + { + if ( !( input.Peek().IsDigit() ) && !( input.Peek().Eos() ) ) + { + // Next character is not a digit or end-of-string character + retVal = EFalse; + break; + } + else if ( input.Peek().Eos() && numCount < KVCCMinVDNLength ) + { + // End of string but number count is too small to be a valid VDN + retVal = EFalse; + break; + } + else if ( input.Peek().Eos() && numCount >= KVCCMinVDNLength ) + { + // At the end of string and number count is acceptable to be a + // valid VDN + break; + } + else + { + // step forward + input.Inc(); + } + } // for + } + else + { + // Empty string + retVal = EFalse; + } + + return retVal; + } +