static extern void linphone_core_set_log_level(OrtpLogLevel loglevel);
private void OnLinphoneLog(IntPtr domain, OrtpLogLevel lev, IntPtr fmt, IntPtr args) { if (fmt == IntPtr.Zero || !_enableLogging) return; var format = Marshal.PtrToStringAnsi(fmt); if (string.IsNullOrEmpty(format)) { return; } lock (logLock) { try { foreach (var formatter in placeholders) { int pos = format.IndexOf(formatter, 0, StringComparison.InvariantCulture); while (pos != -1) { placeHolderItems[pos] = formatter; pos = format.IndexOf(formatter, pos + 1, StringComparison.InvariantCulture); } } } catch (Exception ex) { LOG.Error("Error on formatting: " + format); return; } if (placeHolderItems.Count == 0) { LOG.Info(format); return; } try { var argsArray = new IntPtr[placeHolderItems.Count]; Marshal.Copy(args, argsArray, 0, placeHolderItems.Count); var logOutput = new StringBuilder(format); var formattedString = string.Empty; int offset = 0; for (int i = 0; i < placeHolderItems.Count; i++) { if (i >= argsArray.Length) continue; switch (placeHolderItems.Values[i]) { case "%s": formattedString = Marshal.PtrToStringAnsi(argsArray[i]); break; case "%d": case "%lu": case "%i": case "%u": case "%llu": case "%f": case "%p": formattedString = argsArray[i].ToString(); break; case "%x": case "%X": formattedString = argsArray[i].ToString("X"); break; case "%10I64d": formattedString = argsArray[i].ToInt64().ToString().PadLeft(10); break; case "%-9i": formattedString = argsArray[i].ToString().PadLeft(9, '-'); break; case "%-20s": case "%-19s": formattedString = Marshal.PtrToStringAnsi(argsArray[i]); if (formattedString != null) formattedString = formattedString.PadLeft(19, '-'); break; case "%-19g": formattedString = argsArray[i].ToString().PadLeft(19, '-'); break; case "%-10g": formattedString = argsArray[i].ToString().PadLeft(10, '-'); break; case "%3.1f": case "%5.1f": formattedString = argsArray[i].ToString("N1"); break; default: formattedString = string.Empty; break; } if (formattedString != null) { logOutput.Remove(placeHolderItems.Keys[i] + offset, placeHolderItems.Values[i].Length); if (formattedString.Length > 0) logOutput.Insert(placeHolderItems.Keys[i] + offset, formattedString); // update offset offset += formattedString.Length - placeHolderItems.Values[i].Length; } } LOG.Info(logOutput); } catch (Exception ex) { } finally { placeHolderItems.Clear(); } } }
public static extern void linphone_core_set_log_level_mask(OrtpLogLevel loglevel);