mmsclient.cpp
来自「Qtopia下的邮件处理程序」· C++ 代码 · 共 661 行 · 第 1/2 页
CPP
661 行
if (!comms || !comms->isActive()) return; emit updateStatus(tr("Error occurred")); emit errorOccurred(code, msg); if (comms) comms->clearRequests(); //clear after error emit}Email MmsClient::convertToEmail(const MMSMessage &mms, int size){ qDebug() << "Convert to email."; Email mail; mail.setType(MailMessage::MMS); mail.setStatus(EFlag_Incoming, true ); mail.setUuid( internalId ); QString message; QString to, cc; // first handle the headers. The headers that we get out of the // mms decoder are still encoded, so use fromRFC822 to deal with // the decoding. QList<WspField>::ConstIterator it; for (it = mms.headers().begin(); it != mms.headers().end(); ++it) { const WspField &field = *it; if (field.name == "To") { if (!to.isEmpty()) to += ", "; to += decodeRecipient(field.value); } else if (field.name == "Cc") { if (!cc.isEmpty()) cc += ", "; cc += decodeRecipient(field.value); } else if (field.name == "From") { message += "From: " + decodeRecipient(field.value) + "\n"; } else if (field.name != "Content-Type") { message += field.name + ": " + field.value + "\n"; } } if (!to.isEmpty()) message += "To: " + to + "\n"; if (!cc.isEmpty()) message += "Cc: " + cc + "\n"; QString boundary = "-----4345=next_bound=0495----"; message += "Mime-Version: 1.0\n"; const WspField *f = mms.field("Content-Type"); if (f) { if (f->value.contains("application/vnd.wap.multipart.related")) message += f->name + ": " + "multipart/related"; else message += f->name + ": " + "multipart/mixed"; QString value = f->value; int semi = value.indexOf(';'); if (semi > 0) message += value.mid(semi); message += "; boundary=\"" + boundary + "\"\n\n"; } message += "This is a multipart message in Mime 1.0 format\n\n"; // Now add the parts for (int i = 0; i < mms.messagePartCount(); i++) { qDebug("Adding part"); message += "--" + boundary + "\n"; bool isText = false; const WspPart &mmsPart = mms.messagePart(i); const WspField *f = mmsPart.header("Content-Type"); if (f) { if( f->value.contains( "application/vnd.oma.drm.message" ) || f->value.contains( "application/vnd.oma.drm.content" ) ) { message += convertDrmPart( i, QUuid::createUuid(), f->value, mmsPart ); message += "\n"; continue; } else message += "Content-Type: " + f->value + "\n"; if (f->value.indexOf("text/") == 0) isText = true; } f = mmsPart.header("Content-ID"); if (f) message += "Content-ID: " + f->value + "\n"; f = mmsPart.header("Content-Location"); if (f) message += "Content-Location: " + f->value + "\n"; if (isText) { message += "Content-Transfer-Encoding: 8bit\n\n"; message += QString(mmsPart.data()) + "\n"; } else { message += "Content-Transfer-Encoding: Base64\n\n"; message += MailMessage::encodeBase64(mmsPart.data()) + "\n"; } message += "\n"; } message += "--" + boundary + "--"; message += "\n.\n"; mail.fromRFC822( message ); mail.setMultipartRelated(true); mail.setSize( size ); mail.setStatus(EFlag_Downloaded, true); f = mms.field("Message-ID"); if (f) mail.setServerUid(f->value); mail.setFromAccount( account->id() ); mail.setFromMailbox(""); return mail;}QString MmsClient::convertDrmPart( int i, const QUuid &id, const QString &typeHeader, const WspPart &part ) const{ QString boundary; QString name; QString filename; QString message = "Content-Type: qtopia/drmattachmentlink"; QStringList params = typeHeader.split( ';' ); params.removeAt( 0 ); foreach( QString param, params ) { QString tParam = param.trimmed(); if( tParam.startsWith( "boundary=" ) ) boundary = tParam.mid( 10, tParam.length() - 11 ); else message += ";" + param; if( tParam.startsWith( "filename=" ) ) filename = tParam.mid( 10, tParam.length() - 11 ); if( tParam.startsWith( "name=" ) ) name = tParam.mid( 6 , tParam.length() - 7 ); } message += "\n"; const WspField *f; if( (f = part.header("Content-ID" )) != 0 ) message += "Content-ID: " + f->value + "\n"; if( (f = part.header("Content-Location")) != 0 ) message += "Content-Location: " + f->value + "\n"; f = part.header("Content-Length"); quint64 length = f ? f->value.toInt() : part.data().length(); QString path = getPath("enclosures/", true).replace( "//", "/" ) + QString("%1_%2_%3.dcf").arg( id.data1 ).arg( i ).arg( filename.isEmpty() ? name : filename ); bool installed = false; qDebug() << path; bool isMessage = false; if( typeHeader.contains( "application/vnd.oma.drm.message" ) ) { isMessage = true; if( !boundary.isEmpty() ) installed = QDrmContentAgent::getDrm()->installMessage( part.data(), path, boundary, length ); else installed = QDrmContentAgent::getDrm()->installMessage( part.data(), path ); } else if( typeHeader.contains( "application/vnd.oma.drm.content" ) ) { QFile file( path ); if( file.open( QIODevice::WriteOnly ) ) { file.write( part.data() ); file.close(); installed = QDrmContentAgent::getDrm()->registerDcf( path ); } } if( installed ) { QContent content( path ); message += "Content-Transfer-Encoding: 8bit\n\n"; message += DrmAttachmentLink( content.type(), path ).data(); if( isMessage && (!name.isEmpty() || filename.isEmpty()) ) { content.setName( name.isEmpty() ? filename : name ); content.commit(); } return message; } else return QString( "ContentType: text/plain\n\n\%1" ).arg( tr( "Invalid attachment" ) );}MMSMessage MmsClient::convertToMms(const MailMessage &mail){ MMSMessage mms; mms.setType(MMSMessage::MSendReq); QString id = "00000" + QString::number(txnId); id = id.right(5); mms.addField("X-Mms-Transaction-Id", id); mms.addField("X-Mms-MMS-Version", "1.0"); txnId++; if (mail.dateString().isNull()) { mms.addField("Date", QDateTime::currentDateTime().toString()); } else { mms.addField("Date", mail.dateString()); } mms.addField("From", ""); // i.e. insert-an-address token if (!mail.subject().isEmpty()) mms.addField("Subject", mail.subject()); QStringList list = mail.to(); QStringList::ConstIterator it; for (it = list.begin(); it != list.end(); ++it) mms.addField("To", encodeRecipient(*it)); list = mail.cc(); for (it = list.begin(); it != list.end(); ++it) mms.addField("Cc", encodeRecipient(*it)); list = mail.bcc(); for (it = list.begin(); it != list.end(); ++it) mms.addField("Bcc", encodeRecipient(*it)); addField(mms, mail, "X-Mms-Delivery-Report"); addField(mms, mail, "X-Mms-Read-Reply"); if (mail.multipartRelated()) mms.addField("Content-Type", "application/vnd.wap.multipart.related; type=application/smil; start=<presentation-part>"); else mms.addField("Content-Type", "application/vnd.wap.multipart.mixed"); for (uint i = 0; i < mail.messagePartCount(); i++) { const MailMessagePart &mailPart = mail.messagePartAt(i); WspPart mmsPart; mmsPart.addHeader("Content-Type", mailPart.contentType()); if (mailPart.contentType() == "application/smil") { mmsPart.addHeader("Content-ID", "<presentation-part>"); } else if (!mailPart.contentID().isEmpty()) { mmsPart.addHeader("Content-ID", mailPart.contentID()); } else { mmsPart.addHeader("Content-ID", QString("CID-%1").arg(i)); } mmsPart.addHeader("Date", QDateTime::currentDateTime().toString()); if (!mailPart.contentLocation().isEmpty()) { mmsPart.addHeader("Content-Location", mailPart.contentLocation()); mmsPart.addHeader("X-Wap-Content-URI", "http://orig.host/" + mailPart.contentLocation()); } QByteArray decoded = mailPart.decodedBody().toLatin1(); mmsPart.setData(decoded.data(), decoded.length()); mms.addMessagePart(mmsPart); } if (mail.messagePartCount() == 0 && !mail.plainTextBody().isEmpty()) { // Work-around for MailMessage converting a text/plain attachment // to a body. WspPart mmsPart; mmsPart.addHeader("Content-Type", "text/plain"); mmsPart.addHeader("Content-ID", QString("CID-0")); mmsPart.addHeader("Date", mail.dateString()); QByteArray body = mail.plainTextBody().toLocal8Bit(); mmsPart.setData(body.data(), body.length()); mms.addMessagePart(mmsPart); } return mms;}void MmsClient::addField(MMSMessage &mms, const Email &mail, const QString &field){ QString f = mail.header(field); if (!f.isNull()) { int colon = f.indexOf(':'); if (colon) { f = f.mid(colon+1); if (f.length() && f[0].isSpace()) f = f.mid(1); if (!f.isEmpty()) mms.addField(field, f); } }}QString MmsClient::encodeRecipient(const QString &r){ QString digits("0123456789+!@#*,pwxabcd"); bool isNumber = true; for (int i = 0; i < r.length(); i++) { if (!digits.contains(r[i])) { isNumber = false; break; } } if (isNumber) return r + "/TYPE=PLMN"; else return r;}QString MmsClient::decodeRecipient(const QString &r){ int pos = r.indexOf("/TYPE="); if (pos > 0) return r.left(pos); return r;}QString MmsClient::networkConfig() const{// QSettings defltConf("Trolltech", "Network");// defltConf.beginGroup("WAP"); Q_ASSERT(account); QString accountstr = account->networkConfig(); qDebug() << "Using network config:" << accountstr; return accountstr;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?