using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using Google.Contacts;
using Outlook = Microsoft.Office.Interop.Outlook;
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);
}
var logFileName = Folder + "log.txt";
//If log file is bigger than 1 MB, move it to backup file and create new file
var 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)
{
var 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)
{
var 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(Outlook.AppointmentItem e, EventType eventType)
{
Log("*** Outlook appointment ***", eventType);
Log(" - AllDayEvent: " + e.AllDayEvent ?? "null", eventType);
if (e.Attachments != null)
{
if (e.Attachments.Count > 0)
{
Log(" - Attachments:", eventType);
foreach (Outlook.Attachment a in e.Attachments)
{
Log(" - Attachment: " + (a.DisplayName ?? "null"), eventType);
}
}
}
Log(" - AutoResolvedWinner: " + e.AutoResolvedWinner ?? "null", eventType);
Log(" - BillingInformation: " + e.BillingInformation ?? "null", eventType);
Log(" - Body: " + e.Body ?? "null", eventType);
Log(" - BusyStatus: " + e.BusyStatus ?? "null", eventType);
Log(" - Categories: " + e.Categories ?? "null", eventType);
Log(" - Companies: " + e.Companies ?? "null", eventType);
Log(" - ConferenceServerAllowExternal: " + e.ConferenceServerAllowExternal ?? "null", eventType);
Log(" - ConferenceServerPassword: " + e.ConferenceServerPassword ?? "null", eventType);
if (e.Conflicts != null)
{
if (e.Conflicts.Count > 0)
{
Log(" - Conflicts:", eventType);
foreach (Outlook.Conflict a in e.Conflicts)
{
Log(" - Conflicts: " + (a.Name ?? "null"), eventType);
}
}
}
Log(" - ConversationID: " + e.ConversationID ?? "null", eventType);
Log(" - ConversationIndex: " + e.ConversationIndex ?? "null", eventType);
Log(" - ConversationTopic: " + e.ConversationTopic ?? "null", eventType);
Log(" - CreationTime: " + e.CreationTime ?? "null", eventType);
Log(" - DownloadState: " + e.DownloadState ?? "null", eventType);
Log(" - Duration: " + e.Duration ?? "null", eventType);
Log(" - End: " + e.End ?? "null", eventType);
Log(" - EndInEndTimeZone: " + e.EndInEndTimeZone ?? "null", eventType);
if (e.EndTimeZone != null)
{
Log(" - EndTimeZone: " + e.EndTimeZone.ID ?? "null", eventType);
}
Log(" - EndUTC: " + e.EndUTC ?? "null", eventType);
Log(" - ForceUpdateToAllAttendees: " + e.ForceUpdateToAllAttendees ?? "null", eventType);
Log(" - Importance: " + e.Importance ?? "null", eventType);
Log(" - InternetCodepage: " + e.InternetCodepage ?? "null", eventType);
Log(" - IsConflict: " + e.IsConflict ?? "null", eventType);
Log(" - IsOnlineMeeting: " + e.IsOnlineMeeting ?? "null", eventType);
Log(" - IsRecurring: " + e.IsRecurring ?? "null", eventType);
Log(" - LastModificationTime: " + e.LastModificationTime ?? "null", eventType);
Log(" - Location: " + e.Location ?? "null", eventType);
Log(" - MarkForDownload: " + e.MarkForDownload ?? "null", eventType);
Log(" - MeetingStatus: " + e.MeetingStatus ?? "null", eventType);
Log(" - MeetingWorkspaceURL: " + e.MeetingWorkspaceURL ?? "null", eventType);
Log(" - Mileage: " + e.Mileage ?? "null", eventType);
Log(" - NetMeetingDocPathName: " + e.NetMeetingDocPathName ?? "null", eventType);
Log(" - NetMeetingOrganizerAlias: " + e.NetMeetingOrganizerAlias ?? "null", eventType);
Log(" - NetMeetingServer: " + e.NetMeetingServer ?? "null", eventType);
Log(" - NetMeetingType: " + e.NetMeetingType ?? "null", eventType);
Log(" - NetShowURL: " + e.NetShowURL ?? "null", eventType);
Log(" - NoAging: " + e.NoAging ?? "null", eventType);
Log(" - OptionalAttendees: " + e.OptionalAttendees ?? "null", eventType);
Log(" - Organizer: " + e.Organizer ?? "null", eventType);
if (e.Recipients != null)
{
if (e.Recipients.Count > 0)
{
Log(" - Recipients:", eventType);
foreach (Outlook.Recipient a in e.Recipients)
{
Log(" - Recipients: " + (a.Name ?? "null"), eventType);
}
}
}
Log(" - RecurrenceState: " + e.RecurrenceState ?? "null", eventType);
Log(" - ReminderMinutesBeforeStart: " + e.ReminderMinutesBeforeStart ?? "null", eventType);
Log(" - ReminderOverrideDefault: " + e.ReminderOverrideDefault ?? "null", eventType);
Log(" - ReminderPlaySound: " + e.ReminderPlaySound ?? "null", eventType);
Log(" - ReminderSet: " + e.ReminderSet ?? "null", eventType);
Log(" - ReminderSoundFile: " + e.ReminderSoundFile ?? "null", eventType);
Log(" - ReplyTime: " + e.ReplyTime ?? "null", eventType);
Log(" - RequiredAttendees: " + e.RequiredAttendees ?? "null", eventType);
Log(" - Resources: " + e.Resources ?? "null", eventType);
Log(" - ResponseRequested: " + e.ResponseRequested ?? "null", eventType);
Log(" - ResponseStatus: " + e.ResponseStatus ?? "null", eventType);
Log(" - RTFBody: " + e.RTFBody ?? "null", eventType);
Log(" - Saved: " + e.Saved ?? "null", eventType);
Log(" - Sensitivity: " + e.Sensitivity ?? "null", eventType);
Log(" - Size: " + e.Size ?? "null", eventType);
Log(" - Start: " + e.Start ?? "null", eventType);
Log(" - StartInStartTimeZone: " + e.StartInStartTimeZone ?? "null", eventType);
if (e.StartTimeZone != null)
{
Log(" - StartTimeZone: " + e.StartTimeZone.ID ?? "null", eventType);
}
Log(" - StartUTC: " + e.StartUTC ?? "null", eventType);
Log(" - Subject: " + e.Subject ?? "null", eventType);
Log(" - UnRead: " + e.UnRead ?? "null", eventType);
if (e.UserProperties != null)
{
if (e.UserProperties.Count > 0)
{
Log(" - UserProperties:", eventType);
foreach (Outlook.UserProperty a in e.UserProperties)
{
Log(" - UserProperty: " + (a.Name ?? "null") + "(" + (a.Value ?? "null") + ")", eventType);
}
}
}
var r = e.GetRecurrencePattern();
if (r != null)
{
Log("** Outlook appointment recurrence **", eventType);
Log(" - DayOfMonth: " + r.DayOfMonth ?? "null", eventType);
Log(" - DayOfWeekMask: " + r.DayOfWeekMask ?? "null", eventType);
Log(" - Duration: " + r.Duration ?? "null", eventType);
Log(" - EndTime: " + r.EndTime ?? "null", eventType);
Log(" - Exceptions: " + r.Exceptions ?? "null", eventType);
Log(" - Instance: " + r.Instance ?? "null", eventType);
Log(" - Interval: " + r.Interval ?? "null", eventType);
Log(" - MonthOfYear: " + r.MonthOfYear ?? "null", eventType);
Log(" - NoEndDate: " + r.NoEndDate ?? "null", eventType);
Log(" - Occurrences: " + r.Occurrences ?? "null", eventType);
Log(" - PatternEndDate: " + r.PatternEndDate ?? "null", eventType);
Log(" - PatternStartDate: " + r.PatternStartDate ?? "null", eventType);
Log(" - RecurrenceType: " + r.RecurrenceType ?? "null", eventType);
Log(" - Regenerate: " + r.Regenerate ?? "null", eventType);
Log(" - StartTime: " + r.StartTime ?? "null", eventType);
Log("** Outlook appointment recurrence **", eventType);
}
Log("*** Outlook appointment ***", eventType);
}
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 (var a in e.Attachments)
{
Log(" - Title: " + (a.Title ?? "null"), eventType);
}
}
if (e.Attendees != null)
{
Log(" - Attendees:", eventType);
foreach (var 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 (var 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 (var 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 (var 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 (var 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 (var 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 (var 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 (var e in c.ExtendedProperties)
{
Log(" - Name: " + (e.Name ?? "null"), eventType);
Log(" - Value: " + (e.Value ?? "null"), eventType);
}
}
if (c.GroupMembership != null)
{
Log(" - GroupMembership:", eventType);
foreach (var e in c.GroupMembership)
{
Log(" - HRef: " + (e.HRef ?? "null"), eventType);
}
}
Log(" - Id: " + (c.Id ?? "null"), eventType);
if (c.IMs != null)
{
Log(" - IMs:", eventType);
foreach (var e in c.IMs)
{
Log(" - Value: " + (e.Value ?? "null"), eventType);
}
}
Log(" - IsDraft: " + c.IsDraft.ToString(), eventType);
if (c.Languages != null)
{
Log(" - Languages:", eventType);
foreach (var 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 (var e in c.Organizations)
{
Log(" - Name: " + (e.Name ?? "null"), eventType);
}
}
if (c.Phonenumbers != null)
{
Log(" - Phonenumbers:", eventType);
foreach (var 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 (var 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();
}
}
}