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 + -
显示快捷键?