2015-03-26 13 views
9

Nó là cần thiết để đính kèm một 0313 xếp (0,2) http://xmpp.org/extensions/attic/xep-0313-0.2.html#sect-idp616432 trong smack/ASMACK. Tôi tạo PacketExtension cho việc này.Smack xếp-313 thực hiện

public class Archive313 implements PacketExtension { 
    static final public String NAMESPACE = "urn:xmpp:mam:tmp"; 
    static final public String ELEMENT = "result"; 
    private String Id; 
    private String Queryid; 
    private String Stamp; 
    private String To; 
    private String From; 
    private String Type; 
    private String Body; 

    public Archive313(String id, String queryid, String stamp, String to, String from, String type, String body) { 
     Id = id; 
     Queryid = queryid; 
     Stamp = stamp; 
     To = to; 
     From = from; 
     Type = type; 
     Body = body; 
    } 

    @Override 
    public String getElementName() { 
     return ELEMENT; 
    } 

    @Override 
    public String getNamespace() { 
     return NAMESPACE; 
    } 

    @Override 
    public String toXML() { 
     return "<" + ELEMENT + " xmlns='" + NAMESPACE + "' queryid='" + Queryid + "' id='" + Id + "'>" + 
       "<forwarded xmlns='urn:xmpp:forward:0'>" + 
       "<delay xmlns='urn:xmpp:delay' stamp='" + Stamp + "'/><message to='" 
       + To + "' from='" + From + "' type='" + Type + "'><body>" + Body + "</body></message></forwarded></result>"; 
    } 

    public static class Archive313Provider implements PacketExtensionProvider { 

     @Override 
     public PacketExtension parseExtension(XmlPullParser xmlPullParser) throws Exception { 
      String tag_name = ""; 
      String id = ""; 
      String queryid = ""; 
      String stamp = ""; 
      String to = ""; 
      String from = ""; 
      String type = ""; 
      String body = ""; 

      while (xmlPullParser.getEventType() != XmlPullParser.END_DOCUMENT) { 
       switch (xmlPullParser.getEventType()) { 
        case XmlPullParser.START_TAG: 
         tag_name = xmlPullParser.getName(); 
         for (int i = 0; i < xmlPullParser.getAttributeCount(); i++) { 
          if (tag_name != null && tag_name.equals("result")) { 
           if (xmlPullParser.getAttributeName(i).equals("queryid")) { 
            queryid = xmlPullParser.getAttributeValue(i); 
           } 
           if (xmlPullParser.getAttributeName(i).equals("id")) { 
            id = xmlPullParser.getAttributeValue(i); 
           } 
          } 

          if (tag_name != null && tag_name.equals("delay")) { 
           if (xmlPullParser.getAttributeName(i).equals("stamp")) { 
            stamp = xmlPullParser.getAttributeValue(i); 
           } 
          } 

          if (tag_name != null && tag_name.equals("message") && xmlPullParser.getAttributeCount() > 2) { 
           if (xmlPullParser.getAttributeName(i).equals("to")) { 
            to = xmlPullParser.getAttributeValue(i); 
           } 

           if (xmlPullParser.getAttributeName(i).equals("from")) { 
            from = xmlPullParser.getAttributeValue(i); 
           } 

           if (xmlPullParser.getAttributeName(i).equals("type")) { 
            type = xmlPullParser.getAttributeValue(i); 
           } 
          } 
         } 
         break; 
        case XmlPullParser.END_TAG: 
         tag_name = xmlPullParser.getName(); 
         break; 
        case XmlPullParser.TEXT: 
         if ("body".equals(tag_name)) { 
          body = xmlPullParser.getText(); 
         } 
         break; 
        default: 
         break; 
       } 
       xmlPullParser.next(); 
      } 

      return new Archive313(id,queryid,stamp,to,from,type,body); 
     } 
    } 
} 

ProviderManager pm = ProviderManager.getInstance(); 

pm.addExtensionProvider("result", "urn:xmpp:mam:tmp", new Archive313.Archive313Provider()); 

mXMPPConnection.addPacketListener(archiveListener, new PacketExtensionFilter("result", "urn:xmpp:mam:tmp")); 

private PacketListener archiveListener = new PacketListener() { 

    @Override 
    public void processPacket(Packet packet) { 
     Log.d("archiveListener", packet.toXML()); 
    } 
}; 

Trong triển khai này, tôi không đưa bất kỳ gói nào vào kho lưu trữListener.

Nếu tôi đặt lọc:

PacketFilter filter = new PacketFilter() { 
    @Override 
    public boolean accept(Packet packet) { 
     if (packet.toXML().contains("urn:xmpp:mam:tmp")) { 
      return true; 
     } 
     return false; 
    } 
}; 

tôi đã gói nhưng họ không đầy đủ.

Cần là:

<message id='aeb213' to='[email protected]/chamber'> 
    <result xmlns='urn:xmpp:mam:tmp' queryid='f27' id='28482-98726-73623'> 
    <forwarded xmlns='urn:xmpp:forward:0'> 
     <delay xmlns='urn:xmpp:delay' stamp='2010-07-10T23:08:25Z'/> 
     <message to='[email protected]/balcony' 
     from='[email protected]/orchard' 
     type='chat'> 
     <body>Call me but love, and I'll be new baptized; Henceforth I never will be Romeo.</body> 
     </message> 
    </forwarded> 
    </result> 
</message> 

tôi nhận:

<message id='aeb213' to='[email protected]/chamber'> 
    <result xmlns='urn:xmpp:mam:tmp' queryid='f27' id='28482-98726-73623'> 
    </result> 
</message> 

Trong Smack Logs tôi đã thông báo đầy đủ.

+0

Tôi khuyên bạn nên đọc tài liệu về các nhà cung cấp. – Flow

+0

hi, tôi cũng bị mắc kẹt tại cùng một điểm. Bạn đã cố định chưa? hãy giúp – JIthin

+0

Có thể bạn đang sử dụng một máy chủ không hỗ trợ tính năng này. Tôi đã phát triển một plugin mở để đạt được nó – MrPk

Trả lời

3

Dường như mã của bạn

ProviderManager pm = ProviderManager.getInstance(); 
pm.addExtensionProvider("result", "urn:xmpp:mam:tmp", new Archive313.Archive313Provider()); 

không bao giờ gọi. Kiểm tra điều này. Thông thường, mã này phải được đặt trong khối tĩnh của lớp chính làm việc với lib xmpp.

+0

không, nó được gọi. – JIthin

0

Để thêm bất kỳ tiện ích mở rộng nào, bạn phải thực hiện ba việc.

  1. Tạo lớp mở rộng tùy chỉnh mở rộng Extension/ExtensionElement.

  2. Tạo nhà cung cấp tiện ích mở rộng mở rộng ExtensionProvider.

  3. Thêm nhà cung cấp tiện ích tùy chỉnh vào trình quản lý nhà cung cấp.

Lưu ý: Nhà cung cấp mở rộng sẽ phân tích cú pháp mở rộng của bạn từ gói (XML) theo yêu cầu của bạn (onParse()). Mọi tiện ích tùy chỉnh đều phải phân tích cú pháp theo cách thủ công và cần phải thêm nhà cung cấp tùy chỉnh vào trình quản lý nhà cung cấp.

Các vấn đề liên quan