1d7c6f72b5ef277e562d0da0f8e3c211ef520061
[vuplus_xbmc] / xbmc / utils / AlarmClock.cpp
1 /*
2  *      Copyright (C) 2005-2013 Team XBMC
3  *      http://xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, see
17  *  <http://www.gnu.org/licenses/>.
18  *
19  */
20
21 #include "AlarmClock.h"
22 #include "ApplicationMessenger.h"
23 #include "guilib/LocalizeStrings.h"
24 #include "threads/SingleLock.h"
25 #include "log.h"
26 #include "dialogs/GUIDialogKaiToast.h"
27
28 using namespace std;
29
30 CAlarmClock::CAlarmClock() : CThread("AlarmClock"), m_bIsRunning(false)
31 {
32 }
33
34 CAlarmClock::~CAlarmClock()
35 {
36 }
37
38 void CAlarmClock::Start(const CStdString& strName, float n_secs, const CStdString& strCommand, bool bSilent /* false */, bool bLoop /* false */)
39 {
40   // make lower case so that lookups are case-insensitive
41   CStdString lowerName(strName);
42   lowerName.ToLower();
43   Stop(lowerName);
44   SAlarmClockEvent event;
45   event.m_fSecs = n_secs;
46   event.m_strCommand = strCommand;
47   event.m_loop = bLoop;
48   if (!m_bIsRunning)
49   {
50     StopThread();
51     Create();
52     m_bIsRunning = true;
53   }
54
55   CStdString strAlarmClock;
56   CStdString strStarted;
57   if (strName.CompareNoCase("shutdowntimer") == 0)
58   {
59     strAlarmClock = g_localizeStrings.Get(20144);
60     strStarted = g_localizeStrings.Get(20146);
61   }
62   else
63   {
64     strAlarmClock = g_localizeStrings.Get(13208);
65     strStarted = g_localizeStrings.Get(13210);
66   }
67
68   CStdString strMessage;
69
70   strMessage.Format(strStarted.c_str(),static_cast<int>(event.m_fSecs)/60,static_cast<int>(event.m_fSecs)%60);
71
72   if(!bSilent)
73      CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, strAlarmClock, strMessage);
74
75   event.watch.StartZero();
76   CSingleLock lock(m_events);
77   m_event.insert(make_pair(lowerName,event));
78   CLog::Log(LOGDEBUG,"started alarm with name: %s",lowerName.c_str());
79 }
80
81 void CAlarmClock::Stop(const CStdString& strName, bool bSilent /* false */)
82 {
83   CSingleLock lock(m_events);
84
85   CStdString lowerName(strName);
86   lowerName.ToLower();          // lookup as lowercase only
87   map<CStdString,SAlarmClockEvent>::iterator iter = m_event.find(lowerName);
88
89   if (iter == m_event.end())
90     return;
91
92   SAlarmClockEvent& event = iter->second;
93
94   CStdString strAlarmClock;
95   if (event.m_strCommand.Equals("xbmc.powerdown") || event.m_strCommand.Equals("xbmc.powerdown()"))
96     strAlarmClock = g_localizeStrings.Get(20144);
97   else
98     strAlarmClock = g_localizeStrings.Get(13208);
99
100   CStdString strMessage;
101   if( iter->second.watch.GetElapsedSeconds() > iter->second.m_fSecs )
102     strMessage = g_localizeStrings.Get(13211);
103   else
104   {
105     float remaining = static_cast<float>(iter->second.m_fSecs-iter->second.watch.GetElapsedSeconds());
106     CStdString strStarted = g_localizeStrings.Get(13212);
107     strMessage.Format(strStarted.c_str(),static_cast<int>(remaining)/60,static_cast<int>(remaining)%60);
108   }
109   if (iter->second.m_strCommand.IsEmpty() || iter->second.m_fSecs > iter->second.watch.GetElapsedSeconds())
110   {
111     if(!bSilent)
112       CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, strAlarmClock, strMessage);
113   }
114   else
115   {
116     CApplicationMessenger::Get().ExecBuiltIn(iter->second.m_strCommand);
117     if (iter->second.m_loop)
118     {
119       iter->second.watch.Reset();
120       return;
121     }
122   }
123
124   iter->second.watch.Stop();
125   m_event.erase(iter);
126 }
127
128 void CAlarmClock::Process()
129 {
130   while( !m_bStop)
131   {
132     CStdString strLast = "";
133     {
134       CSingleLock lock(m_events);
135       for (map<CStdString,SAlarmClockEvent>::iterator iter=m_event.begin();iter != m_event.end(); ++iter)
136         if (iter->second.watch.GetElapsedSeconds() >= iter->second.m_fSecs)
137         {
138           Stop(iter->first);
139           if ((iter = m_event.find(strLast)) == m_event.end())
140             break;
141         }
142         else
143           strLast = iter->first;
144     }
145     Sleep(100);
146   }
147 }
148