Beispiel #1
0
        private FreeTime subtractFromFive(DateTime startTime, DateTime endTime, int i)
        {
            FreeTime free = new FreeTime();


            DateTime startWorkHours = new DateTime(startTime.Year, startTime.Month, startTime.Day, 9, 0, 0);
            DateTime endWorkHours = new DateTime(startTime.Year, startTime.Month, startTime.Day, 5, 0, 0).AddHours(12);

            TimeSpan interval = endWorkHours - endTime;
            free.setStart(endWorkHours - interval);
            free.setEnd(endWorkHours);
           // Console.WriteLine("inside the five method : " + free.Start + " " + free.End);

            return free;


        }
Beispiel #2
0
        public CalendarEventList GetComparingEvents(DateTime timeMin, DateTime timeMax, List<String> CalendarIDs, String ViewFormat,bool primaryEmail)
        {

             allFree = new List<FreeTime>();
         finalFree = new List<FreeTime>();
         FinalallFree= new Dictionary<FreeTime, int>();
         FinalallFreeConnection = new Dictionary<FreeTime, String>();
         FreeBusy = new Dictionary<FreeTime, string>();
      FinalFreeBusy = new Dictionary<FreeTime, string>();
      primary = primaryEmail;
            if(primary)
                firstEmail = CalendarIDs[0].Substring(0, CalendarIDs[0].IndexOf("."));

            //Console.WriteLine("fffffffffffff "+ firstEmail);


            log.Debug("Try to compare  events from other Google Calendars ");
            CalendarEventList calendarEvents = new CalendarEventList();

            Dictionary<string, List<FreeTime>> personAndFreeTimes = new Dictionary<string, List<FreeTime>>();
            List<String> noEvents = new List<string>();

            

            try
            {
                foreach (String calendarID in CalendarIDs)
                {

                    List<FreeTime> freeTimeList = new List<FreeTime>();
                    if (timeMax.DayOfWeek == 0)
                        timeMax = timeMax.AddDays(-2);

                    if (timeMax.DayOfWeek == DayOfWeek.Saturday)
                        timeMax = timeMax.AddDays(-1);

                    if (timeMin.DayOfWeek == DayOfWeek.Saturday)
                        timeMax = timeMax.AddDays(+2);

                    if (timeMin.DayOfWeek == DayOfWeek.Sunday)
                        timeMax = timeMax.AddDays(+1);





                    EventsResource.ListRequest events = service.Events.List(calendarID);

                    events.SingleEvents = true;
                    events.MaxResults = 2500;
                    events.TimeMin = timeMin;
                    events.TimeMax = timeMax;
                    Events eventList = events.Execute();






                    FreeBusyRequest request = new FreeBusyRequest();
                    List<FreeBusyRequestItem> requestItems = new List<FreeBusyRequestItem>();
                    request.TimeMin = timeMin;
                    request.TimeMax = timeMax;
                    FreeBusyRequestItem r = new FreeBusyRequestItem();
                                                          

                    r.Id = calendarID;

                    request.Items = new List<FreeBusyRequestItem>();
                    request.Items.Add(r);

                    FreebusyResource.QueryRequest TestRequest = service.Freebusy.Query(request);
                    var responseOBJ = TestRequest.Execute();
                    int count = responseOBJ.Calendars[calendarID].Busy.Count;
                    

                    if (count == 0)
                    {
                        FreeTime free = new FreeTime();

                        free.setStart(new DateTime(timeMax.Year, timeMax.Month, timeMax.Day, 9, 0, 0));
                        free.setEnd(new DateTime(timeMax.Year, timeMax.Month, timeMax.Day, 5, 0, 0).AddHours(12));
                        free.setEmail(calendarID);
                        freeTimeList.Add(free);
                        //Console.WriteLine(calendarID + " " + free.Start + " " + free.End);

                    }


                    if (count != 0)
                    {


                       // Console.WriteLine(timeMax.Date + "date max ");
                        //Console.WriteLine(timeMin.Date + "date min ");
                       // Console.WriteLine(DateTime.Today + "fff");
                        DateTime d = timeMin.Date;
                        Boolean found = false;
                        

                        if (d.DayOfWeek == DayOfWeek.Sunday)
                            d = d.AddDays(1);

                      //  Console.WriteLine("first     "+ d.Date);
                        if (timeMax.Date.CompareTo(timeMin.Date) != 0 && d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday)
                        {

                            //Console.WriteLine("second    " + d.Date);
                        while (d <= timeMax)
                        {
                          found = false;
                            foreach (TimePeriod n in responseOBJ.Calendars[calendarID].Busy)
                            { 
                                //Console.WriteLine("third    " + d.Date);
                                //Console.WriteLine(d.CompareTo(n.Start.Value.Date) + " d: " + d.Date + "n :  " + n.Start.Value.Date); 
                                if (d.CompareTo(n.Start.Value.Date) == 0)
                                {
                                    found = true;
                                    break;
                                }
                            }

                           // Console.WriteLine("fourth    " + d.Date + " " + found);
                            if (!found)
                            {
                                //Console.WriteLine("not found    " + d.Date);
                                FreeTime free = new FreeTime();

                                free.setStart(new DateTime(d.Year, d.Month, d.Day, 9, 0, 0));
                                free.setEnd(new DateTime(d.Year, d.Month, d.Day, 5, 0, 0).AddHours(12));
                                free.setEmail(calendarID);
                                freeTimeList.Add(free);
                               // Console.WriteLine("adding to list    " + free.Start + " " + free.End);
                            }
                            d= d.AddDays(+1);
                            
                            if (d.DayOfWeek == DayOfWeek.Saturday)
                                d = d.AddDays(+2);
                            
                        }
                        }


                        int i = 0;
                        int j = 0;
                        Boolean singleevent = false;
                       // Console.WriteLine("the count " + count);
                        if (count == 1) singleevent = true;
                        while (i < count && count != 0)
                        {
                            FreeTime free = new FreeTime();
                            Boolean startatNine = false;
                            Boolean endFive = false;

                            DateTime starttime = (responseOBJ.Calendars[calendarID].Busy[i].Start).Value;
                            DateTime endtime = (responseOBJ.Calendars[calendarID].Busy[i].End).Value;


                           // Console.WriteLine(" lets see " + starttime + " " + endtime);

                            DateTime startworkhours = new DateTime(starttime.Year, starttime.Month, starttime.Day, 9, 0, 0);
                            DateTime endworkhours = new DateTime(starttime.Year, starttime.Month, starttime.Day, 5, 0, 0).AddHours(12);


                            if (i == 0 && singleevent == false)
                            {
                                if (j == 0 && (DateTime.Compare(startworkhours, starttime) != 0))
                                {
                                    free = subtractFromNine(starttime, endtime, i);
                                    free.setEmail(calendarID);

                                    if ((DateTime.Compare(starttime.Date, ((DateTime)responseOBJ.Calendars[calendarID].Busy[i + 1].Start).Date) < 0))
                                    {

                                        i--;
                                        j++;
                                    }

                                }



                                else if (startworkhours.Equals(starttime) || j > 0)
                                {
                                    //Console.WriteLine("urghhhhh" + DateTime.Compare(starttime.Date, ((DateTime)responseOBJ.Calendars[calendarID].Busy[i + 1].Start).Date));

                                    if (startworkhours.Equals(starttime) && j == 0)
                                    {

                                       // Console.WriteLine("inside second if ");
                                        startatNine = true;
                                        if (DateTime.Compare(starttime.Date, ((DateTime)responseOBJ.Calendars[calendarID].Busy[i + 1].Start).Date) < 0)
                                        {
                                          // Console.WriteLine("::::::::::::::::::::::::::::::::::::::::::::::::::::");
                                            j++;
                                            i--;

                                        }


                                    }

                                    else if ((DateTime.Compare(starttime.Date, ((DateTime)responseOBJ.Calendars[calendarID].Busy[i + 1].Start).Date) < 0) && j > 0)
                                    {
                                        //Console.WriteLine("inside first if ");
                                        free = subtractFromFive(starttime, endtime, i);
                                        free.setEmail(calendarID);
                                        j = 0;
                                    }

                                }

                            }




                            else if (i + 1 == count && singleevent == false)
                            {
                                if (j == 0)
                                {
                                   //Console.WriteLine(" else if (i + 1 == count && !(endworkhours.equals(endtime)) && singleevent == false) j==0 ");
                                    DateTime tempstarttime = (responseOBJ.Calendars[calendarID].Busy[i - 1].Start).Value;
                                    DateTime tempendtime = (responseOBJ.Calendars[calendarID].Busy[i - 1].End).Value;

                                    if ((DateTime.Compare(starttime.Date, tempendtime.Date) == 0))
                                    {
                                        //Console.WriteLine(" entered if ");
                                        TimeSpan interval = starttime - tempendtime;
                                        free.setStart(starttime - interval);
                                        //Console.WriteLine(free.Start);
                                        free.setEnd(starttime);
                                        free.setEmail(calendarID);

                                  }

                                    else
                                    {
                                        free = subtractFromNine(starttime, endtime, i);
                                        
                                    }

                                    if (!(endworkhours.Equals(endtime)))
                                    {
                                        j++;
                                        i--;
                                    }

                                }
                                else
                                {
                                    if (!(endworkhours.Equals(endtime)))
                                    {
                                        free = subtractFromFive(starttime, endtime, i);
                                        j = 0;
                                    }
                                    else endFive = true;


                                }


                            }
                            else if (singleevent)
                            {
                                //Console.WriteLine("inside single event " + j + " " + starttime + " " + startworkhours);
                                if (j == 0 && !(DateTime.Compare(starttime, startworkhours) == 0))
                                {
                                    free = subtractFromNine(starttime, endtime, i);


                                    if (!(DateTime.Compare(endtime, endworkhours) == 0))
                                    {
                                        j++;
                                        i--;
                                    }

                                }


                                else
                                {
                                    if (!(DateTime.Compare(endtime, endworkhours) == 0))
                                    {
                                        free = subtractFromFive(starttime, endtime, i);
                                        free.setEmail(calendarID);
                                        j = 0;
                                    }
                                    else endFive = true;

                                }


                            }

                            else
                            {

                               //Console.WriteLine("yaaaaaaaaaaaaaaarab");
                                DateTime tempstarttime = (responseOBJ.Calendars[calendarID].Busy[i - 1].Start).Value;
                                DateTime tempendtime = (responseOBJ.Calendars[calendarID].Busy[i - 1].End).Value;
                                if (j == 0)
                                {
                                    if ((DateTime.Compare(tempendtime.Date, starttime.Date) == 0))
                                    {
                                        //Console.WriteLine("entered the first");
                                        TimeSpan interval = starttime - tempendtime;
                                        free.setStart(starttime - interval);
                                        free.setEnd(starttime);
                                        free.setEmail(calendarID);


                                    }

                                    else
                                    {
                                        //Console.WriteLine("entered the second");
                                        if (startworkhours.Equals(starttime))
                                        {
                                           // Console.WriteLine("statrt at nine");
                                            startatNine = true;
                                        }
                                        else
                                        {
                                            free = subtractFromNine(starttime, endtime, i);
                                        }

                                    }

                                    if ((DateTime.Compare(starttime.Date, ((DateTime)(responseOBJ.Calendars[calendarID].Busy[i + 1].Start).Value).Date) < 0))
                                    {
                                       //Console.WriteLine("entered the comparason");
                                        i--;
                                        j++;



                                    }

                                }
                                else
                                {
                                    //Console.WriteLine("supposed " + endworkhours.Equals(endtime));
                                    if (!(endworkhours.Equals(endtime)))
                                    {
                                        free = subtractFromFive(starttime, endtime, i);
                                        free.setEmail(calendarID);
                                        j = 0;
                                    }
                                    else { endFive = true; j = 0; }

                                }



                            }
                            i++;


                            if (!startatNine && !endFive)
                            {
                                //Console.WriteLine("befor adding " + free.Start + "  " + free.End);
                                freeTimeList.Add(free);
                               //  Console.WriteLine(calendarID + " " + free.Start + " " + free.End);

                            }

                            //Console.WriteLine("after adding to list");

                        }//end while
                    }//end if (count !=0 )

                   
                    personAndFreeTimes.Add(calendarID.Substring(0, calendarID.IndexOf(".")), freeTimeList);

                    //foreach (String k in personAndFreeTimes.Keys)
                    //{
                    //    foreach (FreeTime f in personAndFreeTimes[k])
                    //        //Console.WriteLine(k + " " + f.Start + " " + f.End);
                    //}

                    freeTimeList.Sort();

                   

                    }//end foreach


                numberOfEmails = personAndFreeTimes.Count;
                Stack myStack = new Stack();
                foreach (String key in personAndFreeTimes.Keys)
                {


                    myStack.Push(personAndFreeTimes[key]);
                }

                //  -----------------------------------  All People View   --------------------------------------------------   //

                if (ViewFormat == "All People")
                {

                 
                    Stack s1 = new Stack();
                    Stack s2 = new Stack();
                    foreach (String key in personAndFreeTimes.Keys)
                    {
                        // string result = noEvents.Find(delegate(String  i) { return i == key; });
                        //  if(result!=null)
                        KeyValuePair<List<FreeTime>, String> pair = new KeyValuePair<List<FreeTime>, String>(personAndFreeTimes[key], key);

                        s1.Push(pair);
                        s2.Push(pair);
                        //Console.WriteLine("pair " + pair.Key.ToString() + " " + pair.Value);
                    }



                    while (s1.Count != 0)
                    {
                        KeyValuePair<List<FreeTime>, String> sp1 = (KeyValuePair<List<FreeTime>, String>)s1.Pop();
                        while (s2.Count != 0)
                        {
                            KeyValuePair<List<FreeTime>, String> sp2 = (KeyValuePair<List<FreeTime>, String>)s2.Pop();
                            if (!(sp1.Value.Equals(sp2.Value)))
                                FindMutual2(sp1, sp2);
                        }
                        s2 = s1;
                    }



                    FinalMutual2();

                    if (personAndFreeTimes.Count > 2)
                    {

                        FinalMutual3();
                        FinalMutual3();
                    }
                    //Console.WriteLine(" back to main");
                    // FinalMutual4();
                    calendarEvents = ConvertToMutualCalendarEvents(FinalFreeBusy);

                }//end if All People view

                //  -----------------------------------     --------------------------------------------------   //


                //  -----------------------------------  "Some People" View   --------------------------------------------------   //

                if (ViewFormat == "Some People")
                {

                    Stack s1 = new Stack();
                    Stack s2 = new Stack();
                    foreach (String key in personAndFreeTimes.Keys)
                    {
                        
                        KeyValuePair<List<FreeTime>, String> pair = new KeyValuePair<List<FreeTime>, String>(personAndFreeTimes[key], key);

                        s1.Push(pair);
                        s2.Push(pair);
                        //Console.WriteLine("pair " + pair.Key.ToString() + " " + pair.Value);
                    }



                    while (s1.Count != 0)
                    {
                        KeyValuePair<List<FreeTime>, String> sp1 = (KeyValuePair<List<FreeTime>, String>)s1.Pop();
                        while (s2.Count != 0)
                        {
                            KeyValuePair<List<FreeTime>, String> sp2 = (KeyValuePair<List<FreeTime>, String>)s2.Pop();
                            if (!(sp1.Value.Equals(sp2.Value)))
                                FindMutual2(sp1, sp2);
                        }
                        s2 = s1;
                    }



                    FinalMutual2();

                    // if (personAndFreeTimes.Count > 2)
                    int num = 1;
                    while( num<personAndFreeTimes.Count)
                    {
                        FinalMutual3();
                        num++;
                    }
                    FinalMutual3();
                    
                    calendarEvents = ConvertToFreeBusyCalendarEvents(FinalFreeBusy);
                } //end free busy view 

                //Console.WriteLine("before sort");
                calendarEvents.SortByDate();

                log.Debug("Successfully compared  events from other Google Calendars");
            }// end try


            catch (Exception ex)
            {
                log.Error("Failed to compare  events from other  Google Calendars with error:", ex);
            }

            
            return calendarEvents;

        }