Exemple #1
0
        IEnumerable <Config> GetAotConfigs()
        {
            if (!Directory.Exists(AotOutputDirectory))
            {
                Directory.CreateDirectory(AotOutputDirectory);
            }

            var sdkBinDirectory = MonoAndroidHelper.GetOSBinPath();

            foreach (var abi in SupportedAbis)
            {
                string            aotCompiler = "";
                string            outdir      = "";
                string            mtriple     = "";
                AndroidTargetArch arch;

                switch (abi)
                {
                case "armeabi-v7a":
                    aotCompiler = Path.Combine(sdkBinDirectory, "cross-arm");
                    outdir      = Path.Combine(AotOutputDirectory, "armeabi-v7a");
                    mtriple     = "armv7-linux-gnueabi";
                    arch        = AndroidTargetArch.Arm;
                    break;

                case "arm64":
                case "arm64-v8a":
                case "aarch64":
                    aotCompiler = Path.Combine(sdkBinDirectory, "cross-arm64");
                    outdir      = Path.Combine(AotOutputDirectory, "arm64-v8a");
                    mtriple     = "aarch64-linux-android";
                    arch        = AndroidTargetArch.Arm64;
                    break;

                case "x86":
                    aotCompiler = Path.Combine(sdkBinDirectory, "cross-x86");
                    outdir      = Path.Combine(AotOutputDirectory, "x86");
                    mtriple     = "i686-linux-android";
                    arch        = AndroidTargetArch.X86;
                    break;

                case "x86_64":
                    aotCompiler = Path.Combine(sdkBinDirectory, "cross-x86_64");
                    outdir      = Path.Combine(AotOutputDirectory, "x86_64");
                    mtriple     = "x86_64-linux-android";
                    arch        = AndroidTargetArch.X86_64;
                    break;

                // case "mips":
                default:
                    throw new Exception("Unsupported Android target architecture ABI: " + abi);
                }

                if (EnableLLVM && !NdkUtil.ValidateNdkPlatform(LogMessage, LogCodedError, AndroidNdkDirectory, arch, enableLLVM:EnableLLVM))
                {
                    yield return(Config.Invalid);

                    yield break;
                }

                outdir = Path.GetFullPath(outdir);
                if (!Directory.Exists(outdir))
                {
                    Directory.CreateDirectory(outdir);
                }

                // dont use a full path if the outdir is withing the WorkingDirectory.
                if (outdir.StartsWith(WorkingDirectory, StringComparison.InvariantCultureIgnoreCase))
                {
                    outdir = outdir.Replace(WorkingDirectory + Path.DirectorySeparatorChar, string.Empty);
                }

                int    level      = 0;
                string toolPrefix = EnableLLVM
                                        ? NdkUtil.GetNdkToolPrefix(AndroidNdkDirectory, arch, level = GetNdkApiLevel(AndroidNdkDirectory, AndroidApiLevel, arch))
                                        : Path.Combine(AndroidBinUtilsDirectory, $"{NdkUtil.GetArchDirName (arch)}-");
                var toolchainPath = toolPrefix.Substring(0, toolPrefix.LastIndexOf(Path.DirectorySeparatorChar));
                var ldFlags       = string.Empty;
                if (EnableLLVM)
                {
                    if (string.IsNullOrEmpty(AndroidNdkDirectory))
                    {
                        yield return(Config.Invalid);

                        yield break;
                    }

                    string androidLibPath = string.Empty;
                    try {
                        androidLibPath = NdkUtil.GetNdkPlatformLibPath(AndroidNdkDirectory, arch, level);
                    } catch (InvalidOperationException ex) {
                        Diagnostic.Error(5101, ex.Message);
                    }

                    string toolchainLibDir;
                    if (NdkUtil.UsingClangNDK)
                    {
                        toolchainLibDir = GetNdkToolchainLibraryDir(toolchainPath, arch);
                    }
                    else
                    {
                        toolchainLibDir = GetNdkToolchainLibraryDir(toolchainPath);
                    }

                    var libs = new List <string>();
                    if (NdkUtil.UsingClangNDK)
                    {
                        libs.Add($"-L{toolchainLibDir}");
                        libs.Add($"-L{androidLibPath}");

                        if (arch == AndroidTargetArch.Arm)
                        {
                            // Needed for -lunwind to work
                            string compilerLibDir = Path.Combine(toolchainPath, "..", "sysroot", "usr", "lib", NdkUtil.GetArchDirName(arch));
                            libs.Add($"-L{compilerLibDir}");
                        }
                    }

                    libs.Add($"\\\"{Path.Combine (toolchainLibDir, "libgcc.a")}\\\"");
                    libs.Add($"\\\"{Path.Combine (androidLibPath, "libc.so")}\\\"");
                    libs.Add($"\\\"{Path.Combine (androidLibPath, "libm.so")}\\\"");

                    ldFlags = string.Join(";", libs);
                }

                foreach (var assembly in ResolvedAssemblies)
                {
                    string outputFile = Path.Combine(outdir, string.Format("libaot-{0}.so",
                                                                           Path.GetFileName(assembly.ItemSpec)));

                    string seqpointsFile = Path.Combine(outdir, string.Format("{0}.msym",
                                                                              Path.GetFileName(assembly.ItemSpec)));

                    string tempDir = Path.Combine(outdir, Path.GetFileName(assembly.ItemSpec));
                    if (!Directory.Exists(tempDir))
                    {
                        Directory.CreateDirectory(tempDir);
                    }

                    List <string> aotOptions = new List <string> ();

                    if (Profiles != null && Profiles.Length > 0)
                    {
                        aotOptions.Add("profile-only");
                        foreach (var p in Profiles)
                        {
                            var fp = Path.GetFullPath(p.ItemSpec);
                            aotOptions.Add($"profile={fp}");
                        }
                    }
                    if (!string.IsNullOrEmpty(AotAdditionalArguments))
                    {
                        aotOptions.Add(AotAdditionalArguments);
                    }
                    if (sequencePointsMode == SequencePointsMode.Offline)
                    {
                        aotOptions.Add($"msym-dir={outdir}");
                    }
                    if (AotMode != AotMode.Normal)
                    {
                        aotOptions.Add(AotMode.ToString().ToLowerInvariant());
                    }

                    aotOptions.Add($"outfile={outputFile}");
                    aotOptions.Add("asmwriter");
                    aotOptions.Add($"mtriple={mtriple}");
                    aotOptions.Add($"tool-prefix={toolPrefix}");
                    aotOptions.Add($"llvm-path={sdkBinDirectory}");
                    aotOptions.Add($"temp-path={tempDir}");
                    aotOptions.Add($"ld-flags={ldFlags}");

                    // we need to quote the entire --aot arguments here to make sure it is parsed
                    // on windows as one argument. Otherwise it will be split up into multiple
                    // values, which wont work.
                    string aotOptionsStr = (EnableLLVM ? "--llvm " : "") + $"\"--aot={string.Join (",", aotOptions)}\"";

                    if (!string.IsNullOrEmpty(ExtraAotOptions))
                    {
                        aotOptionsStr += (aotOptions.Count > 0 ? " " : "") + ExtraAotOptions;
                    }

                    // Due to a Monodroid MSBuild bug we can end up with paths to assemblies that are not in the intermediate
                    // assembly directory (typically obj/assemblies). This can lead to problems with the Mono loader not being
                    // able to find their dependency laters, since framework assemblies are stored in different directories.
                    // This can happen when linking is disabled (AndroidLinkMode=None). Workaround this problem by resolving
                    // the paths to the right assemblies manually.
                    var resolvedPath             = Path.GetFullPath(assembly.ItemSpec);
                    var intermediateAssemblyPath = Path.Combine(IntermediateAssemblyDir, Path.GetFileName(assembly.ItemSpec));

                    if (LinkMode.ToLowerInvariant() == "none")
                    {
                        if (!resolvedPath.Contains(IntermediateAssemblyDir) && File.Exists(intermediateAssemblyPath))
                        {
                            resolvedPath = intermediateAssemblyPath;
                        }
                    }

                    var assembliesPath = Path.GetFullPath(Path.GetDirectoryName(resolvedPath));
                    var assemblyPath   = Path.GetFullPath(resolvedPath);

                    yield return(new Config(assembliesPath, aotCompiler, aotOptionsStr, assemblyPath, outputFile, Path.Combine(tempDir, "response.txt")));
                }
            }
        }
Exemple #2
0
 public BindDefinition(object targetInstance, Member targetMember, string sourceProperty, LinkMode linkMode)
 {
     this.linkMode  = linkMode;
     TargetInstance = targetInstance;
     TargetMember   = targetMember;
     SourceProperty = sourceProperty;
 }
        protected override string GenerateCommandLineCommands()
        {
            var           args          = GenerateCommandLineArguments();
            List <string> unescapedArgs = new List <string> ();

            TargetArchitecture architectures;

            if (string.IsNullOrEmpty(Architectures) || !Enum.TryParse(Architectures, out architectures))
            {
                architectures = TargetArchitecture.Default;
            }

            if (architectures == TargetArchitecture.ARMv6)
            {
                Log.LogError(MSBStrings.E0053);
                return(null);
            }

            args.AddQuotedLine((SdkIsSimulator ? "--sim=" : "--dev=") + Path.GetFullPath(AppBundleDir));

            args.AddQuotedLine($"--executable={ExecutableName}");

            if (IsAppExtension)
            {
                args.AddLine("--extension");
            }

            if (Debug)
            {
                if (FastDev && !SdkIsSimulator)
                {
                    args.AddLine("--fastdev");
                }
            }

            if (LinkerDumpDependencies)
            {
                args.AddLine("--linkerdumpdependencies");
            }

            if (!string.IsNullOrEmpty(Interpreter))
            {
                args.AddLine($"--interpreter={Interpreter}");
            }

            switch (LinkMode.ToLowerInvariant())
            {
            case "sdkonly": args.AddLine("--linksdkonly"); break;

            case "none":    args.AddLine("--nolink"); break;
            }

            args.AddQuotedLine($"--sdk={SdkVersion}");

            if (UseFloat32 /* We want to compile 32-bit floating point code to use 32-bit floating point operations */)
            {
                args.AddLine("--aot-options=-O=float32");
            }
            else
            {
                args.AddLine("--aot-options=-O=-float32");
            }

            if (LinkDescriptions != null)
            {
                foreach (var desc in LinkDescriptions)
                {
                    args.AddQuotedLine($"--xml={desc.ItemSpec}");
                }
            }

            if (EnableBitcode)
            {
                switch (Platform)
                {
                case ApplePlatform.WatchOS:
                    args.AddLine("--bitcode=full");
                    break;

                case ApplePlatform.TVOS:
                    args.AddLine("--bitcode=asmonly");
                    break;

                default:
                    throw new InvalidOperationException(string.Format("Bitcode is currently not supported on {0}.", Platform));
                }
            }

            string thumb = UseThumb && UseLlvm ? "+thumb2" : "";
            string llvm  = UseLlvm ? "+llvm" : "";
            string abi   = "";

            if (SdkIsSimulator)
            {
                if (architectures.HasFlag(TargetArchitecture.i386))
                {
                    abi += (abi.Length > 0 ? "," : "") + "i386";
                }

                if (architectures.HasFlag(TargetArchitecture.x86_64))
                {
                    abi += (abi.Length > 0 ? "," : "") + "x86_64";
                }

                if (string.IsNullOrEmpty(abi))
                {
                    architectures = TargetArchitecture.i386;
                    abi           = "i386";
                }
            }
            else
            {
                if (architectures == TargetArchitecture.Default)
                {
                    architectures = TargetArchitecture.ARMv7;
                }

                if (architectures.HasFlag(TargetArchitecture.ARMv7))
                {
                    abi += (abi.Length > 0 ? "," : "") + "armv7" + llvm + thumb;
                }

                if (architectures.HasFlag(TargetArchitecture.ARMv7s))
                {
                    abi += (abi.Length > 0 ? "," : "") + "armv7s" + llvm + thumb;
                }

                if (architectures.HasFlag(TargetArchitecture.ARM64))
                {
                    // Note: ARM64 does not have thumb.
                    abi += (abi.Length > 0 ? "," : "") + "arm64" + llvm;
                }

                if (architectures.HasFlag(TargetArchitecture.ARMv7k))
                {
                    abi += (abi.Length > 0 ? "," : "") + "armv7k" + llvm;
                }

                if (architectures.HasFlag(TargetArchitecture.ARM64_32))
                {
                    abi += (abi.Length > 0 ? "," : "") + "arm64_32" + llvm;
                }

                if (string.IsNullOrEmpty(abi))
                {
                    abi = "armv7" + llvm + thumb;
                }
            }

            // Output the CompiledArchitectures
            CompiledArchitectures = architectures.ToString();

            args.AddLine($"--abi={abi}");

            // output symbols to preserve when stripping
            args.AddQuotedLine($"--symbollist={Path.GetFullPath (SymbolsList)}");

            // don't have mtouch generate the dsyms...
            args.AddLine("--dsym=no");

            var gcc = new GccOptions();

            if (!string.IsNullOrEmpty(ExtraArgs))
            {
                var    extraArgs = CommandLineArgumentBuilder.Parse(ExtraArgs);
                var    target    = MainAssembly.ItemSpec;
                string projectDir;

                if (ProjectDir.StartsWith("~/", StringComparison.Ordinal))
                {
                    // Note: Since the Visual Studio plugin doesn't know the user's home directory on the Mac build host,
                    // it simply uses paths relative to "~/". Expand these paths to their full path equivalents.
                    var home = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

                    projectDir = Path.Combine(home, ProjectDir.Substring(2));
                }
                else
                {
                    projectDir = ProjectDir;
                }

                var customTags = new Dictionary <string, string> (StringComparer.OrdinalIgnoreCase)
                {
                    { "projectdir", projectDir },
                    // Apparently msbuild doesn't propagate the solution path, so we can't get it.
                    // { "solutiondir",  proj.ParentSolution != null ? proj.ParentSolution.BaseDirectory : proj.BaseDirectory },
                    { "appbundledir", AppBundleDir },
                    { "targetpath", Path.Combine(Path.GetDirectoryName(target), Path.GetFileName(target)) },
                    { "targetdir", Path.GetDirectoryName(target) },
                    { "targetname", Path.GetFileName(target) },
                    { "targetext", Path.GetExtension(target) },
                };

                for (int i = 0; i < extraArgs.Length; i++)
                {
                    var argument   = extraArgs[i];
                    int startIndex = 0;

                    while (argument.Length > startIndex && argument[startIndex] == '-')
                    {
                        startIndex++;
                    }

                    int endIndex = startIndex;
                    while (endIndex < argument.Length && argument[endIndex] != '=')
                    {
                        endIndex++;
                    }

                    int length = endIndex - startIndex;

                    if (length == 9 && string.CompareOrdinal(argument, startIndex, "gcc_flags", 0, 9) == 0)
                    {
                        // user-defined -gcc_flags argument
                        string flags = null;

                        if (endIndex < extraArgs[i].Length)
                        {
                            flags = Unquote(argument, endIndex + 1);
                        }
                        else if (i + 1 < extraArgs.Length)
                        {
                            flags = extraArgs[++i];
                        }

                        if (!string.IsNullOrEmpty(flags))
                        {
                            var gccArgs = CommandLineArgumentBuilder.Parse(flags);

                            for (int j = 0; j < gccArgs.Length; j++)
                            {
                                gcc.Arguments.Add(StringParserService.Parse(gccArgs[j], customTags));
                            }
                        }
                    }
                    else
                    {
                        // other user-defined mtouch arguments
                        unescapedArgs.Add(StringParserService.Parse(argument, customTags));
                    }
                }
            }

            BuildNativeReferenceFlags(gcc);
            gcc.Arguments.AddQuoted(LinkNativeCodeTaskBase.GetEmbedEntitlementsInExecutableLinkerFlags(CompiledEntitlements));

            foreach (var framework in gcc.Frameworks)
            {
                args.AddQuotedLine($"--framework={framework}");
            }

            foreach (var framework in gcc.WeakFrameworks)
            {
                args.AddQuotedLine($"--weak-framework={framework}");
            }

            if (gcc.Cxx)
            {
                args.AddLine("--cxx");
            }

            if (gcc.Arguments.Length > 0)
            {
                unescapedArgs.Add($"--gcc_flags={gcc.Arguments.ToString ()}");
            }

            foreach (var asm in References)
            {
                if (IsFrameworkItem(asm))
                {
                    args.AddQuotedLine($"--reference={ResolveFrameworkFile (asm.ItemSpec)}");
                }
                else
                {
                    args.AddQuotedLine($"--reference={Path.GetFullPath (asm.ItemSpec)}");
                }
            }

            foreach (var ext in AppExtensionReferences)
            {
                args.AddQuotedLine($"--app-extension={Path.GetFullPath (ext.ItemSpec)}");
            }

            if (!string.IsNullOrWhiteSpace(License))
            {
                args.AddLine($"--license={License}");
            }

            return(CreateResponseFile(args, unescapedArgs));
        }
Exemple #4
0
 public Link(ref ptr <OutBuf> Out = default, ref ptr <sym.Symbols> Syms = default, ref ptr <sys.Arch> Arch = default, long Debugvlog = default, ref ptr <bufio.Writer> Bso = default, bool Loaded = default, bool IsELF = default, objabi.HeadType HeadType = default, bool linkShared = default, LinkMode LinkMode = default, BuildMode BuildMode = default, bool canUsePlugins = default, bool compressDWARF = default, ref ptr <sym.Symbol> Tlsg = default, slice <@string> Libdir = default, slice <ptr <sym.Library> > Library = default, map <@string, ptr <sym.Library> > LibraryByPkg = default, slice <Shlib> Shlibs = default, long Tlsoffset = default, slice <ptr <sym.Symbol> > Textp = default, slice <ptr <sym.Symbol> > Filesyms = default, ref ptr <sym.Symbol> Moduledata = default, map <@string, @string> PackageFile = default, map <@string, @string> PackageShlib = default, slice <ptr <sym.Symbol> > tramps = default, map <unresolvedSymKey, bool> unresolvedSymSet = default, map <ptr <sym.Symbol>, ptr <sym.Symbol> > Reachparent = default, slice <ptr <sym.CompilationUnit> > compUnits = default, ref ptr <sym.CompilationUnit> runtimeCU = default, slice <byte> relocbuf = default, ref ptr <loader.Loader> loader = default, slice <cgodata> cgodata = default, map <@string, bool> cgo_export_static = default, map <@string, bool> cgo_export_dynamic = default)
 {
     this.Out                = Out;
     this.Syms               = Syms;
     this.Arch               = Arch;
     this.Debugvlog          = Debugvlog;
     this.Bso                = Bso;
     this.Loaded             = Loaded;
     this.IsELF              = IsELF;
     this.HeadType           = HeadType;
     this.linkShared         = linkShared;
     this.LinkMode           = LinkMode;
     this.BuildMode          = BuildMode;
     this.canUsePlugins      = canUsePlugins;
     this.compressDWARF      = compressDWARF;
     this.Tlsg               = Tlsg;
     this.Libdir             = Libdir;
     this.Library            = Library;
     this.LibraryByPkg       = LibraryByPkg;
     this.Shlibs             = Shlibs;
     this.Tlsoffset          = Tlsoffset;
     this.Textp              = Textp;
     this.Filesyms           = Filesyms;
     this.Moduledata         = Moduledata;
     this.PackageFile        = PackageFile;
     this.PackageShlib       = PackageShlib;
     this.tramps             = tramps;
     this.unresolvedSymSet   = unresolvedSymSet;
     this.Reachparent        = Reachparent;
     this.compUnits          = compUnits;
     this.runtimeCU          = runtimeCU;
     this.relocbuf           = relocbuf;
     this.loader             = loader;
     this.cgodata            = cgodata;
     this.cgo_export_static  = cgo_export_static;
     this.cgo_export_dynamic = cgo_export_dynamic;
 }
Exemple #5
0
 /// <summary>
 /// Sets the module's link mode
 /// </summary>
 /// <seealso cref="LinkMode"/>
 public MarkNavbarItemsAsActive WithLinkMode(LinkMode linkMode)
 {
     LinkMode = linkMode;
     return(this);
 }
Exemple #6
0
        IEnumerable <Config> GetAotConfigs()
        {
            if (!Directory.Exists(AotOutputDirectory))
            {
                Directory.CreateDirectory(AotOutputDirectory);
            }

            var sdkBinDirectory = MonoAndroidHelper.GetOSBinPath();
            var abis            = SupportedAbis.Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var abi in abis)
            {
                string            aotCompiler = "";
                string            outdir      = "";
                string            mtriple     = "";
                AndroidTargetArch arch;

                switch (abi)
                {
                case "armeabi-v7a":
                    aotCompiler = Path.Combine(sdkBinDirectory, "cross-arm");
                    outdir      = Path.Combine(AotOutputDirectory, "armeabi-v7a");
                    mtriple     = "armv7-linux-gnueabi";
                    arch        = AndroidTargetArch.Arm;
                    break;

                case "arm64":
                case "arm64-v8a":
                case "aarch64":
                    aotCompiler = Path.Combine(sdkBinDirectory, "cross-arm64");
                    outdir      = Path.Combine(AotOutputDirectory, "arm64-v8a");
                    mtriple     = "aarch64-linux-android";
                    arch        = AndroidTargetArch.Arm64;
                    break;

                case "x86":
                    aotCompiler = Path.Combine(sdkBinDirectory, "cross-x86");
                    outdir      = Path.Combine(AotOutputDirectory, "x86");
                    mtriple     = "i686-linux-android";
                    arch        = AndroidTargetArch.X86;
                    break;

                case "x86_64":
                    aotCompiler = Path.Combine(sdkBinDirectory, "cross-x86_64");
                    outdir      = Path.Combine(AotOutputDirectory, "x86_64");
                    mtriple     = "x86_64-linux-android";
                    arch        = AndroidTargetArch.X86_64;
                    break;

                // case "mips":
                default:
                    throw new Exception("Unsupported Android target architecture ABI: " + abi);
                }

                if (!NdkUtil.ValidateNdkPlatform(Log, AndroidNdkDirectory, arch, enableLLVM:EnableLLVM))
                {
                    yield return(Config.Invalid);

                    yield break;
                }

                if (!ValidateAotConfiguration(Log, arch, EnableLLVM))
                {
                    yield return(Config.Invalid);

                    yield break;
                }

                outdir = Path.GetFullPath(outdir);
                if (!Directory.Exists(outdir))
                {
                    Directory.CreateDirectory(outdir);
                }

                int    level         = GetNdkApiLevel(AndroidNdkDirectory, AndroidApiLevel, arch);
                string toolPrefix    = NdkUtil.GetNdkToolPrefix(AndroidNdkDirectory, arch, level);
                var    toolchainPath = toolPrefix.Substring(0, toolPrefix.LastIndexOf(Path.DirectorySeparatorChar));
                var    ldFlags       = string.Empty;
                if (EnableLLVM)
                {
                    string androidLibPath = string.Empty;
                    try {
                        androidLibPath = NdkUtil.GetNdkPlatformLibPath(AndroidNdkDirectory, arch, level);
                    } catch (InvalidOperationException ex) {
                        Diagnostic.Error(5101, ex.Message);
                    }

                    string toolchainLibDir;
                    if (NdkUtil.UsingClangNDK)
                    {
                        toolchainLibDir = GetNdkToolchainLibraryDir(toolchainPath, arch);
                    }
                    else
                    {
                        toolchainLibDir = GetNdkToolchainLibraryDir(toolchainPath);
                    }

                    var libs = new List <string>();
                    if (NdkUtil.UsingClangNDK)
                    {
                        libs.Add($"-L{GetShortPath (toolchainLibDir)}");
                        libs.Add($"-L{GetShortPath (androidLibPath)}");

                        if (arch == AndroidTargetArch.Arm)
                        {
                            // Needed for -lunwind to work
                            string compilerLibDir = Path.Combine(toolchainPath, "..", "sysroot", "usr", "lib", NdkUtil.GetArchDirName(arch));
                            libs.Add($"-L{GetShortPath (compilerLibDir)}");
                        }
                    }

                    libs.Add(GetShortPath(Path.Combine(toolchainLibDir, "libgcc.a")));
                    libs.Add(GetShortPath(Path.Combine(androidLibPath, "libc.so")));
                    libs.Add(GetShortPath(Path.Combine(androidLibPath, "libm.so")));

                    ldFlags = string.Join(";", libs);
                }

                foreach (var assembly in ResolvedAssemblies)
                {
                    string outputFile = Path.Combine(outdir, string.Format("libaot-{0}.so",
                                                                           Path.GetFileName(assembly.ItemSpec)));

                    string seqpointsFile = Path.Combine(outdir, string.Format("{0}.msym",
                                                                              Path.GetFileName(assembly.ItemSpec)));

                    string tempDir = Path.Combine(outdir, Path.GetFileName(assembly.ItemSpec));
                    if (!Directory.Exists(tempDir))
                    {
                        Directory.CreateDirectory(tempDir);
                    }

                    List <string> aotOptions = new List <string> ();

                    if (!string.IsNullOrEmpty(AotAdditionalArguments))
                    {
                        aotOptions.Add(AotAdditionalArguments);
                    }
                    if (sequencePointsMode == SequencePointsMode.Offline)
                    {
                        aotOptions.Add("msym-dir=" + GetShortPath(outdir));
                    }
                    if (AotMode != AotMode.Normal)
                    {
                        aotOptions.Add(AotMode.ToString().ToLowerInvariant());
                    }

                    aotOptions.Add("outfile=" + GetShortPath(outputFile));
                    aotOptions.Add("asmwriter");
                    aotOptions.Add("mtriple=" + mtriple);
                    aotOptions.Add("tool-prefix=" + GetShortPath(toolPrefix));
                    aotOptions.Add("ld-flags=" + ldFlags);
                    aotOptions.Add("llvm-path=" + GetShortPath(sdkBinDirectory));
                    aotOptions.Add("temp-path=" + GetShortPath(tempDir));

                    string aotOptionsStr = (EnableLLVM ? "--llvm " : "") + "--aot=" + string.Join(",", aotOptions);

                    if (!string.IsNullOrEmpty(ExtraAotOptions))
                    {
                        aotOptionsStr += (aotOptions.Count > 0 ? "," : "") + ExtraAotOptions;
                    }

                    // Due to a Monodroid MSBuild bug we can end up with paths to assemblies that are not in the intermediate
                    // assembly directory (typically obj/assemblies). This can lead to problems with the Mono loader not being
                    // able to find their dependency laters, since framework assemblies are stored in different directories.
                    // This can happen when linking is disabled (AndroidLinkMode=None). Workaround this problem by resolving
                    // the paths to the right assemblies manually.
                    var resolvedPath             = Path.GetFullPath(assembly.ItemSpec);
                    var intermediateAssemblyPath = Path.Combine(IntermediateAssemblyDir, Path.GetFileName(assembly.ItemSpec));

                    if (LinkMode.ToLowerInvariant() == "none")
                    {
                        if (!resolvedPath.Contains(IntermediateAssemblyDir) && File.Exists(intermediateAssemblyPath))
                        {
                            resolvedPath = intermediateAssemblyPath;
                        }
                    }

                    var assembliesPath = Path.GetFullPath(Path.GetDirectoryName(resolvedPath));
                    var assemblyPath   = QuoteFileName(Path.GetFullPath(resolvedPath));

                    yield return(new Config(assembliesPath, QuoteFileName(aotCompiler), aotOptionsStr, assemblyPath, outputFile));
                }
            }
        }
        /// <summary>
        /// 打开视频
        /// </summary>
        /// <param name="Channel">打开视频的通道</param>
        /// <param name="Stream">视频的流类型</param>
        /// <param name="Mode">连接方式</param>
        /// <returns>true表示成功,false表示失败</returns>
        public bool DvcOpenRealPlay(byte videoChannel, StreamType Stream, LinkMode Mode)
        {
            if (DvcUserID < 0)
            throw new InvalidOperationException();

            if (videoChannel <= 0 || videoChannel > DvcInfo.byChanNum)
            throw new ArgumentOutOfRangeException();

            DvcRealDataCallBackHandle = new HCSDK.HCNetSDK.RealDataCallBack_V30(DvcRealDataCallback);

            DvcCliInfo.hPlayWnd = this.Handle;
            DvcCliInfo.lChannel = videoChannel;
            DvcCliInfo.lLinkMode = ((int)Stream) | ((int)Mode);
            DvcPlayHandle = HCSDK.HCNetSDK.NET_DVR_RealPlay_V30(DvcUserID, ref DvcCliInfo, DvcRealDataCallBackHandle, IntPtr.Zero, true);
            this.isRealPlaying = true;
            if (DvcPlayHandle < 0)
            return false;
            else
            {
            //Default Close Sound
            HCSDK.HCNetSDK.NET_DVR_CloseSoundShare(DvcPlayHandle);
            this.videoChannel = videoChannel;

            OnOpen();

            return true;
            }
        }
        /// <summary>
        /// Turns all URLs and e-mail addresses into clickable links.
        /// </summary>
        /// <param name="htmlAttributes">Adds HTML attributes to the links.</param>
        /// <param name="textReplacer">Lambda expression to change what text is shown inside the link tag.</param>
        /// <param name="linkMode">Option to limit what should be linked.</param>
        public static string AutoLink(this string text, IDictionary <string, string> htmlAttributes = null, Func <string, string> textReplacer = null, LinkMode linkMode = LinkMode.All)
        {
            textReplacer = textReplacer ?? (x => x);
            var replacer = new AutoLinkReplacer(htmlAttributes, textReplacer, linkMode);

            return(replacer.Replace(text));
        }
 public AutoLinkReplacer(IDictionary <string, string> dictionary, Func <string, string> textReplacer, LinkMode linkMode)
 {
     LinkMode       = linkMode;
     HtmlAttributes = dictionary;
     TextReplacer   = textReplacer;
 }
Exemple #10
0
        public static void Eval(Leaf leaf, LinkMsg msg, TCPPacketReader packet, ulong time, LinkMode mode)
        {
            switch (msg)
            {
            case LinkMsg.MSG_LINK_LEAF_AVATAR:
                break;

            case LinkMsg.MSG_LINK_LEAF_CUSTOM_NAME:
                break;

            case LinkMsg.MSG_LINK_LEAF_EMOTE_TEXT:
                break;

            case LinkMsg.MSG_LINK_LEAF_LOGIN:
                LeafLogin(leaf, packet, time, mode);
                break;

            case LinkMsg.MSG_LINK_LEAF_PERSONAL_MESSAGE:
                break;

            case LinkMsg.MSG_LINK_LEAF_PRIVATE_IGNORED:
                break;

            case LinkMsg.MSG_LINK_LEAF_PRIVATE_TEXT:
                break;

            case LinkMsg.MSG_LINK_LEAF_PUBLIC_TEXT:
                break;

            case LinkMsg.MSG_LINK_LEAF_USERLIST_END:
                break;

            case LinkMsg.MSG_LINK_LEAF_USERLIST_ITEM:
                break;
            }
        }
Exemple #11
0
 private static void LeafLogin(Leaf leaf, TCPPacketReader packet, ulong time, LinkMode mode)
 {
 }
Exemple #12
0
        private async Task AddContentItemsAsync(NavigationBuilder listTypeMenu, LinkMode nodeLinkMode)
        {
            foreach (var ci in await getContentItemsAsync())
            {
                var cim = await _contentManager.PopulateAspectAsync <ContentItemMetadata>(ci);


                switch (nodeLinkMode)
                {
                case LinkMode.Admin:
                    if (cim.AdminRouteValues.Any() && ci.DisplayText != null)
                    {
                        listTypeMenu.Add(new LocalizedString(ci.DisplayText, ci.DisplayText), m =>
                        {
                            m.Action(cim.AdminRouteValues["Action"] as string, cim.AdminRouteValues["Controller"] as string, cim.AdminRouteValues);
                            m.Resource(ci);
                            m.Priority(_node.Priority);
                            m.Position(_node.Position);
                            m.LocalNav();
                            AddPrefixToClasses(_node.IconForContentItems).ToList().ForEach(c => m.AddClass(c));

                            m.Permission(ContentTypePermissionsHelper.CreateDynamicPermission(
                                             ContentTypePermissionsHelper.PermissionTemplates[CommonPermissions.EditContent.Name], _contentType));
                        });
                    }
                    break;

                case LinkMode.Display:
                    if (cim.DisplayRouteValues.Any() && ci.DisplayText != null)
                    {
                        listTypeMenu.Add(new LocalizedString(ci.DisplayText, ci.DisplayText), m =>
                        {
                            m.Action(cim.DisplayRouteValues["Action"] as string, cim.DisplayRouteValues["Controller"] as string, cim.DisplayRouteValues);
                            m.Resource(ci);
                            m.Priority(_node.Priority);
                            m.Position(_node.Position);
                            m.LocalNav();
                            AddPrefixToClasses(_node.IconForContentItems).ToList().ForEach(c => m.AddClass(c));

                            m.Permission(ContentTypePermissionsHelper.CreateDynamicPermission(
                                             ContentTypePermissionsHelper.PermissionTemplates[CommonPermissions.EditContent.Name], _contentType));
                        });
                    }
                    break;

                case LinkMode.Edit:
                    if (cim.EditorRouteValues.Any() && ci.DisplayText != null)
                    {
                        listTypeMenu.Add(new LocalizedString(ci.DisplayText, ci.DisplayText), m =>
                        {
                            m.Action(cim.EditorRouteValues["Action"] as string, cim.EditorRouteValues["Controller"] as string, cim.EditorRouteValues);
                            m.Resource(ci);
                            m.Priority(_node.Priority);
                            m.Position(_node.Position);
                            m.LocalNav();
                            AddPrefixToClasses(_node.IconForContentItems).ToList().ForEach(c => m.AddClass(c));

                            m.Permission(ContentTypePermissionsHelper.CreateDynamicPermission(
                                             ContentTypePermissionsHelper.PermissionTemplates[CommonPermissions.EditContent.Name], _contentType));
                        });
                    }
                    break;

                case LinkMode.Create:
                    if (cim.CreateRouteValues.Any() && ci.DisplayText != null)
                    {
                        listTypeMenu.Add(new LocalizedString(ci.DisplayText, ci.DisplayText), m =>
                        {
                            m.Action(cim.CreateRouteValues["Action"] as string, cim.CreateRouteValues["Controller"] as string, cim.CreateRouteValues);
                            m.Resource(ci);
                            m.Priority(_node.Priority);
                            m.Position(_node.Position);
                            m.LocalNav();
                            AddPrefixToClasses(_node.IconForContentItems).ToList().ForEach(c => m.AddClass(c));

                            m.Permission(ContentTypePermissionsHelper.CreateDynamicPermission(
                                             ContentTypePermissionsHelper.PermissionTemplates[CommonPermissions.EditContent.Name], _contentType));
                        });
                    }
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(nodeLinkMode), nodeLinkMode, null);
                }
            }
        }
Exemple #13
0
 public AutoLinkReplacer(IDictionary<string, string> dictionary, Func<string, string> textReplacer, LinkMode linkMode)
 {
     LinkMode = linkMode;
     HtmlAttributes = dictionary;
     TextReplacer = textReplacer;
 }
Exemple #14
0
 /// <summary>
 /// Turns all URLs and e-mail addresses into clickable links.
 /// </summary>
 /// <param name="htmlAttributes">Adds HTML attributes to the links.</param>
 /// <param name="textReplacer">Lambda expression to change what text is shown inside the link tag.</param>
 /// <param name="linkMode">Option to limit what should be linked.</param>
 public static string AutoLink(this string text, IDictionary<string, string> htmlAttributes=null, Func<string, string> textReplacer=null, LinkMode linkMode=LinkMode.All)
 {
     textReplacer = textReplacer ?? (x => x);
     var replacer = new AutoLinkReplacer(htmlAttributes, textReplacer, linkMode);
     return replacer.Replace(text);
 }
Exemple #15
0
        protected override string GenerateCommandLineCommands()
        {
            var           args          = new CommandLineArgumentBuilder();
            List <string> unescapedArgs = new List <string> ();

            TargetArchitecture architectures;
            bool msym;

            if (string.IsNullOrEmpty(Architectures) || !Enum.TryParse(Architectures, out architectures))
            {
                architectures = TargetArchitecture.Default;
            }

            if (architectures == TargetArchitecture.ARMv6)
            {
                Log.LogError("Target architecture ARMv6 is no longer supported in Xamarin.iOS. Please select a supported architecture.");
                return(null);
            }

            if (!string.IsNullOrEmpty(IntermediateOutputPath))
            {
                Directory.CreateDirectory(IntermediateOutputPath);

                args.AddQuotedLine($"--cache={Path.GetFullPath (IntermediateOutputPath)}");
            }

            args.AddQuotedLine((SdkIsSimulator ? "--sim=" : "--dev=") + Path.GetFullPath(AppBundleDir));

            if (AppleSdkSettings.XcodeVersion.Major >= 5 && IPhoneSdks.MonoTouch.Version.CompareTo(new IPhoneSdkVersion(6, 3, 7)) < 0)
            {
                args.AddLine("--compiler=clang");
            }

            args.AddQuotedLine($"--executable={ExecutableName}");

            if (IsAppExtension)
            {
                args.AddLine("--extension");
            }

            if (Debug)
            {
                if (FastDev && !SdkIsSimulator)
                {
                    args.AddLine("--fastdev");
                }

                args.AddLine("--debug");
            }

            if (Profiling)
            {
                args.AddLine("--profiling");
            }

            if (LinkerDumpDependencies)
            {
                args.AddLine("--linkerdumpdependencies");
            }

            if (EnableSGenConc)
            {
                args.AddLine("--sgen-conc");
            }

            if (!string.IsNullOrEmpty(Interpreter))
            {
                args.AddLine($"--interpreter={Interpreter}");
            }

            switch (LinkMode.ToLowerInvariant())
            {
            case "sdkonly": args.AddLine("--linksdkonly"); break;

            case "none":    args.AddLine("--nolink"); break;
            }

            if (!string.IsNullOrEmpty(I18n))
            {
                args.AddQuotedLine($"--i18n={I18n}");
            }

            args.AddQuotedLine($"--sdkroot={SdkRoot}");

            args.AddQuotedLine($"--sdk={SdkVersion}");

            if (!minimumOSVersion.IsUseDefault)
            {
                args.AddQuotedLine($"--targetver={minimumOSVersion.ToString ()}");
            }

            if (UseFloat32 /* We want to compile 32-bit floating point code to use 32-bit floating point operations */)
            {
                args.AddLine("--aot-options=-O=float32");
            }
            else
            {
                args.AddLine("--aot-options=-O=-float32");
            }

            if (!EnableGenericValueTypeSharing)
            {
                args.AddLine("--gsharedvt=false");
            }

            if (LinkDescriptions != null)
            {
                foreach (var desc in LinkDescriptions)
                {
                    args.AddQuotedLine($"--xml={desc.ItemSpec}");
                }
            }

            if (EnableBitcode)
            {
                switch (Framework)
                {
                case ApplePlatform.WatchOS:
                    args.AddLine("--bitcode=full");
                    break;

                case ApplePlatform.TVOS:
                    args.AddLine("--bitcode=asmonly");
                    break;

                default:
                    throw new InvalidOperationException(string.Format("Bitcode is currently not supported on {0}.", Framework));
                }
            }

            if (!string.IsNullOrEmpty(HttpClientHandler))
            {
                args.AddLine($"--http-message-handler={HttpClientHandler}");
            }

            string thumb = UseThumb && UseLlvm ? "+thumb2" : "";
            string llvm  = UseLlvm ? "+llvm" : "";
            string abi   = "";

            if (SdkIsSimulator)
            {
                if (architectures.HasFlag(TargetArchitecture.i386))
                {
                    abi += (abi.Length > 0 ? "," : "") + "i386";
                }

                if (architectures.HasFlag(TargetArchitecture.x86_64))
                {
                    abi += (abi.Length > 0 ? "," : "") + "x86_64";
                }

                if (string.IsNullOrEmpty(abi))
                {
                    architectures = TargetArchitecture.i386;
                    abi           = "i386";
                }
            }
            else
            {
                if (architectures == TargetArchitecture.Default)
                {
                    architectures = TargetArchitecture.ARMv7;
                }

                if (architectures.HasFlag(TargetArchitecture.ARMv7))
                {
                    abi += (abi.Length > 0 ? "," : "") + "armv7" + llvm + thumb;
                }

                if (architectures.HasFlag(TargetArchitecture.ARMv7s))
                {
                    abi += (abi.Length > 0 ? "," : "") + "armv7s" + llvm + thumb;
                }

                if (architectures.HasFlag(TargetArchitecture.ARM64))
                {
                    // Note: ARM64 does not have thumb.
                    abi += (abi.Length > 0 ? "," : "") + "arm64" + llvm;
                }

                if (architectures.HasFlag(TargetArchitecture.ARMv7k))
                {
                    abi += (abi.Length > 0 ? "," : "") + "armv7k" + llvm;
                }

                if (architectures.HasFlag(TargetArchitecture.ARM64_32))
                {
                    abi += (abi.Length > 0 ? "," : "") + "arm64_32" + llvm;
                }

                if (string.IsNullOrEmpty(abi))
                {
                    abi = "armv7" + llvm + thumb;
                }
            }

            // Output the CompiledArchitectures
            CompiledArchitectures = architectures.ToString();

            args.AddLine($"--abi={abi}");

            // output symbols to preserve when stripping
            args.AddQuotedLine($"--symbollist={Path.GetFullPath (SymbolsList)}");

            // don't have mtouch generate the dsyms...
            args.AddLine("--dsym=no");

            if (!string.IsNullOrEmpty(ArchiveSymbols) && bool.TryParse(ArchiveSymbols.Trim(), out msym))
            {
                args.AddLine($"--msym={(msym ? "yes" : "no")}");
            }

            var gcc = new GccOptions();

            if (!string.IsNullOrEmpty(ExtraArgs))
            {
                var    extraArgs = CommandLineArgumentBuilder.Parse(ExtraArgs);
                var    target    = MainAssembly.ItemSpec;
                string projectDir;

                if (ProjectDir.StartsWith("~/", StringComparison.Ordinal))
                {
                    // Note: Since the Visual Studio plugin doesn't know the user's home directory on the Mac build host,
                    // it simply uses paths relative to "~/". Expand these paths to their full path equivalents.
                    var home = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

                    projectDir = Path.Combine(home, ProjectDir.Substring(2));
                }
                else
                {
                    projectDir = ProjectDir;
                }

                var customTags = new Dictionary <string, string> (StringComparer.OrdinalIgnoreCase)
                {
                    { "projectdir", projectDir },
                    // Apparently msbuild doesn't propagate the solution path, so we can't get it.
                    // { "solutiondir",  proj.ParentSolution != null ? proj.ParentSolution.BaseDirectory : proj.BaseDirectory },
                    { "appbundledir", AppBundleDir },
                    { "targetpath", Path.Combine(Path.GetDirectoryName(target), Path.GetFileName(target)) },
                    { "targetdir", Path.GetDirectoryName(target) },
                    { "targetname", Path.GetFileName(target) },
                    { "targetext", Path.GetExtension(target) },
                };

                for (int i = 0; i < extraArgs.Length; i++)
                {
                    var argument   = extraArgs[i];
                    int startIndex = 0;

                    while (argument.Length > startIndex && argument[startIndex] == '-')
                    {
                        startIndex++;
                    }

                    int endIndex = startIndex;
                    while (endIndex < argument.Length && argument[endIndex] != '=')
                    {
                        endIndex++;
                    }

                    int length = endIndex - startIndex;

                    if (length == 9 && string.CompareOrdinal(argument, startIndex, "gcc_flags", 0, 9) == 0)
                    {
                        // user-defined -gcc_flags argument
                        string flags = null;

                        if (endIndex < extraArgs[i].Length)
                        {
                            flags = Unquote(argument, endIndex + 1);
                        }
                        else if (i + 1 < extraArgs.Length)
                        {
                            flags = extraArgs[++i];
                        }

                        if (!string.IsNullOrEmpty(flags))
                        {
                            var gccArgs = CommandLineArgumentBuilder.Parse(flags);

                            for (int j = 0; j < gccArgs.Length; j++)
                            {
                                gcc.Arguments.Add(StringParserService.Parse(gccArgs[j], customTags));
                            }
                        }
                    }
                    else
                    {
                        // other user-defined mtouch arguments
                        unescapedArgs.Add(StringParserService.Parse(argument, customTags));
                    }
                }
            }

            BuildNativeReferenceFlags(gcc);
            BuildEntitlementFlags(gcc);

            foreach (var framework in gcc.Frameworks)
            {
                args.AddQuotedLine($"--framework={framework}");
            }

            foreach (var framework in gcc.WeakFrameworks)
            {
                args.AddQuotedLine($"--weak-framework={framework}");
            }

            if (gcc.Cxx)
            {
                args.AddLine("--cxx");
            }

            if (gcc.Arguments.Length > 0)
            {
                unescapedArgs.Add($"--gcc_flags={gcc.Arguments.ToString ()}");
            }

            foreach (var asm in References)
            {
                if (IsFrameworkItem(asm))
                {
                    args.AddQuotedLine($"-r={ResolveFrameworkFile (asm.ItemSpec)}");
                }
                else
                {
                    args.AddQuotedLine($"-r={Path.GetFullPath (asm.ItemSpec)}");
                }
            }

            foreach (var ext in AppExtensionReferences)
            {
                args.AddQuotedLine($"--app-extension={Path.GetFullPath (ext.ItemSpec)}");
            }

            args.AddLine($"--target-framework={TargetFrameworkIdentifier},{TargetFrameworkVersion}");

            args.AddQuotedLine($"--root-assembly={Path.GetFullPath (MainAssembly.ItemSpec)}");

            var v = VerbosityUtils.Merge(ExtraArgs, (LoggerVerbosity)Verbosity);

            if (v.Length > 0)
            {
                foreach (var arg in v)
                {
                    args.AddLine(arg);
                }
            }

            if (!string.IsNullOrWhiteSpace(License))
            {
                args.AddLine($"--license={License}");
            }

            // Generate a response file
            var responseFile = Path.GetFullPath(ResponseFilePath);

            if (File.Exists(responseFile))
            {
                File.Delete(responseFile);
            }

            try {
                using (var fs = File.Create(responseFile)) {
                    using (var writer = new StreamWriter(fs))
                        writer.Write(args);
                }
            } catch (Exception ex) {
                Log.LogWarning("Failed to create response file '{0}': {1}", responseFile, ex);
            }

            // Some arguments can not safely go in the response file and are
            // added separately. They must go _after_ the response file
            // as they may override options passed in the response file
            var actualArgs = new CommandLineArgumentBuilder();

            actualArgs.AddQuoted($"@{responseFile}");

            foreach (var arg in unescapedArgs)
            {
                actualArgs.AddQuoted(arg);
            }

            return(actualArgs.ToString());
        }
Exemple #16
0
        public static void Eval(Leaf leaf, LinkMsg msg, TCPPacketReader packet, ulong time, LinkMode mode)
        {
            switch (msg)
            {
            case LinkMsg.MSG_LINK_LEAF_AVATAR:
                LeafAvatar(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_CUSTOM_NAME:
                LeafCustomName(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_EMOTE_TEXT:
                LeafEmoteText(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_LOGIN:
                LeafLogin(leaf, packet, time, mode);
                break;

            case LinkMsg.MSG_LINK_LEAF_PERSONAL_MESSAGE:
                LeafPersonalMessage(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_PRIVATE_IGNORED:
                LeafPrivateIgnored(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_PRIVATE_TEXT:
                LeafPrivateText(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_PUBLIC_TEXT:
                LeafPublicText(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_USERLIST_END:
                LeafUserlistEnd(leaf);
                break;

            case LinkMsg.MSG_LINK_LEAF_USERLIST_ITEM:
                LeafUserlistItem(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_JOIN:
                LeafJoin(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_PART:
                LeafPart(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_PING:
                LeafPing(leaf, time);
                break;

            case LinkMsg.MSG_LINK_LEAF_USER_UPDATED:
                LeafUserUpdated(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_NICK_CHANGED:
                LeafNickChanged(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_VROOM_CHANGED:
                LeafVroomChanged(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_IUSER:
                LeafIUser(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_IUSER_BIN:
                LeafIUserBin(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_ADMIN:
                LeafAdmin(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_NO_ADMIN:
                LeafNoAdmin(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_BROWSE:
                LeafBrowse(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_BROWSE_DATA:
                LeafBrowseData(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_CUSTOM_DATA_TO:
                LeafCustomDataTo(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_CUSTOM_DATA_ALL:
                LeafCustomDataAll(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_PRINT_ALL:
                LeafPrintAll(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_PRINT_VROOM:
                LeafPrintVroom(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_PRINT_LEVEL:
                LeafPrintLevel(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_PUBLIC_TO_USER:
                LeafPublicToUser(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_EMOTE_TO_USER:
                LeafEmoteToUser(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_PUBLIC_TO_LEAF:
                LeafPublicToLeaf(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_EMOTE_TO_LEAF:
                LeafEmoteToLeaf(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_NUDGE:
                LeafNudge(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_SCRIBBLE_USER:
                LeafScribbleUser(leaf, packet);
                break;

            case LinkMsg.MSG_LINK_LEAF_SCRIBBLE_LEAF:
                LeafScribbleLeaf(leaf, packet);
                break;
            }
        }
Exemple #17
0
        bool DoExecute()
        {
            Log.LogDebugMessage("Aot:", AndroidAotMode);
            Log.LogDebugMessage("  AndroidApiLevel: {0}", AndroidApiLevel);
            Log.LogDebugMessage("  AndroidAotMode: {0}", AndroidAotMode);
            Log.LogDebugMessage("  AndroidSequencePointsMode: {0}", AndroidSequencePointsMode);
            Log.LogDebugMessage("  AndroidNdkDirectory: {0}", AndroidNdkDirectory);
            Log.LogDebugMessage("  AotOutputDirectory: {0}", AotOutputDirectory);
            Log.LogDebugMessage("  EnableLLVM: {0}", EnableLLVM);
            Log.LogDebugMessage("  IntermediateAssemblyDir: {0}", IntermediateAssemblyDir);
            Log.LogDebugMessage("  LinkMode: {0}", LinkMode);
            Log.LogDebugMessage("  SdkBinDirectory: {0}", SdkBinDirectory);
            Log.LogDebugMessage("  SupportedAbis: {0}", SupportedAbis);
            Log.LogDebugTaskItems("  ResolvedAssemblies:", ResolvedAssemblies);
            Log.LogDebugTaskItems("  AdditionalNativeLibraryReferences:", AdditionalNativeLibraryReferences);

            bool hasValidAotMode = GetAndroidAotMode(AndroidAotMode, out AotMode);

            if (!hasValidAotMode)
            {
                Log.LogCodedError("XA3001", "Invalid AOT mode: {0}", AndroidAotMode);
                return(false);
            }

            TryGetSequencePointsMode(AndroidSequencePointsMode, out sequencePointsMode);

            var nativeLibs = new List <string> ();

            if (!Directory.Exists(AotOutputDirectory))
            {
                Directory.CreateDirectory(AotOutputDirectory);
            }

            // Check that we have a compatible NDK version for the targeted ABIs.
            NdkUtil.NdkVersion ndkVersion;
            bool hasNdkVersion = NdkUtil.GetNdkToolchainRelease(AndroidNdkDirectory, out ndkVersion);

            var abis = SupportedAbis.Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var abi in abis)
            {
                string            aotCompiler = "";
                string            outdir      = "";
                string            mtriple     = "";
                AndroidTargetArch arch;

                switch (abi)
                {
                case "armeabi":
                    aotCompiler = Path.Combine(SdkBinDirectory, "cross-arm");
                    outdir      = Path.Combine(AotOutputDirectory, "armeabi");
                    mtriple     = "armv5-linux-gnueabi";
                    arch        = AndroidTargetArch.Arm;
                    break;

                case "armeabi-v7a":
                    aotCompiler = Path.Combine(SdkBinDirectory, "cross-arm");
                    outdir      = Path.Combine(AotOutputDirectory, "armeabi-v7a");
                    mtriple     = "armv7-linux-gnueabi";
                    arch        = AndroidTargetArch.Arm;
                    break;

                case "arm64":
                case "arm64-v8a":
                case "aarch64":
                    aotCompiler = Path.Combine(SdkBinDirectory, "cross-arm64");
                    outdir      = Path.Combine(AotOutputDirectory, "arm64-v8a");
                    mtriple     = "aarch64-linux-android";
                    arch        = AndroidTargetArch.Arm64;
                    break;

                case "x86":
                    aotCompiler = Path.Combine(SdkBinDirectory, "cross-x86");
                    outdir      = Path.Combine(AotOutputDirectory, "x86");
                    mtriple     = "i686-linux-android";
                    arch        = AndroidTargetArch.X86;
                    break;

                case "x86_64":
                    aotCompiler = Path.Combine(SdkBinDirectory, "cross-x86_64");
                    outdir      = Path.Combine(AotOutputDirectory, "x86_64");
                    mtriple     = "x86_64-linux-android";
                    arch        = AndroidTargetArch.X86_64;
                    break;

                // case "mips":
                default:
                    throw new Exception("Unsupported Android target architecture ABI: " + abi);
                }

                if (!NdkUtil.ValidateNdkPlatform(Log, AndroidNdkDirectory, arch, enableLLVM:EnableLLVM))
                {
                    return(false);
                }

                if (!ValidateAotConfiguration(Log, arch, EnableLLVM))
                {
                    return(false);
                }

                outdir = Path.GetFullPath(outdir);
                if (!Directory.Exists(outdir))
                {
                    Directory.CreateDirectory(outdir);
                }

                var toolPrefix    = NdkUtil.GetNdkToolPrefix(AndroidNdkDirectory, arch);
                var toolchainPath = toolPrefix.Substring(0, toolPrefix.LastIndexOf(Path.DirectorySeparatorChar));
                var ldFlags       = string.Empty;
                if (EnableLLVM)
                {
                    int level = GetNdkApiLevel(AndroidNdkDirectory, AndroidApiLevel, arch);

                    string androidLibPath = string.Empty;
                    try {
                        androidLibPath = NdkUtil.GetNdkPlatformLibPath(AndroidNdkDirectory, arch, level);
                    } catch (InvalidOperationException ex) {
                        Diagnostic.Error(5101, ex.Message);
                    }
                    var libs = new List <string>()
                    {
                        QuoteFileName(Path.Combine(GetNdkToolchainLibraryDir(toolchainPath), "libgcc.a")),
                        QuoteFileName(Path.Combine(androidLibPath, "libc.so")),
                        QuoteFileName(Path.Combine(androidLibPath, "libm.so"))
                    };
                    ldFlags = string.Join(";", libs);
                }

                foreach (var assembly in ResolvedAssemblies)
                {
                    string outputFile = Path.Combine(outdir, string.Format("libaot-{0}.so",
                                                                           Path.GetFileName(assembly.ItemSpec)));

                    string seqpointsFile = Path.Combine(outdir, string.Format("{0}.msym",
                                                                              Path.GetFileName(assembly.ItemSpec)));

                    string aotOptions = string.Format(
                        "{0}--aot={8}{1}outfile={2},asmwriter,mtriple={3},tool-prefix={4},ld-flags={5},llvm-path={6},temp-path={7}",
                        EnableLLVM ? "--llvm " : string.Empty,
                        AotMode != AotMode.Normal ? string.Format("{0},", AotMode.ToString().ToLowerInvariant()) : string.Empty,
                        QuoteFileName(outputFile),
                        mtriple,
                        QuoteFileName(toolPrefix),
                        ldFlags,
                        QuoteFileName(SdkBinDirectory),
                        QuoteFileName(outdir),
                        sequencePointsMode == SequencePointsMode.Offline ? string.Format("gen-seq-points-file={0},", seqpointsFile) : string.Empty
                        );

                    // Due to a Monodroid MSBuild bug we can end up with paths to assemblies that are not in the intermediate
                    // assembly directory (typically obj/assemblies). This can lead to problems with the Mono loader not being
                    // able to find their dependency laters, since framework assemblies are stored in different directories.
                    // This can happen when linking is disabled (AndroidLinkMode=None). Workaround this problem by resolving
                    // the paths to the right assemblies manually.
                    var resolvedPath             = Path.GetFullPath(assembly.ItemSpec);
                    var intermediateAssemblyPath = Path.Combine(IntermediateAssemblyDir, Path.GetFileName(assembly.ItemSpec));

                    if (LinkMode.ToLowerInvariant() == "none")
                    {
                        if (!resolvedPath.Contains(IntermediateAssemblyDir) && File.Exists(intermediateAssemblyPath))
                        {
                            resolvedPath = intermediateAssemblyPath;
                        }
                    }

                    var assembliesPath = Path.GetFullPath(Path.GetDirectoryName(resolvedPath));
                    var assemblyPath   = QuoteFileName(Path.GetFullPath(resolvedPath));

                    if (!RunAotCompiler(assembliesPath, aotCompiler, aotOptions, assemblyPath))
                    {
                        Log.LogCodedError("XA3001", "Could not AOT the assembly: {0}", assembly.ItemSpec);
                        return(false);
                    }
                    nativeLibs.Add(outputFile);
                }
            }

            NativeLibrariesReferences = nativeLibs.ToArray();

            Log.LogDebugTaskItems("Aot Outputs:");
            Log.LogDebugTaskItems("  NativeLibrariesReferences: ", NativeLibrariesReferences);

            return(true);
        }
Exemple #18
0
        /// <summary>
        /// 预览
        /// </summary>
        /// <param name="CH">通道</param>
        /// <param name="Handle">句柄</param>
        /// <param name="StreamType">码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推</param>
        /// <param name="Mode">连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP </param>
        /// <param name="Blocked">0- 非阻塞取流,1- 阻塞取流</param>
        public void RealPlay(int CH, IntPtr Handle, Action <int, int, IntPtr, uint, IntPtr> RealDataCallBack = null, Action <int, int, IntPtr, uint, IntPtr> StdDataEvent = null, Action <int, int, IntPtr, uint, IntPtr> RealDataEvent = null, int StreamType = 0, LinkMode Mode = LinkMode.TCP, bool Blocked = true)
        {
            NET_DVR_PREVIEWINFO lpPreviewInfo = new NET_DVR_PREVIEWINFO();

            lpPreviewInfo.hPlayWnd        = Handle;
            lpPreviewInfo.lChannel        = CH;
            lpPreviewInfo.dwStreamType    = (uint)StreamType;
            lpPreviewInfo.dwLinkMode      = (uint)Mode;
            lpPreviewInfo.bBlocked        = Blocked;
            lpPreviewInfo.dwDisplayBufNum = (uint)this.BufferFrame;
            IntPtr           pUser    = new IntPtr();
            REALDATACALLBACK RealData = null;

            if (RealDataCallBack != null)
            {
                RealData = new REALDATACALLBACK(RealDataCallBack);
            }
            System.Threading.Thread.Sleep(1000);
            if (Environment.Is64BitProcess)
            {
                m_lRealHandle = HCNetSDKia64.NET_DVR_RealPlay_V40(this.lUserID, ref lpPreviewInfo, RealData, pUser);
            }
            else
            {
                m_lRealHandle = HCNetSDK.NET_DVR_RealPlay_V40(this.lUserID, ref lpPreviewInfo, RealData, pUser);
            }
            if (m_lRealHandle < 0)
            {
                Error();
            }
            if (StdDataEvent != null)
            {
                if (Environment.Is64BitProcess)
                {
                    HCNetSDKia64.NET_DVR_SetStandardDataCallBack(this.lUserID, new StdDataCallBack(StdDataEvent), pUser);
                }
                else
                {
                    HCNetSDK.NET_DVR_SetStandardDataCallBack(this.lUserID, new StdDataCallBack(StdDataEvent), pUser);
                }
            }
            if (RealDataEvent != null)
            {
                if (Environment.Is64BitProcess)
                {
                    HCNetSDKia64.NET_DVR_SetRealDataCallBack(this.lUserID, new RealDataCallBack(RealDataEvent), pUser);
                }
                else
                {
                    HCNetSDK.NET_DVR_SetRealDataCallBack(this.lUserID, new RealDataCallBack(RealDataEvent), pUser);
                }
            }
        }
Exemple #19
0
 public CustomizeMacActions(LinkMode mode, IEnumerable <string> skipped_assemblies)
     : base(mode == LinkMode.SDKOnly, skipped_assemblies)
 {
     link_mode = mode;
 }
Exemple #20
0
 /// <summary>
 /// 本地录像
 /// </summary>
 /// <param name="CH"></param>
 /// <param name="FilePath"></param>
 /// <param name="Handle"></param>
 /// <param name="StreamType"></param>
 /// <param name="Mode"></param>
 /// <param name="Blocked"></param>
 public void StartRec(int CH, string FilePath, IntPtr Handle, int StreamType = 0, LinkMode Mode = LinkMode.TCP, bool Blocked = true)
 {
     if (m_lRealHandle < 0)
     {
         RealPlay(CH, Handle, null, null, null, StreamType, Mode, Blocked);
     }
     if (m_lRealHandle < 0)
     {
         Error();
     }
     if (Environment.Is64BitProcess)
     {
         mRec = HCNetSDKia64.NET_DVR_SaveRealData(this.m_lRealHandle, FilePath);
     }
     else
     {
         mRec = HCNetSDK.NET_DVR_SaveRealData(this.m_lRealHandle, FilePath);
     }
 }
Exemple #21
0
 public CustomizeMacActions(LinkMode mode, IEnumerable<string> skipped_assemblies)
     : base(mode == LinkMode.SDKOnly, skipped_assemblies)
 {
     link_mode = mode;
 }
Exemple #22
0
 public Target(ref ptr <sys.Arch> Arch = default, objabi.HeadType HeadType = default, LinkMode LinkMode = default, BuildMode BuildMode = default, bool linkShared = default, bool canUsePlugins = default, bool IsELF = default)
 {
     this.Arch          = Arch;
     this.HeadType      = HeadType;
     this.LinkMode      = LinkMode;
     this.BuildMode     = BuildMode;
     this.linkShared    = linkShared;
     this.canUsePlugins = canUsePlugins;
     this.IsELF         = IsELF;
 }