private void CorrectSalesOrderWithUnknownRef(long shopifyOrderId) { var shopifyOrderRecord = _syncOrderRepository.RetrieveShopifyOrder(shopifyOrderId); if (!shopifyOrderRecord.HasSyncWithUnknownNbr()) { return; } var salesOrderRecord = shopifyOrderRecord.AcumaticaSalesOrder; var customerOrderRef = shopifyOrderRecord.ShopifyOrderId.ToString(); var findOrders = _salesOrderClient.FindSalesOrder(customerOrderRef); if (findOrders.Count == 0) { _logService.Log(LogBuilder.ClearingUnknownAcumaticaSalesOrderRef(shopifyOrderRecord)); _acumaticaOrderRepository.DeleteSalesOrder(shopifyOrderRecord.AcumaticaSalesOrder); return; } // Heuristic for now // var salesOrder = findOrders.OrderBy(x => x.OrderNbr.value).First(); salesOrderRecord.Ingest(salesOrder); _logService.Log(LogBuilder.FillingUnknownAcumaticaSalesOrderRef(shopifyOrderRecord, salesOrderRecord)); _acumaticaOrderRepository.SaveChanges(); }
public static LogBuilder Append(this LogBuilder buidler, string message, Exception ex, string sessionKey, string query, string database, object param) { if (buidler == null) { return(buidler); } buidler.Message(message); if (ex != null) { buidler.Exception(ex); } if (!string.IsNullOrEmpty(sessionKey)) { buidler.Property("SessionKey", sessionKey); } if (string.IsNullOrEmpty(query)) { return(buidler); } buidler.Property("Query", query); buidler.Property("DatabaseName", database); if (param != null) { buidler.Property("Parameters", param.ConvertParameterToJson()); } return(buidler); }
public static LogBuilder Account(this LogBuilder builder, ulong id, string user, SecurityLevel securityLevel = SecurityLevel.User) { builder.LogEventInfo.Properties["account_id"] = id; builder.LogEventInfo.Properties["account_user"] = user; builder.LogEventInfo.Properties["account_level"] = securityLevel; return(builder); }
IDisposable ILogger.BeginScope <TState>(TState state) { lock (_sync) // Guard against tests with explicit concurrency { return(LogBuilder.Indent()); } }
private void Log(string text, params object[] args) { var msg = string.Format(text, args); //TODO: logging such as log4net etc. LogBuilder.AppendLine(msg); }
public LauncherForm() { Fileworks fw = new Fileworks(); LogBuilder lb = new LogBuilder(); InitializeComponent(); if (!Directory.Exists("cstrike")) { cscbx.Enabled = false; lb.AddLine("cstrike folder not found. cscbx radiobtn disabled."); } if (!Directory.Exists("ag")) { agcbx.Enabled = false; lb.AddLine("ag folder not found. agcbx radiobtn disabled."); } if (!Directory.Exists("bshift")) { bscbx.Enabled = false; lb.AddLine("bshift folder not found. bscbx radiobtn disabled."); } if (!Directory.Exists("gearbox")) { ofcbx.Enabled = false; lb.AddLine("gearbox folder not found. ofcbx radiobtn disabled."); } }
private void Timer_Tick(object sender, EventArgs e) { if (ObservedProcess.Process.HasExited) { return; } byte[] result = TryReadProcessMemory(ObservedProcess.ProcessHandle, ObservedProcess.Process.MainModule.BaseAddress.ToInt64(), Convert.ToInt64(TargetAddress, 16)); if (result == null) { return; } ulong oldValue = ReadValue; ReadValue = ((ReadValueType)ValueType).ToValue(result); if (ReadValue == oldValue) { return; } foreach (Notifier notifier in Notifiers) { if (notifier.CompareValue(oldValue, ReadValue)) { LogBuilder.AppendLine(string.Format("[{0}] : {1}", DateTime.Now.ToString(), notifier.GetCompareInfo(oldValue, ReadValue))); if (NotifierPriorityEnabled) { break; } } } ValueUpdated?.Invoke(this, oldValue, ReadValue); }
/// <summary> /// Adds a console target to the logging system /// </summary> /// <param name="options"></param> /// <param name="condition">Log conditions for this target</param> /// <param name="formatter">Message formatter for this target</param> /// <param name="output">Output buffer this target will write to</param> /// <param name="enableBuffering">Sets if buffering should be used with this target</param> /// <param name="maxBufferSize">Maximum number of elements in the buffer</param> /// <param name="bufferExceededBehavior">Sets the behavior of this target when the buffer is full and new entries are logged</param> public static LogBuilder AddConsoleTarget( this LogBuilder options, Func <LogEntry, bool> condition = null, Func <LogEntry, string> formatter = null, ConsoleOutputs output = ConsoleOutputs.StandardOutput, bool enableBuffering = true, int maxBufferSize = BufferSize.Infinite, BufferExceededBehaviors bufferExceededBehavior = BufferExceededBehaviors.Lock) { var console_logger = new ConsoleTarget( (m) => System.Console.WriteLine(m), (m) => System.Console.Error.WriteLine(m)) { Formatter = formatter ?? ConsoleTarget.DEFAULT_FORMAT, OutputStream = output, Condition = condition }; if (enableBuffering) { options.AddLogTarget( new BufferedLogger( console_logger, maxBufferSize, bufferExceededBehavior)); } else { options.AddLogTarget(console_logger); } return(options); }
public async Task <TemperatureProfile> GetActiveProfile() { return(await Task.Run(() => { TemperatureProfile profile = null; Stopwatch sw = new Stopwatch(); sw.Start(); try { var profiles = _context.TemperatureProfiles.Include(p => p.Schedules).ToList(); profile = profiles.Where(p => p.Current).First(); profile.Schedules = profile.Schedules.OrderBy(s => s.DayOfWeek).ThenBy(s => s.Start).ToList(); _logger.Information( LogBuilder.StartNew("Active profile") .KeyValue("Name", profile.Name) .KeyValue("Configurations", profile.Schedules.Count) .ElapsedTime(sw)); } catch (Exception err) { _logger.Error(err, LogBuilder.StartNew("Errore nel recupero del profilo corrente").ElapsedTime(sw)); } finally { sw.Stop(); } return profile; })); }
/// <summary> /// 创建文件 /// </summary> /// <param name="filePath"></param> /// <param name="append">是否在源文件基础追加</param> public static void CreateFile(string filePath, bool append = false) { if (File.Exists(filePath)) { if (append == false)//不追加则创建文件 { try { File.Delete(filePath); using (FileStream fstream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) { fstream.SetLength(0); } } catch (Exception ex) { LogBuilder.CreateInstance().Error("MemoryCache Set Error:" + ex.Message); } } } else { CreateDirectory(filePath); using (FileStream fstream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) { fstream.SetLength(0); } } }
public Task BuildConfigLogMessageMinimal() { ConfigResult config = new(); var message = LogBuilder.BuildConfigLogMessage("theRoot", config, "theConfigFilePath"); return(Verifier.Verify(message)); }
public void Test() { using (var container = Container()) { Assert.That(LogBuilder.ToString(), Is.EqualTo("")); var hoster = container.Get <Hoster>(); Assert.That(LogBuilder.ToString(), Is.EqualTo("")); var outerWrap = container.Get <ComponentWrap>(); Assert.That(LogBuilder.ToString(), Is.EqualTo("Component0.ctor ComponentWrap1.ctor ")); LogBuilder.Clear(); ComponentWrap clone1; using (var clonedContainer = hoster.container.Clone(null)) { clone1 = clonedContainer.Get <ComponentWrap>(); Assert.That(clone1, Is.Not.SameAs(outerWrap)); Assert.That(LogBuilder.ToString(), Is.EqualTo("Component2.ctor ComponentWrap3.ctor ")); Assert.That(container.Get <ComponentWrap>(), Is.SameAs(outerWrap)); LogBuilder.Clear(); } Assert.That(LogBuilder.ToString(), Is.EqualTo("Component2.Dispose ")); LogBuilder.Clear(); using (var clonedContainer = hoster.container.Clone(null)) { Assert.That(clonedContainer.Get <ComponentWrap>(), Is.Not.SameAs(outerWrap)); Assert.That(clonedContainer.Get <ComponentWrap>(), Is.Not.SameAs(clone1)); Assert.That(clonedContainer.Get <ComponentWrap>(), Is.SameAs(clonedContainer.Get <ComponentWrap>())); Assert.That(LogBuilder.ToString(), Is.EqualTo("Component4.ctor ComponentWrap5.ctor ")); LogBuilder.Clear(); } Assert.That(LogBuilder.ToString(), Is.EqualTo("Component4.Dispose ")); LogBuilder.Clear(); } Assert.That(LogBuilder.ToString(), Is.EqualTo("Component0.Dispose ")); }
public void UpdateInventoryLevels(AcumaticaStockItem stockItem) { if (MonsterConfig.Settings.DisableShopifyPut) { _executionLogService.Log(LogBuilder.ShopifyPutDisabled()); return; } var variant = _inventoryRepository .RetrieveVariant(stockItem.MatchedVariant().ShopifyVariantId); if (variant.IsMissing) { _logger.Debug( $"Skipping Inventory Update for " + $"Variant {variant.ShopifySku} ({variant.ShopifyVariantId}) " + $"StockItem {stockItem} - reason: Missing Variant"); return; } if (variant.ShopifyProduct.IsDeleted) { _logger.Debug( $"Skipping Inventory Update for " + $"Variant {variant.ShopifySku} ({variant.ShopifyVariantId}) " + $"StockItem {stockItem} - reason: Deleted Parent Product"); return; } foreach (var level in variant.ShopifyInventoryLevels) { UpdateInventoryLevel(stockItem, level); } }
public ReceiveMessageBehavior(LogBuilder logBuilder) { var templateParser = new MessageTemplateParser(); messageTemplate = templateParser.Parse("Receive message {MessageType} {MessageId}."); logger = logBuilder.GetLogger("NServiceBus.Serilog.MessageReceived"); }
public LoggingService(Action <LogBuilder> fn) { LogBuilder log = new LogBuilder(); fn(log); log.Apply(); }
private void ProcessAdjustmentMemo(AdjustmentAction action) { if (action.ActionCode == ActionCode.None) { return; } if (action.ActionCode == ActionCode.CreateInAcumatica && action.MemoType == AdjustmentMemoType.CreditMemo && action.IsValid) { // Create Acumatica Refund payload // var refund = _syncOrderRepository.RetrieveShopifyRefundWithNoTracking(action.ShopifyRefundId); var memoWrite = BuildCreditMemo(refund); //_invoiceClient.RetrieveInvoiceAndTaxes("000015", "CRM"); // Push to Acumatica and write Sync Record // _logService.Log(LogBuilder.CreateAcumaticaMemo(refund)); PushMemoAndWriteSync(refund, memoWrite); } }
private static void Main(string[] args) { Log.Logger = LogBuilder.Create(); for (int i = 0; i < 1; i++) { Log.Debug("Warning!!!"); } Log.ForContext <Program>().Information("okoko"); Log.Warning("LogWarning"); Log.Error("LogError"); Log.Fatal("LogCritical"); int a = 10, b = 0; try { Log.Debug("Dividing {A} by {B}", a, b); Console.WriteLine(a / b); } catch (Exception ex) { Log.Error(ex, "Something went wrong"); } Console.Read(); }
public Customer FindAcumaticaCustomer(ShopifyCustomer shopifyCustomer) { var customersByIdJson = _customerClient.SearchCustomerByCustomerId(shopifyCustomer.ShopifyCustomerId.ToString()); var customersById = customersByIdJson.DeserializeFromJson <List <Customer> >(); if (customersById.Count == 1) { return(customersById.First()); } var customersByEmailJson = _customerClient.SearchCustomerByEmail(shopifyCustomer.ShopifyPrimaryEmail); var customers = customersByEmailJson.DeserializeFromJson <List <Customer> >(); if (customers.Count == 0) { return(null); } if (customers.Count == 1) { _logService.Log(LogBuilder.FoundAcumaticaCustomerByEmail(shopifyCustomer.ShopifyPrimaryEmail)); } else { _logService.Log(LogBuilder.MultipleCustomersWithSameEmail(shopifyCustomer.ShopifyPrimaryEmail)); } return(customers.First()); }
public void CreateLogMsgWithExceptionWithNoStackTrace() { Log log = LogBuilder.Log(SeverityLevel.Debug, "No payload"); log.AddMessage("no msg", new Exception()); Assert.IsTrue(log.LogMessages.Any()); Assert.IsTrue(log.LogMessages[0].LogMessageText != null); Assert.IsTrue(log.LogMessages[0].LogMessageText.MessageText != null); Assert.IsTrue(log.LogMessages[0].LogMessageText.LogMessageHash != null); Assert.IsTrue(log.LogMessages[1].LogStackTrace != null); Assert.IsTrue(log.LogMessages[1].LogStackTrace.StackTraceText != null); Assert.IsTrue(log.LogMessages[1].LogStackTrace.StackHash != null); log = LogBuilder.Log(SeverityLevel.Debug, "no payload"); log.AddMessage(null, new Exception()); Assert.IsTrue(log.LogMessages[0].LogMessageText != null); log = LogBuilder.Log(SeverityLevel.Debug, "no payload"); log.AddMessage(null, new Exception("outter", new Exception("inner"))); Assert.IsTrue(log.LogMessages[0].LogMessageText != null); Assert.IsTrue(log.LogMessages[0].LogMessageText.MessageText == "outter"); Assert.IsTrue(log.LogMessages[1].LogMessageText != null); Assert.IsTrue(log.LogMessages[1].LogMessageText.MessageText == "inner"); }
public void DuplicationUnitTest() { DALCache cacheInst = DALCache.Instance; LoggingSettings settingsInst = LoggingSettings.Instance; settingsInst.DuplicateCachePurgeSeconds = 1; Log log = LogBuilder.Log(SeverityLevel.Debug, "No payload", "CreateLogMsgWithExceptionWithNoStackTrace"); log.AddMessage("no msg", new Exception()); //first check - should not be duplicate var logCount = cacheInst.DetermineDuplicateState(log); Assert.IsFalse(log.IsDuplicate); Assert.IsTrue(logCount == 1); //second check - immediate - should be duplicate logCount = cacheInst.DetermineDuplicateState(log); Assert.IsTrue(log.IsDuplicate); Assert.IsTrue(logCount > 1); //wait for the over the purge limit, then try again Task.Delay(2000).Wait(); logCount = cacheInst.DetermineDuplicateState(log); Assert.IsFalse(log.IsDuplicate); Assert.IsTrue(logCount == 1); //hit again immediately - should be marked as a duplicate logCount = cacheInst.DetermineDuplicateState(log); Assert.IsTrue(log.IsDuplicate); Assert.IsTrue(logCount > 1); }
public void CreateLogSimpleSignature() { Log log = LogBuilder.Log(SeverityLevel.Debug, ""); Assert.IsNotNull(log); Assert.IsTrue(log.Verify()); }
public void CreateLogFullSignatureWWithException() { Log log = LogBuilder.Log(SeverityLevel.Debug, "", new Exception(), "", new Dictionary <string, string>(), new Dictionary <string, string>()); Assert.IsNotNull(log); Assert.IsTrue(log.Verify()); }
private static LogBuilder AddProperties(LogBuilder builder, Dictionary <string, object> properties) { if (properties == null || properties.Count == 0) { return(builder); } properties.ToList().ForEach(m => { if (m.Value == null) { return; } var type = m.Value.GetType(); if (type.IsPrimitive || type == typeof(String)) { return; } if (type == typeof(DateTime) || type.GetType() == typeof(DateTime?)) { properties[m.Key] = ((DateTime)m.Value).ToString("yyyy-MM-dd HH:mm:ss.ffff"); } else { properties[m.Key] = JsonConvert.SerializeObject(m.Value); } }); return(builder.Properties(properties)); }
static void Main(string[] args) { Logger logger = new LogBuilder() .AddConsole() .AddFile("./log.txt") .AddEmail("*****@*****.**", "*****@*****.**") .CreateLogger(); logger.LogToTarget(LogLevel.Information, "尝试登录..."); // 验证验证码逻辑 logger.LogInformation("验证码正确"); logger.LogInformation("尝试连接数据库..."); // 连接数据库逻辑 logger.LogInformation("连接数据库成功..."); logger.LogInformation("匹配用户名和密码中..."); // 匹配用户名和密码逻辑 logger.LogInformation("用户名和密码匹配正确"); logger.LogInformation("检测用户权限中..."); // 验证用户权限 logger.LogInformation("用户登录成功"); }
public void UpdateLog(object obj) { FtpLogEntry entry = obj as FtpLogEntry; if (entry == null) { return; } _entryBuilder.Append(entry.Date.ToLongTimeString()).Append("\t") .Append(entry.CIP ?? "-").Append("\t") .Append(entry.CSUsername ?? "-").Append("\t") .Append(entry.CSMethod ?? "-").Append(" ") .Append(entry.CSArgs ?? "-").Append("\t") .Append(entry.CSBytes ?? "-").Append("\t") .Append(entry.SCStatus ?? "-").Append("\t") .Append(entry.SCBytes ?? "-").Append("\t") .Append(entry.Info ?? ""); if (Active) { Core.LogTextBox.Invoke(new MethodInvoker(() => { Core.LogTextBox.AppendText(_entryBuilder.ToString()); Core.LogTextBox.AppendText(Environment.NewLine); })); } else { LogBuilder.Append(_entryBuilder.ToString()).AppendLine(); } _entryBuilder.Clear(); }
public SendMessageBehavior(LogBuilder logBuilder) { var templateParser = new MessageTemplateParser(); logger = logBuilder.GetLogger("NServiceBus.Serilog.MessageSent"); messageTemplate = templateParser.Parse("Sent message {MessageType} {MessageId}."); }
public void WakeUp() { try { Core.LastTabData = this; Core.LogTextBox.Invoke(new MethodInvoker(() => { Core.LogTextBox.Text = LogRecorder; Core.LogTextBox.AppendText(LogBuilder.ToString()); })); Core.TabContainer.Invoke(new MethodInvoker(() => { Tab.Controls.Clear(); Tab.Controls.Add(Core.MainSpiltContainer); })); LogBuilder.Clear(); LogRecorder = null; UpdateConnectionList(); } catch (Exception) { return; //throw; } }
/// <summary> /// 添加缓存 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <param name="expiresIn">缓存时长</param> /// <param name="isSliding">是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间)</param> /// <returns></returns> public static bool Set(string key, object value, TimeSpan expiresIn, bool isSliding = false) { try { if (key == null) { throw new ArgumentNullException(nameof(key)); } if (value == null) { throw new ArgumentNullException(nameof(value)); } Cache.Set(key, value, isSliding ? new MemoryCacheEntryOptions().SetSlidingExpiration(expiresIn) : new MemoryCacheEntryOptions().SetAbsoluteExpiration(expiresIn)); return(Exists(key)); } catch (Exception ex) { LogBuilder.CreateInstance().Error("MemoryCache Set Error:" + ex.Message); throw; } }
public void describe(LogBuilder builder) { base.describe(builder); builder.addLogPair("dataSource", dataSource); builder.addLogPair("userID", userID); builder.addLogPair("password", password != null ? "<specified>" : "<null>"); if (dataStoreUserID != null && dataStoreUserID.Length > 0) { builder.addLogPair("dataStoreUserID", dataStoreUserID); } if (dataStorePassword != null && dataStorePassword.Length > 0) { builder.addLogPair("dataStorePassword", "<specified>"); } builder.addLogPair("clientID", clientID); if (timezone != null) { builder.addLogPair("timezone", timezone); } if (timezoneOffset != null) { builder.addLogPair("timezoneOffset", timezoneOffset); } builder.addLogPair("flags", flags); }
/// <summary> /// Get 请求 /// </summary> /// <param name="url"></param> /// <param name="headerList"></param> /// <param name="timeout"></param> /// <returns></returns> public static async Task <Tuple <bool, string> > HttpClientGet(string url, List <KeyValuePair <string, string> > headerList = null, int timeout = 30000) { var retrnVlaue = string.Empty; //var flag = false; var httpclientHandler = new HttpClientHandler(); httpclientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true; using (var httpClient = new HttpClient(httpclientHandler)) { if (headerList != null) { foreach (var item in headerList) { if (item.Key.ToLower().Equals("content-type")) { httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(item.Value)); } else { httpClient.DefaultRequestHeaders.Add(item.Key, item.Value); } } } //var httpResponseMessage = await httpClient.GetAsync(url); retrnVlaue = await httpClient.GetStringAsync(url); //flag = httpResponseMessage.StatusCode == (HttpStatusCode)StatusCodes.Status200OK; //if (flag) //{ // retrnVlaue = httpResponseMessage.Content.ToString(); LogBuilder.CreateInstance().Info($"请求URL:{url},HttpClientGet 返回结果:{retrnVlaue},请求时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}"); //} } return(Tuple.Create <bool, string>(true, retrnVlaue)); }
/// <summary> /// Scenario 3 Message builder /// </summary> /// <param name="sock"> /// socket to query for socket info /// </param> /// <param name="msTime"> /// time parameter to state time in message /// </param> /// <param name="ip"> /// ip addres connected to /// </param> /// <param name="portNum"> /// port number being used /// </param> /// <param name="serverPort"> /// port number being used</param> /// <param name="serverIP"> /// server ip address /// </param> /// <param name="i"> /// count value /// </param> /// <returns> /// a byte array containing formatted message /// </returns> public byte[] MessageBuildScenarioThree(Socket sock, string msTime, string ip, string portNum, string serverPort, string serverIP, int i, int responseTime, LogBuilder lb) { // Hard code and build string. //byte[] msg = System.Text.Encoding.ASCII.GetBytes("REQ|" + msTime // + "|RequestNo:" + i + "|WurdingerO|19-3410|" + ip.ToString() // + "|" + portNum + "|" + sock.Handle.ToString() + "|" + serverIP + "|" // + serverPort + "|StudentData:" + i + "|3|"); byte[] msg = System.Text.Encoding.ASCII.GetBytes("REQ|" + msTime + "|RequestNo:" + i + "|WurdingerO|19-3410|" + responseTime + "|" + ip + "|" + portNum + "|" + sock.Handle.ToString() + "|" + serverIP + "|" + serverPort + "|StudentData:" + i + "|3|"); int msgLength = msg.Length; byte[] lengthByte = System.Text.Encoding.ASCII.GetBytes((msgLength + msgLength.ToString().Length).ToString()); byte[] sendMsg = new byte[msgLength + lengthByte.Length]; Array.Copy(lengthByte, 0, sendMsg, 0, lengthByte.Length); Array.Copy(msg, 0, sendMsg, lengthByte.Length, msg.Length); return sendMsg; }
/// <summary> /// Scenario 2 Message builder /// </summary> /// <param name="sock"> /// socket to query for socket info /// </param> /// <param name="msTime"> /// time parameter to state time in message /// </param> /// <param name="ip"> /// ip addres connected to /// </param> /// <param name="portNum"> /// port number being used /// </param> /// <param name="serverPort"> /// port number being used</param> /// <param name="serverIP"> /// server ip address /// </param> /// <param name="i"> /// count value /// </param> /// <returns> /// a byte array containing formatted message /// </returns> public byte[] MessageBuildScenarioTwo(Socket sock, string msTime, string ip, string portNum, string serverPort, string serverIP, int i, int responseTime, LogBuilder lb) { // Hard code and build string. string stringMsg = "REQ|" + msTime + "|RequestNo:" + i + "|WurdingerO|19-3410|" + responseTime + "|" + ip + "|" + portNum + "|" + sock.Handle.ToString() + "|" + serverIP + "|" + serverPort + "|StudentData:" + i + "|2|"; lb.sentMsgs.Add(stringMsg); byte[] msg = System.Text.Encoding.ASCII.GetBytes(stringMsg); // Length of msg short msgLength = (short)msg.Length; // convert message length to byte array byte[] byteLength = BitConverter.GetBytes(msgLength); if (BitConverter.IsLittleEndian) { Array.Reverse(byteLength); //.Reverse(); } byte[] sendMsg = new byte[byteLength.Length + msgLength]; // Copy arrays to get one single sendMsg array Array.Copy(byteLength, sendMsg, byteLength.Length); Array.Copy(msg, 0, sendMsg, byteLength.Length, msgLength); return sendMsg; }