134 lines
4.2 KiB
C++
134 lines
4.2 KiB
C++
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// NoesisGUI - http://www.noesisengine.com
|
|
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#ifndef __GUI_URI_H__
|
|
#define __GUI_URI_H__
|
|
|
|
|
|
#include <NsCore/Noesis.h>
|
|
#include <NsCore/ReflectionDeclare.h>
|
|
#include <NsCore/String.h>
|
|
#include <NsGui/ProvidersApi.h>
|
|
|
|
|
|
namespace Noesis
|
|
{
|
|
|
|
NS_WARNING_PUSH
|
|
NS_MSVC_WARNING_DISABLE(4251 4275)
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
/// Provides a representation of a uniform resource identifier and easy access to parts of the URI.
|
|
///
|
|
/// In NoesisGUI, uniform resource identifiers (URIs) are used to identify and load resources like
|
|
/// *Images*, *Fonts* and *Dictionaries*. Two kind of URIs are supported: absolute and relative.
|
|
///
|
|
/// Absolute URIs define a scheme preceding the path part. Paths beginning with a drive letter
|
|
/// are also considered absolute (automatically normalized to a file scheme URI).
|
|
///
|
|
/// .. code-block:: xml
|
|
///
|
|
/// <Image Source="pack://application:,,,/Images/icon.png" />
|
|
/// <Image Source="file:///Images/icon.png" />
|
|
/// <Image Source="C:/Images/icon.png" />
|
|
/// <Image Source="http://www.noesisengine.com" />
|
|
///
|
|
/// A relative URI includes only the path.
|
|
///
|
|
/// .. code-block:: xml
|
|
///
|
|
/// <Image Source="Images/icon.png" />
|
|
///
|
|
/// Both absolute and relative URIs can have an optional assembly definition in
|
|
/// the form of *'/Assembly;component/'* preceding the path.
|
|
///
|
|
/// .. code-block:: xml
|
|
///
|
|
/// <Image Source="pack://application:,,,/MyProject;component/Images/icon.png" />
|
|
/// <Image Source="/MyProject;component/Images/icon.png" />
|
|
///
|
|
/// By default, a relative URI is considered relative to the location of the XAML that contains
|
|
/// the reference. If a leading slash is provided, however, the relative URI reference is then
|
|
/// considered relative to the root of the application. For example, given the following project
|
|
/// structure:
|
|
///
|
|
/// .. code-block:: cpp
|
|
///
|
|
/// App.xaml
|
|
/// Page2.xaml
|
|
/// Folder/
|
|
/// + Page1.xaml
|
|
/// + Page2.xaml
|
|
///
|
|
/// If Page1.xaml contains a reference to *'Page2.xaml'*, it will point to *'Folder/Page2.xaml'* as
|
|
/// the reference is considered relative to the XAML. If it refers to *'/Page2.xaml'* or
|
|
/// *'/MyProject;component/Page2.xaml'*, it will point to the root *'Page2.xaml'* as the reference
|
|
/// is considered relative to the root of the application.
|
|
///
|
|
/// https://docs.microsoft.com/en-us/dotnet/api/system.uri
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
struct NS_GUI_PROVIDERS_API Uri
|
|
{
|
|
/// Constructor for empty Uri
|
|
Uri();
|
|
|
|
/// Constructor from string identifying a resource reference
|
|
Uri(const char* uri);
|
|
|
|
/// Constructor from base URI and relative URI string
|
|
Uri(const Uri& baseUri, const char* uri);
|
|
|
|
/// Indicates if this Uri is valid
|
|
bool IsValid() const;
|
|
|
|
/// Indicates if this Uri is absolute
|
|
bool IsAbsolute() const;
|
|
|
|
/// Gets the original string that was passed to this Uri constructor normalized
|
|
const char* Str() const;
|
|
|
|
/// Gets path part of the Uri including the assembly
|
|
const char* FullPath() const;
|
|
|
|
/// Gets scheme part of the Uri
|
|
void GetScheme(BaseString& scheme) const;
|
|
|
|
/// Gets assembly part of the Uri
|
|
void GetAssembly(BaseString& assembly) const;
|
|
|
|
/// Gets path part of the Uri with the assembly removed
|
|
void GetPath(BaseString& path) const;
|
|
|
|
/// Generates a string representation of the Uri
|
|
String ToString() const;
|
|
|
|
bool operator==(const Uri& uri) const;
|
|
bool operator!=(const Uri& uri) const;
|
|
|
|
/// Uri creation from file scheme ('file:///path')
|
|
static Uri File(const char* path);
|
|
|
|
/// Uri creation from pack scheme ('pack://application:,,,/assembly;component/path')
|
|
static Uri Pack(const char* assembly, const char* path);
|
|
|
|
private:
|
|
FixedString<512> mUri;
|
|
uint8_t mPathStart;
|
|
uint8_t mSchemeLen;
|
|
uint8_t mAssemblyLen;
|
|
uint8_t mSlashLen;
|
|
bool mIsValid;
|
|
|
|
NS_DECLARE_REFLECTION(Uri, NoParent)
|
|
};
|
|
|
|
NS_WARNING_POP
|
|
|
|
}
|
|
|
|
|
|
#endif
|