54 #else |
55 #else |
55 qDebug() << qPrintable(msg); |
56 qDebug() << qPrintable(msg); |
56 #endif |
57 #endif |
57 } |
58 } |
58 |
59 |
|
60 void usage() |
|
61 { |
|
62 QString msg("Usage: [<options>] [<datafields>]\n" |
|
63 " Where <options> limit the types of messages shown, valid choices: -all, -sms, -mms, -email, -instantmessage, -incoming, -read, -inboxfolder, -draftsfolder, -outboxfolder, -sentfolder, -trashfolder\n" |
|
64 " To join options by logical OR use +, for option, eg \"+sms +mms\" will return sms OR mms messages\n" |
|
65 " Where <datafields> specify what fields to print from matched messages, valid choices are: subject, date, receivedDate, status, size, priority, to, cc, bcc, from, type, body, attachments"); |
|
66 printMessage(msg); |
|
67 } |
|
68 |
|
69 // create message filter as requested by command line options |
|
70 QMessageFilter createFilter(QStringList args) |
|
71 { |
|
72 QMessageFilter filter(QMessageFilter::byStatus(QMessage::Incoming)); |
|
73 QMessageFilter customfilter; |
|
74 bool setCustomFilter = false; |
|
75 QMap<QString, QMessageFilter> filterMap; |
|
76 filterMap.insert(QLatin1String("all"), QMessageFilter()); |
|
77 filterMap.insert(QLatin1String("sms"), QMessageFilter::byType(QMessage::Sms)); |
|
78 filterMap.insert(QLatin1String("mms"), QMessageFilter::byType(QMessage::Mms)); |
|
79 filterMap.insert(QLatin1String("email"), QMessageFilter::byType(QMessage::Email)); |
|
80 filterMap.insert(QLatin1String("instantmessage"), QMessageFilter::byType(QMessage::InstantMessage)); |
|
81 filterMap.insert(QLatin1String("incoming"), QMessageFilter::byStatus(QMessage::Incoming)); |
|
82 filterMap.insert(QLatin1String("read"), QMessageFilter::byStatus(QMessage::Read)); |
|
83 filterMap.insert(QLatin1String("inboxfolder"), QMessageFilter::byStandardFolder(QMessage::InboxFolder)); |
|
84 filterMap.insert(QLatin1String("draftsfolder"), QMessageFilter::byStandardFolder(QMessage::DraftsFolder)); |
|
85 filterMap.insert(QLatin1String("outboxfolder"), QMessageFilter::byStandardFolder(QMessage::OutboxFolder)); |
|
86 filterMap.insert(QLatin1String("sentfolder"), QMessageFilter::byStandardFolder(QMessage::SentFolder)); |
|
87 filterMap.insert(QLatin1String("trashfolder"), QMessageFilter::byStandardFolder(QMessage::TrashFolder)); |
|
88 |
|
89 // process command line options after the application name |
|
90 foreach (const QString &arg, args.mid(1)){ |
|
91 QMap<QString, QMessageFilter>::const_iterator iterator = filterMap.find(arg.toLower().mid(1)); |
|
92 if (iterator != filterMap.end()){ |
|
93 setCustomFilter = true; |
|
94 // use AND logic when compounding filter? |
|
95 if (arg[0] == '-' ) |
|
96 customfilter = customfilter & iterator.value(); |
|
97 else |
|
98 customfilter = customfilter | iterator.value(); |
|
99 } |
|
100 } |
|
101 |
|
102 if (setCustomFilter) |
|
103 filter = customfilter; |
|
104 |
|
105 return filter; |
|
106 } |
|
107 |
|
108 |
59 int main(int argc, char *argv[]) |
109 int main(int argc, char *argv[]) |
60 { |
110 { |
61 QCoreApplication app(argc, argv); |
111 QCoreApplication app(argc, argv); |
62 |
112 |
63 printMessage("Querying messages..."); |
113 printMessage("Querying messages..."); |
64 |
114 |
|
115 // determine what data options were requested and if help was requested |
|
116 // if no data options were provided default to "subject" |
|
117 QStringList dataOptions; |
|
118 QStringList validDataOptions = QStringList() << "subject" << "date" << "receivedDate" << "status" |
|
119 << "size" << "priority" << "to" << "cc" << "bcc" << "from" |
|
120 << "type" << "body" << "attachments"; |
|
121 foreach (const QString &arg, app.arguments()){ |
|
122 if (arg == "-help"){ |
|
123 usage(); |
|
124 exit(1); |
|
125 } |
|
126 if (validDataOptions.contains(arg)) |
|
127 dataOptions.append(arg); |
|
128 } |
|
129 if (dataOptions.isEmpty()) |
|
130 dataOptions.append("subject"); |
|
131 |
65 //! [setup-query] |
132 //! [setup-query] |
66 // Match all messages whose status field includes the Incoming flag |
133 // Create filter to match required messages |
67 QMessageFilter filter(QMessageFilter::byStatus(QMessage::Incoming)); |
134 QMessageFilter filter = createFilter(app.arguments()); |
|
135 // instead of the above use the following for a simple filter of all messages whose status field have the Incoming flag to be set, eg incoming emails |
|
136 //QMessageFilter filter(QMessageFilter::byStatus(QMessage::Incoming)); |
68 |
137 |
69 // Order the matching results by their reception timestamp, in descending order |
138 // Order the matching results by their reception timestamp, in descending order |
70 QMessageSortOrder sortOrder(QMessageSortOrder::byReceptionTimeStamp(Qt::DescendingOrder)); |
139 QMessageSortOrder sortOrder(QMessageSortOrder::byReceptionTimeStamp(Qt::DescendingOrder)); |
71 //! [setup-query] |
140 //! [setup-query] |
72 |
141 |
88 //! [iterate-results] |
157 //! [iterate-results] |
89 |
158 |
90 if (manager.error() == QMessageManager::NoError) { |
159 if (manager.error() == QMessageManager::NoError) { |
91 QStringList result; |
160 QStringList result; |
92 |
161 |
93 if (app.arguments().count() < 2) { |
|
94 // Default to printing only the subject |
|
95 result.append(message.subject()); |
|
96 } else { |
|
97 //! [generate-output] |
162 //! [generate-output] |
98 // Extract the requested data items from this message |
163 // Extract the requested data items from this message |
99 foreach (const QString &arg, app.arguments().mid(1)) { |
164 foreach (const QString &arg, dataOptions) { |
100 if (arg == "subject") { |
165 if (arg == "subject") { |
101 result.append(message.subject()); |
166 result.append(message.subject()); |
102 } else if (arg == "date") { |
167 } else if (arg == "date") { |
103 result.append(message.date().toLocalTime().toString()); |
168 result.append(message.date().toLocalTime().toString()); |
104 //! [generate-output] |
169 //! [generate-output] |
105 } else if (arg == "receivedDate") { |
170 } else if (arg == "receivedDate") { |
106 result.append(message.receivedDate().toLocalTime().toString()); |
171 result.append(message.receivedDate().toLocalTime().toString()); |
107 } else if (arg == "size") { |
172 } else if (arg == "size") { |
108 result.append(QString::number(message.size())); |
173 result.append(QString::number(message.size())); |
109 } else if (arg == "priority") { |
174 } else if (arg == "priority") { |
110 result.append(message.priority() == QMessage::HighPriority ? "High" : (message.priority() == QMessage::LowPriority ? "Low" : "Normal")); |
175 result.append(message.priority() == QMessage::HighPriority ? "High" : (message.priority() == QMessage::LowPriority ? "Low" : "Normal")); |
111 } else if ((arg == "to") || (arg == "cc") || (arg == "bcc")) { |
176 } else if ((arg == "to") || (arg == "cc") || (arg == "bcc")) { |
112 QStringList addresses; |
177 QStringList addresses; |
113 foreach (const QMessageAddress &addr, (arg == "to" ? message.to() : (arg == "cc" ? message.cc() : message.bcc()))) { |
178 foreach (const QMessageAddress &addr, (arg == "to" ? message.to() : (arg == "cc" ? message.cc() : message.bcc()))) { |
114 addresses.append(addr.addressee()); |
179 addresses.append(addr.addressee()); |
115 } |
|
116 result.append(addresses.join(",")); |
|
117 } else if (arg == "from") { |
|
118 result.append(message.from().addressee()); |
|
119 } else if (arg == "type") { |
|
120 result.append(message.contentType() + '/' + message.contentSubType()); |
|
121 } else if (arg == "body") { |
|
122 result.append(message.find(message.bodyId()).textContent()); |
|
123 } else if (arg == "attachments") { |
|
124 QStringList fileNames; |
|
125 foreach (const QMessageContentContainerId &id, message.attachmentIds()) { |
|
126 fileNames.append(message.find(id).suggestedFileName()); |
|
127 } |
|
128 result.append(fileNames.join(",")); |
|
129 } |
180 } |
|
181 result.append(addresses.join(",")); |
|
182 } else if (arg == "from") { |
|
183 result.append(message.from().addressee()); |
|
184 } else if (arg == "type") { |
|
185 result.append(message.contentType() + '/' + message.contentSubType()); |
|
186 } else if (arg == "body") { |
|
187 result.append(message.find(message.bodyId()).textContent()); |
|
188 } else if (arg == "status") { |
|
189 result.append(QString("0x%1").arg(QString::number(message.status()))); |
|
190 } else if (arg == "attachments") { |
|
191 QStringList fileNames; |
|
192 foreach (const QMessageContentContainerId &id, message.attachmentIds()) { |
|
193 fileNames.append(message.find(id).suggestedFileName()); |
|
194 } |
|
195 result.append(fileNames.join(",")); |
130 } |
196 } |
131 } |
197 } |
132 |
198 |
133 //! [print-result] |
199 //! [print-result] |
134 printMessage(QString::number(++n) + '\t' + result.join("\t")); |
200 printMessage(QString::number(++n) + '\t' + result.join("\t")); |