2015-03-26 15 views
9

Konieczne jest dołączenie 0313 XEP (0,2) http://xmpp.org/extensions/attic/xep-0313-0.2.html#sect-idp616432 w smack/ASMACK. Tworzę PacketExtension dla tego.SMACK XEP-313 Wdrożenie

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()); 
    } 
}; 

W tej implementacji nie przekazuję żadnego pakietu do archiveListener.

Jeżeli ustawić filtr:

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

mam pakiety ale one nie są pełne.

muszą być:

<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> 

mam:

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

W Smack Logi mam pełną wiadomość.

+0

Proponuję zapoznać się z dokumentacją dotyczącą dostawców. – Flow

+0

cześć, utknąłem w tym samym punkcie. Naprawiłeś? proszę pomóc – JIthin

+0

Prawdopodobnie używasz serwera, który nie obsługuje tej funkcji. Opracowałem plugin openfire, aby go osiągnąć – MrPk

Odpowiedz

3

Wygląda kodzie

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

nigdy rozmowy. Sprawdź to. Zwykle ten kod musi być umieszczony w bloku statycznym klasy głównej, który działa z biblioteką xmpp.

+0

nie, to się nazywa. – JIthin

0

Aby dodać rozszerzenie, musisz zrobić trzy rzeczy.

  1. Utwórz niestandardową klasę rozszerzenia rozszerzającą rozszerzenie/rozszerzenie.

  2. Utwórz dostawcę rozszerzenia rozszerzającego ExtensionProvider.

  3. Dodaj niestandardowego dostawcę rozszerzeń do menedżera dostawcy.

Uwaga: Dostawca rozszerzeń przeanalizuje rozszerzenie z pakietu (XML) zgodnie z wymaganiami (metoda onParse() dostawcy). Każde niestandardowe rozszerzenie musi zostać przeanalizowane ręcznie i konieczne jest dodanie niestandardowego dostawcy do menedżera dostawcy.