Does VCard.getAvatar() really work?

Hello everybody,

I can’‘t correctly get avatars with VCard.getAvatar(). The byte buffer I get seems to be corrupted, even if I write the bytes to the disk I cannot produce a valid image file. The image I’'m using is about 6.2 KB. Any suggestions?

Thanks

Davide

I’‘m trying with smaller pictures, and this is the error I’'m getting with a file of about 3KB and one about 2KB.

Corrupt JPEG data: 1 extraneous bytes before marker 0xfd

Nobody’'s using this feature?

Any help would be really appreciated.

Thanks

D.

Hello people,

I’'ve found a solution.

From my few tests it seems that SMACK clients are able to show avatars created with SMACK, but not them created with other clients.

Looking at VCard’‘s source code I saw that avatar bytes are decoded from a private avatar field. I used this “hack” to get avatar bytes, decoding them with Sun’'s Base64Decoder, and now everything goes fine.

private byte[] getAvatarBytes(VCard vcard){

byte[] res = null;

try{

Field f = VCard.class.getDeclaredField(“avatar”);

f.setAccessible(true);

String avatar = (String)f.get(vcard);

sun.misc.BASE64Decoder enc = new sun.misc.BASE64Decoder();

res = enc.decodeBuffer(avatar);

}catch(Exception e){

e.printStackTrace();

}

return res;

}

Is it a bug or am I using libraries in a wrong way ?

I’‘m not surprised as I’'ve had issues with our Base64 debugger before. There is another Base64 implementation in Smack that I will likely switch this method into using. Could you post the base64 data here so that I can create a test case to confirm that everything is functioning okay?

Thanks,

Alex

Hi Alex, here’‘s the full vCard response which makes getAvatar() method fail. Using Sun’'s Base64Decoder the picture is OK.

Thanks

Davide

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

Thanks for the info. I found the issue in Smack and checked in a fix for it:

SMACK-135

Cheers,

Alex