Fix memory leaks
[apps/osp/Gallery.git] / src / GlContentUpdateEventListener.cpp
1 //
2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Flora License, Version 1.1 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //     http://floralicense.org/license/
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an AS IS BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 /**
18  * @file                GlContentUpdateEventListener.cpp
19  * @brief               This is the implementation file for ContentUpdateEventListener class.
20  */
21
22 #include <FApp.h>
23 #include <FUi.h>
24 #include "GlContentUpdateEventListener.h"
25 #include "GlFileListPresentationModel.h"
26 #include "GlAlbumListPresentationModel.h"
27
28 using namespace Tizen::Base;
29 using namespace Tizen::Base::Collection;
30 using namespace Tizen::Base::Utility;
31 using namespace Tizen::Content;
32
33 ContentUpdateEventListener* ContentUpdateEventListener::__pContentUpdateEventListener = null;
34
35 ContentUpdateEventListener::ContentUpdateEventListener(void)
36         : __pContentManager(null)
37 {
38         AppLogDebug("ENTER");
39         AppLogDebug("EXIT");
40 }
41
42 ContentUpdateEventListener::~ContentUpdateEventListener(void)
43 {
44         AppLogDebug("ENTER");
45         __pContentManager->RemoveContentUpdateEventListener(*this);
46         delete __pContentManager;
47         AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
48 }
49
50 ContentUpdateEventListener*
51 ContentUpdateEventListener::GetInstance(void)
52 {
53         AppLogDebug("ENTER");
54         if (__pContentUpdateEventListener == null)
55         {
56                 CreateInstance();
57         }
58         AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
59
60         return __pContentUpdateEventListener;
61 }
62
63 void ContentUpdateEventListener::AddContentListener(void)
64 {
65         __pContentManager->AddContentUpdateEventListener(*this);
66 }
67
68 void ContentUpdateEventListener::RemoveContentListener(void)
69 {
70         __pContentManager->RemoveContentUpdateEventListener(*this);
71 }
72
73 result
74 ContentUpdateEventListener::Construct(void)
75 {
76         AppLogDebug("ENTER");
77
78         __pContentManager = new (std::nothrow) ContentManager();
79         __pContentManager->Construct();
80         __pContentManager->AddContentUpdateEventListener(*this);
81
82         AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
83         return E_SUCCESS;
84 }
85
86 void
87 ContentUpdateEventListener::CreateInstance(void)
88 {
89         AppLogDebug("ENTER");
90         __pContentUpdateEventListener = new (std::nothrow) ContentUpdateEventListener();
91         result r = __pContentUpdateEventListener->Construct();
92         if (IsFailed(r) == true)
93         {
94                 delete __pContentUpdateEventListener;
95                 __pContentUpdateEventListener = null;
96                 AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult()));
97
98                 return;
99         }
100
101         std::atexit(DestroyInstance);
102         AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
103 }
104
105 void
106 ContentUpdateEventListener::DestroyInstance(void)
107 {
108         AppLogDebug("ENTER");
109
110         delete __pContentUpdateEventListener;
111         __pContentUpdateEventListener = null;
112
113         AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
114 }
115
116 bool
117 ContentUpdateEventListener::GetChangeNotificationStatus()
118 {
119         AppLogDebug("ENTER");
120         AppLogDebug("EXIT");
121         return __changeNotificationReceived;
122 }
123
124 void
125 ContentUpdateEventListener::ResumeOperation()
126 {
127         AppLogDebug("ENTER");
128         AlbumListPresentationModel::GetInstance()->OnContentDeleted();
129         FileListPresentationModel::GetInstance()->OnContentDeleted();
130         __changeNotificationReceived = false;
131         AppLogDebug("EXIT");
132 }
133
134 String
135 ContentUpdateEventListener::GetDirecotyNameFromFullPath(const String& fullPath)const
136 {
137         AppLogDebug("ENTER");
138         if (fullPath == null)
139         {
140                 AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult()));
141
142                 return null;
143         }
144         String delim(DIRECTORY_SEPARATOR);
145         StringTokenizer st(fullPath,delim);
146         String token;
147         String tokenPrev;
148         while (st.HasMoreTokens())
149         {
150                 tokenPrev = token;
151                 st.GetNextToken(token);
152         }
153
154         AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
155
156         return tokenPrev;
157 }
158
159 void
160 ContentUpdateEventListener::OnContentFileCreated(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r)
161 {
162         AppLogDebug("ENTER");
163         if ( contentType == CONTENT_TYPE_IMAGE || contentType == CONTENT_TYPE_VIDEO)
164         {
165                 Tizen::Content::ContentInfo* cntInfo = __pContentManager->GetContentInfoN(contentId);
166                 String path = cntInfo->GetContentPath();
167                 String dirName = GetDirecotyNameFromFullPath(path);
168
169                 FileListPresentationModel* pFileListPM = FileListPresentationModel::GetInstance();
170                 pFileListPM->AddDirectoryIfNew(dirName);
171                 AlbumListPresentationModel::GetInstance()->OnContentCreated();
172                 pFileListPM->OnContentCreated();
173         }
174
175         AppLogDebug("EXIT");
176 }
177
178 void
179 ContentUpdateEventListener::OnContentFileUpdated(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r)
180 {
181         AppLogDebug("ENTER");
182         
183         if ( contentType == CONTENT_TYPE_IMAGE || contentType == CONTENT_TYPE_VIDEO)
184         {
185                 AlbumListPresentationModel::GetInstance()->OnContentUpdated();
186                 FileListPresentationModel::GetInstance()->OnContentUpdated();
187         }
188         AppLogDebug("EXIT");
189 }
190
191 void
192 ContentUpdateEventListener::OnContentFileDeleted(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r)
193 {
194         AppLogDebug("ENTER");
195
196         if ( contentType == CONTENT_TYPE_IMAGE || contentType == CONTENT_TYPE_VIDEO)
197         {
198                 Tizen::App::UiApp* appPtr = Tizen::App::UiApp::GetInstance();
199                 if (appPtr->GetAppUiState() == Tizen::App::APP_UI_STATE_FOREGROUND)
200                 {
201                         AlbumListPresentationModel::GetInstance()->OnContentDeleted();
202                         FileListPresentationModel::GetInstance()->OnContentDeleted();
203                 }
204                 else
205                 {
206                         __changeNotificationReceived = true;
207                 }
208
209         }
210         AppLogDebug("EXIT");
211 }
212
213 void
214 ContentUpdateEventListener::OnContentDirectoryScanCompleted(const Tizen::Base::String& directoryPath, result r)
215 {
216         AppLogDebug("ENTER");
217
218         Tizen::App::UiApp* appPtr = Tizen::App::UiApp::GetInstance();
219         if (appPtr->GetAppUiState() == Tizen::App::APP_UI_STATE_FOREGROUND)
220         {
221                 AlbumListPresentationModel::GetInstance()->OnContentDeleted();
222                 FileListPresentationModel::GetInstance()->OnContentDeleted();
223                 AlbumListPresentationModel::GetInstance()->OnContentScanCompleted( directoryPath );
224         }
225         else
226         {
227                 __changeNotificationReceived = true;
228         }\r
229
230         AppLogDebug("EXIT");
231 }