using Google.Contacts;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
namespace GoContactSyncMod
{
internal enum EventType
{
Debug,
Information,
Warning,
Error
}
internal struct LogEntry
{
public DateTime date;
public EventType type;
public string msg;
public LogEntry(DateTime _date, EventType _type, string _msg)
{
date = _date; type = _type; msg = _msg;
}
}
internal static class Logger
{
public static List<LogEntry> messages = new List<LogEntry>();
public delegate void LogUpdatedHandler(string Message);
public static event LogUpdatedHandler LogUpdated;
private static StreamWriter logwriter;
public static readonly string Folder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GoContactSyncMOD\\";
public static readonly string AuthFolder = Folder + "\\Auth\\";
static Logger()
{
try
{
if (!Directory.Exists(Folder))
{
Directory.CreateDirectory(Folder);
}
if (!Directory.Exists(AuthFolder))
{
Directory.CreateDirectory(AuthFolder);
}
string logFileName = Folder + "log.txt";
//If log file is bigger than 1 MB, move it to backup file and create new file
FileInfo logFile = new FileInfo(logFileName);
if (logFile.Exists && logFile.Length >= 1000000)
{
File.Move(logFileName, logFileName + "_" + DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss"));
}
logwriter = new StreamWriter(logFileName, true);
logwriter.WriteLine("[Start Rolling]");
logwriter.Flush();
}
catch (Exception ex)
{
ErrorHandler.Handle(ex);
}
}
public static void Close()
{
try
{
if (logwriter != null)
{
logwriter.WriteLine("[End Rolling]");
logwriter.Flush();
logwriter.Close();
}
}
catch (Exception e)
{
ErrorHandler.Handle(e);
}
}
private static string FormatMessage(string message, EventType eventType)
{
return string.Format("{0}:{1}{2}", eventType, Environment.NewLine, message);
}
private static string GetLogLine(LogEntry entry)
{
return string.Format("[{0} | {1}]\t{2}\r\n", entry.date, entry.type, entry.msg);
}
public static void Log(string message, EventType eventType)
{
LogEntry new_logEntry = new LogEntry(DateTime.Now, eventType, message);
messages.Add(new_logEntry);
try
{
logwriter.Write(GetLogLine(new_logEntry));
logwriter.Flush();
}
catch (Exception)
{
//ignore it, because if you handle this error, the handler will again log the message
//ErrorHandler.Handle(ex);
}
//Populate LogMessage to all subscribed Logger-Outputs, but only if not Debug message, Debug messages are only logged to logfile
if (LogUpdated != null && eventType > EventType.Debug)
{
LogUpdated(GetLogLine(new_logEntry));
}
}
public static void Log(Exception ex, EventType eventType)
{
CultureInfo oldCI = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
if (ex.InnerException != null)
{
Log("Inner Exception Type: " + ex.InnerException.GetType().ToString(), eventType);
if (ex.InnerException is COMException ci)
{
Log("Inner Error Code: " + ci.ErrorCode.ToString("X"), eventType);
}
Log("Inner Exception: " + ex.InnerException.Message, eventType);
Log("Inner Source: " + ex.InnerException.Source, eventType);
if (ex.InnerException.StackTrace != null)
{
Log("Inner Stack Trace: " + ex.InnerException.StackTrace, eventType);
}
}
Log("Exception Type: " + ex.GetType().ToString(), eventType);
if (ex is COMException c)
{
Log("Error Code: " + c.ErrorCode.ToString("X"), eventType);
}
Log("Exception: " + ex.Message, eventType);
Log("Source: " + ex.Source, eventType);
if (ex.StackTrace != null)
{
Log("Stack Trace: " + ex.StackTrace, eventType);
}
Thread.CurrentThread.CurrentCulture = oldCI;
Thread.CurrentThread.CurrentUICulture = oldCI;
}
public static void Log(Google.Apis.Calendar.v3.Data.Event e, EventType eventType)
{
Log("*** Google event ***", eventType);
Log(" - AnyoneCanAddSelf: " + (e.AnyoneCanAddSelf != null ? e.AnyoneCanAddSelf.ToString() : "null"), eventType);
if (e.Attachments != null)
{
Log(" - Attachments:", eventType);
foreach (Google.Apis.Calendar.v3.Data.EventAttachment a in e.Attachments)
{
Log(" - Title: " + (a.Title ?? "null"), eventType);
}
}
if (e.Attendees != null)
{
Log(" - Attendees:", eventType);
foreach (Google.Apis.Calendar.v3.Data.EventAttendee a in e.Attendees)
{
Log(" - DisplayName: " + (a.DisplayName ?? "null"), eventType);
}
}
Log(" - AttendeesOmitted: " + (e.AttendeesOmitted != null ? e.AttendeesOmitted.ToString() : "null"), eventType);
Log(" - ColorId: " + (e.ColorId ?? "null"), eventType);
Log(" - Created: " + (e.Created != null ? e.Created.ToString() : "null"), eventType);
Log(" - CreatedRaw: " + (e.CreatedRaw ?? "null"), eventType);
if (e.Creator != null)
{
Log(" - Creator:", eventType);
Log(" - DisplayName: " + (e.Creator.DisplayName ?? "null"), eventType);
}
Log(" - Description: " + (e.Description ?? "null"), eventType);
if (e.End != null)
{
Log(" - End:", eventType);
if (!string.IsNullOrEmpty(e.End.Date))
{
Log(" - Date: " + e.End.Date, eventType);
}
if (e.End.DateTime != null)
{
Log(" - DateTime: " + e.End.DateTime.Value.ToString(), eventType);
}
if (!string.IsNullOrEmpty(e.End.TimeZone))
{
Log(" - TimeZone: " + e.End.TimeZone, eventType);
}
}
Log(" - EndTimeUnspecified: " + (e.EndTimeUnspecified != null ? e.EndTimeUnspecified.ToString() : "null"), eventType);
if (e.ExtendedProperties != null)
{
Log(" - ExtendedProperties:", eventType);
if (e.ExtendedProperties.Shared != null)
{
Log(" - Shared:", eventType);
foreach (KeyValuePair<string, string> p in e.ExtendedProperties.Shared)
{
Log(" - Key: " + (p.Key ?? "null"), eventType);
Log(" - Value: " + (p.Value ?? "null"), eventType);
}
}
if (e.ExtendedProperties.Private__ != null)
{
Log(" - Private__:", eventType);
foreach (KeyValuePair<string, string> p in e.ExtendedProperties.Private__)
{
Log(" - Key: " + (p.Key ?? "null"), eventType);
Log(" - Value: " + (p.Value ?? "null"), eventType);
}
}
}
if (e.Gadget != null)
{
Log(" - Gadget:", eventType);
if (!string.IsNullOrEmpty(e.Gadget.Title))
{
Log(" - Title: " + e.Gadget.Title, eventType);
}
}
Log(" - GuestsCanInviteOthers: " + (e.GuestsCanInviteOthers != null ? e.GuestsCanInviteOthers.ToString() : "null"), eventType);
Log(" - GuestsCanModify: " + (e.GuestsCanModify != null ? e.GuestsCanModify.ToString() : "null"), eventType);
Log(" - GuestsCanSeeOtherGuests: " + (e.GuestsCanSeeOtherGuests != null ? e.GuestsCanSeeOtherGuests.ToString() : "null"), eventType);
Log(" - HangoutLink: " + (e.HangoutLink ?? "null"), eventType);
Log(" - HtmlLink: " + (e.HtmlLink ?? "null"), eventType);
Log(" - ICalUID: " + (e.ICalUID ?? "null"), eventType);
Log(" - Id: " + (e.Id ?? "null"), eventType);
Log(" - Kind: " + (e.Kind ?? "null"), eventType);
Log(" - Location: " + (e.Location ?? "null"), eventType);
Log(" - Locked: " + (e.Locked != null ? e.Locked.ToString() : "null"), eventType);
if (e.Organizer != null)
{
Log(" - Organizer:", eventType);
Log(" - DisplayName: " + (e.Organizer.DisplayName ?? "null"), eventType);
}
if (e.OriginalStartTime != null)
{
Log(" - OriginalStartTime:", eventType);
if (!string.IsNullOrEmpty(e.OriginalStartTime.Date))
{
Log(" - Date: " + e.OriginalStartTime.Date, eventType);
}
if (e.OriginalStartTime.DateTime != null)
{
Log(" - DateTime: " + e.OriginalStartTime.DateTime.Value.ToString(), eventType);
}
if (!string.IsNullOrEmpty(e.OriginalStartTime.TimeZone))
{
Log(" - TimeZone: " + e.OriginalStartTime.TimeZone, eventType);
}
}
Log(" - PrivateCopy: " + (e.PrivateCopy != null ? e.PrivateCopy.ToString() : "null"), eventType);
if (e.Recurrence != null)
{
Log(" - Recurrence:", eventType);
foreach (string r in e.Recurrence)
{
Log(" - : " + r, eventType);
}
}
Log(" - RecurringEventId: " + (e.RecurringEventId ?? "null"), eventType);
if (e.Reminders != null)
{
Log(" - Reminders:", eventType);
if (e.Reminders.UseDefault != null)
{
Log(" - UseDefault: " + e.Reminders.UseDefault.ToString(), eventType);
}
if (e.Reminders.Overrides != null)
{
Log(" - Overrides:", eventType);
foreach (Google.Apis.Calendar.v3.Data.EventReminder o in e.Reminders.Overrides)
{
Log(" - Minutes: " + (o.Minutes != null ? o.Minutes.ToString() : "null"), eventType);
}
}
}
Log(" - Sequence: " + (e.Sequence != null ? e.Sequence.ToString() : "null"), eventType);
if (e.Source != null)
{
Log(" - Source:", eventType);
Log(" - Url: " + (e.Source.Url ?? "null"), eventType);
}
if (e.Start != null)
{
Log(" - Start:", eventType);
if (!string.IsNullOrEmpty(e.Start.Date))
{
Log(" - Date: " + e.Start.Date, eventType);
}
if (e.Start.DateTime != null)
{
Log(" - DateTime: " + e.Start.DateTime.Value.ToString(), eventType);
}
if (!string.IsNullOrEmpty(e.Start.TimeZone))
{
Log(" - TimeZone: " + e.Start.TimeZone, eventType);
}
}
Log(" - Status: " + (e.Status ?? "null"), eventType);
Log(" - Summary: " + (e.Summary ?? "null"), eventType);
Log(" - Transparency: " + (e.Transparency ?? "null"), eventType);
Log(" - Updated: " + (e.Updated != null ? e.Updated.ToString() : "null"), eventType);
Log(" - UpdatedRaw: " + (e.UpdatedRaw ?? "null"), eventType);
Log(" - Visibility: " + (e.Visibility ?? "null"), eventType);
Log("*** Google event ***", eventType);
}
public static void Log(Contact c, EventType eventType)
{
Log("*** Google contact ***", eventType);
if (c.AppControl != null)
{
Log(" - AppControl:", eventType);
}
if (c.AtomEntry != null)
{
Log(" - AtomEntry:", eventType);
}
Log(" - Author: " + (c.Author ?? "null"), eventType);
if (c.BatchData != null)
{
Log(" - BatchData:", eventType);
if (c.BatchData.Id != null)
{
Log(" - Id: " + c.BatchData.Id, eventType);
}
}
if (c.Categories != null)
{
Log(" - Categories:", eventType);
foreach (Google.GData.Client.AtomCategory e in c.Categories)
{
Log(" - Scheme: " + (e.Scheme ?? "null"), eventType);
Log(" - Term: " + (e.Term ?? "null"), eventType);
}
}
if (c.ContactEntry != null)
{
Log(" - ContactEntry:", eventType);
Log(" - Initials: " + (c.ContactEntry.Initials ?? "null"), eventType);
}
Log(" - Content: " + (c.Content ?? "null"), eventType);
Log(" - Deleted: " + c.Deleted.ToString(), eventType);
if (c.Emails != null)
{
Log(" - Emails:", eventType);
foreach (Google.GData.Extensions.EMail e in c.Emails)
{
Log(" - Address: " + (e.Address ?? "null"), eventType);
Log(" - Label: " + (e.Label ?? "null"), eventType);
Log(" - Primary: " + e.Primary.ToString(), eventType);
}
}
Log(" - ETag: " + (c.ETag ?? "null"), eventType);
if (c.ExtendedProperties != null)
{
Log(" - ExtendedProperties:", eventType);
foreach (Google.GData.Extensions.ExtendedProperty e in c.ExtendedProperties)
{
Log(" - Name: " + (e.Name ?? "null"), eventType);
Log(" - Value: " + (e.Value ?? "null"), eventType);
}
}
if (c.GroupMembership != null)
{
Log(" - GroupMembership:", eventType);
foreach (Google.GData.Contacts.GroupMembership e in c.GroupMembership)
{
Log(" - HRef: " + (e.HRef ?? "null"), eventType);
}
}
Log(" - Id: " + (c.Id ?? "null"), eventType);
if (c.IMs != null)
{
Log(" - IMs:", eventType);
foreach (Google.GData.Extensions.IMAddress e in c.IMs)
{
Log(" - Value: " + (e.Value ?? "null"), eventType);
}
}
Log(" - IsDraft: " + c.IsDraft.ToString(), eventType);
if (c.Languages != null)
{
Log(" - Languages:", eventType);
foreach (Google.GData.Contacts.Language e in c.Languages)
{
Log(" - Value: " + (e.Value ?? "null"), eventType);
}
}
Log(" - Location: " + (c.Location ?? "null"), eventType);
if (c.MediaSource != null)
{
Log(" - MediaSource:", eventType);
Log(" - Name: " + (c.MediaSource.Name ?? "null"), eventType);
}
if (c.Name != null)
{
Log(" - Name:", eventType);
Log(" - FamilyName: " + (c.Name.FamilyName ?? "null"), eventType);
Log(" - FullName: " + (c.Name.FullName ?? "null"), eventType);
Log(" - GivenName: " + (c.Name.GivenName ?? "null"), eventType);
}
if (c.Organizations != null)
{
Log(" - Organizations:", eventType);
foreach (Google.GData.Extensions.Organization e in c.Organizations)
{
Log(" - Name: " + (e.Name ?? "null"), eventType);
}
}
if (c.Phonenumbers != null)
{
Log(" - Phonenumbers:", eventType);
foreach (Google.GData.Extensions.PhoneNumber e in c.Phonenumbers)
{
Log(" - Rel: " + (e.Rel ?? "null"), eventType);
Log(" - Value: " + (e.Value ?? "null"), eventType);
}
}
Log(" - PhotoEtag: " + (c.PhotoEtag ?? "null"), eventType);
if (c.PhotoUri != null)
{
Log(" - PhotoUri:", eventType);
Log(" - OriginalString: " + (c.PhotoUri.OriginalString ?? "null"), eventType);
}
if (c.PostalAddresses != null)
{
Log(" - PostalAddresses:", eventType);
foreach (Google.GData.Extensions.StructuredPostalAddress e in c.PostalAddresses)
{
Log(" - Stret: " + (e.Street ?? "null"), eventType);
}
}
if (c.PrimaryEmail != null)
{
Log(" - PrimaryEmail:", eventType);
Log(" - Value: " + (c.PrimaryEmail.Value ?? "null"), eventType);
}
if (c.PrimaryIMAddress != null)
{
Log(" - PrimaryIMAddress:", eventType);
Log(" - Value: " + (c.PrimaryIMAddress.Value ?? "null"), eventType);
}
if (c.PrimaryPhonenumber != null)
{
Log(" - PrimaryPhonenumber:", eventType);
Log(" - Value: " + (c.PrimaryPhonenumber.Value ?? "null"), eventType);
}
if (c.PrimaryPostalAddress != null)
{
Log(" - PrimaryPostalAddress:", eventType);
Log(" - Street: " + (c.PrimaryPostalAddress.Street ?? "null"), eventType);
}
Log(" - ReadOnly: " + c.ReadOnly.ToString(), eventType);
Log(" - Self: " + (c.Self ?? "null"), eventType);
Log(" - Summary: " + (c.Summary ?? "null"), eventType);
Log(" - Title: " + (c.Title ?? "null"), eventType);
Log(" - Updated: " + (c.Updated != null ? c.Updated.ToString() : "null"), eventType);
Log("*** Google contact ***", eventType);
}
public static void ClearLog()
{
messages.Clear();
}
}
}