Merge remote-tracking branch 'origin/master' into tizen
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / Xaml / ResourcesLoader.cs
1 /*
2  * Copyright(c) 2022 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 using System;
18 using System.IO;
19 using System.Reflection;
20 using Tizen.NUI;
21 using System.Xml;
22 using Tizen.NUI.Binding.Internals;
23
24 // [assembly:Dependency(typeof(Tizen.NUI.Xaml.ResourcesLoader))]
25 namespace Tizen.NUI.Xaml
26 {
27     internal class ResourcesLoader : IResourcesLoader
28     {
29         public T CreateFromResource<T>(string resourcePath, Assembly assembly, IXmlLineInfo lineInfo) where T : new()
30         {
31             var rd = new T();
32             var resourceLoadingResponse = ResourceLoader.ResourceProvider?.Invoke(new ResourceLoader.ResourceLoadingQuery
33             {
34                 AssemblyName = assembly.GetName(),
35                 ResourcePath = resourcePath,
36                 Instance = rd
37             });
38             var alternateResource = resourceLoadingResponse?.ResourceContent;
39             if (alternateResource != null)
40             {
41                 rd.LoadFromXaml(alternateResource);
42                 return rd;
43             }
44
45             var resourceId = XamlResourceIdAttribute.GetResourceIdForPath(assembly, resourcePath);
46             if (resourceId == null)
47                 throw new XamlParseException($"Resource '{resourcePath}' not found.", lineInfo);
48
49             using (var stream = assembly.GetManifestResourceStream(resourceId))
50             {
51                 if (stream == null)
52                     throw new XamlParseException($"No resource found for '{resourceId}'.", lineInfo);
53                 using (var reader = new StreamReader(stream))
54                 {
55                     rd.LoadFromXaml(reader.ReadToEnd());
56                     return rd;
57                 }
58             }
59         }
60
61         public string GetResource(string resourcePath, Assembly assembly, object target, IXmlLineInfo lineInfo)
62         {
63             var resourceLoadingResponse = ResourceLoader.ResourceProvider?.Invoke(new ResourceLoader.ResourceLoadingQuery {
64                 AssemblyName = assembly.GetName(),
65                 ResourcePath = resourcePath,
66                 Instance = target
67             });
68             var alternateResource = resourceLoadingResponse?.ResourceContent;
69             if (alternateResource != null)
70                 return alternateResource;
71
72             var resourceId = XamlResourceIdAttribute.GetResourceIdForPath(assembly, resourcePath);
73             if (resourceId == null)
74                 throw new XamlParseException($"Resource '{resourcePath}' not found.", lineInfo);
75
76             using (var stream = assembly.GetManifestResourceStream(resourceId))
77             {
78                 if (stream == null)
79                     throw new XamlParseException($"No resource found for '{resourceId}'.", lineInfo);
80                 using (var reader = new StreamReader(stream))
81                     return reader.ReadToEnd();
82             }
83         }
84     }
85 }