ImagePlayer.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  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.created().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. system("sync");
  215. } else {
  216. if (0 == multimediaType) {
  217. multimediaType = MT_Image;
  218. SaveConfigString(multimediaType,USBMultimedia);
  219. system("sync");
  220. }
  221. persistantIndex = QString("0");
  222. }
  223. }
  224. persistant.appendChild(domDocument.createTextNode(persistantIndex));
  225. QDomElement type = domDocument.createElement(QString("USBType"));
  226. root.appendChild(type);
  227. type.appendChild(domDocument.createTextNode(QString::number(multimediaType)));
  228. m_USBFileNamesXml = domDocument.toString();
  229. }
  230. void ImagePlayerPrivate::createSDFileNamesXml()
  231. {
  232. QDomDocument domDocument;
  233. domDocument.clear();
  234. domDocument.appendChild(domDocument.createElement(QString("ImagePlayer")));
  235. QDomElement root = domDocument.firstChildElement(QString("ImagePlayer"));
  236. QDomElement fileNames;
  237. QDomElement info;
  238. fileNames = domDocument.createElement(QString("SDFileNames"));
  239. root.appendChild(fileNames);
  240. m_SDFileNamesXml.clear();
  241. string pathInfo;
  242. LoadConfigString(pathInfo,SDImagePathInfo);
  243. QString sdPersistantPathInfo = QString::fromStdString(pathInfo);
  244. QStringList stringList = sdPersistantPathInfo.split(QChar('/'));
  245. QString sdPersistantPath = sdPersistantPathInfo.left(sdPersistantPathInfo.length() - stringList.last().length() - 1);
  246. QString persistantIndex("");
  247. QFileInfo fileInfo;
  248. int i;
  249. for (i = 0; i < m_SDPathList.size(); ++i) {
  250. info = domDocument.createElement(QString("Index:" + QString::number(i)));
  251. fileNames.appendChild(info);
  252. fileInfo.setFile(m_SDPathList.at(i));
  253. info.appendChild(domDocument.createTextNode(fileInfo.fileName()));
  254. if (persistantIndex.isEmpty()) {
  255. if (fileInfo.filePath() == sdPersistantPath) {
  256. if (sdPersistantPathInfo == (fileInfo.filePath() + QString("/") + fileInfo.created().toString(QString("yyyyMMddhhmmss")) + fileInfo.lastModified().toString(QString("yyyyMMddhhmmss")) + QString::number(fileInfo.size()))) {
  257. persistantIndex = QString::number(i);
  258. }
  259. }
  260. }
  261. }
  262. QDomElement persistant = domDocument.createElement(QString("SDPersistant"));
  263. root.appendChild(persistant);
  264. int mediaType = 0;
  265. LoadConfigString(mediaType,SDMultimedia);
  266. unsigned char multimediaType = (unsigned char)mediaType;
  267. if (persistantIndex.isEmpty()) {
  268. if (0 == i) {
  269. persistantIndex = QString("-1");
  270. multimediaType = MT_Idle;
  271. int value = MT_Video;
  272. SaveConfigString(value,SDMultimedia);
  273. system("sync");
  274. } else {
  275. if (0 == multimediaType) {
  276. multimediaType = MT_Image;
  277. SaveConfigString(multimediaType,SDMultimedia);
  278. system("sync");
  279. }
  280. persistantIndex = QString("0");
  281. }
  282. }
  283. persistant.appendChild(domDocument.createTextNode(persistantIndex));
  284. QDomElement type = domDocument.createElement(QString("SDType"));
  285. root.appendChild(type);
  286. type.appendChild(domDocument.createTextNode(QString::number(multimediaType)));
  287. m_SDFileNamesXml = domDocument.toString();
  288. }
  289. void ImagePlayerPrivate::playListViewIndex(const DeviceWatcherType type, const int index)
  290. {
  291. QList<QString> temp = getPathList(type);
  292. if ((temp.size() > index)
  293. && (QFile(temp.at(index))).exists()) {
  294. m_DiskType = type;
  295. m_RotateAngle = 0;
  296. m_Scale = 1.0f;
  297. m_PlayIndex = index;
  298. m_CurrentPath = temp.at(index);
  299. int percent = m_Scale * 100;
  300. system("echo 3 > /proc/sys/vm/drop_caches"); //dll add change image clear caches
  301. emit m_Parent->onImagePlayerChange(m_DiskType, m_CurrentPath, m_PlayIndex, percent, m_RotateAngle);
  302. QFileInfo fileInfo(m_CurrentPath);
  303. QString filePath = fileInfo.filePath() + QString("/") +
  304. fileInfo.created().toString(QString("yyyyMMddhhmmss")) +
  305. fileInfo.lastModified().toString(QString("yyyyMMddhhmmss")) +
  306. QString::number(fileInfo.size());
  307. int value = MT_Image;
  308. if(m_DiskType == DWT_USBDisk){
  309. SaveConfigString(filePath.toStdString(),USBImagePathInfo);
  310. system("sync");
  311. SaveConfigString(value,USBMultimedia);
  312. system("sync");
  313. }
  314. else if(m_DiskType == DWT_SDDisk){
  315. SaveConfigString(filePath.toStdString(),SDImagePathInfo);
  316. system("sync");
  317. SaveConfigString(value,SDMultimedia);
  318. system("sync");
  319. }
  320. }
  321. }
  322. void ImagePlayerPrivate::playPreviousListViewIndex()
  323. {
  324. m_RotateAngle = 0;
  325. int lastIndex = m_PlayIndex;
  326. QList<QString> temp = getPathList(m_DiskType);
  327. if ((lastIndex > 0)
  328. && (lastIndex <= temp.size() - 1)) {
  329. --lastIndex;
  330. } else {
  331. lastIndex = temp.size() - 1;
  332. }
  333. playListViewIndex(m_DiskType, lastIndex);
  334. }
  335. void ImagePlayerPrivate::playNextListViewIndex()
  336. {
  337. m_RotateAngle = 0;
  338. int lastIndex = m_PlayIndex;
  339. QList<QString> temp = getPathList(m_DiskType);
  340. if (((lastIndex < (temp.size() - 1)))
  341. && (lastIndex >= 0)) {
  342. ++lastIndex;
  343. } else {
  344. lastIndex = 0;
  345. }
  346. playListViewIndex(m_DiskType, lastIndex);
  347. }
  348. void ImagePlayerPrivate::rotateImage()
  349. {
  350. int step(90);
  351. if (((m_RotateAngle + step) < 360)
  352. && (m_RotateAngle >= 0)) {
  353. m_RotateAngle += step;
  354. } else {
  355. m_RotateAngle = 0;
  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::zoomInImage()
  361. {
  362. if (m_Scale > 1.0f) {
  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. void ImagePlayerPrivate::zoomOutImage()
  369. {
  370. if (m_Scale < 2.5f) {
  371. m_Scale += 0.25f;
  372. }
  373. int percent = m_Scale * 100;
  374. emit m_Parent->onImagePlayerChange(m_DiskType, m_CurrentPath, m_PlayIndex, percent, m_RotateAngle);
  375. }
  376. QByteArray &ImagePlayerPrivate::convertByteArray(const QImage &image)
  377. {
  378. QByteArray byteArray;
  379. return byteArray;
  380. }
  381. QList<QString> &ImagePlayerPrivate::getPathList(const DeviceWatcherType type)
  382. {
  383. switch (type) {
  384. case DWT_SDDisk: {
  385. return m_SDPathList;
  386. }
  387. case DWT_USBDisk:
  388. default: {
  389. return m_USBPathList;
  390. }
  391. }
  392. }
  393. void ImagePlayerPrivate::exitImagePlayer()
  394. {
  395. }