Reputation: 493
I am creating an iphone app with xmpframework, everything works fine, but i would like to update my profile picture with the following code. and i got some incorrect recursive vCard-temp request to the server. But the picture got updated, and notified all friends in my roster.
//I clicked on the button
-(void)updatevCardButtonClicked{
XMPPvCardTemp *vCardTemp = [[[self appDelegate] xmppvCardTempModule] myvCardTemp];
NSLog(@"my vCardTemp: %@", vCardTemp);
NSData *tempImage = [self getDataFromImage:[self resizeImage:userImage]];
[vCardTemp setPhoto: tempImage];
[[[self appDelegate] xmppvCardTempModule]updateMyvCardTemp:vCardTemp];
}
output and explanation below
my vCardTemp: *nil description*
MyApp[60625:6c1b] XMPPvCardCoreDataStorage: Triggering save (pendingRequests=0)
MyApp[60625:207] MyAppDelegate: xmppStream:didReceiveIQ: - E49C843A-5A05-4148-A4CF-B400062A83C0
MyApp[60625:207] MyAppDelegate: xmppStream:didReceivePresence: - <presence xmlns="jabber:client" from="[email protected]/1948110991326183732515886" to="[email protected]/1948110991326183732515886">
<status>At work</status>
<x xmlns="vcard-temp:x:update">
<photo>1f6401ddea76826fddc4cd7ddc17741db6c9dabc</photo>
</x>
<c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="></c>
<x xmlns="vcard-temp:x:update">
<photo>c3b2d65259a4fc1d37e56777697d4f5a9730fb03</photo></x><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="></c>
</presence>
MyApp[60625:5323] XMPPRosterCoreDataStorage: handlePresence:xmppStream:
//repeat start from here, and the DidReceivePresence: will grow into tons of lines with the samthing
MyApp[60625:207] XMPPRosterCoreDataStorage: userForJID:xmppStream:managedObjectContext:
MyApp[60625:1e0b] XMPPRosterCoreDataStorage: userForJID:xmppStream:managedObjectContext:
MyApp[60625:207] XMPPRosterCoreDataStorage: resourceForJID:xmppStream:managedObjectContext:
MyApp[60625:5323] XMPPvCardCoreDataStorage: Triggering save (pendingRequests=0)
MyApp[60625:207] MyAppDelegate: xmppStream:didReceiveIQ: - (null)
MyApp[60625:1e0b] XMPPvCardCoreDataStorage: Triggering save (pendingRequests=0)
MyApp[60625:207] MyAppDelegate: xmppStream:didReceivePresence: - <presence xmlns="jabber:client" from="[email protected]/1948110991326183732515886" to="[email protected]/1948110991326183732515886">
<status>At work</status>
<x xmlns="vcard-temp:x:update">
<photo>1f6401ddea76826fddc4cd7ddc17741db6c9dabc</photo>
</x>
<c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="></c>
<x xmlns="vcard-temp:x:update">
<photo>c3b2d65259a4fc1d37e56777697d4f5a9730fb03</photo>
</x>
<c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="></c>
<x xmlns="vcard-temp:x:update">
<photo>c3b2d65259a4fc1d37e56777697d4f5a9730fb03</photo>
</x>
<c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4=">
</c>
</presence>
//repeat the above in the rest of the output with more and more "vcard-temp:x:update"
what i found so far, the below cause this problem, but i can't figure out where i can fix it.
//i found that these two "SEND" cause the problem, the app just keep sending these two
SEND: <iq type="get" to="[email protected]"><vCard xmlns="vcard-temp"/></iq>
SEND: <presence>
<x xmlns="vcard-temp:x:update">
<photo>1f6401ddea76826fddc4cd7ddc17741db6c9dabc</photo>
</x>
<c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="/>
<x xmlns="vcard-temp:x:update">
<photo>1f6401ddea76826fddc4cd7ddc17741db6c9dabc</photo>
</x>
<c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="/>
<x xmlns="vcard-temp:x:update">
<photo>f93ee3918c7baaf095edb9f6bede892c603161af</photo>
</x>
<c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="/>
<x xmlns="vcard-temp:x:update">
<photo>f93ee3918c7baaf095edb9f6bede892c603161af</photo>
</x>
<c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/xmppframework" ver="VyOFcFX6+YNmKssVXSBKGFP0BS4="/>
</presence>
//this presence keep growing as you can see the repeated parts
Upvotes: 1
Views: 1552
Reputation: 46
I have been trying to tackle this problem for quite some time. Let me know if this works for you. Here's my explanation:
Whenever you send a presence element via xmppStream, it caches a copy of it under the "myPresence" instance variable.
If you look for the following method in XMPPStream.m:
- (void)continueSendElement:(NSXMLElement *)element withTag:(long)tag
there is a comment about 10-20 lines down that says:
// Update myPresence if this is a normal presence element.
// In other words, ignore presence subscription stuff, MUC room stuff, etc.
When the XMPPvCardAvatarModule class updates the vcard, it introduces things like the <x> and the <c> (capability) tags that pollutes the normal presence element.
To fix this, we need to clean up those unnecessary tags. Here is a section of my edited code:
else if ([element isKindOfClass:[XMPPPresence class]])
{
// Update myPresence if this is a normal presence element.
// In other words, ignore presence subscription stuff, MUC room stuff, etc.
XMPPPresence *presence = (XMPPPresence *)element;
// We use the built-in [presence type] which guarantees lowercase strings,
// and will return @"available" if there was no set type (as available is implicit).
NSString *type = [presence type];
if ([type isEqualToString:@"available"] || [type isEqualToString:@"unavailable"])
{
NSArray *vCardXElem = [presence elementsForName:@"x"];
NSArray *capabilitiesHash = [presence elementsForName:@"c"];
for (NSXMLElement *x in vCardXElem)
{
[presence removeChildAtIndex:[x index]];
}
for (NSXMLElement *c in capabilitiesHash)
{
[presence removeChildAtIndex:[c index]];
}
if ([presence toStr] == nil && myPresence != presence)
{
myPresence = presence;
}
}
[multicastDelegate xmppStream:self didSendPresence:(XMPPPresence *)element];
}
Upvotes: 2