ImagePlayer.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. #include "ImagePlayer.h"
  2. #include "AutoConnect.h"
  3. #include "Utility.h"
  4. #include "UserInterfaceUtility.h"
  5. #include <QList>
  6. #include <QFileInfo>
  7. #include <QTimer>
  8. #include <QMatrix>
  9. #include <QImage>
  10. #include <QImageReader>
  11. #include <QBuffer>
  12. #include <QDomDocument>
  13. #include <iostream>
  14. #include "configUtils.h"
  15. using namespace std;
  16. static const string SDMultimedia("/data/MultiMediaFile/SDMultimedia");
  17. static const string SDImagePathInfo("/data/MultiMediaFile/SDImagePathInfo");
  18. static const string USBMultimedia("/data/MultiMediaFile/USBMultimedia");
  19. static const string USBImagePathInfo("/data/MultiMediaFile/USBImagePathInfo");
  20. class ImagePlayerPrivate
  21. {
  22. Q_DISABLE_COPY(ImagePlayerPrivate)
  23. public:
  24. explicit ImagePlayerPrivate(ImagePlayer* parent);
  25. ~ImagePlayerPrivate();
  26. void initialize();
  27. void connectAllSlots();
  28. void createUSBFileNamesXml();
  29. void createSDFileNamesXml();
  30. void playListViewIndex(const DeviceWatcherType type, const int index);
  31. void playPreviousListViewIndex();
  32. void playNextListViewIndex();
  33. void rotateImage();
  34. void zoomInImage();
  35. void zoomOutImage();
  36. // QByteArray& convertByteArray(const QImage &image);
  37. QList<QString>& getPathList(const DeviceWatcherType type);
  38. void exitImagePlayer();
  39. QList<QString> m_USBPathList;
  40. QList<QString> m_SDPathList;
  41. int m_PlayIndex;
  42. DeviceWatcherType m_DiskType;
  43. QString m_USBFileNamesXml;
  44. QString m_SDFileNamesXml;
  45. QString m_CurrentPath;
  46. int m_RotateAngle;
  47. float m_Scale;
  48. private:
  49. ImagePlayer* m_Parent;
  50. };
  51. ImagePlayer::ImagePlayer(QObject *parent)
  52. : QObject(parent)
  53. , m_Private(new ImagePlayerPrivate(this))
  54. {
  55. }
  56. ImagePlayer::~ImagePlayer()
  57. {
  58. }
  59. void ImagePlayer::imagePlayerRequestFileNames(const DeviceWatcherType type)
  60. {
  61. if (DWT_SDDisk == type) {
  62. emit onImagePlayerFileNames(DWT_SDDisk, m_Private->m_SDFileNamesXml);
  63. } else if (DWT_USBDisk == type) {
  64. emit onImagePlayerFileNames(DWT_USBDisk, m_Private->m_USBFileNamesXml);
  65. }
  66. }
  67. void ImagePlayer::imagePlayerPlayListViewIndex(const DeviceWatcherType type, const int index)
  68. {
  69. m_Private->playListViewIndex(type, index);
  70. }
  71. void ImagePlayer::imagePlayerPlayPreviousListViewIndex()
  72. {
  73. m_Private->playPreviousListViewIndex();
  74. }
  75. void ImagePlayer::imagePlayerPlayNextListViewIndex()
  76. {
  77. m_Private->playNextListViewIndex();
  78. }
  79. void ImagePlayer::imagePlayerRotateImage()
  80. {
  81. m_Private->rotateImage();
  82. }
  83. void ImagePlayer::imagePlayerZoomInImage()
  84. {
  85. m_Private->zoomInImage();
  86. }
  87. void ImagePlayer::imagePlayerZoomOutImage()
  88. {
  89. m_Private->zoomOutImage();
  90. }
  91. void ImagePlayer::onDeviceWatcherStatus(const DeviceWatcherType type, const DeviceWatcherStatus status)
  92. {
  93. if (DWT_SDDisk == type) {
  94. switch (status) {
  95. case DWS_Empty: {
  96. m_Private->m_SDPathList.clear();
  97. break;
  98. }
  99. case DWS_Busy: {
  100. m_Private->m_SDPathList.clear();
  101. break;
  102. }
  103. case DWS_Ready: {
  104. m_Private->createSDFileNamesXml();
  105. imagePlayerRequestFileNames(DWT_SDDisk);
  106. break;
  107. }
  108. case DWS_Remove: {
  109. m_Private->m_SDPathList.clear();
  110. break;
  111. }
  112. default : {
  113. break;
  114. }
  115. }
  116. } else if (DWT_USBDisk == type) {
  117. switch (status) {
  118. case DWS_Empty: {
  119. m_Private->m_USBPathList.clear();
  120. break;
  121. }
  122. case DWS_Busy: {
  123. m_Private->m_USBPathList.clear();
  124. break;
  125. }
  126. case DWS_Ready: {
  127. m_Private->createUSBFileNamesXml();
  128. imagePlayerRequestFileNames(DWT_USBDisk);
  129. break;
  130. }
  131. case DWS_Remove: {
  132. m_Private->m_USBPathList.clear();
  133. break;
  134. }
  135. default : {
  136. break;
  137. }
  138. }
  139. }
  140. }
  141. void ImagePlayer::onImageFilePath(const QString &path, const DeviceWatcherType type)
  142. {
  143. if (DWT_SDDisk == type) {
  144. m_Private->m_SDPathList.append(path);
  145. } else if (DWT_USBDisk == type) {
  146. m_Private->m_USBPathList.append(path);
  147. }
  148. // emit onImagePlayerFilePath(type, path);
  149. }
  150. ImagePlayerPrivate::ImagePlayerPrivate(ImagePlayer *parent)
  151. : m_Parent(parent)
  152. {
  153. m_PlayIndex = 0;
  154. m_DiskType = DWT_Undefine;
  155. m_RotateAngle = 0;
  156. m_Scale = 1.0f;
  157. initialize();
  158. connectAllSlots();
  159. }
  160. ImagePlayerPrivate::~ImagePlayerPrivate()
  161. {
  162. }
  163. void ImagePlayerPrivate::initialize()
  164. {
  165. }
  166. void ImagePlayerPrivate::connectAllSlots()
  167. {
  168. connectSignalAndSlotByNamesake(g_DeviceWatcher, m_Parent, SLOT(onDeviceWatcherStatus(const int, const int)));
  169. connectSignalAndSlotByNamesake(g_DeviceWatcher, m_Parent, SLOT(onImageFilePath(const QString &, const int)));
  170. }
  171. void ImagePlayerPrivate::createUSBFileNamesXml()
  172. {
  173. QDomDocument domDocument;
  174. domDocument.clear();
  175. domDocument.appendChild(domDocument.createElement(QString("ImagePlayer")));
  176. QDomElement root = domDocument.firstChildElement(QString("ImagePlayer"));
  177. QDomElement fileNames;
  178. QDomElement info;
  179. fileNames = domDocument.createElement(QString("USBFileNames"));
  180. root.appendChild(fileNames);
  181. m_USBFileNamesXml.clear();
  182. string pathInfo;
  183. LoadConfigString(pathInfo,USBImagePathInfo);
  184. QString usbPersistantPathInfo = QString::fromStdString(pathInfo);
  185. QStringList stringList = usbPersistantPathInfo.split(QChar('/'));
  186. QString usbPersistantPath = usbPersistantPathInfo.left(usbPersistantPathInfo.length() - stringList.last().length() - 1);
  187. QString persistantIndex("");
  188. QFileInfo fileInfo;
  189. int i;
  190. for (i = 0; i < m_USBPathList.size(); ++i) {
  191. info = domDocument.createElement(QString("Index:" + QString::number(i)));
  192. fileNames.appendChild(info);
  193. fileInfo.setFile(m_USBPathList.at(i));
  194. info.appendChild(domDocument.createTextNode(fileInfo.fileName()));
  195. if (persistantIndex.isEmpty()) {
  196. if (fileInfo.filePath() == usbPersistantPath) {
  197. if (usbPersistantPathInfo == (fileInfo.filePath() + QString("/") + fileInfo.birthTime().toString(QString("yyyyMMddhhmmss")) + fileInfo.lastModified().toString(QString("yyyyMMddhhmmss")) + QString::number(fileInfo.size()))) {
  198. persistantIndex = QString::number(i);
  199. }
  200. }
  201. }
  202. }
  203. QDomElement persistant = domDocument.createElement(QString("USBPersistant"));
  204. root.appendChild(persistant);
  205. int mediaType = 0;
  206. LoadConfigString(mediaType,USBMultimedia);
  207. unsigned char multimediaType = (unsigned char)mediaType;
  208. if (persistantIndex.isEmpty()) {
  209. if (0 == i) {
  210. persistantIndex = QString("-1");
  211. multimediaType = MT_Idle;
  212. int value = MT_Video;
  213. SaveConfigString(value,USBMultimedia);
  214. } else {
  215. if (0 == multimediaType) {
  216. multimediaType = MT_Image;
  217. SaveConfigString(multimediaType,USBMultimedia);
  218. }
  219. persistantIndex = QString("0");
  220. }
  221. }
  222. persistant.appendChild(domDocument.createTextNode(persistantIndex));
  223. QDomElement type = domDocument.createElement(QString("USBType"));
  224. root.appendChild(type);
  225. type.appendChild(domDocument.createTextNode(QString::number(multimediaType)));
  226. m_USBFileNamesXml = domDocument.toString();
  227. }
  228. void ImagePlayerPrivate::createSDFileNamesXml()
  229. {
  230. QDomDocument domDocument;
  231. domDocument.clear();
  232. domDocument.appendChild(domDocument.createElement(QString("ImagePlayer")));
  233. QDomElement root = domDocument.firstChildElement(QString("ImagePlayer"));
  234. QDomElement fileNames;
  235. QDomElement info;
  236. fileNames = domDocument.createElement(QString("SDFileNames"));
  237. root.appendChild(fileNames);
  238. m_SDFileNamesXml.clear();
  239. string pathInfo;
  240. LoadConfigString(pathInfo,SDImagePathInfo);
  241. QString sdPersistantPathInfo = QString::fromStdString(pathInfo);
  242. QStringList stringList = sdPersistantPathInfo.split(QChar('/'));
  243. QString sdPersistantPath = sdPersistantPathInfo.left(sdPersistantPathInfo.length() - stringList.last().length() - 1);
  244. QString persistantIndex("");
  245. QFileInfo fileInfo;
  246. int i;
  247. for (i = 0; i < m_SDPathList.size(); ++i) {
  248. info = domDocument.createElement(QString("Index:" + QString::number(i)));
  249. fileNames.appendChild(info);
  250. fileInfo.setFile(m_SDPathList.at(i));
  251. info.appendChild(domDocument.createTextNode(fileInfo.fileName()));
  252. if (persistantIndex.isEmpty()) {
  253. if (fileInfo.filePath() == sdPersistantPath) {
  254. if (sdPersistantPathInfo == (fileInfo.filePath() + QString("/") + fileInfo.birthTime().toString(QString("yyyyMMddhhmmss")) + fileInfo.lastModified().toString(QString("yyyyMMddhhmmss")) + QString::number(fileInfo.size()))) {
  255. persistantIndex = QString::number(i);
  256. }
  257. }
  258. }
  259. }
  260. QDomElement persistant = domDocument.createElement(QString("SDPersistant"));
  261. root.appendChild(persistant);
  262. int mediaType = 0;
  263. LoadConfigString(mediaType,SDMultimedia);
  264. unsigned char multimediaType = (unsigned char)mediaType;
  265. if (persistantIndex.isEmpty()) {
  266. if (0 == i) {
  267. persistantIndex = QString("-1");
  268. multimediaType = MT_Idle;
  269. int value = MT_Video;
  270. SaveConfigString(value,SDMultimedia);
  271. } else {
  272. if (0 == multimediaType) {
  273. multimediaType = MT_Image;
  274. SaveConfigString(multimediaType,SDMultimedia);
  275. }
  276. persistantIndex = QString("0");
  277. }
  278. }
  279. persistant.appendChild(domDocument.createTextNode(persistantIndex));
  280. QDomElement type = domDocument.createElement(QString("SDType"));
  281. root.appendChild(type);
  282. type.appendChild(domDocument.createTextNode(QString::number(multimediaType)));
  283. m_SDFileNamesXml = domDocument.toString();
  284. }
  285. void ImagePlayerPrivate::playListViewIndex(const DeviceWatcherType type, const int index)
  286. {
  287. QList<QString> temp = getPathList(type);
  288. if ((temp.size() > index)
  289. && (QFile(temp.at(index))).exists()) {
  290. m_DiskType = type;
  291. m_RotateAngle = 0;
  292. m_Scale = 1.0f;
  293. m_PlayIndex = index;
  294. m_CurrentPath = temp.at(index);
  295. int percent = m_Scale * 100;
  296. CHECK_SYSTEM("echo 3 > /proc/sys/vm/drop_caches"); //dll add change image clear caches
  297. emit m_Parent->onImagePlayerChange(m_DiskType, m_CurrentPath, m_PlayIndex, percent, m_RotateAngle);
  298. QFileInfo fileInfo(m_CurrentPath);
  299. QString filePath = fileInfo.filePath() + QString("/") +
  300. fileInfo.birthTime().toString(QString("yyyyMMddhhmmss")) +
  301. fileInfo.lastModified().toString(QString("yyyyMMddhhmmss")) +
  302. QString::number(fileInfo.size());
  303. int value = MT_Image;
  304. if(m_DiskType == DWT_USBDisk){
  305. SaveConfigString(filePath.toStdString(),USBImagePathInfo);
  306. SaveConfigString(value,USBMultimedia);
  307. }
  308. else if(m_DiskType == DWT_SDDisk){
  309. SaveConfigString(filePath.toStdString(),SDImagePathInfo);
  310. SaveConfigString(value,SDMultimedia);
  311. }
  312. }
  313. }
  314. void ImagePlayerPrivate::playPreviousListViewIndex()
  315. {
  316. m_RotateAngle = 0;
  317. int lastIndex = m_PlayIndex;
  318. QList<QString> temp = getPathList(m_DiskType);
  319. if ((lastIndex > 0)
  320. && (lastIndex <= temp.size() - 1)) {
  321. --lastIndex;
  322. } else {
  323. lastIndex = temp.size() - 1;
  324. }
  325. playListViewIndex(m_DiskType, lastIndex);
  326. }
  327. void ImagePlayerPrivate::playNextListViewIndex()
  328. {
  329. m_RotateAngle = 0;
  330. int lastIndex = m_PlayIndex;
  331. QList<QString> temp = getPathList(m_DiskType);
  332. if (((lastIndex < (temp.size() - 1)))
  333. && (lastIndex >= 0)) {
  334. ++lastIndex;
  335. } else {
  336. lastIndex = 0;
  337. }
  338. playListViewIndex(m_DiskType, lastIndex);
  339. }
  340. void ImagePlayerPrivate::rotateImage()
  341. {
  342. int step(90);
  343. if (((m_RotateAngle + step) < 360)
  344. && (m_RotateAngle >= 0)) {
  345. m_RotateAngle += step;
  346. } else {
  347. m_RotateAngle = 0;
  348. }
  349. int percent = m_Scale * 100;
  350. emit m_Parent->onImagePlayerChange(m_DiskType, m_CurrentPath, m_PlayIndex, percent, m_RotateAngle);
  351. }
  352. void ImagePlayerPrivate::zoomInImage()
  353. {
  354. if (m_Scale > 1.0f) {
  355. m_Scale -= 0.25f;
  356. }
  357. int percent = m_Scale * 100;
  358. emit m_Parent->onImagePlayerChange(m_DiskType, m_CurrentPath, m_PlayIndex, percent, m_RotateAngle);
  359. }
  360. void ImagePlayerPrivate::zoomOutImage()
  361. {
  362. if (m_Scale < 2.5f) {
  363. m_Scale += 0.25f;
  364. }
  365. int percent = m_Scale * 100;
  366. emit m_Parent->onImagePlayerChange(m_DiskType, m_CurrentPath, m_PlayIndex, percent, m_RotateAngle);
  367. }
  368. //QByteArray &ImagePlayerPrivate::convertByteArray(const QImage &image)
  369. //{
  370. // QByteArray byteArray;
  371. // return byteArray;
  372. //}
  373. QList<QString> &ImagePlayerPrivate::getPathList(const DeviceWatcherType type)
  374. {
  375. switch (type) {
  376. case DWT_SDDisk: {
  377. return m_SDPathList;
  378. }
  379. case DWT_USBDisk:
  380. default: {
  381. printf("************getPathList\n");
  382. return m_USBPathList;
  383. }
  384. }
  385. }
  386. void ImagePlayerPrivate::exitImagePlayer()
  387. {
  388. }