diff options
Diffstat (limited to 'bindings/csharp/NativeMethods.cs')
-rw-r--r-- | bindings/csharp/NativeMethods.cs | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/bindings/csharp/NativeMethods.cs b/bindings/csharp/NativeMethods.cs new file mode 100644 index 0000000..6a3c911 --- /dev/null +++ b/bindings/csharp/NativeMethods.cs @@ -0,0 +1,260 @@ +// Copyright 2014 CrossWire Bible Society (http://www.crosswire.org) +// CrossWire Bible Society +// P. O. Box 2528 +// Tempe, AZ 85280-2528 +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the +// Free Software Foundation version 2. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +using System; +using System.Runtime.InteropServices; +using System.Collections.Generic; + +namespace Sword +{ + public enum SearchType + { + REGEX = 1, + PHRASE = -1, + MULTIWORD = -2, + ENTRYATTR = -3, + LUCENE = -4 + }; + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + public struct ModInfo + { + public string Name; + public string Description; + public string Category; + public string Language; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct SearchHit + { + IntPtr _modName; + IntPtr _key; + long Score; + + public bool IsNull() + { + return _key == IntPtr.Zero; + } + public string Key + { + get + { + if(_key == IntPtr.Zero) + { + return null; + } + return Marshal.PtrToStringAnsi(_key); + } + } + + public string ModName + { + get + { + if(_modName == IntPtr.Zero) + { + return null; + } + return Marshal.PtrToStringAnsi(_modName); + } + } + }; + + public static class NativeMethods + { + + + public const string DLLNAME = "libsword.so"; + + [DllImport(DLLNAME)] + public static extern IntPtr org_crosswire_sword_SWMgr_new(); + + [DllImport(DLLNAME)] + public static extern IntPtr org_crosswire_sword_SWMgr_newWithPath(string path); + + [DllImport(DLLNAME)] + public static extern IntPtr org_crosswire_sword_SWMgr_getModuleByName(IntPtr hSWMgr, string moduleName); + + [DllImport(DLLNAME)] + public static extern void org_crosswire_sword_SWModule_setKeyText(IntPtr hSWModule, string key); + + [DllImport(DLLNAME)] + public static extern IntPtr org_crosswire_sword_SWModule_renderText(IntPtr hSWModule); + + [DllImport(DLLNAME)] + public static extern IntPtr org_crosswire_sword_SWModule_getRawEntry(IntPtr hSWModule); + + [DllImport(DLLNAME)] + public static extern IntPtr org_crosswire_sword_SWModule_getKeyText(IntPtr hSWModule); + + [DllImport(DLLNAME)] + public static extern void org_crosswire_sword_SWMgr_delete(IntPtr hSWMgr); + + [DllImport(DLLNAME)] + public static extern IntPtr org_crosswire_sword_SWMgr_getModInfoList(IntPtr hSWMgr); + + [DllImport(DLLNAME)] + public static extern IntPtr org_crosswire_sword_SWModule_stripText(IntPtr hSWModule); + + [DllImport(DLLNAME)] + public static extern void org_crosswire_sword_SWModule_setRawEntry(IntPtr hSWModule, string entryBuffer); + + [DllImport(DLLNAME)] + public static extern void org_crosswire_sword_SWModule_terminateSearch(IntPtr hSWModule); + + [DllImport(DLLNAME)] + public static extern char org_crosswire_sword_SWModule_popError(IntPtr hSWModule); + + [DllImport(DLLNAME)] + public static extern long org_crosswire_sword_SWModule_getEntrySize(IntPtr hSWModule); + + [DllImport(DLLNAME)] + public static extern IntPtr org_crosswire_sword_SWModule_getEntryAttribute(IntPtr hSWModule, string level1, string level2, string level3, char filteredBool); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWModule_parseKeyList(IntPtr hSWModule, string keyText); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWModule_search(IntPtr hSWModule, string searchString, int searchType, long flags, string scope, IntPtr progressReporter); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern char org_crosswire_sword_SWModule_hasKeyChildren(IntPtr hSWModule); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWModule_getKeyChildren(IntPtr hSWModule); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWModule_getName(IntPtr hSWModule); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWModule_getDescription(IntPtr hSWModule); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWModule_getCategory(IntPtr hSWModule); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWModule_getKeyParent(IntPtr hSWModule); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern void org_crosswire_sword_SWModule_previous(IntPtr hSWModule); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern void org_crosswire_sword_SWModule_next(IntPtr hSWModule); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern void org_crosswire_sword_SWModule_begin(IntPtr hSWModule); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWModule_getRenderHeader(IntPtr hSWModule); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWModule_getConfigEntry(IntPtr hSWModule, string key); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern void org_crosswire_sword_SWModule_deleteSearchFramework(IntPtr hSWModule); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern bool org_crosswire_sword_SWModule_hasSearchFramework(IntPtr hSWModule); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWMgr_version(IntPtr hSWMgr); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWMgr_getPrefixPath(IntPtr hSWMgr); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWMgr_getConfigPath(IntPtr hSWMgr); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern void org_crosswire_sword_SWMgr_setGlobalOption(IntPtr hSWMgr, string option, string val); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWMgr_getGlobalOptionValues(IntPtr hSWMgr, string option); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern void org_crosswire_sword_SWMgr_setCipherKey(IntPtr hSWMgr, string modName, byte[] key); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern void org_crosswire_sword_SWMgr_setJavascript(IntPtr hSWMgr, bool valueBool); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWMgr_getAvailableLocales(IntPtr hSWMgr); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern void org_crosswire_sword_SWMgr_setDefaultLocale(IntPtr hSWMgr, string name); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_SWMgr_translate(IntPtr hSWMgr, string text, string localeName); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern void org_crosswire_sword_InstallMgr_reInit(IntPtr hInstallMgr); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_InstallMgr_new(string baseDir, IntPtr statusReporter); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern void org_crosswire_sword_InstallMgr_setUserDisclaimerConfirmed(IntPtr hInstallMgr); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern int org_crosswire_sword_InstallMgr_syncConfig(IntPtr hInstallMgr); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_InstallMgr_getRemoteSources(IntPtr hInstallMgr); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr org_crosswire_sword_InstallMgr_getRemoteModInfoList(IntPtr hInstallMgr, IntPtr hSWMgr_deltaCompareTo, string sourceName); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern int org_crosswire_sword_InstallMgr_refreshRemoteSource(IntPtr hInstallMgr, string sourceName); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern int org_crosswire_sword_InstallMgr_remoteInstallModule(IntPtr hInstallMgr_from, IntPtr hSWMgr_to, string sourceName, string modName); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public static extern void org_crosswire_sword_InstallMgr_delete(IntPtr hInstallMgr); + + public static IEnumerable<string> MarshalStringArray(IntPtr arrayPtr) + { + if(arrayPtr == IntPtr.Zero) + { + yield break; + } + + while(arrayPtr != IntPtr.Zero) + { + IntPtr ptr = Marshal.ReadIntPtr(arrayPtr); + if(ptr == IntPtr.Zero) + { + yield break; + } + string key = Marshal.PtrToStringAnsi(ptr); + yield return key; + arrayPtr = new IntPtr(arrayPtr.ToInt64() + IntPtr.Size); + } + } + + public static IEnumerable<ModInfo> MarshallModInfoArray(IntPtr pointer) + { + ModInfo modInfo = (ModInfo)Marshal.PtrToStructure(pointer, typeof(ModInfo)); + + while (modInfo.Name != null) + { + yield return modInfo; + pointer = new IntPtr(pointer.ToInt64() + Marshal.SizeOf(typeof(ModInfo))); + modInfo = (ModInfo)Marshal.PtrToStructure(pointer, typeof(ModInfo)); + } + } + } +} + |