calendarui/regionalplugins/calenregionalutil/src/calenlunarinfoprovider.cpp
changeset 0 f979ecb2b13e
child 18 c198609911f9
child 65 12af337248b1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/regionalplugins/calenregionalutil/src/calenlunarinfoprovider.cpp	Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,206 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   Calendar Lunar Plugin 
+*
+*/
+
+
+#include "calendarui_debug.h"
+#include "calenlunarinfoprovider.h"
+#include "calenlunarinfo.h"
+#include "calensolarterms.h"
+
+#include <calendarconverter.h>
+
+
+// ---------------------------------------------------------
+// CCalenCalanderConverter::CalculateCelestialIndex
+// Calculates a Heavenly stem's index and a Terrestrial branch's index
+// ---------------------------------------------------------
+//
+static void CelestialIndex(const TChineseDate& aChineseDate,
+                           TInt& aCelestialIndex, 
+                           TInt& aTerrestrialIndex)
+    {
+    TRACE_ENTRY_POINT;
+    
+    aCelestialIndex = aChineseDate.iYear % 10;
+    
+    if (aCelestialIndex == 0)
+        {
+        aCelestialIndex = 9;
+        }
+    else
+        {
+        aCelestialIndex--;
+        }
+
+    aTerrestrialIndex = aChineseDate.iYear % 12;
+    if (aTerrestrialIndex == 0)
+        {
+        aTerrestrialIndex = 11;
+        }
+    else
+        {
+        aTerrestrialIndex--;
+        }
+    
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenCalanderConverter::ChineseFestival
+// -----------------------------------------------------------------------------
+//
+static TCalenLunarInfo::TFestival ChineseFestival(
+    const TChineseDate& aChineseDate, 
+    const TChineseDate& aNextDate)
+    {
+    TRACE_ENTRY_POINT;
+    
+    TCalenLunarInfo::TFestival index = TCalenLunarInfo::ENoFestival;
+
+    if (!aChineseDate.iLeapMonth)
+        {
+        if (aChineseDate.iMonth == 1 && aChineseDate.iDay == 1)
+            {
+            index = TCalenLunarInfo::EFestivalSpring;
+            }
+        else if (aChineseDate.iMonth == 1 && aChineseDate.iDay == 15)
+            {
+            index = TCalenLunarInfo::EFestivalLantern;
+            }
+        else if (aChineseDate.iMonth == 5 && aChineseDate.iDay == 5)
+            {
+            index = TCalenLunarInfo::EFestivalDragonBoat;
+            }
+        else if (aChineseDate.iMonth == 7 && aChineseDate.iDay == 7)
+            {
+            index = TCalenLunarInfo::EFestivalSeventhNight;
+            }
+        else if (aChineseDate.iMonth == 7 && aChineseDate.iDay == 15)
+            {
+            index = TCalenLunarInfo::EFestivalGhost;
+            }
+        else if (aChineseDate.iMonth == 8 && aChineseDate.iDay == 15)
+            {
+            index = TCalenLunarInfo::EFestivalMidAutumn;
+            }
+        else if (aChineseDate.iMonth == 9 && aChineseDate.iDay == 9)
+            {
+            index = TCalenLunarInfo::EFestivalDoubleNinth;
+            }
+        else if (aChineseDate.iMonth == 12 && aChineseDate.iDay == 8)
+            {
+            index = TCalenLunarInfo::EFestivalTwelfthMonth;
+            }
+        else
+            {
+            // nothing
+            }
+        }
+    if (!aNextDate.iLeapMonth &&
+        aNextDate.iMonth == 1 && aNextDate.iDay == 1)
+        {
+        index = TCalenLunarInfo::EFestivalNewYearEve;
+        }
+    
+    TRACE_EXIT_POINT;
+    return index;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenLunarInfoProvider::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCalenLunarInfoProvider* CCalenLunarInfoProvider::NewL(RFs& aFs)
+    {
+    TRACE_ENTRY_POINT;
+    
+    CCalenLunarInfoProvider* self = new (ELeave) CCalenLunarInfoProvider();
+    CleanupStack::PushL(self);
+    self->ConstructL(aFs);
+    CleanupStack::Pop(self);
+    
+    TRACE_EXIT_POINT;
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenLunarInfoProvider::~CCalenLunarInfoProvider
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCalenLunarInfoProvider::~CCalenLunarInfoProvider()
+    {
+    TRACE_ENTRY_POINT;
+    
+    delete iSolarTerms; 
+    delete iConverter;
+    
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenLunarInfoProvider::CCalenLunarInfoProvider
+// -----------------------------------------------------------------------------
+//
+CCalenLunarInfoProvider::CCalenLunarInfoProvider()
+    {
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenLunarInfoProvider::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CCalenLunarInfoProvider::ConstructL(RFs& aFs)
+    {
+    TRACE_ENTRY_POINT;
+
+    iConverter = CChineseCalendarConverter::NewL();
+    iSolarTerms = CCalenSolarTerms::NewL(aFs);
+    
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenLunarInfoProvider::GetLunarInfoL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TCalenLunarInfo CCalenLunarInfoProvider::GetLunarInfoL( const TTime& aDay ) 
+    {
+    TRACE_ENTRY_POINT;
+       
+    TDateTime dayDt = aDay.DateTime();
+
+    TTime nextDay = aDay + TTimeIntervalDays(1);
+    TDateTime nextDayDt = nextDay.DateTime();
+
+    TChineseDate chineseDate;
+    TChineseDate nextChineseDate;
+    
+    iConverter->DateTimeToChineseL(dayDt, chineseDate);
+    iConverter->DateTimeToChineseL(nextDayDt, nextChineseDate);
+    
+    TCalenLunarInfo info;
+    info.iLunarDate = chineseDate;
+    info.iGregorianDate = aDay;
+    info.iFestival = ChineseFestival( chineseDate, nextChineseDate );
+    info.iSolarTerm = iSolarTerms->CheckSolarTermDateL( dayDt );
+    CelestialIndex( chineseDate, info.iHeavenlyStem, info.iTerrestialBranch );
+    
+    TRACE_EXIT_POINT;
+    return info;
+    }