b10af3622a8e94cc4056ded1f6282a98937825fb
[apps/native/sample/ImageFeatureManager.git] / project / src / FeatureSetGenerator.cpp
1 //
2 // Tizen Native SDK
3 // Open Service Platform
4 // Copyright (c) 2013 Samsung Electronics Co., Ltd.
5 // All rights reserved.
6 //
7 // This software contains confidential and proprietary information
8 // of Samsung Electronics Co., Ltd.
9 // The user of this software agrees not to disclose, disseminate or copy such
10 // Confidential Information and shall use the software only in accordance with
11 // the terms of the license agreement the user entered into with Samsung.
12 //
13
14 #include "FeatureSetGenerator.h"
15
16 #include <FIo.h>
17 #include <FSysSystemTime.h>
18
19 FeatureSetGenThread::FeatureSetGenThread(void)
20     : __pListener(0)
21         , __pImageFeatureManager(0)
22 {
23 }
24
25 FeatureSetGenThread::~FeatureSetGenThread(void)
26 {
27 }
28
29 result
30 FeatureSetGenThread::Construct(void)
31 {
32     return Thread::Construct();
33 }
34
35 Tizen::Base::Object*
36 FeatureSetGenThread::Run(void)
37 {
38     __resultInfo.appendTime = 0;
39     __resultInfo.totalObjectsNumber = 0;
40     __resultInfo.appendedObjectsNumber = 0;
41     __resultInfo.rejectedObjectsNumber = 0;
42
43     Generate(__imagePath, __resultInfo);
44
45     if (__pListener)
46     {
47         __pListener->OnFinish();
48     }
49
50     return null;
51 }
52
53 void
54 FeatureSetGenThread::SetListener(IFeatureSetGeneratorListener* pListener)
55 {
56     if (__pListener == pListener)
57     {
58         return;
59     }
60     __pListener = pListener;
61 }
62
63 bool
64 FeatureSetGenThread::Generate(Tizen::Base::String imPath, ResultInfo& resInfo)
65 {
66     bool isRes = true;
67     int currObject = 0;
68
69     if(!__pImageFeatureManager)
70     {
71         return false;
72     }
73
74     Tizen::Base::TimeSpan start(0, 0, 1), finish(0, 0, 1);
75     Tizen::System::SystemTime::GetUptime(start);
76     Tizen::Io::Directory dir;
77
78     result r = dir.Construct(imPath);
79     if (!IsFailed(r))
80     {
81
82         Tizen::Base::String folder(imPath);
83         if (folder[folder.GetLength() - 1] != '/')
84         {
85             folder += "/";
86         }
87
88         Tizen::Io::DirEnumerator* pDirEnum = dir.ReadN();
89         if (!pDirEnum)
90         {
91             return false;
92         }
93
94         while(pDirEnum->MoveNext() == E_SUCCESS)
95         {
96             Tizen::Io::DirEntry dirEntry = pDirEnum->GetCurrentDirEntry();
97             if (!dirEntry.IsDirectory())
98             {
99                 if(Tizen::Io::File::IsFileExist(imPath + "/" + dirEntry.GetName()))
100                 {
101                     __files.Add(imPath + "/" + dirEntry.GetName());
102                 }
103             }
104         }
105         pDirEnum->Reset();
106
107     }
108     else
109     {
110
111         if(CheckExt(imPath) && Tizen::Io::File::IsFileExist(imPath))
112         {
113             __files.Add(imPath);
114         }
115         else
116         {
117             return false;
118         }
119     }
120
121     StrComparer* pStrComparer = new StrComparer();
122     __files.Sort(*pStrComparer);
123     delete pStrComparer;
124
125     // Uses an enumerator to access elements in the list
126     Tizen::Base::Collection::IEnumeratorT<Tizen::Base::String>*    pEnum = __files.GetEnumeratorN();
127     Tizen::Base::String     name;
128
129     while (pEnum->MoveNext() == E_SUCCESS)
130     {
131         pEnum->GetCurrent(name);
132
133         ++currObject;
134         AppLog("AddFeature %ls %i", name.GetPointer(), currObject);
135
136         if (__pListener)
137         {
138             __pListener->OnImageProcessed(currObject, __files.GetCount());
139         }
140
141         if ( __pImageFeatureManager->AddFeature(name) >= 0)
142         {
143                 AppLog("AddFeature appended %ls %i", name.GetPointer(), currObject);
144             ++resInfo.appendedObjectsNumber;
145         }
146         else
147         {
148             ++resInfo.rejectedObjectsNumber;
149         }
150     }
151     delete pEnum;
152     __files.RemoveAll();
153
154     Tizen::System::SystemTime::GetUptime(finish);
155     resInfo.appendTime = 60000 * (finish - start).GetMinutes() + 1000 * (finish - start).GetSeconds()
156         + (finish - start).GetMilliseconds();
157
158     resInfo.totalObjectsNumber = __pImageFeatureManager->GetTotalNumberOfFeatures();
159
160     //Causing UI frees after exit
161     Sleep(500);
162
163     return isRes;
164 }
165
166 void
167 FeatureSetGenThread::SetImagePath(const Tizen::Base::String& imPath)
168 {
169     __imagePath = imPath;
170 }
171
172 void
173 FeatureSetGenThread::GetResults(ResultInfo& resInfo)
174 {
175     resInfo = __resultInfo;
176 }
177
178 bool
179 FeatureSetGenThread::CheckExt(Tizen::Base::String fileName)
180 {
181     int period = 0;
182     const Tizen::Base::String period_symbol = ".";
183     if (E_SUCCESS != fileName.LastIndexOf(period_symbol, fileName.GetLength()-1, period))
184     {
185         return false;
186     }
187     Tizen::Base::String extension;
188     if(E_SUCCESS != fileName.SubString(period + 1, extension))
189     {
190         return false;
191     }
192
193     if ( (extension.Equals(L"jpg",true)) ||
194          (extension.Equals(L"bmp",true)) ||
195          (extension.Equals(L"png",true)) ||
196          (extension.Equals(L"jpeg",true)))
197     {
198         return true;
199     }
200
201     return false;
202
203 }
204
205 void
206 FeatureSetGenThread::SetFeatureManager(Tizen::Uix::Vision::ImageFeatureManager* pImageFeatureManager)
207 {
208     __pImageFeatureManager = pImageFeatureManager;
209 }