AnnoucementManager should take a Variant reference instead of pointer
[xbmc:xbmc-antiquated.git] / xbmc / utils / AnnouncementManager.cpp
1 /*
2  *      Copyright (C) 2005-2010 Team XBMC
3  *      http://www.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, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21
22 #include "AnnouncementManager.h"
23 #include "SingleLock.h"
24 #include <stdio.h>
25 #include "log.h"
26 #include "Variant.h"
27 #include "FileItem.h"
28 #include "MusicInfoTag.h"
29
30 using namespace std;
31 using namespace ANNOUNCEMENT;
32
33 CCriticalSection CAnnouncementManager::m_critSection;
34 vector<IAnnouncer *> CAnnouncementManager::m_announcers;
35
36 void CAnnouncementManager::AddAnnouncer(IAnnouncer *listener)
37 {
38   CSingleLock lock (m_critSection);
39   m_announcers.push_back(listener);
40 }
41
42 void CAnnouncementManager::RemoveAnnouncer(IAnnouncer *listener)
43 {
44   CSingleLock lock (m_critSection);
45   for (unsigned int i = 0; i < m_announcers.size(); i++)
46   {
47     if (m_announcers[i] == listener)
48     {
49       m_announcers.erase(m_announcers.begin() + i);
50       return;
51     }
52   }
53 }
54
55 void CAnnouncementManager::Announce(EAnnouncementFlag flag, const char *sender, const char *message)
56 {
57   CVariant data;
58   Announce(flag, sender, message, data);
59 }
60
61 void CAnnouncementManager::Announce(EAnnouncementFlag flag, const char *sender, const char *message, CVariant &data)
62 {
63   CLog::Log(LOGDEBUG, "CAnnouncementManager - Announcement: %s from %s", message, sender);
64   CSingleLock lock (m_critSection);
65   for (unsigned int i = 0; i < m_announcers.size(); i++)
66     m_announcers[i]->Announce(flag, sender, message, data);
67 }
68
69 void CAnnouncementManager::Announce(EAnnouncementFlag flag, const char *sender, const char *message, CFileItemPtr item)
70 {
71   CVariant data;
72   Announce(flag, sender, message, data);
73 }
74
75 void CAnnouncementManager::Announce(EAnnouncementFlag flag, const char *sender, const char *message, CFileItemPtr item, CVariant &data)
76 {
77   // Extract db id of item
78   CVariant object = data.isNull() || data.isObject() ? data : CVariant::VariantTypeObject;
79   CStdString type;
80   int id = 0;
81
82   if (item->HasVideoInfoTag())
83   {
84     CVideoDatabase::VideoContentTypeToString(item->GetVideoContentType(), type);
85     id = item->GetVideoInfoTag()->m_iDbId;
86   }
87   else if (item->HasMusicInfoTag())
88   {
89     type = "music";
90     id = item->GetMusicInfoTag()->GetDatabaseId();
91   }
92
93   if (id > 0)
94   {
95     type += "id";
96     object[type] = id;
97   }
98
99   Announce(flag, sender, message, object);
100 }