namespace
{
-VisualUrl::Location ResolveLocation( const std::string& url)
+VisualUrl::ProtocolType ResolveLocation( const std::string& url )
{
- const char FTP[] = { 'f', 't', 'p', ':', '/', '/' };
- const char SSH[] = { 's', 's', 'h', ':', '/', '/' };
- const char HTTP[] = { 'h', 't', 't', 'p', ':', '/', '/' };
- const char HTTPS[] = { 'h', 't', 't', 'p', 's', ':', '/', '/' };
-
- const int MATCH_FTP = 0x01;
- const int MATCH_SSH = 0x02;
- const int MATCH_HTTP = 0x04;
- const int MATCH_HTTPS = 0x08;
-
const char* urlCStr = url.c_str();
- if( url.size() > 6 )
+ const uint32_t length = url.size();
+ if( ( length > 7 ) && urlCStr[5] == ':' && urlCStr[6] == '/' && urlCStr[7] == '/' )
+ {
+ // https://
+ if( ( 'h' == tolower( urlCStr[0] ) )&&
+ ( 't' == tolower( urlCStr[1] ) )&&
+ ( 't' == tolower( urlCStr[2] ) )&&
+ ( 'p' == tolower( urlCStr[3] ) )&&
+ ( 's' == tolower( urlCStr[4] ) ) )
+ {
+ return VisualUrl::REMOTE;
+ }
+ }
+ else if( ( length > 6 ) && urlCStr[4] == ':' && urlCStr[5] == '/' && urlCStr[6] == '/' )
+ {
+ // http:// or dali://
+ const char hOrd = tolower( urlCStr[0] );
+ const char tOra = tolower( urlCStr[1] );
+ const char tOrl = tolower( urlCStr[2] );
+ const char pOri = tolower( urlCStr[3] );
+ if( ( 'h' == hOrd )&&
+ ( 't' == tOra )&&
+ ( 't' == tOrl )&&
+ ( 'p' == pOri ) )
+ {
+ return VisualUrl::REMOTE;
+ }
+ if( ( 'd' == hOrd )&&
+ ( 'a' == tOra )&&
+ ( 'l' == tOrl )&&
+ ( 'i' == pOri ) )
+ {
+ return VisualUrl::TEXTURE;
+ }
+ }
+ else if( ( length > 5 ) && urlCStr[3] == ':' && urlCStr[4] == '/' && urlCStr[5] == '/' )
{
- if( urlCStr[3] == ':' || urlCStr[4] == ':' || urlCStr[5] == ':' )
+ // ftp:// or ssh://
+ const char fOrS = tolower( urlCStr[0] );
+ if( ( 'f' == fOrS )||( 's' == fOrS ) )
{
- int flags = 0x0F;
- for( unsigned int i=0; i < sizeof(HTTPS); ++i )
+ const char tOrs = tolower( urlCStr[1] );
+ if( ( 't' == tOrs )||( 's' == tOrs ) )
{
- char c = tolower( urlCStr[i] );
- if( i < sizeof(FTP) && (flags & MATCH_FTP) && c != FTP[i] )
- {
- flags &= ~MATCH_FTP;
- }
- if( i < sizeof(SSH) && (flags & MATCH_SSH) && c != SSH[i] )
- {
- flags &= ~MATCH_SSH;
- }
- if( i < sizeof(HTTP) && (flags & MATCH_HTTP) && c != HTTP[i] )
- {
- flags &= ~MATCH_HTTP;
- }
- if( i < sizeof(HTTPS) && (flags & MATCH_HTTPS) && c != HTTPS[i] )
- {
- flags &= ~MATCH_HTTPS;
- }
-
- if( (flags & (MATCH_FTP | MATCH_SSH | MATCH_HTTP | MATCH_HTTPS )) == 0 )
+ const char pOrh = tolower( urlCStr[2] );
+ if( ( 'p' == pOrh )||( 'h' == pOrh ) )
{
- break;
+ return VisualUrl::REMOTE;
}
}
-
- if( flags )
- {
- return VisualUrl::REMOTE;
- }
}
}
return VisualUrl::LOCAL;
enum { SUFFIX, HASH, HASH_DOT } state = SUFFIX;
char SVG[ 4 ] = { 'g', 'v', 's', '.' };
char GIF[ 4 ] = { 'f', 'i', 'g', '.' };
+ char JSON[ 5 ] = { 'n', 'o', 's', 'j', '.' };
unsigned int svgScore = 0;
unsigned int gifScore = 0;
+ unsigned int jsonScore = 0;
int index = count;
while( --index >= 0 )
{
- const char currentChar = url[ index ];
+ const char currentChar = tolower( url[ index ] );
const std::size_t offsetFromEnd = count - index - 1u;
- if( ( offsetFromEnd < sizeof(SVG) )&&( tolower( currentChar ) == SVG[ offsetFromEnd ] ) )
+ if( ( offsetFromEnd < sizeof(SVG) )&&( currentChar == SVG[ offsetFromEnd ] ) )
{
// early out if SVG as can't be used in N patch for now
if( ++svgScore == sizeof(SVG) )
return VisualUrl::SVG;
}
}
- if( ( offsetFromEnd < sizeof(GIF) )&&( tolower( currentChar ) == GIF[ offsetFromEnd ] ) )
+ if( ( offsetFromEnd < sizeof(GIF) )&&( currentChar == GIF[ offsetFromEnd ] ) )
{
- // early out if GIF
+ // early out if GIF as can't be used in N patch for now
if( ++gifScore == sizeof(GIF) )
{
return VisualUrl::GIF;
}
}
+ if( ( offsetFromEnd < sizeof(JSON) )&&( currentChar == JSON[ offsetFromEnd ] ) )
+ {
+ // early out if JSON as can't be used in N patch for now
+ if( ++jsonScore == sizeof(JSON) )
+ {
+ return VisualUrl::JSON;
+ }
+ }
switch( state )
{
case SUFFIX:
if( ! url.empty() )
{
mLocation = ResolveLocation( url );
- mType = ResolveType( url );
+ if( VisualUrl::TEXTURE != mLocation )
+ {
+ // TEXTURE location url doesn't need type resolving, REGULAR_IMAGE is fine
+ mType = ResolveType( url );
+ }
}
}
return mType;
}
-VisualUrl::Location VisualUrl::GetLocation() const
+VisualUrl::ProtocolType VisualUrl::GetProtocolType() const
{
return mLocation;
}
return mUrl.size() > 0u;
}
-bool VisualUrl::IsLocal() const
+bool VisualUrl::IsLocalResource() const
{
return mLocation == VisualUrl::LOCAL;
}
+std::string VisualUrl::GetLocation() const
+{
+ const auto location = mUrl.find( "://" );
+ if( std::string::npos != location )
+ {
+ return mUrl.substr( location + 3u ); // 3 characters forwards from the start of ://
+ }
+ return mUrl;
+}
+std::string VisualUrl::CreateTextureUrl( const std::string& location )
+{
+ return "dali://" + location;
+}
} // Internal
+
} // Toolkit
+
} // Dali