numberprocessor.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #include "numberprocessor.h"
  2. #include "numberreg.h"
  3. NumberProcessor::NumberProcessor(QList<QString> *bufferSegments, QList<QStringList> *bufferNumbers,
  4. QSemaphore *free, QSemaphore *used, QMutex *mutex,
  5. NumberProcessType processType)
  6. {
  7. this->bufferSegments = bufferSegments;
  8. this->bufferNumbers = bufferNumbers;
  9. this->free = free;
  10. this->used = used;
  11. this->mutex = mutex;
  12. this->processType = processType;
  13. this->stop = false;
  14. }
  15. void NumberProcessor::abort()
  16. {
  17. this->stop = true;
  18. }
  19. NumberProcessor::~NumberProcessor()
  20. {
  21. qDebug()<<"NumberProcessor dead";
  22. }
  23. void NumberProcessor::setBlackSegments(QStringList blackSegments)
  24. {
  25. this->blackSegments = blackSegments;
  26. }
  27. void NumberProcessor::setBlackNumbers(QList<QStringList> blackNumbers)
  28. {
  29. this->blackNumbers = blackNumbers;
  30. }
  31. void NumberProcessor::run()
  32. {
  33. switch(processType)
  34. {
  35. case NumberSort:
  36. sort();
  37. break;
  38. case NumberRemoveDuplicate:
  39. removeDuplicate();
  40. break;
  41. case NumberRemoveBlackList:
  42. removeBlackList();
  43. break;
  44. case NumberRemoveNotPhone:
  45. removeNotPhoneNumber();
  46. break;
  47. default:
  48. break;
  49. }
  50. }
  51. void NumberProcessor::sort()
  52. {
  53. while(true)
  54. {
  55. //used->acquire();
  56. if(stop)
  57. {
  58. break;
  59. }
  60. mutex->lock();
  61. QString segment;
  62. QStringList numbers;
  63. if(bufferSegments->size()>0)
  64. {
  65. segment = bufferSegments->takeLast();
  66. numbers = bufferNumbers->takeLast();
  67. }
  68. mutex->unlock();
  69. //free->release();
  70. if(!segment.isEmpty())
  71. {
  72. numbers.sort();
  73. emit childTaskFinished(segment,numbers);
  74. }
  75. }
  76. emit threadDestroy();
  77. }
  78. void NumberProcessor::removeDuplicate()
  79. {
  80. while(true)
  81. {
  82. //used->acquire();
  83. if(stop)
  84. {
  85. break;
  86. }
  87. mutex->lock();
  88. QString segment;
  89. QStringList numbers;
  90. if(bufferSegments->size()>0)
  91. {
  92. segment = bufferSegments->takeLast();
  93. numbers = bufferNumbers->takeLast();
  94. }
  95. mutex->unlock();
  96. //free->release();
  97. if(!segment.isEmpty())
  98. {
  99. numbers.sort();
  100. QStringList list;
  101. QString tmp;
  102. for(int j=0;j<numbers.size();j++)
  103. {
  104. if (tmp != numbers[j])
  105. {
  106. tmp = numbers[j];
  107. list.append(tmp);
  108. }
  109. }
  110. numbers = list;
  111. emit childTaskFinished(segment,numbers);
  112. }
  113. }
  114. emit threadDestroy();
  115. }
  116. void NumberProcessor::removeBlackList()
  117. {
  118. while(true)
  119. {
  120. //used->acquire();
  121. if(stop)
  122. {
  123. break;
  124. }
  125. mutex->lock();
  126. QString segment;
  127. QStringList numbers;
  128. if(bufferSegments->size()>0)
  129. {
  130. segment = bufferSegments->takeLast();
  131. numbers = bufferNumbers->takeLast();
  132. }
  133. mutex->unlock();
  134. //free->release();
  135. if(!segment.isEmpty())
  136. {
  137. for(int j=0;j<blackSegments.size();j++)
  138. {
  139. if(segment==blackSegments.at(j))
  140. {
  141. for(int k=0;k<numbers.size();k++)
  142. {
  143. for(int l=0;l<blackNumbers.at(j).size();l++)
  144. {
  145. if(numbers.at(k)==blackNumbers.at(j).at(l))
  146. {
  147. numbers.removeAt(k);
  148. k--;
  149. break;
  150. }
  151. }
  152. }
  153. break;
  154. }
  155. }
  156. if(numbers.size()==0)
  157. {
  158. segment = "";
  159. }
  160. emit childTaskFinished(segment,numbers);
  161. }
  162. }
  163. emit threadDestroy();
  164. }
  165. void NumberProcessor::removeNotPhoneNumber()
  166. {
  167. while(true)
  168. {
  169. //used->acquire();
  170. if(stop)
  171. {
  172. break;
  173. }
  174. mutex->lock();
  175. QString segment;
  176. QStringList numbers;
  177. if(bufferSegments->size()>0)
  178. {
  179. segment = bufferSegments->takeLast();
  180. numbers = bufferNumbers->takeLast();
  181. }
  182. mutex->unlock();
  183. //free->release();
  184. if(!segment.isEmpty())
  185. {
  186. if(!NumberReg::getSegmentReg().exactMatch(segment))
  187. {
  188. segment = "";
  189. }
  190. else
  191. {
  192. for(int i=0;i<numbers.size();i++)
  193. {
  194. if (!NumberReg::getLastFour().exactMatch(numbers[i]))
  195. {
  196. numbers.removeAt(i);
  197. i++;
  198. }
  199. }
  200. if(numbers.size()==0)
  201. {
  202. segment = "";
  203. }
  204. }
  205. emit childTaskFinished(segment,numbers);
  206. }
  207. }
  208. emit threadDestroy();
  209. }