messagemanager.java

来自「moblie syncml mail javame」· Java 代码 · 共 1,265 行 · 第 1/4 页

JAVA
1,265
字号
            
            Hashtable attr = XmlUtil.getTagAttributes(xml, ITEM_TAG);
            String encoding = (String)attr.get("enc");
            // Try with Uppercase for 3.0 connector bug
            if(encoding == null) {
                encoding = (String)attr.get("ENC");
            }
            if(encoding != null) {
                Log.debug("EmailData.parse: encoding from server= " + encoding);
                if(StringUtil.equalsIgnoreCase(encoding,"quoted-printable")) {
                    // TODO: optimize this. Since the connector now does
                    //       not send QP to the client, we will not fall
                    //       into this case.
                    String qp = item.toString();
                    qp = QuotedPrintable.decode(qp.getBytes(), "UTF-8");
                    item = new ChunkedString(qp);
                }
            }
            // 
            MIMEProcessor mp = new MIMEProcessor();
            Message msg = mp.parseMailMessage(item);
            
            msg.setFlags(flags);

            // Process the Funambol extensions for filtering. Example:
            // <Ext><XNam>x-funambol-body</XNam><XVal>15000</XVal></Ext> 
            // <Ext><XNam>x-funambol-attach-n</XNam><XVal>1</XVal></Ext> 
            // <Ext><XNam>x-funambol-attach</XNam><XVal>att1.txt</XVal><XVal>10000</XVal></Ext>
            // XXX: we are now considering x-funambol-body only
            Vector extList = XmlUtil.getTagValues(xml, EXT_TAG);
            
            Multipart multipart = null;
            
            
            
            for(int i=0, l=extList.size(); i<l; i++) {
                ChunkedString ext = (ChunkedString)extList.elementAt(i);
                try {
                    ChunkedString xnam = XmlUtil.getTagValue(ext, "XNam");
                    if(xnam.equals("x-funambol-body")) {
                        String xval = XmlUtil.getTagValue(ext, "XVal").toString();
                        if (xval == null) {
                            Log.info("Incomplete header");
                        }
                        msg.getFlags().setFlag(MessageFlags.PARTIAL, true);
                        //break;
                    }

                  
//ifndef isBlackberry
                    
                    if(xnam.equals("x-funambol-attach-n")){
                        if(msg.isMultipart()){
                            multipart = (Multipart)msg.getContent();
                        }else{
                            multipart = new Multipart();
                            BodyPart bodyPartText = new BodyPart();
                            bodyPartText.addHeader(BodyPart.CONTENT_TRANSFER_ENCODING, "8bit");
                            bodyPartText.setContent(msg.getTextContent());
                            multipart.addBodyPart(bodyPartText);
                        }
                        
                        
                    }
        
                    if(xnam.equals("x-funambol-attach")){
                        Vector vec = XmlUtil.getTagValues(ext, "XVal");
                        BodyPart bodyPartAttach = new BodyPart();
                        bodyPartAttach.setDisposition(BodyPart.CD_ATTACHMENT);
                        bodyPartAttach.addHeader(BodyPart.CONTENT_TRANSFER_ENCODING, "8bit");
                        String name = ((ChunkedString)vec.elementAt(0)).toString();
                        if (name.equals("null")){
                            name = "Att.html";
                        }
                        bodyPartAttach.setFileName(name);
                        bodyPartAttach.setSize(((ChunkedString)vec.elementAt(1)).toString());
                        if (vec.size() == 4){
                            bodyPartAttach.setContentType(((ChunkedString)vec.elementAt(2)).toString());
                            
                            String url = checkUrl(((ChunkedString)vec.elementAt(3)).toString());
                            bodyPartAttach.setAttachUrl(url);
                        }
                        multipart.addBodyPart(bodyPartAttach); 
                    }
                            
//endif   
                } catch (XmlException xe) {
                    xe.printStackTrace();
                    Log.error("[EmailData.parse]Invalid Ext field. Ignoring it");
                }
            }
            
            if(multipart != null){
                msg.setContent(multipart);
                Log.debug("Message is multipart : "+msg.isMultipart());
            }
            // Dump memory stats
            Log.stats("End of MessageManager.parseMessage");

            return msg;
        }
        return null;
    }
    
     private String checkUrl(String url) {
        if(url.startsWith("/")){
            try{
                String syncUrl = ConfigManager.getConfig().getMailAccount().getUrl();
                int index = syncUrl.indexOf('/',7);
                String prefixUrl = syncUrl.substring(0, index);
                return prefixUrl+url;                
            } catch (ConfigException cex) {
                cex.printStackTrace();
                Log.error(this,"Extracting attachments url from ext "+cex.toString());
                return null;
            }
            
        }else{
            return url;
        }
         
         
    }

    /**
     * Parse a SyncML byte stream representing a folder.
     *
     * @param syncmlData syncml byte stream
     * @return the Folder
     * @throws XmlException if the SyncML item is not formed properly
     */
    private Folder parseFolder(byte[] syncmlData) throws XmlException {
        ChunkedString xml = new ChunkedString(new String(syncmlData));

        String name;
        String role = XmlUtil.getTagValue(xml, ROLE_TAG).toString();
        //TODO: be careful while doing turkish localization: there are 
        //two different lowercase 'i'  in turkey!
        
        if (role.toLowerCase().equals(Store.INBOX.toLowerCase())) {
            Log.debug("Folder Inbox from server");
            name = Store.INBOX;
        }
        else if (role.toLowerCase().equals(Store.OUTBOX.toLowerCase())) {
            Log.debug("Folder Outbox from server");
            name = Store.OUTBOX;
        }
        else if (role.toLowerCase().equals(Store.DRAFTS.toLowerCase())) {
            Log.debug("Folder Drafts from server");
            name = Store.DRAFTS;
        }
        else if (role.toLowerCase().equals(Store.SENT.toLowerCase())) {
            Log.debug("Folder Sent from server");
            name = Store.SENT;
        }
        else {
            throw new XmlException("Invalid folder from server:"+role);
        }

         //Date created = MailDateFormatter.parseUTCDate(XmlUtil.getTagValue(xml, CREATED_TAG).toString());

         Folder folder = new Folder(name, msgStore);
         return folder;
    }


    /**
     * Utility method to check if a tag is found in a chunked string
     *
     * @param xml a chunked string
     * @param tag to be extracted
     *
     * @return true if the tag is found, false otherwise
     */
    private boolean getXmlFlag(ChunkedString xml, String tag) throws XmlException {
        ChunkedString val = null;

        if(XmlUtil.getTag(xml, tag) > -1) {
            val = XmlUtil.getTagValue(xml, tag);
            if(val.equals("true")) {
                return true;
            }
        }
        return false;
    }

    /**
     * Utility method to add a boolean xml flag into a String buffer
     * @param out the xml output stream
     * @param tag tag name
     * @param flag tag value (true, false)
     */
    private void addXmlFlag(StringBuffer out, String tag, boolean flag) {
        String val = flag ? "true" : "false" ;
        XmlUtil.addElement(out, tag, val);
    }

    /**
     * Utility method to get an xml date out of a chunked string
     * @param xml is the chunked string
     * @param tag the date tag
     * @return the date tag value
     */
    private Date getXmlDate(ChunkedString xml, String tag) throws XmlException {
        String val = null;
        MailDateFormatter df = new MailDateFormatter();

        if(XmlUtil.getTag(xml, tag) > -1) {
            val = XmlUtil.getTagValue(xml, tag).toString();
            return MailDateFormatter.parseUTCDate(val);
        }
        return null;
    }

    /**
     * Convert Funambol 3.0 folder names into local folder names.
     *
     * @param parent the item parent string
     * @return the converted name, or the original one if does not
     *         starts with "ROOT/"
     */
    private String folderFromParent(String parent) {
        final String root = "ROOT/";
        
        if(parent == null) {
            return null;
        }
        if (parent.startsWith(root)) {
            return folderFromPrefix(parent.charAt(root.length()));
        }
        return parent;
    }

    /**
     * Find the folder name from the Funambol key prefix.
     */
    private String folderFromPrefix(char prefix) {
        switch (prefix) {
            case 'I':
                return "Inbox";
            case 'O':
                return "Outbox";
            case 'D':
                return "Drafts";
            case 'S':
                return "Sent";
            default:
                return null;
        }
    }

    /**
     * This method creates a LUID for a given message.
     * In our client a LUID is folderName/messageRecordId
     *
     * @param msg the message
     * @return the LUID
     */
    private String makeLuid(Message msg) {
        String luid = msg.getParent().getName()+"/"+msg.getRecordId();
        return luid;
    }

    /**
     * Utility method to dump the message flags into a string representing a
     * SyncML email item.
     * @param flags message flags
     * @param out output string
     */
    private void formatFlags(MessageFlags flags, StringBuffer out) {
        addXmlFlag(out, READ_TAG, flags.isSet(MessageFlags.OPENED));
        addXmlFlag(out, FORW_TAG, flags.isSet(MessageFlags.FORWARDED));
        addXmlFlag(out, REPL_TAG, flags.isSet(MessageFlags.ANSWERED));
        addXmlFlag(out, DELE_TAG, flags.isSet(MessageFlags.DELETED));
        addXmlFlag(out, FLAG_TAG, flags.isSet(MessageFlags.FLAGGED));
    }

    /**
     * Compute root folders. This method initializes the rootFolders array with
     * the set of root folders. If the array has already been computed then the
     * method will overwrite it.
     */
    private void computeRootFolders() {

        if (rootFolders == null) {
            // Build the ordered root folder list
            Folder[] flist = msgStore.list();
            int len=flist.length;
            rootFolders = new Folder[len];
            
            for(int i=0, j=4; i<flist.length; i++) {
                String name = flist[i].getName();
                int idx = 0;
                
                if(name.equals(Store.INBOX)) {
                    idx = INBOX;
                } else if (name.equals(Store.OUTBOX)) {
                    idx = OUTBOX;
                } else if (name.equals(Store.DRAFTS)) {
                    idx = DRAFTS;
                } else if (name.equals(Store.SENT)) {
                    idx = SENT;
                } else {
                    idx = j++;
                }
               
                rootFolders[idx] = new Folder(flist[i].getFullName(), msgStore);
            }
        }
    }

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?