[bluray] Fix stream info/language retrieval for blurays in non-nav mode.
[vuplus_xbmc] / xbmc / BackgroundInfoLoader.cpp
1 /*
2  *      Copyright (C) 2005-2013 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, see
17  *  <http://www.gnu.org/licenses/>.
18  *
19  */
20
21 #include "BackgroundInfoLoader.h"
22 #include "FileItem.h"
23 #include "settings/AdvancedSettings.h"
24 #include "threads/SingleLock.h"
25 #include "utils/log.h"
26
27 using namespace std;
28
29 CBackgroundInfoLoader::CBackgroundInfoLoader() : m_thread (NULL)
30 {
31   m_bStop = true;
32   m_pObserver=NULL;
33   m_pProgressCallback=NULL;
34   m_pVecItems = NULL;
35 }
36
37 CBackgroundInfoLoader::~CBackgroundInfoLoader()
38 {
39   StopThread();
40 }
41
42 void CBackgroundInfoLoader::Run()
43 {
44   try
45   {
46     if (m_vecItems.size() > 0)
47     {
48       OnLoaderStart();
49
50       // Stage 1: All "fast" stuff we have already cached
51       for (vector<CFileItemPtr>::const_iterator iter = m_vecItems.begin(); iter != m_vecItems.end(); ++iter)
52       {
53         CFileItemPtr pItem = *iter;
54
55         // Ask the callback if we should abort
56         if ((m_pProgressCallback && m_pProgressCallback->Abort()) || m_bStop)
57           break;
58
59         try
60         {
61           if (LoadItemCached(pItem.get()) && m_pObserver)
62             m_pObserver->OnItemLoaded(pItem.get());
63         }
64         catch (...)
65         {
66           CLog::Log(LOGERROR, "CBackgroundInfoLoader::LoadItemCached - Unhandled exception for item %s", pItem->GetPath().c_str());
67         }
68       }
69
70       // Stage 2: All "slow" stuff that we need to lookup
71       for (vector<CFileItemPtr>::const_iterator iter = m_vecItems.begin(); iter != m_vecItems.end(); ++iter)
72       {
73         CFileItemPtr pItem = *iter;
74
75         // Ask the callback if we should abort
76         if ((m_pProgressCallback && m_pProgressCallback->Abort()) || m_bStop)
77           break;
78
79         try
80         {
81           if (LoadItemLookup(pItem.get()) && m_pObserver)
82             m_pObserver->OnItemLoaded(pItem.get());
83         }
84         catch (...)
85         {
86           CLog::Log(LOGERROR, "CBackgroundInfoLoader::LoadItemLookup - Unhandled exception for item %s", pItem->GetPath().c_str());
87         }
88       }
89     }
90
91     OnLoaderFinish();
92   }
93   catch (...)
94   {
95     CLog::Log(LOGERROR, "%s - Unhandled exception", __FUNCTION__);
96   }
97 }
98
99 void CBackgroundInfoLoader::Load(CFileItemList& items)
100 {
101   StopThread();
102
103   if (items.Size() == 0)
104     return;
105
106   CSingleLock lock(m_lock);
107
108   for (int nItem=0; nItem < items.Size(); nItem++)
109     m_vecItems.push_back(items[nItem]);
110
111   m_pVecItems = &items;
112   m_bStop = false;
113
114   m_thread = new CThread(this, "BackgroundLoader");
115   m_thread->Create();
116 #ifndef TARGET_POSIX
117   m_thread->SetPriority(THREAD_PRIORITY_BELOW_NORMAL);
118 #endif
119 }
120
121 void CBackgroundInfoLoader::StopAsync()
122 {
123   m_bStop = true;
124 }
125
126
127 void CBackgroundInfoLoader::StopThread()
128 {
129   StopAsync();
130
131   if (m_thread)
132   {
133     m_thread->StopThread();
134     delete m_thread;
135     m_thread = NULL;
136   }
137   m_vecItems.clear();
138   m_pVecItems = NULL;
139 }
140
141 bool CBackgroundInfoLoader::IsLoading()
142 {
143   return m_thread != NULL;
144 }
145
146 void CBackgroundInfoLoader::SetObserver(IBackgroundLoaderObserver* pObserver)
147 {
148   m_pObserver = pObserver;
149 }
150
151 void CBackgroundInfoLoader::SetProgressCallback(IProgressCallback* pCallback)
152 {
153   m_pProgressCallback = pCallback;
154 }
155