using System.Runtime.InteropServices;
using Tizen.Applications;
+/// <summary>
+/// Interoperability support class for Tizen APIs
+/// </summary>
internal static partial class Interop
{
+ /// <summary>
+ /// Interoperability support class for the attach panel APIs
+ /// </summary>
internal static partial class AttachPanel
{
internal enum ErrorCode : int
+/// <summary>
+/// Interoperability support class for the attach panel APIs
+/// </summary>
internal static partial class Interop
{
+ /// <summary>
+ /// Interoperability support class for the API library
+ /// </summary>
internal static partial class Libraries
{
public const string AttachPanel = "libattach-panel.so.0.1.0";
</PropertyGroup>
<ItemGroup>
+ <ProjectReference Include="..\ElmSharp\ElmSharp.csproj" />
<ProjectReference Include="..\Tizen.Applications.Common\Tizen.Applications.Common.csproj" />
</ItemGroup>
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
-VisualStudioVersion = 15.0.26430.12
+VisualStudioVersion = 15.0.26730.12
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Applications.AttachPanel", "Tizen.Applications.AttachPanel.csproj", "{C8C93D46-CACE-4BF1-8B50-6A6A00967045}"
+ ProjectSection(ProjectDependencies) = postProject
+ {AF2CEEB1-B3B2-4E2D-8854-A54871CD0D1C} = {AF2CEEB1-B3B2-4E2D-8854-A54871CD0D1C}
+ EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Applications.Common", "..\Tizen.Applications.Common\Tizen.Applications.Common.csproj", "{D2B5F854-4FE1-473C-A8E3-53ABB0A966AA}"
EndProject
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Log", "..\Tizen.Log\Tizen.Log.csproj", "{AFF3D5BA-42DA-40CE-BC57-0DC1E92673B9}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElmSharp", "..\ElmSharp\ElmSharp.csproj", "{AF2CEEB1-B3B2-4E2D-8854-A54871CD0D1C}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
{AFF3D5BA-42DA-40CE-BC57-0DC1E92673B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFF3D5BA-42DA-40CE-BC57-0DC1E92673B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFF3D5BA-42DA-40CE-BC57-0DC1E92673B9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AF2CEEB1-B3B2-4E2D-8854-A54871CD0D1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AF2CEEB1-B3B2-4E2D-8854-A54871CD0D1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AF2CEEB1-B3B2-4E2D-8854-A54871CD0D1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AF2CEEB1-B3B2-4E2D-8854-A54871CD0D1C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {7169FEAE-EE0D-4B29-B710-F504A6B82E8C}
+ EndGlobalSection
EndGlobal
+using ElmSharp;
using System;
namespace Tizen.Applications.AttachPanel
/// <param name="conformant">The caller's conformant</param>
/// <exception cref="OutOfMemoryException">Thrown when an attempt to allocate memory fails.</exception>
/// <exception cref="InvalidOperationException">Thrown when the AttachPanel is already exist or the <paramref name="conformant"/> is not a conformant object</exception>
- public AttachPanel(IntPtr conformant)
+ public AttachPanel(EvasObject conformant)
{
if (conformant == IntPtr.Zero)
{
throw new ArgumentNullException("Use the value property, not null value");
}
+
+ IntPtr candidateAttachPanel = new IntPtr();
+ Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.CreateAttachPanel(conformant, ref candidateAttachPanel);
+ CheckException(err);
+
+ Tizen.Log.Debug("AttachPanelSharp", "Success to create an AttachPanel Instance");
+ isCreationSucceed = true;
+ _attachPanel = candidateAttachPanel;
+
+ if (_eventEventHandler == null)
+ {
+ StateEventListenStart();
+ }
+
+ if (_resultEventHandler == null)
+ {
+ ResultEventListenStart();
+ }
+ }
+
+ /// <summary>
+ /// Represents immutable class for attach panel.
+ /// </summary>
+ /// <since_tizen> 3 </since_tizen>
+ /// <param name="conformant">The caller's conformant</param>
+ /// <exception cref="OutOfMemoryException">Thrown when an attempt to allocate memory fails.</exception>
+ /// <exception cref="InvalidOperationException">Thrown when the AttachPanel is already exist or the <paramref name="conformant"/> is not a conformant object</exception>
+ public AttachPanel(Conformant conformant)
+ {
+ if (conformant == IntPtr.Zero)
+ {
+ throw new ArgumentNullException("Use the value property, not null value");
+ }
+
IntPtr candidateAttachPanel = new IntPtr();
Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.CreateAttachPanel(conformant, ref candidateAttachPanel);
- checkException(err);
+ CheckException(err);
Tizen.Log.Debug("AttachPanelSharp", "Success to create an AttachPanel Instance");
isCreationSucceed = true;
_attachPanel != IntPtr.Zero)
{
Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.DestroyAttachPanel(_attachPanel);
- checkException(err);
+ CheckException(err);
_attachPanel = IntPtr.Zero;
}
}
/// Gets the state of the AttachPanel.
/// </summary>
/// <value>The AttachPanel window state</value>
- public int State
+ public StateType State
{
get
{
- int state;
- Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.GetState(_attachPanel, out state);
- checkException(err);
+ int interopState;
+ Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.GetState(_attachPanel, out interopState);
+ CheckException(err);
+ StateType state = (StateType)Enum.ToObject(typeof(StateType), interopState);
return state;
}
}
/// Gets the value that indicates whether the AttachPanel is visible.
/// </summary>
/// <value>visible value of AttachPanel state</value>
- public int Visible
+ public bool Visible
{
get
{
int visible;
Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.GetVisibility(_attachPanel, out visible);
- checkException(err);
- return visible;
+ CheckException(err);
+ return (visible == 1);
}
}
{
bundle = extraData.SafeBundleHandle.DangerousGetHandle();
}
+
Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.AddCategory(_attachPanel, (int)category, bundle);
- checkException(err);
+ CheckException(err);
}
/// <summary>
public void RemoveCategory(ContentCategory category)
{
Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.RemoveCategory(_attachPanel, (int)category);
- checkException(err);
+ CheckException(err);
}
/// <summary>
/// <exception cref="OutOfMemoryException">Thrown when an attempt to allocate memory fails.</exception>
public void SetExtraData(ContentCategory category, Bundle extraData)
{
- if(extraData == null)
+ if (extraData == null)
{
- checkException(Interop.AttachPanel.ErrorCode.InvalidParameter);
+ CheckException(Interop.AttachPanel.ErrorCode.InvalidParameter);
}
IntPtr bundle = IntPtr.Zero;
{
bundle = extraData.SafeBundleHandle.DangerousGetHandle();
}
+
Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.SetExtraData(_attachPanel, (int)category, bundle);
- checkException(err);
+ CheckException(err);
}
/// <summary>
public void Show()
{
Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.Show(_attachPanel);
- checkException(err);
+ CheckException(err);
}
/// <summary>
/// Shows the attach panel and selects whether or not to animate
/// </summary>
+ /// <param name="animation">A flag which turn on or turn off the animation while attach panel showing.</param>
/// <exception cref="InvalidOperationException">Thrown when the AttachPanel is destroyed</exception>
public void Show(bool animation)
{
if (animation)
{
Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.Show(_attachPanel);
- checkException(err);
+ CheckException(err);
}
else
{
Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.ShowWithoutAnimation(_attachPanel);
- checkException(err);
+ CheckException(err);
}
}
public void Hide()
{
Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.Hide(_attachPanel);
- checkException(err);
+ CheckException(err);
}
/// <summary>
/// Hides the attach panel and selects whether or not to animate
/// </summary>
+ /// <param name="animation">A flag which turn on or turn off the animation while attach panel hiding.</param>
/// <exception cref="InvalidOperationException">Thrown when the AttachPanel is destroyed</exception>
public void Hide(bool animation)
{
if (animation)
{
Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.Hide(_attachPanel);
- checkException(err);
+ CheckException(err);
}
else
{
Interop.AttachPanel.ErrorCode err = Interop.AttachPanel.HideWithoutAnimation(_attachPanel);
- checkException(err);
+ CheckException(err);
}
}
{
StateEventListenStart();
}
+
_eventEventHandler += value;
}
+
remove
{
_eventEventHandler -= value;
{
ResultEventListenStart();
}
+
_resultEventHandler += value;
}
+
remove
{
_resultEventHandler -= value;
namespace Tizen.Applications.AttachPanel
{
+ /// <summary>
+ /// Attach panel internal implementation
+ /// </summary>
public partial class AttachPanel
{
private static IntPtr _attachPanel;
SetEventListener = (attachPanel, eventType, eventInfo, userData) =>
{
- _eventEventHandler?.Invoke(null, new StateEventArgs(attachPanel, (EventType)eventType, eventInfo, userData));
+ _eventEventHandler?.Invoke(null, new StateEventArgs((EventType)eventType));
};
err = Interop.AttachPanel.SetEventCb(_attachPanel, SetEventListener, IntPtr.Zero);
- checkException(err);
+ CheckException(err);
}
+
private void StateEventListenStop()
{
Interop.AttachPanel.ErrorCode err = 0;
- err = Interop.AttachPanel.UnsetEventCb(_attachPanel);
- checkException(err);
+ err = Interop.AttachPanel.UnsetEventCb(_attachPanel);
+ CheckException(err);
}
private void ResultEventListenStart()
{
SafeAppControlHandle handle = new SafeAppControlHandle(resulthandler, false);
AppControl result = new AppControl(handle);
- _resultEventHandler?.Invoke(null, new ResultEventArgs(attachPanel, (ContentCategory)category, result, (AppControlReplyResult)resultCode, userData));
+ _resultEventHandler?.Invoke(null, new ResultEventArgs((ContentCategory)category, result, (AppControlReplyResult)resultCode));
};
err = Interop.AttachPanel.SetResultCb(_attachPanel, SetResultListener, IntPtr.Zero);
- checkException(err);
+ CheckException(err);
}
private void ResultEventListenStop()
{
Interop.AttachPanel.ErrorCode err = 0;
err = Interop.AttachPanel.UnsetResultCb(_attachPanel);
- checkException(err);
+ CheckException(err);
}
- internal static void checkException(Interop.AttachPanel.ErrorCode err)
+ internal static void CheckException(Interop.AttachPanel.ErrorCode err)
{
switch (err)
{
/// </summary>
public class ResultEventArgs : EventArgs
{
- private readonly IntPtr _attachPanel;
private readonly ContentCategory _category;
private readonly AppControl _result;
private readonly AppControlReplyResult _resultCode;
- private readonly IntPtr _userData;
- internal ResultEventArgs(IntPtr attachPanel, ContentCategory category, AppControl result, AppControlReplyResult resultCode, IntPtr userData)
+ internal ResultEventArgs(ContentCategory category, AppControl result, AppControlReplyResult resultCode)
{
- _attachPanel = attachPanel;
_category = category;
_result = result;
_resultCode = resultCode;
- _userData = userData;
}
/// <summary>
- /// Property for attach panel object.
- /// </summary>
- public IntPtr AttachPanel { get { return _attachPanel; } }
-
- /// <summary>
/// Results are from the content category.
/// </summary>
- public ContentCategory Category { get { return _category; } }
+ public ContentCategory Category
+ {
+ get
+ {
+ return _category;
+ }
+ }
/// <summary>
/// Property for result
/// The caller app has to use ExtraData property to get received data.
/// </summary>
- public AppControl Result { get { return _result; } }
+ public AppControl Result
+ {
+ get
+ {
+ return _result;
+ }
+ }
/// <summary>
/// Property for result of AppControl
/// </summary>
- public AppControlReplyResult ResultCode { get { return _resultCode; } }
-
- /// <summary>
- /// Property for user data
- /// </summary>
- public IntPtr UserData { get { return _userData; } }
+ public AppControlReplyResult ResultCode
+ {
+ get
+ {
+ return _resultCode;
+ }
+ }
}
}
/// </summary>
public class StateEventArgs : EventArgs
{
- private readonly IntPtr _attachPanel;
private readonly EventType _eventType;
- private readonly IntPtr _eventInfo;
- private readonly IntPtr _userData;
- internal StateEventArgs(IntPtr attachPanel, EventType eventType, IntPtr eventInfo, IntPtr userData)
+ internal StateEventArgs(EventType eventType)
{
- _attachPanel = attachPanel;
_eventType = eventType;
- _eventInfo = eventInfo;
- _userData = userData;
}
/// <summary>
- /// Property for attach panel object
- /// </summary>
- public IntPtr AttachPanel { get { return _attachPanel; } }
-
- /// <summary>
/// Property for event type.
/// </summary>
- public EventType EventType { get { return _eventType; } }
-
- /// <summary>
- /// Additional event information.
- /// This can be NULL if there are no necessary information.
- /// </summary>
- public IntPtr EventInfo { get { return _eventInfo; } }
-
- /// <summary>
- /// Property for user data.
- /// </summary>
- public IntPtr UserData { get { return _userData; } }
+ public EventType EventType
+ {
+ get
+ {
+ return _eventType;
+ }
+ }
}
}
}
[StructLayout(LayoutKind.Sequential)]
- internal struct sTEEC_SharedMemoryImp
+ internal class TEEC_SharedMemory
{
- public IntPtr context;
- public IntPtr context_imp;
+ public IntPtr buffer;
+ public UInt32 size;
public UInt32 flags;
- public UInt32 memid;
+ public IntPtr imp;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ internal struct TEEC_Value
+ {
+ public UInt32 a;
+ public UInt32 b;
}
[StructLayout(LayoutKind.Sequential)]
- internal struct TEEC_SharedMemory
+ internal struct TEEC_TempMemoryReference
{
public IntPtr buffer;
public UInt32 size;
- public UInt32 flags;
}
[StructLayout(LayoutKind.Sequential)]
+ internal struct TEEC_RegisteredMemoryReference
+ {
+ public TEEC_SharedMemory parent;
+ public UInt32 size;
+ public UInt32 offset;
+ }
+
+ [StructLayout(LayoutKind.Explicit)]
internal struct TEEC_Parameter
{
- public UInt32 a;
- public UInt32 b;
+ [FieldOffset(0)]
+ public TEEC_TempMemoryReference tmpref;
+ [FieldOffset(0)]
+ public TEEC_RegisteredMemoryReference memref;
+ [FieldOffset(0)]
+ public TEEC_Value value;
}
[StructLayout(LayoutKind.Sequential)]
/// This property represents the size of the buffer.
/// </summary>
/// <since_tizen> 3 </since_tizen>
- public uint Size { get; }
+ public uint Size { get; internal set; }
};
/// <summary>
/// This property represents the size (in bytes) of the shared memory.
/// </summary>
/// <since_tizen> 3 </since_tizen>
- public uint Size { get; }
+ public uint Size { get; internal set; }
/// <summary>
/// This property represents the offset (in bytes) from the start of the shared memory.
/// </summary>
/// This property represents an unsigned integer A.
/// </summary>
/// <since_tizen> 3 </since_tizen>
- public uint A { get; }
+ public uint A { get; internal set; }
/// <summary>
/// This property represents an unsigned integer B.
/// </summary>
/// <since_tizen> 3 </since_tizen>
- public uint B { get; }
+ public uint B { get; internal set; }
};
this.session = new Interop.TEEC_Session();
}
+ /// <summary>
+ /// Destructor of the class.
+ /// </summary>
~Session()
{
Close();
}
+ internal UInt32 InitParam(ref Interop.TEEC_Parameter dst, Parameter src)
+ {
+ switch (src.NativeType) {
+ case (int)TEFValueType.Input:
+ case (int)TEFValueType.Output:
+ case (int)TEFValueType.InOut:
+ dst.value.a = ((Value)src).A;
+ dst.value.b = ((Value)src).B;
+ break;
+
+ case (int)TEFTempMemoryType.Input:
+ case (int)TEFTempMemoryType.Output:
+ case (int)TEFTempMemoryType.InOut:
+ dst.tmpref.buffer = ((TempMemoryReference)src).Buffer;
+ dst.tmpref.size = ((TempMemoryReference)src).Size;
+ break;
+
+ case (int)TEFRegisteredMemoryType.Whole:
+ case (int)TEFRegisteredMemoryType.PartialInput:
+ case (int)TEFRegisteredMemoryType.PartialOutput:
+ case (int)TEFRegisteredMemoryType.PartialInOut:
+ dst.memref.parent = ((RegisteredMemoryReference)src).Parent.shm;
+ dst.memref.size = ((RegisteredMemoryReference)src).Size;
+ dst.memref.offset = ((RegisteredMemoryReference)src).Offset;
+ break;
+
+ default: return 0;
+ }
+ return src.NativeType;
+ }
+
+ internal void UpdateParam(Interop.TEEC_Parameter src, ref Parameter dst)
+ {
+ switch (dst.NativeType) {
+ case (int)TEFValueType.Input:
+ case (int)TEFValueType.Output:
+ case (int)TEFValueType.InOut:
+ ((Value)dst).A = src.value.a;
+ ((Value)dst).B = src.value.b;
+ break;
+
+ case (int)TEFTempMemoryType.Input:
+ case (int)TEFTempMemoryType.Output:
+ case (int)TEFTempMemoryType.InOut:
+ ((TempMemoryReference)dst).Size = src.tmpref.size;
+ break;
+
+ case (int)TEFRegisteredMemoryType.Whole:
+ case (int)TEFRegisteredMemoryType.PartialInput:
+ case (int)TEFRegisteredMemoryType.PartialOutput:
+ case (int)TEFRegisteredMemoryType.PartialInOut:
+ ((RegisteredMemoryReference)dst).Size = src.memref.size;
+ break;
+
+ default: break;
+ }
+ }
+
internal void Open(Guid destination, uint loginMethod, byte[] connectionData, Parameter[] paramlist)
{
Interop.TEEC_UUID uuid = Interop.TEEC_UUID.ToTeecUuid(destination);
Interop.TEEC_Operation op = new Interop.TEEC_Operation();
- uint ro;
+ op.started=0;
+ op.paramTypes=0;
+ for (int i=0; i < 4 && i < paramlist.Length; ++i) {
+ op.paramTypes |= InitParam(ref op.paramlist[i], paramlist[i]) << (4*i);
+ }
+
+ uint ro;
int ret = Interop.Libteec.OpenSession(ref context, ref session, ref uuid, loginMethod, connectionData, ref op, out ro);
//MAYBE map origin of return code to specyfic Exception
Interop.CheckNThrowException(ret, string.Format("OpenSession('{0}')", destination));
+ for (int i=0; i < 4 && i < paramlist.Length; ++i) {
+ UpdateParam(op.paramlist[i], ref paramlist[i]);
+ }
}
/// <summary>
Interop.TEEC_Operation op = new Interop.TEEC_Operation();
op.started=0;
op.paramTypes=0;
-
- for (int i=0; i < 4; ++i) {
- Parameter p = paramlist[i];
- //TODO fill TEEC_Operation struct
+ for (int i=0; i < 4 && i < paramlist.Length; ++i) {
+ op.paramTypes |= InitParam(ref op.paramlist[i], paramlist[i]) << (4*i);
}
uint ro;
int ret = Interop.Libteec.InvokeCommand(ref session, commandID, ref op, out ro);
//MAYBE map origin of return code to specific Exception
Interop.CheckNThrowException(ret, string.Format("InvokeCommand({0})", commandID));
+ for (int i=0; i < 4 && i < paramlist.Length; ++i) {
+ UpdateParam(op.paramlist[i], ref paramlist[i]);
+ }
}
/// <summary>
context = new Interop.TEEC_Context();
if (name != null && name.Length == 0)
name = null;
- int ret = Interop.Libteec.InitializeContext(name, ref context);
- Interop.CheckNThrowException(ret, string.Format("InititalizeContext('{0}')", name));
+ try {
+ int ret = Interop.Libteec.InitializeContext(name, ref context);
+ Interop.CheckNThrowException(ret, string.Format("InititalizeContext('{0}')", name));
+ }
+ catch (global::System.DllNotFoundException e)
+ {
+ unchecked {
+ Interop.CheckNThrowException((int)Interop.LibteecError.NotImplemented, "Not found: " + e.Message);
+ }
+ }
}
+ /// <summary>
+ /// Destructor of the class.
+ /// </summary>
~Context()
{
Dispose();
/// <privlevel>partner</privlevel>
/// <feature>http://tizen.org/feature/security.tee</feature>
public void Dispose() {
- Interop.Libteec.FinalizeContext(ref context);
- //context.imp = null;
+ try {
+ Interop.Libteec.FinalizeContext(ref context);
+ }
+ catch (global::System.DllNotFoundException) { }
}
/// <summary>