--- /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 <e32std.h>
+#include <uri8.h>
+#include <uriutils.h>
+#include <authority8.h>
+#include <delimitedpath8.h>
+//#include <e32const.h>
+
+#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); i<aURI.Length(); i++ )
+ {
+ if( KAt == aURI[i] )
+ {
+ ++atcount;
+ }
+ }
+
+ if( atcount>1 )
+ {
+ 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;
+ }
+