public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession) { _normalSession = normalSession; _commonArguments = IApplet.ReadStruct <CommonArguments>(_normalSession.Pop()); Logger.Info?.PrintMsg(LogClass.ServiceAm, $"ErrorApplet version: 0x{_commonArguments.AppletVersion:x8}"); _errorStorage = _normalSession.Pop(); _errorCommonHeader = IApplet.ReadStruct <ErrorCommonHeader>(_errorStorage); _errorStorage = _errorStorage.Skip(Marshal.SizeOf(typeof(ErrorCommonHeader))).ToArray(); switch (_errorCommonHeader.Type) { case ErrorType.ErrorCommonArg: { ParseErrorCommonArg(); break; } case ErrorType.ApplicationErrorArg: { ParseApplicationErrorArg(); break; } default: throw new NotImplementedException($"ErrorApplet type {_errorCommonHeader.Type} is not implemented."); } AppletStateChanged?.Invoke(this, null); return(ResultCode.Success); }
unsafe public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession) { _normalSession = normalSession; byte[] launchParams = _normalSession.Pop(); byte[] controllerSupportArgPrivate = _normalSession.Pop(); ControllerSupportArgPrivate privateArg = IApplet.ReadStruct <ControllerSupportArgPrivate>(controllerSupportArgPrivate); Logger.PrintStub(LogClass.ServiceHid, $"ControllerApplet ArgPriv {privateArg.PrivateSize} {privateArg.ArgSize} {privateArg.Mode}" + $"HoldType:{(NpadJoyHoldType)privateArg.NpadJoyHoldType} StyleSets:{(ControllerType)privateArg.NpadStyleSet}"); if (privateArg.Mode != ControllerSupportMode.ShowControllerSupport) { _normalSession.Push(BuildResponse()); // Dummy response for other modes AppletStateChanged?.Invoke(this, null); return(ResultCode.Success); } byte[] controllerSupportArg = _normalSession.Pop(); ControllerSupportArgHeader argHeader; if (privateArg.ArgSize == Marshal.SizeOf <ControllerSupportArg>()) { ControllerSupportArg arg = IApplet.ReadStruct <ControllerSupportArg>(controllerSupportArg); argHeader = arg.Header; // Read enable text here? } else { Logger.PrintStub(LogClass.ServiceHid, $"Unknown revision of ControllerSupportArg."); argHeader = IApplet.ReadStruct <ControllerSupportArgHeader>(controllerSupportArg); // Read just the header } Logger.PrintStub(LogClass.ServiceHid, $"ControllerApplet Arg {argHeader.PlayerCountMin} {argHeader.PlayerCountMax} {argHeader.EnableTakeOverConnection} {argHeader.EnableSingleMode}"); // Currently, the only purpose of this applet is to help // choose the primary input controller for the game // TODO: Ideally should hook back to HID.Controller. When applet is called, can choose appropriate controller and attach to appropriate id. if (argHeader.PlayerCountMin > 1) { Logger.PrintWarning(LogClass.ServiceHid, "More than one controller was requested."); } ControllerSupportResultInfo result = new ControllerSupportResultInfo { PlayerCount = 1, SelectedId = (uint)GetNpadIdTypeFromIndex(_system.Device.Hid.Npads.PrimaryController) }; Logger.PrintStub(LogClass.ServiceHid, $"ControllerApplet ReturnResult {result.PlayerCount} {result.SelectedId}"); _normalSession.Push(BuildResponse(result)); AppletStateChanged?.Invoke(this, null); return(ResultCode.Success); }
private void _connect_to_dock() { DBus.BusG.Init(); DBus.Bus bus = DBus.Bus.Session; this.icon = bus.GetObject <IApplet> ("org.cairodock.CairoDock", new ObjectPath(this.cBusPath)); this.icon.on_click += new OnClickEvent(on_click); this.icon.on_middle_click += new OnMiddleClickEvent(on_middle_click); this.icon.on_scroll += new OnScrollEvent(on_scroll); this.icon.on_build_menu += new OnBuildMenuEvent(_on_build_menu); this.icon.on_menu_select += new OnMenuSelectEvent(_on_menu_select); this.icon.on_drop_data += new OnDropDataEvent(on_drop_data); this.icon.on_answer += new OnAnswerEvent(on_answer); this.icon.on_answer_dialog += new OnAnswerDialogEvent(on_answer_dialog); this.icon._on_stop += new OnStopModuleEvent(_on_stop); this.icon._on_reload += new OnReloadModuleEvent(_on_reload); this.sub_icons = bus.GetObject <ISubApplet>("org.cairodock.CairoDock", new ObjectPath(this.cBusPath + "/sub_icons")); this.sub_icons.on_click_sub_icon += new OnClickSubIconEvent(on_click_sub_icon); this.sub_icons.on_middle_click_sub_icon += new OnMiddleClickSubIconEvent(on_middle_click_sub_icon); this.sub_icons.on_scroll_sub_icon += new OnScrollSubIconEvent(on_scroll_sub_icon); this.sub_icons.on_build_menu_sub_icon += new OnBuildMenuSubIconEvent(_on_build_menu_sub_icon); this.sub_icons.on_menu_select_sub_icon += new OnMenuSelectSubIconEvent(on_menu_select_sub_icon); this.sub_icons.on_drop_data_sub_icon += new OnDropDataSubIconEvent(on_drop_data_sub_icon); this.sub_icons.on_answer_sub_icon += new OnAnswerSubIconEvent(on_answer_sub_icon); }
public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession) { _normalSession = normalSession; _interactiveSession = interactiveSession; _interactiveSession.DataAvailable += OnInteractiveData; var launchParams = _normalSession.Pop(); var keyboardConfig = _normalSession.Pop(); var transferMemory = _normalSession.Pop(); _keyboardConfig = IApplet.ReadStruct <SoftwareKeyboardConfig>(keyboardConfig); if (_keyboardConfig.UseUtf8) { _encoding = Encoding.UTF8; } _state = SoftwareKeyboardState.Ready; Execute(); return(ResultCode.Success); }
public ILibraryAppletAccessor(AppletId appletId, Horizon system) { _stateChangedEvent = new KEvent(system); _applet = AppletManager.Create(appletId, system); _inData = new AppletFifo <byte[]>(); _outData = new AppletFifo <byte[]>(); _applet.AppletStateChanged += OnAppletStateChanged; Logger.PrintInfo(LogClass.ServiceAm, $"Applet '{appletId}' created."); }
public ILibraryAppletAccessor(AppletId appletId, Horizon system) { _stateChangedEvent = new KEvent(system.KernelContext); _normalOutDataEvent = new KEvent(system.KernelContext); _interactiveOutDataEvent = new KEvent(system.KernelContext); _applet = AppletManager.Create(appletId, system); _normalSession = new AppletSession(); _interactiveSession = new AppletSession(); _applet.AppletStateChanged += OnAppletStateChanged; _normalSession.DataAvailable += OnNormalOutData; _interactiveSession.DataAvailable += OnInteractiveOutData; Logger.PrintInfo(LogClass.ServiceAm, $"Applet '{appletId}' created."); }
// GetIndirectLayerImageMap(s64 width, s64 height, u64 handle, nn::applet::AppletResourceUserId, pid) -> (s64, s64, buffer<bytes, 0x46>) public ResultCode GetIndirectLayerImageMap(ServiceCtx context) { // The size of the layer buffer should be an aligned multiple of width * height // because it was created using GetIndirectLayerImageRequiredMemoryInfo as a guide. long layerWidth = context.RequestData.ReadInt64(); long layerHeight = context.RequestData.ReadInt64(); long layerHandle = context.RequestData.ReadInt64(); ulong layerBuffPosition = context.Request.ReceiveBuff[0].Position; ulong layerBuffSize = context.Request.ReceiveBuff[0].Size; // Get the pitch of the layer that is necessary to render correctly. ulong size = GetA8B8G8R8LayerSize((int)layerWidth, (int)layerHeight, out int pitch, out _); Debug.Assert(layerBuffSize == size); // Get the applet associated with the handle. object appletObject = context.Device.System.AppletState.IndirectLayerHandles.GetData((int)layerHandle); if (appletObject == null) { Logger.Error?.Print(LogClass.ServiceVi, $"Indirect layer handle {layerHandle} does not match any applet"); return(ResultCode.Success); } Debug.Assert(appletObject is IApplet); IApplet applet = appletObject as IApplet; Span <byte> graphics = applet.GetGraphicsA8B8G8R8((int)layerWidth, (int)layerHeight, pitch, (int)layerBuffSize); if (graphics == null) { Logger.Error?.Print(LogClass.ServiceVi, $"Applet returned no graphics for indirect layer handle {layerHandle}"); return(ResultCode.Success); } context.Memory.Write((ulong)layerBuffPosition, graphics); context.ResponseData.Write(layerWidth); context.ResponseData.Write(layerHeight); return(ResultCode.Success); }
public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession) { _normalSession = normalSession; _interactiveSession = interactiveSession; _commonArguments = IApplet.ReadStruct <CommonArguments>(_normalSession.Pop()); Logger.Stub?.PrintStub(LogClass.ServiceAm, $"WebApplet version: 0x{_commonArguments.AppletVersion:x8}"); ReadOnlySpan <byte> webArguments = _normalSession.Pop(); (_shimKind, _arguments) = BrowserArgument.ParseArguments(webArguments); Logger.Stub?.PrintStub(LogClass.ServiceAm, $"Web Arguments: {_arguments.Count}"); foreach (BrowserArgument argument in _arguments) { Logger.Stub?.PrintStub(LogClass.ServiceAm, $"{argument.Type}: {argument.GetValue()}"); } if ((_commonArguments.AppletVersion >= 0x80000 && _shimKind == ShimKind.Web) || (_commonArguments.AppletVersion >= 0x30000 && _shimKind == ShimKind.Share)) { List <BrowserOutput> result = new List <BrowserOutput>(); result.Add(new BrowserOutput(BrowserOutputType.ExitReason, (uint)WebExitReason.ExitButton)); _normalSession.Push(BuildResponseNew(result)); } else { WebCommonReturnValue result = new WebCommonReturnValue() { ExitReason = WebExitReason.ExitButton, }; _normalSession.Push(BuildResponseOld(result)); } AppletStateChanged?.Invoke(this, null); return(ResultCode.Success); }
public static (ShimKind, List <BrowserArgument>) ParseArguments(ReadOnlySpan <byte> data) { List <BrowserArgument> browserArguments = new List <BrowserArgument>(); WebArgHeader header = IApplet.ReadStruct <WebArgHeader>(data.Slice(0, 8)); ReadOnlySpan <byte> rawTLVs = data.Slice(8); for (int i = 0; i < header.Count; i++) { WebArgTLV tlv = IApplet.ReadStruct <WebArgTLV>(rawTLVs); ReadOnlySpan <byte> tlvData = rawTLVs.Slice(Unsafe.SizeOf <WebArgTLV>(), tlv.Size); browserArguments.Add(new BrowserArgument((WebArgTLVType)tlv.Type, tlvData.ToArray())); rawTLVs = rawTLVs.Slice(Unsafe.SizeOf <WebArgTLV>() + tlv.Size); } return(header.ShimKind, browserArguments); }
private void AttachApplets() { string path = Environment.CurrentDirectory; path += "\\applets"; string[] dlls = System.IO.Directory.GetFiles(path, "*.dll"); if (dlls.Length == 0) throw new Exception("Exception in PersonalDictionary.App.xaml.cs.AttachApplets().At list one applet must be in the \\applets\\.. directory"); foreach (var dll_ka in dlls) { var asm = Assembly.LoadFrom(dll_ka); var types = asm.GetTypes().Where((t, obj) => t.IsClass).ToList(); foreach (var item in types) { IApplet obj = null; try { obj = asm.CreateInstance(item.FullName) as IApplet; } catch { } if (obj != null) { applets.Add(obj.ToType().FullName, obj); //Регистрация апплета в БД для сохранения результатов (прогресса) string applet_uid = asm.ManifestModule.Name.Substring(0, asm.ManifestModule.Name.LastIndexOf('.')); applet_uid += "." + obj.ToType().FullName; if (DB.GetInstance().ApplestsData.Where(app => app.AppletID == applet_uid).ToArray().Length == 0) { AppletData appletData = new AppletData(); appletData.AppletID = applet_uid; appletData.AppletDisplay = obj.DisplayName(); DB.GetInstance().RegisterApplet(appletData); } } } } }
unsafe public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession) { _normalSession = normalSession; byte[] launchParams = _normalSession.Pop(); byte[] controllerSupportArgPrivate = _normalSession.Pop(); ControllerSupportArgPrivate privateArg = IApplet.ReadStruct <ControllerSupportArgPrivate>(controllerSupportArgPrivate); Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerApplet ArgPriv {privateArg.PrivateSize} {privateArg.ArgSize} {privateArg.Mode} " + $"HoldType:{(NpadJoyHoldType)privateArg.NpadJoyHoldType} StyleSets:{(ControllerType)privateArg.NpadStyleSet}"); if (privateArg.Mode != ControllerSupportMode.ShowControllerSupport) { _normalSession.Push(BuildResponse()); // Dummy response for other modes AppletStateChanged?.Invoke(this, null); return(ResultCode.Success); } byte[] controllerSupportArg = _normalSession.Pop(); ControllerSupportArgHeader argHeader; if (privateArg.ArgSize == Marshal.SizeOf <ControllerSupportArgV7>()) { ControllerSupportArgV7 arg = IApplet.ReadStruct <ControllerSupportArgV7>(controllerSupportArg); argHeader = arg.Header; Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerSupportArg Version 7 EnableExplainText={arg.EnableExplainText != 0}"); // Read enable text here? } else if (privateArg.ArgSize == Marshal.SizeOf <ControllerSupportArgVPre7>()) { ControllerSupportArgVPre7 arg = IApplet.ReadStruct <ControllerSupportArgVPre7>(controllerSupportArg); argHeader = arg.Header; Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerSupportArg Version Pre-7 EnableExplainText={arg.EnableExplainText != 0}"); // Read enable text here? } else { Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerSupportArg Version Unknown"); argHeader = IApplet.ReadStruct <ControllerSupportArgHeader>(controllerSupportArg); // Read just the header } int playerMin = argHeader.PlayerCountMin; int playerMax = argHeader.PlayerCountMax; Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerApplet Arg {playerMin} {playerMax} {argHeader.EnableTakeOverConnection} {argHeader.EnableSingleMode}"); int configuredCount = 0; PlayerIndex primaryIndex = PlayerIndex.Unknown; while (!_system.Device.Hid.Npads.Validate(playerMin, playerMax, (ControllerType)privateArg.NpadStyleSet, out configuredCount, out primaryIndex)) { ControllerAppletUiArgs uiArgs = new ControllerAppletUiArgs { PlayerCountMin = playerMin, PlayerCountMax = playerMax, SupportedStyles = (ControllerType)privateArg.NpadStyleSet, SupportedPlayers = _system.Device.Hid.Npads.GetSupportedPlayers(), IsDocked = _system.State.DockedMode }; if (!_system.Device.UiHandler.DisplayMessageDialog(uiArgs)) { break; } } ControllerSupportResultInfo result = new ControllerSupportResultInfo { PlayerCount = (sbyte)configuredCount, SelectedId = (uint)GetNpadIdTypeFromIndex(primaryIndex) }; Logger.Stub?.PrintStub(LogClass.ServiceHid, $"ControllerApplet ReturnResult {result.PlayerCount} {result.SelectedId}"); _normalSession.Push(BuildResponse(result)); AppletStateChanged?.Invoke(this, null); _system.ReturnFocus(); return(ResultCode.Success); }
public AppletProxy(IApplet proxy) { _proxy = proxy; }
private void _connect_to_dock () { DBus.BusG.Init(); DBus.Bus bus = DBus.Bus.Session; this.icon = bus.GetObject<IApplet> ("org.cairodock.CairoDock", new ObjectPath (this.cBusPath)); this.icon.on_click += new OnClickEvent (on_click); this.icon.on_middle_click += new OnMiddleClickEvent (on_middle_click); this.icon.on_scroll += new OnScrollEvent (on_scroll); this.icon.on_build_menu += new OnBuildMenuEvent (_on_build_menu); this.icon.on_menu_select += new OnMenuSelectEvent (_on_menu_select); this.icon.on_drop_data += new OnDropDataEvent (on_drop_data); this.icon.on_answer += new OnAnswerEvent (on_answer); this.icon.on_answer_dialog += new OnAnswerDialogEvent (on_answer_dialog); this.icon._on_stop += new OnStopModuleEvent (_on_stop); this.icon._on_reload += new OnReloadModuleEvent (_on_reload); this.sub_icons = bus.GetObject<ISubApplet>("org.cairodock.CairoDock", new ObjectPath(this.cBusPath + "/sub_icons")); this.sub_icons.on_click_sub_icon += new OnClickSubIconEvent (on_click_sub_icon); this.sub_icons.on_middle_click_sub_icon += new OnMiddleClickSubIconEvent (on_middle_click_sub_icon); this.sub_icons.on_scroll_sub_icon += new OnScrollSubIconEvent (on_scroll_sub_icon); this.sub_icons.on_build_menu_sub_icon += new OnBuildMenuSubIconEvent (_on_build_menu_sub_icon); this.sub_icons.on_menu_select_sub_icon += new OnMenuSelectSubIconEvent (on_menu_select_sub_icon); this.sub_icons.on_drop_data_sub_icon += new OnDropDataSubIconEvent (on_drop_data_sub_icon); this.sub_icons.on_answer_sub_icon += new OnAnswerSubIconEvent (on_answer_sub_icon); }