Mercurial > pidgin
changeset 24174:bc10a2129be4
propagate from branch 'im.pidgin.pidgin' (head 3ffe6fd197f037185a0012875ef68c8f6d6c2f89)
to branch 'im.pidgin.xmpp.custom_smiley' (head 5499bab119f9e44a61835cf4f024c1ea6828ff7c)
author | Marcus Lundblad <ml@update.uu.se> |
---|---|
date | Tue, 16 Sep 2008 20:01:24 +0000 |
parents | 5395b18f9f08 (diff) 60c23887a665 (current diff) |
children | 89bed0c03194 |
files | pidgin/artwork/art-tools/clean-svg-definitions.sh pidgin/artwork/art-tools/render-pidgin-emotes.rb pidgin/artwork/hicolor/16x16/actions/pidgin-change-bgcolor.png pidgin/artwork/hicolor/16x16/actions/pidgin-change-fgcolor.png pidgin/artwork/hicolor/16x16/actions/pidgin-drag-down.png pidgin/artwork/hicolor/16x16/actions/pidgin-drag-left.png pidgin/artwork/hicolor/16x16/actions/pidgin-drag-right.png pidgin/artwork/hicolor/16x16/actions/pidgin-drag-up.png pidgin/artwork/hicolor/16x16/actions/pidgin-emote-select.png pidgin/artwork/hicolor/16x16/actions/pidgin-font-face.png pidgin/artwork/hicolor/16x16/actions/pidgin-font-size-down.png pidgin/artwork/hicolor/16x16/actions/pidgin-font-size-up.png pidgin/artwork/hicolor/16x16/actions/pidgin-get-attention.png pidgin/artwork/hicolor/16x16/actions/pidgin-insert-image.png pidgin/artwork/hicolor/16x16/actions/pidgin-insert-link.png pidgin/artwork/hicolor/16x16/actions/pidgin-insert.png pidgin/artwork/hicolor/16x16/actions/pidgin-message-new.png pidgin/artwork/hicolor/16x16/actions/pidgin-send-file.png pidgin/artwork/hicolor/16x16/actions/pidgin-unblock.png pidgin/artwork/hicolor/16x16/actions/pidgin-view-plugins.png pidgin/artwork/hicolor/16x16/actions/pidgin-view-transfers.png pidgin/artwork/hicolor/16x16/animations/process-working0.png pidgin/artwork/hicolor/16x16/animations/process-working1.png pidgin/artwork/hicolor/16x16/animations/process-working10.png pidgin/artwork/hicolor/16x16/animations/process-working11.png pidgin/artwork/hicolor/16x16/animations/process-working12.png pidgin/artwork/hicolor/16x16/animations/process-working13.png pidgin/artwork/hicolor/16x16/animations/process-working14.png pidgin/artwork/hicolor/16x16/animations/process-working15.png pidgin/artwork/hicolor/16x16/animations/process-working16.png pidgin/artwork/hicolor/16x16/animations/process-working17.png pidgin/artwork/hicolor/16x16/animations/process-working18.png pidgin/artwork/hicolor/16x16/animations/process-working19.png pidgin/artwork/hicolor/16x16/animations/process-working2.png pidgin/artwork/hicolor/16x16/animations/process-working20.png pidgin/artwork/hicolor/16x16/animations/process-working21.png pidgin/artwork/hicolor/16x16/animations/process-working22.png pidgin/artwork/hicolor/16x16/animations/process-working23.png pidgin/artwork/hicolor/16x16/animations/process-working24.png pidgin/artwork/hicolor/16x16/animations/process-working25.png pidgin/artwork/hicolor/16x16/animations/process-working26.png pidgin/artwork/hicolor/16x16/animations/process-working27.png pidgin/artwork/hicolor/16x16/animations/process-working28.png pidgin/artwork/hicolor/16x16/animations/process-working29.png pidgin/artwork/hicolor/16x16/animations/process-working3.png pidgin/artwork/hicolor/16x16/animations/process-working30.png pidgin/artwork/hicolor/16x16/animations/process-working4.png pidgin/artwork/hicolor/16x16/animations/process-working5.png pidgin/artwork/hicolor/16x16/animations/process-working6.png pidgin/artwork/hicolor/16x16/animations/process-working7.png pidgin/artwork/hicolor/16x16/animations/process-working8.png pidgin/artwork/hicolor/16x16/animations/process-working9.png pidgin/artwork/hicolor/16x16/animations/typing0.png pidgin/artwork/hicolor/16x16/animations/typing1.png pidgin/artwork/hicolor/16x16/animations/typing2.png pidgin/artwork/hicolor/16x16/animations/typing3.png pidgin/artwork/hicolor/16x16/animations/typing4.png pidgin/artwork/hicolor/16x16/animations/typing5.png pidgin/artwork/hicolor/16x16/apps/pidgin-aim.png pidgin/artwork/hicolor/16x16/apps/pidgin-bonjour.png pidgin/artwork/hicolor/16x16/apps/pidgin-facebook.png pidgin/artwork/hicolor/16x16/apps/pidgin-gadu-gadu.png pidgin/artwork/hicolor/16x16/apps/pidgin-google-talk.png pidgin/artwork/hicolor/16x16/apps/pidgin-icq.png pidgin/artwork/hicolor/16x16/apps/pidgin-irc.png pidgin/artwork/hicolor/16x16/apps/pidgin-jabber.png pidgin/artwork/hicolor/16x16/apps/pidgin-meanwhile.png pidgin/artwork/hicolor/16x16/apps/pidgin-msn.png pidgin/artwork/hicolor/16x16/apps/pidgin-myspace.png pidgin/artwork/hicolor/16x16/apps/pidgin-novell.png pidgin/artwork/hicolor/16x16/apps/pidgin-qq.png pidgin/artwork/hicolor/16x16/apps/pidgin-silc.png pidgin/artwork/hicolor/16x16/apps/pidgin-simple.png pidgin/artwork/hicolor/16x16/apps/pidgin-yahoo.png pidgin/artwork/hicolor/16x16/apps/pidgin-zephyr.png pidgin/artwork/hicolor/16x16/apps/pidgin.png pidgin/artwork/hicolor/16x16/devices/pidgin-hiptop.png pidgin/artwork/hicolor/16x16/devices/pidgin-mobile.png pidgin/artwork/hicolor/16x16/emblems/pidgin-aol-client.png pidgin/artwork/hicolor/16x16/emblems/pidgin-birthday.png pidgin/artwork/hicolor/16x16/emblems/pidgin-blocked.png pidgin/artwork/hicolor/16x16/emblems/pidgin-bot.png pidgin/artwork/hicolor/16x16/emblems/pidgin-external.png pidgin/artwork/hicolor/16x16/emblems/pidgin-female.png pidgin/artwork/hicolor/16x16/emblems/pidgin-founder.png pidgin/artwork/hicolor/16x16/emblems/pidgin-free-for-chat.png pidgin/artwork/hicolor/16x16/emblems/pidgin-game.png pidgin/artwork/hicolor/16x16/emblems/pidgin-half-operator.png pidgin/artwork/hicolor/16x16/emblems/pidgin-male.png pidgin/artwork/hicolor/16x16/emblems/pidgin-music.png pidgin/artwork/hicolor/16x16/emblems/pidgin-not-authorized.png pidgin/artwork/hicolor/16x16/emblems/pidgin-operator.png pidgin/artwork/hicolor/16x16/emblems/pidgin-qq-member.png pidgin/artwork/hicolor/16x16/emblems/pidgin-secure.png pidgin/artwork/hicolor/16x16/emblems/pidgin-unavailable.png pidgin/artwork/hicolor/16x16/emblems/pidgin-video.png pidgin/artwork/hicolor/16x16/emblems/pidgin-voice.png pidgin/artwork/hicolor/16x16/status/pidgin-available.png pidgin/artwork/hicolor/16x16/status/pidgin-away.png pidgin/artwork/hicolor/16x16/status/pidgin-busy.png pidgin/artwork/hicolor/16x16/status/pidgin-chatroom.png pidgin/artwork/hicolor/16x16/status/pidgin-contact.png pidgin/artwork/hicolor/16x16/status/pidgin-dialog-auth.png pidgin/artwork/hicolor/16x16/status/pidgin-dialog-error.png pidgin/artwork/hicolor/16x16/status/pidgin-dialog-info.png pidgin/artwork/hicolor/16x16/status/pidgin-dialog-mail.png pidgin/artwork/hicolor/16x16/status/pidgin-dialog-question.png pidgin/artwork/hicolor/16x16/status/pidgin-extended-away.png pidgin/artwork/hicolor/16x16/status/pidgin-invisible.png pidgin/artwork/hicolor/16x16/status/pidgin-offline.png pidgin/artwork/hicolor/16x16/status/pidgin-tray-available.png pidgin/artwork/hicolor/16x16/status/pidgin-tray-away.png pidgin/artwork/hicolor/16x16/status/pidgin-tray-busy.png pidgin/artwork/hicolor/16x16/status/pidgin-tray-extended-away.png pidgin/artwork/hicolor/16x16/status/pidgin-tray-invisible.png pidgin/artwork/hicolor/16x16/status/pidgin-tray-message-pending.png pidgin/artwork/hicolor/16x16/status/pidgin-tray-new-im.png pidgin/artwork/hicolor/16x16/status/pidgin-tray-offline.png pidgin/artwork/hicolor/22x22/apps/pidgin.png pidgin/artwork/hicolor/22x22/status/pidgin-available.png pidgin/artwork/hicolor/22x22/status/pidgin-away.png pidgin/artwork/hicolor/22x22/status/pidgin-busy.png pidgin/artwork/hicolor/22x22/status/pidgin-chatroom.png pidgin/artwork/hicolor/22x22/status/pidgin-contact.png pidgin/artwork/hicolor/22x22/status/pidgin-extended-away.png pidgin/artwork/hicolor/22x22/status/pidgin-invisible.png pidgin/artwork/hicolor/22x22/status/pidgin-offline.png pidgin/artwork/hicolor/22x22/status/pidgin-tray-available.png pidgin/artwork/hicolor/22x22/status/pidgin-tray-away.png pidgin/artwork/hicolor/22x22/status/pidgin-tray-busy.png pidgin/artwork/hicolor/22x22/status/pidgin-tray-extended-away.png pidgin/artwork/hicolor/22x22/status/pidgin-tray-invisible.png pidgin/artwork/hicolor/22x22/status/pidgin-tray-message-pending.png pidgin/artwork/hicolor/22x22/status/pidgin-tray-new-im.png pidgin/artwork/hicolor/22x22/status/pidgin-tray-offline.png pidgin/artwork/hicolor/24x24/apps/pidgin-aim.png pidgin/artwork/hicolor/24x24/apps/pidgin-bonjour.png pidgin/artwork/hicolor/24x24/apps/pidgin-facebook.png pidgin/artwork/hicolor/24x24/apps/pidgin-gadu-gadu.png pidgin/artwork/hicolor/24x24/apps/pidgin-google-talk.png pidgin/artwork/hicolor/24x24/apps/pidgin-icq.png pidgin/artwork/hicolor/24x24/apps/pidgin-irc.png pidgin/artwork/hicolor/24x24/apps/pidgin-jabber.png pidgin/artwork/hicolor/24x24/apps/pidgin-meanwhile.png pidgin/artwork/hicolor/24x24/apps/pidgin-msn.png pidgin/artwork/hicolor/24x24/apps/pidgin-myspace.png pidgin/artwork/hicolor/24x24/apps/pidgin-novell.png pidgin/artwork/hicolor/24x24/apps/pidgin-qq.png pidgin/artwork/hicolor/24x24/apps/pidgin-silc.png pidgin/artwork/hicolor/24x24/apps/pidgin-simple.png pidgin/artwork/hicolor/24x24/apps/pidgin-yahoo.png pidgin/artwork/hicolor/24x24/apps/pidgin-zephyr.png pidgin/artwork/hicolor/24x24/apps/pidgin.png pidgin/artwork/hicolor/24x24/emotes/Makefile.am pidgin/artwork/hicolor/24x24/emotes/Makefile.mingw pidgin/artwork/hicolor/24x24/emotes/default.theme.in pidgin/artwork/hicolor/24x24/emotes/none/Makefile.am pidgin/artwork/hicolor/24x24/emotes/none/Makefile.mingw pidgin/artwork/hicolor/24x24/emotes/none/none.theme.in pidgin/artwork/hicolor/24x24/emotes/none/theme pidgin/artwork/hicolor/24x24/emotes/pidgin-act-up.png pidgin/artwork/hicolor/24x24/emotes/pidgin-airplane.png pidgin/artwork/hicolor/24x24/emotes/pidgin-alien.png pidgin/artwork/hicolor/24x24/emotes/pidgin-angel.png pidgin/artwork/hicolor/24x24/emotes/pidgin-angry.png pidgin/artwork/hicolor/24x24/emotes/pidgin-arrogant.png pidgin/artwork/hicolor/24x24/emotes/pidgin-at-wits-end.png pidgin/artwork/hicolor/24x24/emotes/pidgin-bad.png pidgin/artwork/hicolor/24x24/emotes/pidgin-bashful.png pidgin/artwork/hicolor/24x24/emotes/pidgin-beat-up.png pidgin/artwork/hicolor/24x24/emotes/pidgin-beauty.png pidgin/artwork/hicolor/24x24/emotes/pidgin-beer.png pidgin/artwork/hicolor/24x24/emotes/pidgin-blowkiss.png pidgin/artwork/hicolor/24x24/emotes/pidgin-bomb.png pidgin/artwork/hicolor/24x24/emotes/pidgin-bowl.png pidgin/artwork/hicolor/24x24/emotes/pidgin-boy.png pidgin/artwork/hicolor/24x24/emotes/pidgin-brb.png pidgin/artwork/hicolor/24x24/emotes/pidgin-bulgy-eyes.png pidgin/artwork/hicolor/24x24/emotes/pidgin-bunny.png pidgin/artwork/hicolor/24x24/emotes/pidgin-bye.png pidgin/artwork/hicolor/24x24/emotes/pidgin-cake.png pidgin/artwork/hicolor/24x24/emotes/pidgin-call-me.png pidgin/artwork/hicolor/24x24/emotes/pidgin-camera.png pidgin/artwork/hicolor/24x24/emotes/pidgin-can.png pidgin/artwork/hicolor/24x24/emotes/pidgin-car.png pidgin/artwork/hicolor/24x24/emotes/pidgin-cat.png pidgin/artwork/hicolor/24x24/emotes/pidgin-chicken.png pidgin/artwork/hicolor/24x24/emotes/pidgin-cigarette.png pidgin/artwork/hicolor/24x24/emotes/pidgin-clap.png pidgin/artwork/hicolor/24x24/emotes/pidgin-clock.png pidgin/artwork/hicolor/24x24/emotes/pidgin-cloudy.png pidgin/artwork/hicolor/24x24/emotes/pidgin-clover.png pidgin/artwork/hicolor/24x24/emotes/pidgin-clown.png pidgin/artwork/hicolor/24x24/emotes/pidgin-coffee.png pidgin/artwork/hicolor/24x24/emotes/pidgin-coins.png pidgin/artwork/hicolor/24x24/emotes/pidgin-computer.png pidgin/artwork/hicolor/24x24/emotes/pidgin-confused.png pidgin/artwork/hicolor/24x24/emotes/pidgin-console.png pidgin/artwork/hicolor/24x24/emotes/pidgin-cow.png pidgin/artwork/hicolor/24x24/emotes/pidgin-cowboy.png pidgin/artwork/hicolor/24x24/emotes/pidgin-crying.png pidgin/artwork/hicolor/24x24/emotes/pidgin-curl-lip.png pidgin/artwork/hicolor/24x24/emotes/pidgin-curse.png pidgin/artwork/hicolor/24x24/emotes/pidgin-cute.png pidgin/artwork/hicolor/24x24/emotes/pidgin-cyclops.png pidgin/artwork/hicolor/24x24/emotes/pidgin-dance.png pidgin/artwork/hicolor/24x24/emotes/pidgin-dazed.png pidgin/artwork/hicolor/24x24/emotes/pidgin-desire.png pidgin/artwork/hicolor/24x24/emotes/pidgin-devil.png pidgin/artwork/hicolor/24x24/emotes/pidgin-disappointed.png pidgin/artwork/hicolor/24x24/emotes/pidgin-disdain.png pidgin/artwork/hicolor/24x24/emotes/pidgin-doctor.png pidgin/artwork/hicolor/24x24/emotes/pidgin-dog.png pidgin/artwork/hicolor/24x24/emotes/pidgin-doh.png pidgin/artwork/hicolor/24x24/emotes/pidgin-dont-know.png pidgin/artwork/hicolor/24x24/emotes/pidgin-drink.png pidgin/artwork/hicolor/24x24/emotes/pidgin-drool.png pidgin/artwork/hicolor/24x24/emotes/pidgin-eat.png pidgin/artwork/hicolor/24x24/emotes/pidgin-embarrassed.png pidgin/artwork/hicolor/24x24/emotes/pidgin-excruciating.png pidgin/artwork/hicolor/24x24/emotes/pidgin-eyeroll.png pidgin/artwork/hicolor/24x24/emotes/pidgin-female-fighter.png pidgin/artwork/hicolor/24x24/emotes/pidgin-film.png pidgin/artwork/hicolor/24x24/emotes/pidgin-fingers-crossed.png pidgin/artwork/hicolor/24x24/emotes/pidgin-flag.png pidgin/artwork/hicolor/24x24/emotes/pidgin-foot-in-mouth.png pidgin/artwork/hicolor/24x24/emotes/pidgin-freaked-out.png pidgin/artwork/hicolor/24x24/emotes/pidgin-ghost.png pidgin/artwork/hicolor/24x24/emotes/pidgin-giggle.png pidgin/artwork/hicolor/24x24/emotes/pidgin-girl.png pidgin/artwork/hicolor/24x24/emotes/pidgin-glasses-cool.png pidgin/artwork/hicolor/24x24/emotes/pidgin-glasses-nerdy.png pidgin/artwork/hicolor/24x24/emotes/pidgin-go-away.png pidgin/artwork/hicolor/24x24/emotes/pidgin-goat.png pidgin/artwork/hicolor/24x24/emotes/pidgin-good.png pidgin/artwork/hicolor/24x24/emotes/pidgin-hammer.png pidgin/artwork/hicolor/24x24/emotes/pidgin-handcuffs.png pidgin/artwork/hicolor/24x24/emotes/pidgin-handshake.png pidgin/artwork/hicolor/24x24/emotes/pidgin-highfive.png pidgin/artwork/hicolor/24x24/emotes/pidgin-hug-left.png pidgin/artwork/hicolor/24x24/emotes/pidgin-hug-right.png pidgin/artwork/hicolor/24x24/emotes/pidgin-hypnotized.png pidgin/artwork/hicolor/24x24/emotes/pidgin-in-love.png pidgin/artwork/hicolor/24x24/emotes/pidgin-island.png pidgin/artwork/hicolor/24x24/emotes/pidgin-jump.png pidgin/artwork/hicolor/24x24/emotes/pidgin-kiss.png pidgin/artwork/hicolor/24x24/emotes/pidgin-kissed.png pidgin/artwork/hicolor/24x24/emotes/pidgin-kissing.png pidgin/artwork/hicolor/24x24/emotes/pidgin-knife.png pidgin/artwork/hicolor/24x24/emotes/pidgin-lamp.png pidgin/artwork/hicolor/24x24/emotes/pidgin-lashes.png pidgin/artwork/hicolor/24x24/emotes/pidgin-laugh.png pidgin/artwork/hicolor/24x24/emotes/pidgin-liquor.png pidgin/artwork/hicolor/24x24/emotes/pidgin-loser.png pidgin/artwork/hicolor/24x24/emotes/pidgin-love-over.png pidgin/artwork/hicolor/24x24/emotes/pidgin-love.png pidgin/artwork/hicolor/24x24/emotes/pidgin-lying.png pidgin/artwork/hicolor/24x24/emotes/pidgin-mad-tongue.png pidgin/artwork/hicolor/24x24/emotes/pidgin-mail.png pidgin/artwork/hicolor/24x24/emotes/pidgin-male-fighter1.png pidgin/artwork/hicolor/24x24/emotes/pidgin-male-fighter2.png pidgin/artwork/hicolor/24x24/emotes/pidgin-mean.png pidgin/artwork/hicolor/24x24/emotes/pidgin-meeting.png pidgin/artwork/hicolor/24x24/emotes/pidgin-messed.png pidgin/artwork/hicolor/24x24/emotes/pidgin-mobile.png pidgin/artwork/hicolor/24x24/emotes/pidgin-mohawk.png pidgin/artwork/hicolor/24x24/emotes/pidgin-moneymouth.png pidgin/artwork/hicolor/24x24/emotes/pidgin-monkey.png pidgin/artwork/hicolor/24x24/emotes/pidgin-moon.png pidgin/artwork/hicolor/24x24/emotes/pidgin-msn-away.png pidgin/artwork/hicolor/24x24/emotes/pidgin-msn-busy.png pidgin/artwork/hicolor/24x24/emotes/pidgin-msn.png pidgin/artwork/hicolor/24x24/emotes/pidgin-msn_online.png pidgin/artwork/hicolor/24x24/emotes/pidgin-music.png pidgin/artwork/hicolor/24x24/emotes/pidgin-musical-note.png pidgin/artwork/hicolor/24x24/emotes/pidgin-nailbiting.png pidgin/artwork/hicolor/24x24/emotes/pidgin-neutral.png pidgin/artwork/hicolor/24x24/emotes/pidgin-on-the-phone.png pidgin/artwork/hicolor/24x24/emotes/pidgin-party.png pidgin/artwork/hicolor/24x24/emotes/pidgin-peace.png pidgin/artwork/hicolor/24x24/emotes/pidgin-phone.png pidgin/artwork/hicolor/24x24/emotes/pidgin-pig.png pidgin/artwork/hicolor/24x24/emotes/pidgin-pill.png pidgin/artwork/hicolor/24x24/emotes/pidgin-pirate.png pidgin/artwork/hicolor/24x24/emotes/pidgin-pissed-off.png pidgin/artwork/hicolor/24x24/emotes/pidgin-pizza.png pidgin/artwork/hicolor/24x24/emotes/pidgin-plate.png pidgin/artwork/hicolor/24x24/emotes/pidgin-poop.png pidgin/artwork/hicolor/24x24/emotes/pidgin-pray.png pidgin/artwork/hicolor/24x24/emotes/pidgin-present.png pidgin/artwork/hicolor/24x24/emotes/pidgin-pumpkin.png pidgin/artwork/hicolor/24x24/emotes/pidgin-qq.png pidgin/artwork/hicolor/24x24/emotes/pidgin-question.png pidgin/artwork/hicolor/24x24/emotes/pidgin-quiet.png pidgin/artwork/hicolor/24x24/emotes/pidgin-rain.png pidgin/artwork/hicolor/24x24/emotes/pidgin-rainbow.png pidgin/artwork/hicolor/24x24/emotes/pidgin-rose-dead.png pidgin/artwork/hicolor/24x24/emotes/pidgin-rose.png pidgin/artwork/hicolor/24x24/emotes/pidgin-rotfl.png pidgin/artwork/hicolor/24x24/emotes/pidgin-sad.png pidgin/artwork/hicolor/24x24/emotes/pidgin-sarcastic.png pidgin/artwork/hicolor/24x24/emotes/pidgin-search.png pidgin/artwork/hicolor/24x24/emotes/pidgin-secret.png pidgin/artwork/hicolor/24x24/emotes/pidgin-shame.png pidgin/artwork/hicolor/24x24/emotes/pidgin-sheep.png pidgin/artwork/hicolor/24x24/emotes/pidgin-shock.png pidgin/artwork/hicolor/24x24/emotes/pidgin-shout.png pidgin/artwork/hicolor/24x24/emotes/pidgin-shut-mouth.png pidgin/artwork/hicolor/24x24/emotes/pidgin-sick.png pidgin/artwork/hicolor/24x24/emotes/pidgin-sidefrown.png pidgin/artwork/hicolor/24x24/emotes/pidgin-silly.png pidgin/artwork/hicolor/24x24/emotes/pidgin-sinister.png pidgin/artwork/hicolor/24x24/emotes/pidgin-skeleton.png pidgin/artwork/hicolor/24x24/emotes/pidgin-skywalker.png pidgin/artwork/hicolor/24x24/emotes/pidgin-sleepy.png pidgin/artwork/hicolor/24x24/emotes/pidgin-smile-big.png pidgin/artwork/hicolor/24x24/emotes/pidgin-smile.png pidgin/artwork/hicolor/24x24/emotes/pidgin-smirk.png pidgin/artwork/hicolor/24x24/emotes/pidgin-snail.png pidgin/artwork/hicolor/24x24/emotes/pidgin-snicker.png pidgin/artwork/hicolor/24x24/emotes/pidgin-snowman.png pidgin/artwork/hicolor/24x24/emotes/pidgin-soccerball.png pidgin/artwork/hicolor/24x24/emotes/pidgin-soldier.png pidgin/artwork/hicolor/24x24/emotes/pidgin-star.png pidgin/artwork/hicolor/24x24/emotes/pidgin-starving.png pidgin/artwork/hicolor/24x24/emotes/pidgin-stop.png pidgin/artwork/hicolor/24x24/emotes/pidgin-struggle.png pidgin/artwork/hicolor/24x24/emotes/pidgin-sun.png pidgin/artwork/hicolor/24x24/emotes/pidgin-sweat.png pidgin/artwork/hicolor/24x24/emotes/pidgin-talktohand.png pidgin/artwork/hicolor/24x24/emotes/pidgin-teeth.png pidgin/artwork/hicolor/24x24/emotes/pidgin-terror.png pidgin/artwork/hicolor/24x24/emotes/pidgin-thinking.png pidgin/artwork/hicolor/24x24/emotes/pidgin-thunder.png pidgin/artwork/hicolor/24x24/emotes/pidgin-time-out.png pidgin/artwork/hicolor/24x24/emotes/pidgin-tongue.png pidgin/artwork/hicolor/24x24/emotes/pidgin-tremble.png pidgin/artwork/hicolor/24x24/emotes/pidgin-turtle.png pidgin/artwork/hicolor/24x24/emotes/pidgin-tv.png pidgin/artwork/hicolor/24x24/emotes/pidgin-umbrella.png pidgin/artwork/hicolor/24x24/emotes/pidgin-vampire.png pidgin/artwork/hicolor/24x24/emotes/pidgin-victory.png pidgin/artwork/hicolor/24x24/emotes/pidgin-waiting.png pidgin/artwork/hicolor/24x24/emotes/pidgin-watermelon.png pidgin/artwork/hicolor/24x24/emotes/pidgin-waving.png pidgin/artwork/hicolor/24x24/emotes/pidgin-weep.png pidgin/artwork/hicolor/24x24/emotes/pidgin-wilt.png pidgin/artwork/hicolor/24x24/emotes/pidgin-wink.png pidgin/artwork/hicolor/24x24/emotes/pidgin-worship.png pidgin/artwork/hicolor/24x24/emotes/pidgin-yawn.png pidgin/artwork/hicolor/24x24/emotes/pidgin-yin-yang.png pidgin/artwork/hicolor/24x24/emotes/theme pidgin/artwork/hicolor/24x24/status/pidgin-available.png pidgin/artwork/hicolor/24x24/status/pidgin-away.png pidgin/artwork/hicolor/24x24/status/pidgin-busy.png pidgin/artwork/hicolor/24x24/status/pidgin-chatroom.png pidgin/artwork/hicolor/24x24/status/pidgin-contact.png pidgin/artwork/hicolor/24x24/status/pidgin-extended-away.png pidgin/artwork/hicolor/24x24/status/pidgin-invisible.png pidgin/artwork/hicolor/24x24/status/pidgin-offline.png pidgin/artwork/hicolor/24x24/status/pidgin-tray-available.png pidgin/artwork/hicolor/24x24/status/pidgin-tray-away.png pidgin/artwork/hicolor/24x24/status/pidgin-tray-busy.png pidgin/artwork/hicolor/24x24/status/pidgin-tray-extended-away.png pidgin/artwork/hicolor/24x24/status/pidgin-tray-invisible.png pidgin/artwork/hicolor/24x24/status/pidgin-tray-message-pending.png pidgin/artwork/hicolor/24x24/status/pidgin-tray-new-im.png pidgin/artwork/hicolor/24x24/status/pidgin-tray-offline.png pidgin/artwork/hicolor/32x32/actions/pidgin-select-avatar.png pidgin/artwork/hicolor/32x32/apps/pidgin.png pidgin/artwork/hicolor/32x32/status/pidgin-available.png pidgin/artwork/hicolor/32x32/status/pidgin-away.png pidgin/artwork/hicolor/32x32/status/pidgin-busy.png pidgin/artwork/hicolor/32x32/status/pidgin-extended-away.png pidgin/artwork/hicolor/32x32/status/pidgin-invisible.png pidgin/artwork/hicolor/32x32/status/pidgin-offline.png pidgin/artwork/hicolor/32x32/status/pidgin-tray-available.png pidgin/artwork/hicolor/32x32/status/pidgin-tray-away.png pidgin/artwork/hicolor/32x32/status/pidgin-tray-busy.png pidgin/artwork/hicolor/32x32/status/pidgin-tray-extended-away.png pidgin/artwork/hicolor/32x32/status/pidgin-tray-invisible.png pidgin/artwork/hicolor/32x32/status/pidgin-tray-message-pending.png pidgin/artwork/hicolor/32x32/status/pidgin-tray-new-im.png pidgin/artwork/hicolor/32x32/status/pidgin-tray-offline.png pidgin/artwork/hicolor/48x48/apps/pidgin-aim.png pidgin/artwork/hicolor/48x48/apps/pidgin-bonjour.png pidgin/artwork/hicolor/48x48/apps/pidgin-facebook.png pidgin/artwork/hicolor/48x48/apps/pidgin-gadu-gadu.png pidgin/artwork/hicolor/48x48/apps/pidgin-icq.png pidgin/artwork/hicolor/48x48/apps/pidgin-irc.png pidgin/artwork/hicolor/48x48/apps/pidgin-jabber.png pidgin/artwork/hicolor/48x48/apps/pidgin-meanwhile.png pidgin/artwork/hicolor/48x48/apps/pidgin-msn.png pidgin/artwork/hicolor/48x48/apps/pidgin-myspace.png pidgin/artwork/hicolor/48x48/apps/pidgin-novell.png pidgin/artwork/hicolor/48x48/apps/pidgin-qq.png pidgin/artwork/hicolor/48x48/apps/pidgin-silc.png pidgin/artwork/hicolor/48x48/apps/pidgin-simple.png pidgin/artwork/hicolor/48x48/apps/pidgin-yahoo.png pidgin/artwork/hicolor/48x48/apps/pidgin-zephyr.png pidgin/artwork/hicolor/48x48/apps/pidgin.png pidgin/artwork/hicolor/48x48/status/pidgin-available.png pidgin/artwork/hicolor/48x48/status/pidgin-away.png pidgin/artwork/hicolor/48x48/status/pidgin-busy.png pidgin/artwork/hicolor/48x48/status/pidgin-dialog-auth.png pidgin/artwork/hicolor/48x48/status/pidgin-dialog-cool.png pidgin/artwork/hicolor/48x48/status/pidgin-dialog-dialog.png pidgin/artwork/hicolor/48x48/status/pidgin-dialog-error.png pidgin/artwork/hicolor/48x48/status/pidgin-dialog-info.png pidgin/artwork/hicolor/48x48/status/pidgin-dialog-mail.png pidgin/artwork/hicolor/48x48/status/pidgin-extended-away.png pidgin/artwork/hicolor/48x48/status/pidgin-invisible.png pidgin/artwork/hicolor/48x48/status/pidgin-offline.png pidgin/artwork/hicolor/48x48/status/pidgin-tray-available.png pidgin/artwork/hicolor/48x48/status/pidgin-tray-away.png pidgin/artwork/hicolor/48x48/status/pidgin-tray-busy.png pidgin/artwork/hicolor/48x48/status/pidgin-tray-extended-away.png pidgin/artwork/hicolor/48x48/status/pidgin-tray-invisible.png pidgin/artwork/hicolor/48x48/status/pidgin-tray-message-pending.png pidgin/artwork/hicolor/48x48/status/pidgin-tray-new-im.png pidgin/artwork/hicolor/48x48/status/pidgin-tray-offline.png pidgin/artwork/hicolor/48x48/status/question.png pidgin/artwork/hicolor/48x48/status/warning.png pidgin/artwork/hicolor/scalable/apps/pidgin.svg pidgin/artwork/hicolor/scalable/status/pidgin-auth.svg pidgin/artwork/hicolor/scalable/status/pidgin-cool.svg pidgin/artwork/hicolor/scalable/status/pidgin-dialog.svg pidgin/artwork/hicolor/scalable/status/pidgin-error.svg pidgin/artwork/hicolor/scalable/status/pidgin-info.svg pidgin/artwork/hicolor/scalable/status/pidgin-mail.svg pidgin/artwork/hicolor/scalable/status/pidgin-question.svg pidgin/artwork/hicolor/scalable/status/pidgin-warning.svg pidgin/artwork/pixmaps/logo.png pidgin/artwork/pixmaps/pidgin.ico |
diffstat | 499 files changed, 2816 insertions(+), 9468 deletions(-) [+] |
line wrap: on
line diff
--- a/.mtn-ignore Sat Sep 13 16:13:48 2008 +0000 +++ b/.mtn-ignore Tue Sep 16 20:01:24 2008 +0000 @@ -58,6 +58,7 @@ libpurple/purple-client-bindings.h libpurple/purple-client-example libpurple/tests/check_libpurple +libpurple/tests/libpurple.. libpurple/version.h$ libpurple/win32/libpurplerc.rc$ libtool
--- a/ChangeLog Sat Sep 13 16:13:48 2008 +0000 +++ b/ChangeLog Tue Sep 16 20:01:24 2008 +0000 @@ -1,6 +1,17 @@ Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul version 2.5.2 (??/??/????): + libpurple: + * Restored the "Has You" feature to the MSN protocol tooltips. + * Fixed a crash on removing a custom buddy icon on a buddy. + * Fixed a crash caused by certain self-signed SSL certificates. + + Pidgin: + * The status selector now saves your message when changing status. + * Fix a case where a conversation window could close unexpectedly. + * A mute sounds option has been added to the preferences window to + help with discoverability. CTRL+S is no longer bound to mute. + Finch: * A new 'Nested Grouping' option in the 'Grouping' plugin. Group hierarchies are defined by the '/' character in the group names
--- a/finch/gntpounce.c Sat Sep 13 16:13:48 2008 +0000 +++ b/finch/gntpounce.c Tue Sep 16 20:01:24 2008 +0000 @@ -979,15 +979,10 @@ PURPLE_CALLBACK(signed_on_off_cb), NULL); } -static void -dummy_pounce_cb(PurplePounce *pounce, PurplePounceEvent events, void *data) -{ -} - /* XXX: There's no such thing in pidgin. Perhaps there should be? */ void finch_pounces_uninit() { - purple_pounces_register_handler(FINCH_UI, dummy_pounce_cb, NULL, NULL); + purple_pounces_unregister_handler(FINCH_UI); purple_signals_disconnect_by_handle(finch_pounces_get_handle()); }
--- a/finch/libgnt/gntmenu.c Sat Sep 13 16:13:48 2008 +0000 +++ b/finch/libgnt/gntmenu.c Tue Sep 16 20:01:24 2008 +0000 @@ -399,9 +399,11 @@ static gboolean gnt_menu_clicked(GntWidget *widget, GntMouseEvent event, int x, int y) { - if (!org_clicked || !org_clicked(widget, event, x, y) || - !GNT_MENU(widget)->type == GNT_MENU_TOPLEVEL) - return FALSE; + if (GNT_MENU(widget)->type != GNT_MENU_POPUP) + return FALSE; + + if (org_clicked && org_clicked(widget, event, x, y)) + return TRUE; gnt_widget_activate(widget); return TRUE; }
--- a/libpurple/buddyicon.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/buddyicon.c Tue Sep 16 20:01:24 2008 +0000 @@ -934,8 +934,8 @@ purple_buddy_icons_node_set_custom_icon_from_file(PurpleBlistNode *node, const gchar *filename) { - size_t len; - guchar *data; + size_t len = 0; + guchar *data = NULL; g_return_val_if_fail(node != NULL, NULL); @@ -945,8 +945,10 @@ return NULL; } - if (!read_icon_file(filename, &data, &len)) { - return NULL; + if (filename != NULL) { + if (!read_icon_file(filename, &data, &len)) { + return NULL; + } } return purple_buddy_icons_node_set_custom_icon(node, data, len);
--- a/libpurple/buddyicon.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/buddyicon.h Tue Sep 16 20:01:24 2008 +0000 @@ -308,7 +308,7 @@ * * @param node The blist node for which to set a custom icon. * @param icon_data The image data of the icon, which the buddy icon code will - * free. + * free. Use NULL to unset the icon. * @param icon_len The length of the data in @a icon_data. * * @return The icon that was set. The caller does NOT own a reference to this, @@ -326,7 +326,8 @@ * @see purple_buddy_icons_node_set_custom_icon() * * @param node The blist node for which to set a custom icon. - * @param filename The path to the icon to set for the blist node. + * @param filename The path to the icon to set for the blist node. Use NULL + * to unset the custom icon. * * @return The icon that was set. The caller does NOT own a reference to this, * and must call purple_imgstore_ref() if it wants one.
--- a/libpurple/dnsquery.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/dnsquery.c Tue Sep 16 20:01:24 2008 +0000 @@ -108,6 +108,13 @@ } } + /* + * Set the resolver to NULL so that it doesn't get killed so that + * it sits around waiting for additional DNS requests for a few + * seconds longer. + */ + query_data->resolver = NULL; + purple_dnsquery_destroy(query_data); } @@ -209,9 +216,8 @@ * the result back to our parent, when finished. */ while (1) { - const char ch = 'Y'; fd_set fds; - struct timeval tv = { .tv_sec = 40 , .tv_usec = 0 }; + struct timeval tv = { .tv_sec = 20, .tv_usec = 0 }; FD_ZERO(&fds); FD_SET(child_in, &fds); rc = select(child_in + 1, &fds, NULL, NULL, &tv); @@ -237,8 +243,6 @@ dns_params.port); _exit(1); } - /* Tell our parent that we read the data successfully */ - write_to_parent(child_out, &ch, sizeof(ch)); /* We have the hostname and port, now resolve the IP */ @@ -425,8 +429,7 @@ { pid_t pid; dns_params_t dns_params; - int rc; - char ch; + ssize_t rc; /* This waitpid might return the child's PID if it has recently * exited, or it might return an error if it exited "long @@ -458,16 +461,10 @@ purple_dnsquery_resolver_destroy(resolver); return FALSE; } - - g_return_val_if_fail(rc == sizeof(dns_params), -1); - - /* Did you hear me? (This avoids some race conditions) */ - rc = read(resolver->fd_out, &ch, sizeof(ch)); - if (rc != 1 || ch != 'Y') - { - purple_debug_warning("dns", - "DNS child %d not responding. Killing it!\n", - resolver->dns_pid); + if (rc < sizeof(dns_params)) { + purple_debug_error("dns", "Tried to read %" G_GSSIZE_FORMAT + " bytes from child but only read %" G_GSSIZE_FORMAT "\n", + sizeof(dns_params), rc); purple_dnsquery_resolver_destroy(resolver); return FALSE; }
--- a/libpurple/plugins/ssl/ssl-nss.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/plugins/ssl/ssl-nss.c Tue Sep 16 20:01:24 2008 +0000 @@ -285,7 +285,8 @@ } for (count = 0 ; count < CERT_MAX_CERT_CHAIN ; count++) { - purple_debug_info("nss", "subject=%s issuer=%s\n", curcert->subjectName, curcert->issuerName); + purple_debug_info("nss", "subject=%s issuer=%s\n", curcert->subjectName, + curcert->issuerName ? curcert->issuerName : "(null)"); newcrt = x509_import_from_nss(curcert); peer_certs = g_list_append(peer_certs, newcrt); @@ -676,7 +677,8 @@ subjectCert = X509_NSS_DATA(crt); g_return_val_if_fail(subjectCert, FALSE); - if ( PORT_Strcmp(subjectCert->issuerName, issuerCert->subjectName) != 0 ) + if (subjectCert->issuerName == NULL + || PORT_Strcmp(subjectCert->issuerName, issuerCert->subjectName) != 0) return FALSE; st = CERT_VerifySignedData(&subjectCert->signatureWrap, issuerCert, PR_Now(), NULL); return st == SECSuccess;
--- a/libpurple/protocols/msn/msn.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/msn/msn.c Tue Sep 16 20:01:24 2008 +0000 @@ -769,6 +769,9 @@ { const char *phone; + purple_notify_user_info_add_pair(user_info, _("Has you"), + ((user->list_op & (1 << MSN_LIST_RL)) ? _("Yes") : _("No"))); + purple_notify_user_info_add_pair(user_info, _("Blocked"), ((user->list_op & (1 << MSN_LIST_BL)) ? _("Yes") : _("No")));
--- a/libpurple/protocols/msn/soap.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/msn/soap.c Tue Sep 16 20:01:24 2008 +0000 @@ -284,6 +284,11 @@ count += cnt; g_string_append_len(conn->buf, buf, cnt); } + + perrno = errno; + if (cnt < 0 && perrno != EAGAIN) + purple_debug_info("soap", "read: %s\n", g_strerror(perrno)); + #ifndef MSN_UNSAFE_DEBUG if (conn->current_request->secure) purple_debug_misc("soap", "Received secure request.\n"); @@ -299,11 +304,9 @@ return; /* msn_soap_process could alter errno */ - perrno = errno; msn_soap_process(conn); if (cnt < 0 && perrno != EAGAIN) { - purple_debug_info("soap", "read: %s\n", g_strerror(perrno)); /* It's possible msn_soap_process closed the ssl connection */ if (conn->ssl) { purple_ssl_close(conn->ssl);
--- a/libpurple/protocols/oscar/flap_connection.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/oscar/flap_connection.c Tue Sep 16 20:01:24 2008 +0000 @@ -158,8 +158,8 @@ gettimeofday(&now, NULL); purple_debug_info("oscar", "Attempting to send %u queued SNACs and %u queued low-priority SNACs for %p\n", - (conn->queued_snacs ? g_queue_get_length(conn->queued_snacs) : 0), - (conn->queued_lowpriority_snacs ? g_queue_get_length(conn->queued_lowpriority_snacs) : 0), + (conn->queued_snacs ? conn->queued_snacs->length : 0), + (conn->queued_lowpriority_snacs ? conn->queued_lowpriority_snacs->length : 0), conn); if (!conn->queued_snacs || flap_connection_send_snac_queue(conn, now, conn->queued_snacs)) { if (!conn->queued_lowpriority_snacs || flap_connection_send_snac_queue(conn, now, conn->queued_lowpriority_snacs)) {
--- a/libpurple/protocols/qq/AUTHORS Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/AUTHORS Tue Sep 16 20:01:24 2008 +0000 @@ -1,35 +1,38 @@ Code Contributors -===== -puzzlebird : original author -gfhuang : patches for libpurple 2.0.0beta2, maintainer -henryouly : file transfer, udp sock5 proxy and qq_show, maintainer -hzhr : maintainer -joymarquis : maintainer -arfankai : fixed bugs in char_conv.c -rakescar : provided filter for HTML tag -yyw : improved performance on PPC linux -lvxiang : provided ip to location original code -markhuetsch : OpenQ merge into libpurple, maintainer 2006-2007 -ccpaging : maintainer since 2007 -icesky : maintainer since 2007 -csyfek : faces, maintainer since 2007 +========= +puzzlebird : original author +gfhuang : patches for libpurple 2.0.0beta2, maintainer +Yuan Qingyun : patches for libpurple 1.5.0, maintainer +henryouly : file transfer, udp sock5 proxy and qq_show, maintainer +hzhr : maintainer +joymarquis : maintainer +arfankai : fixed bugs in char_conv.c +rakescar : provided filter for HTML tag +yyw : improved performance on PPC linux +lvxiang : provided ip to location original code +markhuetsch : OpenQ merge into libpurple, maintainer 2006-2007 +ccpaging : maintainer since 2007 +icesky : maintainer since 2007 +csyfek : faces, maintainer since 2007 Lovely Patch Writers -===== -gnap : message displaying, documentation -manphiz : qun processing -moo : qun processing -Coly Li : qun processing +========= +gnap : message displaying, documentation +manphiz : qun processing +moo : qun processing +Coly Li : qun processing +Emil Alexiev : captcha verification on login based on LumaQQ for MAC (2007), + login, add buddy, remove buddy, message exchange and logout Acknowledgement -===== -Shufeng Tan : http://sf.net/projects/perl-oicq -Jeff Ye : http://www.sinomac.com -Hu Zheng : http://forlinux.yeah.net -yunfan : http://www.myswear.net +========= +Shufeng Tan : http://sf.net/projects/perl-oicq +Jeff Ye : http://www.sinomac.com +Hu Zheng : http://forlinux.yeah.net +yunfan : http://www.myswear.net +OpenQ Team : http://openq.linuxsir.org +LumaQQ Team : http://lumaqq.linuxsir.org khc@pidgin.im qulogic@pidgin.im rlaager@pidgin.im -OpenQ Team -LumaQQ Team -OpenQ Google Group +OpenQ Google Group : http://groups.google.com/group/openq
--- a/libpurple/protocols/qq/ChangeLog Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/ChangeLog Tue Sep 16 20:01:24 2008 +0000 @@ -1,6 +1,36 @@ +2008.09.05 - ccpaging <ccpaging(at)gmail.com> + * Filter chars 0x01-0x20 in nickname + +2008.09.05 - ccpaging <ccpaging(at)gmail.com> + * Fixed compilation even pidgin-udp-patch not applied + * Place and analysis 'before login packet' after login. packages will be updated slowly and server may send lots of 'server command packet', while 'before login packet' is placed after 'finished update' + +2008.09.02 - ccpaging <ccpaging(at)gmail.com> + * Bugfix: can not send message to the QUN blocked adding + * Tickets: + Fixes #6957 + +2008.09.02 - ccpaging <ccpaging(at)gmail.com> + * Use new tactics of information update: + 1. send next package till the previous package received + 2. fix duplicated get_room_info and get_room_buddies commands + +2008.08.16 - ccpaging <ecc_hy(at)hotmail.com> + * Rename group to room. If you used pidginqq before, this may create a new room with same title, you may delete old one + * Replace purple_debug with purple_debug_info, purple_debug_warning, purple_debug_error + * Add server notice and server new, and two options to turn on/off + * Minor modify for reducing transaction's debug infor + * Minor modifies for system notice and QQ news. + * Add 4 new strings need translate compare with p10. + * Tickets: + Fixes #6990 + 2008.08.10 - csyfek <csyfek(at)gmail.com> * Commit to Pidgin +2008.08.07 - ccpaging <ecc_hy(at)hotmail.com> + * Support managing multi-connections according to simple.c + 2008.08.06 - ccpaging <ecc_hy(at)hotmail.com> * Rename names of variables, Group, to Room * Functions of group_network merged into qq_network and qq_process
--- a/libpurple/protocols/qq/buddy_info.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/buddy_info.c Tue Sep 16 20:01:24 2008 +0000 @@ -284,7 +284,7 @@ qd = (qq_data *) gc->proto_data; g_snprintf(uid_str, sizeof(uid_str), "%d", uid); - qq_send_cmd(qd, QQ_CMD_GET_USER_INFO, (guint8 *) uid_str, strlen(uid_str)); + qq_send_cmd(gc, QQ_CMD_GET_BUDDY_INFO, (guint8 *) uid_str, strlen(uid_str)); query = g_new0(qq_info_query, 1); query->uid = uid; @@ -293,6 +293,20 @@ qd->info_query = g_list_append(qd->info_query, query); } +void qq_request_buddy_info(PurpleConnection *gc, guint32 uid, + gint update_class, guint32 ship32) +{ + qq_data *qd; + gchar raw_data[16] = {0}; + + g_return_if_fail(uid != 0); + + qd = (qq_data *) gc->proto_data; + g_snprintf(raw_data, sizeof(raw_data), "%d", uid); + qq_send_cmd_mess(gc, QQ_CMD_GET_BUDDY_INFO, (guint8 *) raw_data, strlen(raw_data), + update_class, ship32); +} + /* set up the fields requesting personal information and send a get_info packet * for myself */ void qq_prepare_modify_info(PurpleConnection *gc) @@ -314,7 +328,6 @@ /* send packet to modify personal information */ static void qq_send_packet_modify_info(PurpleConnection *gc, contact_info *info) { - qq_data *qd = (qq_data *) gc->proto_data; gint bytes = 0; guint8 raw_data[MAX_PACKET_SIZE - 128] = {0}; guint8 bar; @@ -446,7 +459,7 @@ bytes += qq_put8(raw_data + bytes, bar); - qq_send_cmd(qd, QQ_CMD_UPDATE_INFO, raw_data, bytes); + qq_send_cmd(gc, QQ_CMD_UPDATE_INFO, raw_data, bytes); } @@ -677,9 +690,9 @@ mid->info->qq_show = g_strdup(info->qq_show); mid->info->unknown6 = g_strdup(info->unknown6); - purple_request_fields(gc, _("Modify my information"), - _("Modify my information"), NULL, fields, - _("Update my information"), G_CALLBACK(modify_info_ok_cb), + purple_request_fields(gc, _("Modify information"), + _("Modify information"), NULL, fields, + _("Update information"), G_CALLBACK(modify_info_ok_cb), _("Cancel"), G_CALLBACK(modify_info_cancel_cb), purple_connection_get_account(gc), NULL, NULL, mid); @@ -697,8 +710,8 @@ data[data_len] = '\0'; if (qd->uid == atoi((gchar *) data)) { /* return should be my uid */ - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Update info ACK OK\n"); - purple_notify_info(gc, NULL, _("Your information has been updated"), NULL); + purple_debug_info("QQ", "Update info ACK OK\n"); + purple_notify_info(gc, _("QQ Buddy"), _("Successed:"), _("Change buddy information.")); } } @@ -762,7 +775,7 @@ && g_ascii_strncasecmp(icon_path + dir_len + 1 + prefix_len + icon_len, QQ_ICON_SUFFIX, suffix_len) == 0 && icon_len <= 3)) { if (icon_global) - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "%s\n", errmsg); + purple_debug_error("QQ", "%s\n", errmsg); else purple_notify_error(gc, _("Invalid QQ Face"), errmsg, NULL); g_free(errmsg); @@ -775,7 +788,7 @@ /* ensure face number in proper range */ if (icon_num > QQ_FACES) { if (icon_global) - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "%s\n", errmsg); + purple_debug_error("QQ", "%s\n", errmsg); else purple_notify_error(gc, _("Invalid QQ Face"), errmsg, NULL); g_free(errmsg); @@ -849,7 +862,7 @@ } /* process reply to get_info packet */ -void qq_process_get_info_reply(guint8 *data, gint data_len, PurpleConnection *gc) +void qq_process_get_buddy_info(guint8 *data, gint data_len, PurpleConnection *gc) { gchar **segments; qq_info_query *query; @@ -902,22 +915,24 @@ void qq_info_query_free(qq_data *qd) { - gint i; + gint count; qq_info_query *p; g_return_if_fail(qd != NULL); - i = 0; + count = 0; while (qd->info_query != NULL) { p = (qq_info_query *) (qd->info_query->data); qd->info_query = g_list_remove(qd->info_query, p); g_free(p); - i++; + count++; } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "%d info queries are freed!\n", i); + if (count > 0) { + purple_debug_info("QQ", "%d info queries are freed!\n", count); + } } -void qq_send_packet_get_level(PurpleConnection *gc, guint32 uid) +void qq_request_get_level(PurpleConnection *gc, guint32 uid) { qq_data *qd = (qq_data *) gc->proto_data; guint8 buf[16] = {0}; @@ -927,10 +942,10 @@ bytes += qq_put32(buf + bytes, uid); qd = (qq_data *) gc->proto_data; - qq_send_cmd(qd, QQ_CMD_GET_LEVEL, buf, bytes); + qq_send_cmd(gc, QQ_CMD_GET_LEVEL, buf, bytes); } -void qq_send_packet_get_buddies_levels(PurpleConnection *gc) +void qq_request_get_buddies_level(PurpleConnection *gc, gint update_class) { guint8 *buf; guint16 size; @@ -942,12 +957,11 @@ if ( qd->buddies == NULL) { return; } - /* server only sends back levels for online buddies, no point - * in asking for anyone else */ - size = 4 * g_list_length(qd->buddies) + 1; + /* server only reply levels for online buddies */ + size = 4 * g_list_length(qd->buddies) + 1 + 4; buf = g_newa(guint8, size); bytes += qq_put8(buf + bytes, 0x00); - + while (NULL != node) { q_bud = (qq_buddy *) node->data; if (NULL != q_bud) { @@ -955,7 +969,10 @@ } node = node->next; } - qq_send_cmd(qd, QQ_CMD_GET_LEVEL, buf, size); + + /* my id should be the end if included */ + bytes += qq_put32(buf + bytes, qd->uid); + qq_send_cmd_mess(gc, QQ_CMD_GET_LEVEL, buf, size, update_class, 0); } void qq_process_get_level_reply(guint8 *decr_buf, gint decr_len, PurpleConnection *gc) @@ -970,9 +987,9 @@ qq_data *qd = (qq_data *) gc->proto_data; gint bytes = 0; - decr_len--; + decr_len--; if (decr_len % 12 != 0) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "Get levels list of abnormal length. Truncating last %d bytes.\n", decr_len % 12); decr_len -= (decr_len % 12); } @@ -980,19 +997,18 @@ bytes += 1; /* this byte seems random */ /* - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Byte one of get_level packet: %d\n", buf[0]); + purple_debug_info("QQ", "Byte one of get_level packet: %d\n", buf[0]); */ for (i = 0; i < decr_len; i += 12) { bytes += qq_get32(&uid, decr_buf + bytes); bytes += qq_get32(&onlineTime, decr_buf + bytes); bytes += qq_get16(&level, decr_buf + bytes); bytes += qq_get16(&timeRemainder, decr_buf + bytes); - purple_debug(PURPLE_DEBUG_INFO, "QQ_LEVEL", - "%d, tmOnline: %d, level: %d, tmRemainder: %d\n", + purple_debug_info("QQ_LEVEL", "%d, tmOnline: %d, level: %d, tmRemainder: %d\n", uid, onlineTime, level, timeRemainder); if (uid == qd->uid) { qd->my_level = level; - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Got my levels as %d\n", qd->my_level); + purple_debug_warning("QQ", "Got my levels as %d\n", qd->my_level); continue; } @@ -1000,7 +1016,7 @@ if (purple_name == NULL) { continue; } - + b = purple_find_buddy(account, purple_name); g_free(purple_name); @@ -1008,10 +1024,9 @@ if (b != NULL) { q_bud = (qq_buddy *) b->proto_data; } - + if (q_bud == NULL) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "Got levels of %d not in my buddy list\n", uid); + purple_debug_error("QQ", "Got levels of %d not in my buddy list\n", uid); continue; }
--- a/libpurple/protocols/qq/buddy_info.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/buddy_info.h Tue Sep 16 20:01:24 2008 +0000 @@ -51,14 +51,14 @@ #define QQ_FRIEND_FLAG_MOBILE 0x10 #define QQ_FRIEND_FLAG_BIND_MOBILE 0x20 */ -#define QQ_COMM_FLAG_QQ_MEMBER 0x02 -#define QQ_COMM_FLAG_QQ_VIP 0x04 +#define QQ_COMM_FLAG_QQ_VIP 0x02 +#define QQ_COMM_FLAG_QQ_MEMBER 0x04 #define QQ_COMM_FLAG_TCP_MODE 0x10 #define QQ_COMM_FLAG_MOBILE 0x20 #define QQ_COMM_FLAG_BIND_MOBILE 0x40 #define QQ_COMM_FLAG_VIDEO 0x80 -#define QQ_EXT_FLAG_SPACE 0x02 +#define QQ_EXT_FLAG_ZONE 0x02 #define QQ_BUDDY_GENDER_GG 0x00 #define QQ_BUDDY_GENDER_MM 0x01 @@ -67,14 +67,22 @@ #define QQ_ICON_PREFIX "qq_" #define QQ_ICON_SUFFIX ".png" +enum { + QQ_BUDDY_INFO_UPDATE_ONLY = 0, + QQ_BUDDY_INFO_DISPLAY, + QQ_BUDDY_INFO_MODIFY, +}; + void qq_send_packet_get_info(PurpleConnection *gc, guint32 uid, gboolean show_window); +void qq_request_buddy_info(PurpleConnection *gc, guint32 uid, + gint update_class, guint32 ship32); void qq_set_my_buddy_icon(PurpleConnection *gc, PurpleStoredImage *img); void qq_set_buddy_icon_for_user(PurpleAccount *account, const gchar *who, const gchar *icon_num, const gchar *iconfile); void qq_prepare_modify_info(PurpleConnection *gc); void qq_process_modify_info_reply(guint8 *data, gint data_len, PurpleConnection *gc); -void qq_process_get_info_reply(guint8 *data, gint data_len, PurpleConnection *gc); +void qq_process_get_buddy_info(guint8 *data, gint data_len, PurpleConnection *gc); void qq_info_query_free(qq_data *qd); -void qq_send_packet_get_level(PurpleConnection *gc, guint32 uid); -void qq_send_packet_get_buddies_levels(PurpleConnection *gc); +void qq_request_get_level(PurpleConnection *gc, guint32 uid); +void qq_request_get_buddies_level(PurpleConnection *gc, gint update_class); void qq_process_get_level_reply(guint8 *buf, gint buf_len, PurpleConnection *gc); #endif
--- a/libpurple/protocols/qq/buddy_list.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/buddy_list.c Tue Sep 16 20:01:24 2008 +0000 @@ -56,7 +56,7 @@ } qq_buddy_online; /* get a list of online_buddies */ -void qq_send_packet_get_buddies_online(PurpleConnection *gc, guint8 position) +void qq_request_get_buddies_online(PurpleConnection *gc, guint8 position, gint update_class) { qq_data *qd; guint8 *raw_data; @@ -77,15 +77,14 @@ /* 003-004 */ bytes += qq_put16(raw_data + bytes, 0x0000); - qq_send_cmd(qd, QQ_CMD_GET_BUDDIES_ONLINE, raw_data, 5); + qq_send_cmd_mess(gc, QQ_CMD_GET_BUDDIES_ONLINE, raw_data, 5, update_class, 0); qd->last_get_online = time(NULL); } -/* position starts with 0x0000, +/* position starts with 0x0000, * server may return a position tag if list is too long for one packet */ -void qq_send_packet_get_buddies_list(PurpleConnection *gc, guint16 position) +void qq_request_get_buddies_list(PurpleConnection *gc, guint16 position, gint update_class) { - qq_data *qd = (qq_data *) gc->proto_data; guint8 raw_data[16] = {0}; gint bytes = 0; @@ -98,13 +97,12 @@ * March 22, found the 00,00,00 starts to work as well */ bytes += qq_put8(raw_data + bytes, 0x00); - qq_send_cmd(qd, QQ_CMD_GET_BUDDIES_LIST, raw_data, bytes); + qq_send_cmd_mess(gc, QQ_CMD_GET_BUDDIES_LIST, raw_data, bytes, update_class, 0); } /* get all list, buddies & Quns with groupsid support */ -void qq_send_packet_get_buddies_and_rooms(PurpleConnection *gc, guint32 position) +void qq_request_get_buddies_and_rooms(PurpleConnection *gc, guint32 position, gint update_class) { - qq_data *qd = (qq_data *) gc->proto_data; guint8 raw_data[16] = {0}; gint bytes = 0; @@ -116,7 +114,7 @@ bytes += qq_put32(raw_data + bytes, 0x00000000); bytes += qq_put32(raw_data + bytes, position); - qq_send_cmd(qd, QQ_CMD_GET_BUDDIES_AND_ROOMS, raw_data, bytes); + qq_send_cmd_mess(gc, QQ_CMD_GET_BUDDIES_AND_ROOMS, raw_data, bytes, update_class, 0); } /* parse the data into qq_buddy_status */ @@ -146,8 +144,8 @@ /* 015-030: unknown key */ bytes += qq_getdata(&(bs->unknown_key[0]), QQ_KEY_LENGTH, data + bytes); - purple_debug(PURPLE_DEBUG_INFO, "QQ_STATUS", - "uid: %d, U1: %d, ip: %s:%d, U2:%d, status:%d, U3:%04X\n", + purple_debug_info("QQ_STATUS", + "uid: %d, U1: %d, ip: %s:%d, U2:%d, status:%d, U3:%04X\n", bs->uid, bs->unknown1, inet_ntoa(bs->ip), bs->port, bs->unknown2, bs->status, bs->unknown3); @@ -180,13 +178,12 @@ count = 0; while (bytes < data_len) { if (data_len - bytes < QQ_ONLINE_BUDDY_ENTRY_LEN) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "[buddies online] only %d, need %d", + purple_debug_error("QQ", "[buddies online] only %d, need %d", (data_len - bytes), QQ_ONLINE_BUDDY_ENTRY_LEN); break; } memset(&bo, 0 ,sizeof(bo)); - + /* set flag */ bytes_buddy = bytes; /* based on one online buddy entry */ @@ -204,31 +201,29 @@ bytes += qq_get8(&bo.ending, data + bytes); /* 0x00 */ if (bo.bs.uid == 0 || (bytes - bytes_buddy) != QQ_ONLINE_BUDDY_ENTRY_LEN) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "uid=0 or entry complete len(%d) != %d", + purple_debug_error("QQ", "uid=0 or entry complete len(%d) != %d", (bytes - bytes_buddy), QQ_ONLINE_BUDDY_ENTRY_LEN); continue; } /* check if it is a valid entry */ if (bo.bs.uid == qd->uid) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "I am in online list %d\n", bo.bs.uid); + purple_debug_warning("QQ", "I am in online list %d\n", bo.bs.uid); continue; } /* update buddy information */ purple_name = uid_to_purple_name(bo.bs.uid); if (purple_name == NULL) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "Got an online buddy %d, but not find purple name\n", bo.bs.uid); continue; } b = purple_find_buddy(purple_connection_get_account(gc), purple_name); g_free(purple_name); - + q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data; if (q_bud == NULL) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "Got an online buddy %d, but not in my buddy list\n", bo.bs.uid); continue; } @@ -247,11 +242,11 @@ } if(bytes > data_len) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "qq_process_get_buddies_online_reply: Dangerous error! maybe protocol changed, notify developers!\n"); } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Received %d online buddies, nextposition=%u\n", + purple_debug_info("QQ", "Received %d online buddies, nextposition=%u\n", count, (guint) position); return position; } @@ -274,7 +269,7 @@ qd = (qq_data *) gc->proto_data; if (data_len <= 2) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "empty buddies list"); + purple_debug_error("QQ", "empty buddies list"); return -1; } /* qq_show_packet("QQ get buddies list", data, data_len); */ @@ -297,6 +292,7 @@ pascal_len = convert_as_pascal_string(data + bytes, &q_bud->nickname, QQ_CHARSET_DEFAULT); bytes += pascal_len; + qq_filter_str(q_bud->nickname); bytes += qq_get16(&unknown, data + bytes); bytes += qq_get8(&q_bud->ext_flag, data + bytes); @@ -305,7 +301,7 @@ bytes_expected = 12 + pascal_len; if (q_bud->uid == 0 || (bytes - buddy_bytes) != bytes_expected) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "Buddy entry, expect %d bytes, read %d bytes\n", bytes_expected, bytes - buddy_bytes); g_free(q_bud->nickname); g_free(q_bud); @@ -315,7 +311,7 @@ } #if 1 - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "buddy [%09d]: ext_flag=0x%02x, comm_flag=0x%02x, nick=%s\n", q_bud->uid, q_bud->ext_flag, q_bud->comm_flag, q_bud->nickname); #endif @@ -334,11 +330,11 @@ } if(bytes > data_len) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "qq_process_get_buddies_list_reply: Dangerous error! maybe protocol changed, notify developers!"); } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Received %d buddies, nextposition=%u\n", + purple_debug_info("QQ", "Received %d buddies, nextposition=%u\n", count, (guint) position); return position; } @@ -364,8 +360,7 @@ bytes += qq_get8(&reply_code, data + bytes); if(0 != reply_code) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "qq_process_get_buddies_and_rooms, %d", reply_code); + purple_debug_warning("QQ", "qq_process_get_buddies_and_rooms, %d", reply_code); } bytes += qq_get32(&unknown, data + bytes); @@ -381,48 +376,45 @@ /* 05: groupid*4 */ /* seems to always be 0 */ bytes += qq_get8(&groupid, data + bytes); /* - purple_debug(PURPLE_DEBUG_INFO, "QQ", "groupid: %i\n", groupid); + purple_debug_info("QQ", "groupid: %i\n", groupid); groupid >>= 2; */ if (uid == 0 || (type != 0x1 && type != 0x4)) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "Buddy entry, uid=%d, type=%d", uid, type); + purple_debug_info("QQ", "Buddy entry, uid=%d, type=%d", uid, type); continue; - } + } if(0x1 == type) { /* a buddy */ - /* don't do anything but count - buddies are handled by - * qq_send_packet_get_buddies_list */ + /* don't do anything but count - buddies are handled by + * qq_request_get_buddies_list */ ++i; } else { /* a group */ group = qq_room_search_id(gc, uid); if(group == NULL) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "Not find room id %d in qq_process_get_buddies_and_rooms\n", uid); qq_set_pending_id(&qd->adding_groups_from_server, uid, TRUE); - qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_INFO, uid); } else { - group->my_status = QQ_GROUP_MEMBER_STATUS_IS_MEMBER; + group->my_role = QQ_ROOM_ROLE_YES; qq_group_refresh(gc, group); - qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_INFO, group->id); } ++j; } } if(bytes > data_len) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "qq_process_get_buddies_and_rooms: Dangerous error! maybe protocol changed, notify developers!"); } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Received %d buddies and %d groups, nextposition=%u\n", i, j, (guint) position); + purple_debug_info("QQ", "Received %d buddies and %d groups, nextposition=%u\n", i, j, (guint) position); return position; } #define QQ_MISC_STATUS_HAVING_VIIDEO 0x00000001 #define QQ_CHANGE_ONLINE_STATUS_REPLY_OK 0x30 /* ASCII value of "0" */ -/* TODO: figure out what's going on with the IP region. Sometimes I get valid IP addresses, - * but the port number's weird, other times I get 0s. I get these simultaneously on the same buddy, +/* TODO: figure out what's going on with the IP region. Sometimes I get valid IP addresses, + * but the port number's weird, other times I get 0s. I get these simultaneously on the same buddy, * using different accounts to get info. */ /* check if status means online or offline */ @@ -433,7 +425,7 @@ case QQ_BUDDY_ONLINE_AWAY: case QQ_BUDDY_ONLINE_INVISIBLE: return TRUE; - case QQ_BUDDY_ONLINE_OFFLINE: + case QQ_BUDDY_CHANGE_TO_OFFLINE: return FALSE; } return FALSE; @@ -441,9 +433,9 @@ /* Help calculate the correct icon index to tell the server. */ gint get_icon_offset(PurpleConnection *gc) -{ +{ PurpleAccount *account; - PurplePresence *presence; + PurplePresence *presence; account = purple_connection_get_account(gc); presence = purple_account_get_presence(account); @@ -460,7 +452,7 @@ } /* send a packet to change my online status */ -void qq_send_packet_change_status(PurpleConnection *gc) +void qq_request_change_status(PurpleConnection *gc, gint update_class) { qq_data *qd; guint8 raw_data[16] = {0}; @@ -469,13 +461,13 @@ guint32 misc_status; gboolean fake_video; PurpleAccount *account; - PurplePresence *presence; + PurplePresence *presence; account = purple_connection_get_account(gc); presence = purple_account_get_presence(account); qd = (qq_data *) gc->proto_data; - if (!qd->logged_in) + if (!qd->is_login) return; if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_INVISIBLE)) { @@ -497,7 +489,7 @@ bytes += qq_put8(raw_data + bytes, away_cmd); bytes += qq_put32(raw_data + bytes, misc_status); - qq_send_cmd(qd, QQ_CMD_CHANGE_ONLINE_STATUS, raw_data, bytes); + qq_send_cmd_mess(gc, QQ_CMD_CHANGE_STATUS, raw_data, bytes, update_class, 0); } /* parse the reply packet for change_status */ @@ -513,15 +505,15 @@ g_return_if_fail(data != NULL && data_len != 0); qd = (qq_data *) gc->proto_data; - + bytes = 0; bytes = qq_get8(&reply, data + bytes); if (reply != QQ_CHANGE_ONLINE_STATUS_REPLY_OK) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Change status fail 0x%02X\n", reply); + purple_debug_warning("QQ", "Change status fail 0x%02X\n", reply); return; } - /* purple_debug(PURPLE_DEBUG_INFO, "QQ", "Change status OK\n"); */ + /* purple_debug_info("QQ", "Change status OK\n"); */ name = uid_to_purple_name(qd->uid); b = purple_find_buddy(gc->account, name); g_free(name); @@ -532,7 +524,7 @@ } /* it is a server message indicating that one of my buddies has changed its status */ -void qq_process_buddy_change_status(guint8 *data, gint data_len, PurpleConnection *gc) +void qq_process_buddy_change_status(guint8 *data, gint data_len, PurpleConnection *gc) { qq_data *qd; gint bytes; @@ -547,16 +539,16 @@ qd = (qq_data *) gc->proto_data; if (data_len < 35) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "[buddy status change] only %d, need 35 bytes\n", data_len); + purple_debug_error("QQ", "[buddy status change] only %d, need 35 bytes\n", data_len); return; } - + memset(&bs, 0, sizeof(bs)); bytes = 0; /* 000-030: qq_buddy_status */ bytes += get_buddy_status(&bs, data + bytes); - /* 031-034: Unknow, maybe my uid */ - /* This has a value of 0 when we've changed our status to + /* 031-034: Unknow, maybe my uid */ + /* This has a value of 0 when we've changed our status to * QQ_BUDDY_ONLINE_INVISIBLE */ bytes += qq_get32(&my_uid, data + bytes); @@ -565,20 +557,18 @@ g_free(name); q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data; if (q_bud == NULL) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "got information of unknown buddy %d\n", bs.uid); + purple_debug_warning("QQ", "Get status of unknown buddy %d\n", bs.uid); return; } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "status:.uid = %d, q_bud->uid = %d\n", bs.uid , q_bud->uid); - if(bs.ip.s_addr != 0) { + if(bs.ip.s_addr != 0) { q_bud->ip.s_addr = bs.ip.s_addr; q_bud->port = bs.port; } q_bud->status =bs.status; - if (q_bud->status == QQ_BUDDY_ONLINE_NORMAL) { - qq_send_packet_get_level(gc, q_bud->uid); + if (q_bud->status == QQ_BUDDY_ONLINE_NORMAL && q_bud->level <= 0) { + qq_request_get_level(gc, q_bud->uid); } qq_update_buddy_contact(gc, q_bud); } @@ -589,24 +579,24 @@ gchar *purple_name; PurpleBuddy *bud; gchar *status_id; - + g_return_if_fail(q_bud != NULL); purple_name = uid_to_purple_name(q_bud->uid); if (purple_name == NULL) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Not find purple name: %d\n", q_bud->uid); + purple_debug_error("QQ", "Not find purple name: %d\n", q_bud->uid); return; } bud = purple_find_buddy(gc->account, purple_name); if (bud == NULL) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Not find buddy: %d\n", q_bud->uid); + purple_debug_error("QQ", "Not find buddy: %d\n", q_bud->uid); g_free(purple_name); return; } - + purple_blist_server_alias_buddy(bud, q_bud->nickname); /* server */ - q_bud->last_refresh = time(NULL); + q_bud->last_update = time(NULL); /* purple supports signon and idle time * but it is not much use for QQ, I do not use them */ @@ -619,7 +609,7 @@ case QQ_BUDDY_ONLINE_NORMAL: status_id = "available"; break; - case QQ_BUDDY_ONLINE_OFFLINE: + case QQ_BUDDY_CHANGE_TO_OFFLINE: status_id = "offline"; break; case QQ_BUDDY_ONLINE_AWAY: @@ -630,10 +620,10 @@ break; default: status_id = "invisible"; - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "unknown status: %x\n", q_bud->status); + purple_debug_error("QQ", "unknown status: %x\n", q_bud->status); break; } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "buddy %d %s\n", q_bud->uid, status_id); + purple_debug_info("QQ", "buddy %d %s\n", q_bud->uid, status_id); purple_prpl_got_user_status(gc->account, purple_name, status_id, NULL); if (q_bud->comm_flag & QQ_COMM_FLAG_MOBILE && q_bud->status != QQ_BUDDY_OFFLINE) @@ -641,11 +631,6 @@ else purple_prpl_got_user_status_deactive(gc->account, purple_name, "mobile"); - if (q_bud->comm_flag & QQ_COMM_FLAG_VIDEO && q_bud->status != QQ_BUDDY_OFFLINE) - purple_prpl_got_user_status(gc->account, purple_name, "video", NULL); - else - purple_prpl_got_user_status_deactive(gc->account, purple_name, "video"); - g_free(purple_name); } @@ -664,9 +649,9 @@ while (list != NULL) { q_bud = (qq_buddy *) list->data; - if (q_bud != NULL && now > q_bud->last_refresh + QQ_UPDATE_ONLINE_INTERVAL + if (q_bud != NULL && now > q_bud->last_update + QQ_UPDATE_ONLINE_INTERVAL && q_bud->status != QQ_BUDDY_ONLINE_INVISIBLE) { - q_bud->status = QQ_BUDDY_ONLINE_OFFLINE; + q_bud->status = QQ_BUDDY_CHANGE_TO_OFFLINE; qq_update_buddy_contact(gc, q_bud); } list = list->next;
--- a/libpurple/protocols/qq/buddy_list.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/buddy_list.h Tue Sep 16 20:01:24 2008 +0000 @@ -42,19 +42,19 @@ enum { QQ_BUDDY_OFFLINE = 0x00, - QQ_BUDDY_ONLINE_NORMAL = 0x0a, - QQ_BUDDY_ONLINE_OFFLINE = 0x14, - QQ_BUDDY_ONLINE_AWAY = 0x1e, - QQ_BUDDY_ONLINE_INVISIBLE = 0x28 + QQ_BUDDY_ONLINE_NORMAL = 10, + QQ_BUDDY_CHANGE_TO_OFFLINE = 20, + QQ_BUDDY_ONLINE_AWAY = 30, + QQ_BUDDY_ONLINE_INVISIBLE = 40 }; -void qq_send_packet_get_buddies_online(PurpleConnection *gc, guint8 position); +void qq_request_get_buddies_online(PurpleConnection *gc, guint8 position, gint update_class); guint8 qq_process_get_buddies_online_reply(guint8 *data, gint data_len, PurpleConnection *gc); -void qq_send_packet_get_buddies_list(PurpleConnection *gc, guint16 position); +void qq_request_get_buddies_list(PurpleConnection *gc, guint16 position, gint update_class); guint16 qq_process_get_buddies_list_reply(guint8 *data, gint data_len, PurpleConnection *gc); -void qq_send_packet_get_buddies_and_rooms(PurpleConnection *gc, guint32 position); +void qq_request_get_buddies_and_rooms(PurpleConnection *gc, guint32 position, gint update_class); guint32 qq_process_get_buddies_and_rooms(guint8 *data, gint data_len, PurpleConnection *gc); void qq_refresh_all_buddy_status(PurpleConnection *gc); @@ -63,7 +63,7 @@ gint get_icon_offset(PurpleConnection *gc); -void qq_send_packet_change_status(PurpleConnection *gc); +void qq_request_change_status(PurpleConnection *gc, gint update_class); void qq_process_change_status_reply(guint8 *data, gint data_len, PurpleConnection *gc); void qq_process_buddy_change_status(guint8 *data, gint data_len, PurpleConnection *gc);
--- a/libpurple/protocols/qq/buddy_opt.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/buddy_opt.c Tue Sep 16 20:01:24 2008 +0000 @@ -60,19 +60,17 @@ /* send packet to remove a buddy from my buddy list */ static void _qq_send_packet_remove_buddy(PurpleConnection *gc, guint32 uid) { - qq_data *qd = (qq_data *) gc->proto_data; gchar uid_str[11]; g_return_if_fail(uid > 0); g_snprintf(uid_str, sizeof(uid_str), "%d", uid); - qq_send_cmd(qd, QQ_CMD_DEL_BUDDY, (guint8 *) uid_str, strlen(uid_str)); + qq_send_cmd(gc, QQ_CMD_DEL_BUDDY, (guint8 *) uid_str, strlen(uid_str)); } /* try to remove myself from someone's buddy list */ static void _qq_send_packet_remove_self_from(PurpleConnection *gc, guint32 uid) { - qq_data *qd = (qq_data *) gc->proto_data; guint8 raw_data[16] = {0}; gint bytes = 0; @@ -80,7 +78,7 @@ bytes += qq_put32(raw_data + bytes, uid); - qq_send_cmd(qd, QQ_CMD_REMOVE_SELF, raw_data, bytes); + qq_send_cmd(gc, QQ_CMD_REMOVE_SELF, raw_data, bytes); } /* try to add a buddy without authentication */ @@ -94,7 +92,7 @@ /* we need to send the ascii code of this uid to qq server */ g_snprintf(uid_str, sizeof(uid_str), "%d", uid); - qq_send_cmd(qd, QQ_CMD_ADD_BUDDY_WO_AUTH, (guint8 *) uid_str, strlen(uid_str)); + qq_send_cmd(gc, QQ_CMD_ADD_BUDDY_WO_AUTH, (guint8 *) uid_str, strlen(uid_str)); /* must be set after sending packet to get the correct send_seq */ req = g_new0(qq_add_buddy_request, 1); @@ -106,7 +104,6 @@ /* this buddy needs authentication, text conversion is done at lowest level */ static void _qq_send_packet_buddy_auth(PurpleConnection *gc, guint32 uid, const gchar response, const gchar *text) { - qq_data *qd = (qq_data *) gc->proto_data; gchar *text_qq, uid_str[11]; guint8 bar, *raw_data; gint bytes = 0; @@ -128,7 +125,7 @@ g_free(text_qq); } - qq_send_cmd(qd, QQ_CMD_BUDDY_AUTH, raw_data, bytes); + qq_send_cmd(gc, QQ_CMD_BUDDY_AUTH, raw_data, bytes); } static void _qq_send_packet_add_buddy_auth_with_gc_and_uid(gc_and_uid *g, const gchar *text) @@ -204,11 +201,11 @@ g2->uid = uid; msg1 = g_strdup_printf(_("You rejected %d's request"), uid); - msg2 = g_strdup(_("Input your reason:")); + msg2 = g_strdup(_("Message:")); nombre = uid_to_purple_name(uid); purple_request_input(gc, _("Reject request"), msg1, msg2, - _("Sorry, you are not my type..."), TRUE, FALSE, + _("Sorry, you are not my style..."), TRUE, FALSE, NULL, _("Reject"), G_CALLBACK(_qq_reject_add_request_real), _("Cancel"), NULL, purple_connection_get_account(gc), nombre, NULL, g2); @@ -261,7 +258,7 @@ qd = (qq_data *) gc->proto_data; if (data[0] != QQ_ADD_BUDDY_AUTH_REPLY_OK) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Add buddy with auth request failed\n"); + purple_debug_warning("QQ", "Add buddy with auth request failed\n"); if (NULL == (segments = split_data(data, data_len, "\x1f", 2))) { return; } @@ -269,7 +266,7 @@ purple_notify_error(gc, NULL, _("Add buddy with auth request failed"), msg_utf8); g_free(msg_utf8); } else { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Add buddy with auth request OK\n"); + purple_debug_info("QQ", "Add buddy with auth request OK\n"); } } @@ -284,16 +281,17 @@ if (data[0] != QQ_REMOVE_BUDDY_REPLY_OK) { /* there is no reason return from server */ - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Remove buddy fails\n"); + purple_debug_warning("QQ", "Remove buddy fails\n"); + purple_notify_info(gc, _("QQ Buddy"), _("Failed:"), _("Remove buddy")); } else { /* if reply */ - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Remove buddy OK\n"); + purple_debug_info("QQ", "Remove buddy OK\n"); /* TODO: We don't really need to notify the user about this, do we? */ - purple_notify_info(gc, NULL, _("You have successfully removed a buddy"), NULL); + purple_notify_info(gc, _("QQ Buddy"), _("Successed:"), _("Remove buddy")); } } /* process the server reply for my request to remove myself from a buddy */ -void qq_process_remove_self_reply(guint8 *data, gint data_len, PurpleConnection *gc) +void qq_process_remove_self_reply(guint8 *data, gint data_len, PurpleConnection *gc) { qq_data *qd; @@ -303,11 +301,12 @@ if (data[0] != QQ_REMOVE_SELF_REPLY_OK) { /* there is no reason return from server */ - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Remove self fails\n"); + purple_debug_warning("QQ", "Remove self fails\n"); + purple_notify_info(gc, _("QQ Buddy"), _("Failed:"), _("Remove from other's buddy list")); } else { /* if reply */ - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Remove self from a buddy OK\n"); + purple_debug_info("QQ", "Remove from a buddy OK\n"); /* TODO: Does the user really need to be notified about this? */ - purple_notify_info(gc, NULL, _("You have successfully removed yourself from your friend's buddy list"), NULL); + purple_notify_info(gc, _("QQ Buddy"), _("Successed:"), _("Remove from other's buddy list")); } } @@ -340,25 +339,25 @@ } if (for_uid == 0) { /* we have no record for this */ - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "We have no record for add buddy reply [%d], discard\n", seq); + purple_debug_error("QQ", "We have no record for add buddy reply [%d], discard\n", seq); return; } else { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Add buddy reply [%d] is for id [%d]\n", seq, for_uid); + purple_debug_info("QQ", "Add buddy reply [%d] is for id [%d]\n", seq, for_uid); } if (NULL == (segments = split_data(data, data_len, "\x1f", 2))) return; - + uid = segments[0]; reply = segments[1]; if (strtol(uid, NULL, 10) != qd->uid) { /* should not happen */ - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Add buddy reply is to [%s], not me!", uid); + purple_debug_error("QQ", "Add buddy reply is to [%s], not me!", uid); g_strfreev(segments); return; } if (strtol(reply, NULL, 10) > 0) { /* need auth */ - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Add buddy attempt fails, need authentication\n"); + purple_debug_warning("QQ", "Add buddy attempt fails, need authentication\n"); nombre = uid_to_purple_name(for_uid); b = purple_find_buddy(gc->account, nombre); if (b != NULL) @@ -366,7 +365,7 @@ g = g_new0(gc_and_uid, 1); g->gc = gc; g->uid = for_uid; - msg = g_strdup_printf(_("User %d needs authentication"), for_uid); + msg = g_strdup_printf(_("%d needs authentication"), for_uid); purple_request_input(gc, NULL, msg, _("Input request here"), /* TODO: Awkward string to fix post string freeze - standardize auth dialogues? -evands */ _("Would you be my friend?"), @@ -380,8 +379,8 @@ g_free(nombre); } else { /* add OK */ qq_add_buddy_by_recv_packet(gc, for_uid, TRUE, TRUE); - msg = g_strdup_printf(_("You have added %d to buddy list"), for_uid); - purple_notify_info(gc, NULL, msg, NULL); + msg = g_strdup_printf(_("Add into %d's buddy list"), for_uid); + purple_notify_info(gc, _("QQ Buddy"), _("Successed:"), msg); g_free(msg); } g_strfreev(segments); @@ -397,7 +396,7 @@ if (g == NULL) { g = purple_group_new(group_name); purple_blist_add_group(g, NULL); - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Add new group: %s\n", group_name); + purple_debug_warning("QQ", "Add new group: %s\n", group_name); } return g; @@ -440,11 +439,11 @@ b->proto_data = q_bud; qd->buddies = g_list_append(qd->buddies, q_bud); qq_send_packet_get_info(gc, q_bud->uid, FALSE); - qq_send_packet_get_buddies_online(gc, 0); + qq_request_get_buddies_online(gc, 0, 0); } purple_blist_add_buddy(b, NULL, g, NULL); - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Add new buddy: [%s]\n", name); + purple_debug_warning("QQ", "Add new buddy: [%s]\n", name); g_free(name); g_free(group_name); @@ -454,8 +453,8 @@ /* add a buddy and send packet to QQ server * note that when purple load local cached buddy list into its blist - * it also calls this funtion, so we have to - * define qd->logged_in=TRUE AFTER serv_finish_login(gc) */ + * it also calls this funtion, so we have to + * define qd->is_login=TRUE AFTER serv_finish_login(gc) */ void qq_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) { qq_data *qd; @@ -463,7 +462,7 @@ PurpleBuddy *b; qd = (qq_data *) gc->proto_data; - if (!qd->logged_in) + if (!qd->is_login) return; /* IMPORTANT ! */ uid = purple_name_to_uid(buddy->name); @@ -474,8 +473,8 @@ if (b != NULL) purple_blist_remove_buddy(b); purple_notify_error(gc, NULL, - _("QQid Error"), - _("Invalid QQid")); + _("QQ Number Error"), + _("Invalid QQ Number")); } } @@ -490,7 +489,7 @@ qd = (qq_data *) gc->proto_data; uid = purple_name_to_uid(buddy->name); - if (!qd->logged_in) + if (!qd->is_login) return; if (uid > 0) @@ -502,7 +501,7 @@ if (q_bud != NULL) qd->buddies = g_list_remove(qd->buddies, q_bud); else - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "We have no qq_buddy record for %s\n", buddy->name); + purple_debug_warning("QQ", "We have no qq_buddy record for %s\n", buddy->name); /* remove buddy on blist, this does not trigger qq_remove_buddy again * do this only if the request comes from block request, * otherwise purple segmentation fault */ @@ -514,41 +513,45 @@ /* free add buddy request queue */ void qq_add_buddy_request_free(qq_data *qd) { - gint i; + gint count; qq_add_buddy_request *p; - i = 0; - while (qd->add_buddy_request) { + count = 0; + while (qd->add_buddy_request != NULL) { p = (qq_add_buddy_request *) (qd->add_buddy_request->data); qd->add_buddy_request = g_list_remove(qd->add_buddy_request, p); g_free(p); - i++; + count++; } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "%d add buddy requests are freed!\n", i); + if (count > 0) { + purple_debug_info("QQ", "%d add buddy requests are freed!\n", count); + } } /* free up all qq_buddy */ void qq_buddies_list_free(PurpleAccount *account, qq_data *qd) { - gint i; + gint count; qq_buddy *p; gchar *name; PurpleBuddy *b; - i = 0; + count = 0; while (qd->buddies) { p = (qq_buddy *) (qd->buddies->data); qd->buddies = g_list_remove(qd->buddies, p); name = uid_to_purple_name(p->uid); - b = purple_find_buddy(account, name); - if(b != NULL) + b = purple_find_buddy(account, name); + if(b != NULL) b->proto_data = NULL; else - purple_debug(PURPLE_DEBUG_INFO, "QQ", "qq_buddy %s not found in purple proto_data\n", name); + purple_debug_info("QQ", "qq_buddy %s not found in purple proto_data\n", name); g_free(name); g_free(p); - i++; + count++; } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "%d qq_buddy structures are freed!\n", i); + if (count > 0) { + purple_debug_info("QQ", "%d qq_buddy structures are freed!\n", count); + } }
--- a/libpurple/protocols/qq/char_conv.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/char_conv.c Tue Sep 16 20:01:24 2008 +0000 @@ -98,7 +98,7 @@ } /* convert a string from from_charset to to_charset, using g_convert */ -static gchar *_my_convert(const gchar *str, gssize len, const gchar *to_charset, const gchar *from_charset) +static gchar *_my_convert(const gchar *str, gssize len, const gchar *to_charset, const gchar *from_charset) { GError *error = NULL; gchar *ret; @@ -111,9 +111,9 @@ if (error == NULL) { return ret; /* conversion is OK */ } - + /* conversion error */ - purple_debug(PURPLE_DEBUG_ERROR, "QQ_CONVERT", "%s\n", error->message); + purple_debug_error("QQ_CONVERT", "%s\n", error->message); qq_hex_dump(PURPLE_DEBUG_WARNING, "QQ_CONVERT", (guint8 *) str, (len == -1) ? strlen(str) : len, @@ -127,8 +127,8 @@ * take the input as a pascal string and return a converted c-string in UTF-8 * returns the number of bytes read, return -1 if fatal error * the converted UTF-8 will be saved in ret - */ -gint convert_as_pascal_string(guint8 *data, gchar **ret, const gchar *from_charset) + */ +gint convert_as_pascal_string(guint8 *data, gchar **ret, const gchar *from_charset) { guint8 len; @@ -182,7 +182,7 @@ g_string_append_printf(encoded, "<font color=\"%s\"><font face=\"%s\"><font size=\"%d\">", color_code, font_name, font_size / 3); - purple_debug(PURPLE_DEBUG_INFO, "QQ_MESG", + purple_debug_info("QQ_MESG", "recv <font color=\"%s\"><font face=\"%s\"><font size=\"%d\">\n", color_code, font_name, font_size / 3); g_string_append(encoded, msg_utf8); @@ -222,7 +222,7 @@ return _my_convert(str, -1, UTF8, from_charset); } -/* QQ uses binary code for smiley, while purple uses strings. +/* QQ uses binary code for smiley, while purple uses strings. * There is a mapping relation between these two. */ gchar *qq_smiley_to_purple(gchar *text) { @@ -286,7 +286,8 @@ } for (temp = str; *temp != 0; temp++) { - if (*temp == '\r' || *temp == '\n') *temp = ' '; + /*if (*temp == '\r' || *temp == '\n') *temp = ' ';*/ + if (*temp > 0 && *temp < 0x20) *temp = ' '; } g_strstrip(str); }
--- a/libpurple/protocols/qq/file_trans.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/file_trans.c Tue Sep 16 20:01:24 2008 +0000 @@ -22,10 +22,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ -#ifdef _WIN32 -#define random rand -#endif - #include "internal.h" #include "debug.h" @@ -62,7 +58,7 @@ { guint8 seed; - seed = random(); + seed = rand() & 0xFF; return _get_file_key(seed); } @@ -261,7 +257,7 @@ if (bytes == len + 12) { _qq_xfer_write(raw_data, bytes, qd->xfer); } else - purple_debug(PURPLE_DEBUG_INFO, "QQ", "send_file: want %d but got %d\n", len + 12, bytes); + purple_debug_info("QQ", "send_file: want %d but got %d\n", len + 12, bytes); return bytes; } @@ -323,13 +319,13 @@ bytes_expected = 61; break; default: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "qq_send_file_ctl_packet: Unknown packet type[%d]\n", + purple_debug_info("QQ", "qq_send_file_ctl_packet: Unknown packet type[%d]\n", packet_type); bytes_expected = 0; } if (bytes != bytes_expected) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "qq_send_file_ctl_packet: Expected to get %d bytes, but get %d", + purple_debug_error("QQ", "qq_send_file_ctl_packet: Expected to get %d bytes, but get %d", bytes_expected, bytes); return; } @@ -346,24 +342,24 @@ guint8 *buf; int buflen; hex_dump = hex_dump_to_str(encrypted_data, encrypted_len); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "encrypted packet: \n%s", hex_dump); + purple_debug_info("QQ", "encrypted packet: \n%s", hex_dump); g_free(hex_dump); buf = g_newa(guint8, MAX_PACKET_SIZE); buflen = encrypted_len; if (qq_crypt(DECRYPT, encrypted_data, encrypted_len, info->file_session_key, buf, &buflen)) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "decrypt success\n"); + purple_debug_info("QQ", "decrypt success\n"); if (buflen == bytes && memcmp(raw_data, buf, buflen) == 0) - purple_debug(PURPLE_DEBUG_INFO, "QQ", "checksum ok\n"); + purple_debug_info("QQ", "checksum ok\n"); hex_dump = hex_dump_to_str(buf, buflen); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "decrypted packet: \n%s", hex_dump); + purple_debug_info("QQ", "decrypted packet: \n%s", hex_dump); g_free(hex_dump); } else { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "decrypt fail\n"); + purple_debug_info("QQ", "decrypt fail\n"); } #endif - purple_debug(PURPLE_DEBUG_INFO, "QQ", "<== send %s packet\n", qq_get_file_cmd_desc(packet_type)); + purple_debug_info("QQ", "<== send %s packet\n", qq_get_file_cmd_desc(packet_type)); _qq_send_file(gc, encrypted_data, encrypted_len, QQ_FILE_CONTROL_PACKET_TAG, info->to_uid); } @@ -410,7 +406,7 @@ info->fragment_num = (filesize - 1) / QQ_FILE_FRAGMENT_MAXLEN + 1; info->fragment_len = QQ_FILE_FRAGMENT_MAXLEN; - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "start transfering data, %d fragments with %d length each\n", info->fragment_num, info->fragment_len); /* Unknown */ @@ -435,7 +431,7 @@ filename_len); break; case QQ_FILE_DATA_INFO: - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "sending %dth fragment with length %d, offset %d\n", fragment_index, len, (fragment_index-1)*fragment_size); /* bytes += qq_put16(raw_data + bytes, ++(qd->send_seq)); */ @@ -448,7 +444,7 @@ bytes += qq_putdata(raw_data + bytes, data, len); break; case QQ_FILE_EOF: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "end of sending data\n"); + purple_debug_info("QQ", "end of sending data\n"); /* bytes += qq_put16(raw_data + bytes, info->fragment_num + 1); */ bytes += qq_put16(raw_data + bytes, info->fragment_num); bytes += qq_put8(raw_data + bytes, sub_type); @@ -474,7 +470,7 @@ break; } } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "<== send %s packet\n", qq_get_file_cmd_desc(packet_type)); + purple_debug_info("QQ", "<== send %s packet\n", qq_get_file_cmd_desc(packet_type)); _qq_send_file(gc, raw_data, bytes, QQ_FILE_DATA_PACKET_TAG, info->to_uid); } @@ -516,7 +512,7 @@ decrypted_data = g_newa(guint8, data_len); decrypted_len = qq_decrypt(decrypted_data, data, data_len, qd->session_md5); if ( decrypted_len <= 0 ) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt rcv file ctrl packet\n"); + purple_debug_error("QQ", "Error decrypt rcv file ctrl packet\n"); return; } @@ -526,7 +522,7 @@ decryped_bytes += qq_get16(&seq, decrypted_data + decryped_bytes); decryped_bytes += 4+1+1+19+1; /* skip something */ - purple_debug(PURPLE_DEBUG_INFO, "QQ", "==> [%d] receive %s packet\n", seq, qq_get_file_cmd_desc(packet_type)); + purple_debug_info("QQ", "==> [%d] receive %s packet\n", seq, qq_get_file_cmd_desc(packet_type)); qq_hex_dump(PURPLE_DEBUG_INFO, "QQ", decrypted_data, decrypted_len, "decrypted control packet received:"); @@ -566,7 +562,7 @@ qq_send_file_ctl_packet(gc, QQ_FILE_CMD_SENDER_SAY_HELLO, fh.sender_uid, 0); break; default: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "unprocess file command %d\n", packet_type); + purple_debug_info("QQ", "unprocess file command %d\n", packet_type); } } @@ -577,7 +573,7 @@ ft_info *info = (ft_info *) xfer->data; guint32 mask; - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "receiving %dth fragment with length %d, slide window status %o, max_fragment_index %d\n", index, len, info->window, info->max_fragment_index); if (info->window == 0 && info->max_fragment_index == 0) { @@ -585,11 +581,11 @@ purple_xfer_cancel_local(xfer); return; } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "object file opened for writing\n"); + purple_debug_info("QQ", "object file opened for writing\n"); } mask = 0x1 << (index % sizeof(info->window)); if (index < info->max_fragment_index || (info->window & mask)) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "duplicate %dth fragment, drop it!\n", index+1); + purple_debug_info("QQ", "duplicate %dth fragment, drop it!\n", index+1); return; } @@ -609,7 +605,7 @@ if (mask & 0x8000) mask = 0x0001; else mask = mask << 1; } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "procceed %dth fragment, slide window status %o, max_fragment_index %d\n", + purple_debug_info("QQ", "procceed %dth fragment, slide window status %o, max_fragment_index %d\n", index, info->window, info->max_fragment_index); } @@ -654,12 +650,12 @@ PurpleXfer *xfer = qd->xfer; ft_info *info = (ft_info *) xfer->data; - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "receiving %dth fragment ack, slide window status %o, max_fragment_index %d\n", fragment_index, info->window, info->max_fragment_index); if (fragment_index < info->max_fragment_index || fragment_index >= info->max_fragment_index + sizeof(info->window)) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "duplicate %dth fragment, drop it!\n", fragment_index+1); + purple_debug_info("QQ", "duplicate %dth fragment, drop it!\n", fragment_index+1); return; } mask = 0x1 << (fragment_index % sizeof(info->window)); @@ -696,7 +692,7 @@ else mask = mask << 1; } } - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "procceed %dth fragment ack, slide window status %o, max_fragment_index %d\n", fragment_index, info->window, info->max_fragment_index); } @@ -737,7 +733,7 @@ info->max_fragment_index = 0; info->window = 0; - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "start receiving data, %d fragments with %d length each\n", info->fragment_num, info->fragment_len); _qq_send_file_data_packet(gc, QQ_FILE_CMD_FILE_OP_ACK, sub_type, @@ -747,7 +743,7 @@ bytes += qq_get32(&fragment_index, data + bytes); bytes += qq_get32(&fragment_offset, data + bytes); bytes += qq_get16(&fragment_len, data + bytes); - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "received %dth fragment with length %d, offset %d\n", fragment_index, fragment_len, fragment_offset); @@ -756,7 +752,7 @@ _qq_recv_file_progess(gc, data + bytes, fragment_len, fragment_index, fragment_offset); break; case QQ_FILE_EOF: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "end of receiving\n"); + purple_debug_info("QQ", "end of receiving\n"); _qq_send_file_data_packet(gc, QQ_FILE_CMD_FILE_OP_ACK, sub_type, 0, 0, NULL, 0); break; @@ -795,11 +791,11 @@ purple_xfer_end(qd->xfer); break; case QQ_FILE_BASIC_INFO: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "here\n"); + purple_debug_info("QQ", "here\n"); _qq_send_file_data_packet(gc, QQ_FILE_DATA_INFO, 0, 0, 0, NULL, 0); break; default: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "_qq_process_recv_file_data: unknown packet type [%d]\n", + purple_debug_info("QQ", "_qq_process_recv_file_data: unknown packet type [%d]\n", packet_type); break; } @@ -824,6 +820,6 @@ _qq_process_recv_file_data(gc, data + bytes, len - bytes); break; default: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "unknown packet tag"); + purple_debug_info("QQ", "unknown packet tag"); } }
--- a/libpurple/protocols/qq/group.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group.c Tue Sep 16 20:01:24 2008 +0000 @@ -64,9 +64,9 @@ pce = g_new0(struct proto_chat_entry, 1); pce->label = _("ID: "); - pce->identifier = QQ_GROUP_KEY_EXTERNAL_ID; + pce->identifier = QQ_ROOM_KEY_EXTERNAL_ID; m = g_list_append(m, pce); - + return m; } @@ -77,7 +77,7 @@ defaults = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); if (chat_name != NULL) - g_hash_table_insert(defaults, QQ_GROUP_KEY_EXTERNAL_ID, g_strdup(chat_name)); + g_hash_table_insert(defaults, QQ_ROOM_KEY_EXTERNAL_ID, g_strdup(chat_name)); return defaults; } @@ -96,33 +96,33 @@ rl = purple_roomlist_new(purple_connection_get_account(gc)); qd->roomlist = rl; - f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, _("Group ID"), QQ_GROUP_KEY_EXTERNAL_ID, FALSE); + f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, _("Group ID"), QQ_ROOM_KEY_EXTERNAL_ID, FALSE); fields = g_list_append(fields, f); - f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, _("Creator"), QQ_GROUP_KEY_CREATOR_UID, FALSE); + f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, _("Creator"), QQ_ROOM_KEY_CREATOR_UID, FALSE); fields = g_list_append(fields, f); f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, - _("Group Description"), QQ_GROUP_KEY_GROUP_DESC_UTF8, FALSE); + _("Group Description"), QQ_ROOM_KEY_DESC_UTF8, FALSE); fields = g_list_append(fields, f); - f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "", QQ_GROUP_KEY_INTERNAL_ID, TRUE); + f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "", QQ_ROOM_KEY_INTERNAL_ID, TRUE); fields = g_list_append(fields, f); - f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "", QQ_GROUP_KEY_TYPE, TRUE); + f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "", QQ_ROOM_KEY_TYPE, TRUE); fields = g_list_append(fields, f); - f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, _("Auth"), QQ_GROUP_KEY_AUTH_TYPE, TRUE); + f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, _("Auth"), QQ_ROOM_KEY_AUTH_TYPE, TRUE); fields = g_list_append(fields, f); - f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "", QQ_GROUP_KEY_GROUP_CATEGORY, TRUE); + f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "", QQ_ROOM_KEY_CATEGORY, TRUE); fields = g_list_append(fields, f); - f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "", QQ_GROUP_KEY_GROUP_NAME_UTF8, TRUE); + f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "", QQ_ROOM_KEY_TITLE_UTF8, TRUE); fields = g_list_append(fields, f); purple_roomlist_set_fields(rl, fields); purple_roomlist_set_in_progress(qd->roomlist, TRUE); purple_request_input(gc, _("QQ Qun"), - _("Please enter external group ID"), - _("You can only search for permanent QQ groups\n"), - NULL, FALSE, FALSE, NULL, - _("Search"), G_CALLBACK(_qq_group_search_callback), - _("Cancel"), G_CALLBACK(_qq_group_search_cancel_callback), + _("Please enter Qun number"), + _("You can only search for permanent Qun\n"), + NULL, FALSE, FALSE, NULL, + _("Search"), G_CALLBACK(_qq_group_search_callback), + _("Cancel"), G_CALLBACK(_qq_group_search_cancel_callback), purple_connection_get_account(gc), NULL, NULL, gc); @@ -157,7 +157,7 @@ purple_group = purple_find_group(PURPLE_GROUP_QQ_QUN); if (purple_group == NULL) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "We have no QQ Qun\n"); + purple_debug_info("QQ", "We have no QQ Qun\n"); return; } @@ -170,7 +170,7 @@ chat = (PurpleChat *) node; if (account != chat->account) /* not qq account*/ continue; - group = qq_group_from_hashtable(gc, chat->components); + group = qq_room_create_by_hashtable(gc, chat->components); if (group == NULL) continue; @@ -178,8 +178,7 @@ continue; count++; - qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_INFO, group->id); } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Load %d QQ Qun configurations\n", count); + purple_debug_info("QQ", "Load %d QQ Qun configurations\n", count); }
--- a/libpurple/protocols/qq/group.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group.h Tue Sep 16 20:01:24 2008 +0000 @@ -34,27 +34,29 @@ #define PURPLE_GROUP_QQ_QUN "QQ 群" typedef enum { - QQ_GROUP_MEMBER_STATUS_NOT_MEMBER = 0x00, /* default 0x00 means not member */ - QQ_GROUP_MEMBER_STATUS_IS_MEMBER, - QQ_GROUP_MEMBER_STATUS_APPLYING, - QQ_GROUP_MEMBER_STATUS_IS_ADMIN, -} qq_group_member_status; + QQ_ROOM_ROLE_NO = 0x00, /* default 0x00 means not member */ + QQ_ROOM_ROLE_YES, + QQ_ROOM_ROLE_REQUESTING, + QQ_ROOM_ROLE_ADMIN, +} qq_room_role; typedef struct _qq_group { /* all these will be saved when we exit Purple */ - qq_group_member_status my_status; /* my status for this group */ - gchar *my_status_desc; /* my status description */ + qq_room_role my_role; /* my role for this room */ + gchar *my_role_desc; /* my role description */ guint32 id; guint32 ext_id; guint8 type8; /* permanent or temporory */ guint32 creator_uid; - guint32 group_category; + guint32 category; guint8 auth_type; - gchar *group_name_utf8; - gchar *group_desc_utf8; + gchar *title_utf8; + gchar *desc_utf8; /* all these will be loaded from the network */ gchar *notice_utf8; /* group notice by admin */ - GList *members; + GList *members; + + gboolean is_got_info; } qq_group; GList *qq_chat_info(PurpleConnection *gc);
--- a/libpurple/protocols/qq/group_conv.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_conv.c Tue Sep 16 20:01:24 2008 +0000 @@ -25,25 +25,40 @@ #include <glib.h> #include "qq.h" -#include "conversation.h" - #include "group_conv.h" #include "buddy_list.h" +#include "header_info.h" +#include "qq_network.h" +#include "qq_process.h" #include "utils.h" /* show group conversation window */ -void qq_group_conv_show_window(PurpleConnection *gc, qq_group *group) +PurpleConversation *qq_room_conv_create(PurpleConnection *gc, qq_group *group) { PurpleConversation *conv; qq_data *qd; - g_return_if_fail(group != NULL); + g_return_val_if_fail(group != NULL, NULL); qd = (qq_data *) gc->proto_data; - conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, - group->group_name_utf8, purple_connection_get_account(gc)); - if (conv == NULL) /* show only one window per group */ - serv_got_joined_chat(gc, qd->channel++, group->group_name_utf8); + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, + group->title_utf8, purple_connection_get_account(gc)); + if (conv != NULL) { + /* show only one conversation per group */ + return conv; + } + + serv_got_joined_chat(gc, qd->channel++, group->title_utf8); + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, group->title_utf8, purple_connection_get_account(gc)); + if (conv != NULL) { + purple_conv_chat_set_topic(PURPLE_CONV_CHAT(conv), NULL, group->notice_utf8); + if (group->is_got_info) + qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_ONLINES, group->id); + else + qq_update_room(gc, 0, group->id); + return conv; + } + return NULL; } /* refresh online member in group conversation window */ @@ -59,7 +74,7 @@ names = NULL; flags = NULL; conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, - group->group_name_utf8, purple_connection_get_account(gc)); + group->title_utf8, purple_connection_get_account(gc)); if (conv != NULL && group->members != NULL) { list = group->members; while (list != NULL) {
--- a/libpurple/protocols/qq/group_conv.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_conv.h Tue Sep 16 20:01:24 2008 +0000 @@ -26,9 +26,10 @@ #define _QQ_GROUP_CONV_H_ #include "connection.h" +#include "conversation.h" #include "group.h" -void qq_group_conv_show_window(PurpleConnection *gc, qq_group *group); +PurpleConversation *qq_room_conv_create(PurpleConnection *gc, qq_group *group); void qq_group_conv_refresh_online_member(PurpleConnection *gc, qq_group *group); #endif
--- a/libpurple/protocols/qq/group_find.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_find.c Tue Sep 16 20:01:24 2008 +0000 @@ -110,10 +110,10 @@ group = NULL; while (list != NULL) { group = (qq_group *) list->data; - if (group->group_name_utf8 == NULL) { + if (group->title_utf8 == NULL) { continue; } - if (!g_ascii_strcasecmp(purple_conversation_get_name(conv), group->group_name_utf8)) + if (!g_ascii_strcasecmp(purple_conversation_get_name(conv), group->title_utf8)) break; list = list->next; } @@ -167,3 +167,83 @@ return NULL; } + +qq_group *qq_room_get_next(PurpleConnection *gc, guint32 room_id) +{ + GList *list; + qq_group *group; + qq_data *qd; + gboolean is_find = FALSE; + + qd = (qq_data *) gc->proto_data; + + if (qd->groups == NULL) { + return NULL; + } + + if (room_id <= 0) { + return (qq_group *) qd->groups->data; + } + + list = qd->groups; + while (list != NULL) { + group = (qq_group *) list->data; + list = list->next; + if (group->id == room_id) { + is_find = TRUE; + break; + } + } + + if ( !is_find || list == NULL) { + return NULL; + } + + return (qq_group *)list->data; +} + +qq_group *qq_room_get_next_conv(PurpleConnection *gc, guint32 room_id) +{ + GList *list; + qq_group *group; + qq_data *qd; + gboolean is_find; + + qd = (qq_data *) gc->proto_data; + + list = qd->groups; + if (room_id > 0) { + /* search next room */ + is_find = FALSE; + while (list != NULL) { + group = (qq_group *) list->data; + list = list->next; + if (group->id == room_id) { + is_find = TRUE; + break; + } + } + if ( !is_find || list == NULL) { + return NULL; + } + } + + is_find = FALSE; + while (list != NULL) { + group = (qq_group *) list->data; + if (group->my_role == QQ_ROOM_ROLE_YES || group->my_role == QQ_ROOM_ROLE_ADMIN) { + if (NULL != purple_find_conversation_with_account( + PURPLE_CONV_TYPE_CHAT,group->title_utf8, purple_connection_get_account(gc))) { + /* In convseration*/ + is_find = TRUE; + break; + } + } + list = list->next; + } + + if ( !is_find) { + return NULL; + } + return group; +}
--- a/libpurple/protocols/qq/group_find.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_find.h Tue Sep 16 20:01:24 2008 +0000 @@ -32,10 +32,12 @@ qq_buddy *qq_group_find_member_by_uid(qq_group *group, guint32 uid); void qq_group_remove_member_by_uid(qq_group *group, guint32 uid); qq_buddy *qq_group_find_or_add_member(PurpleConnection *gc, qq_group *group, guint32 member_uid); -gboolean qq_group_find_id_by_seq(PurpleConnection *gc, guint16 seq, guint32 *id); qq_group *qq_group_find_by_channel(PurpleConnection *gc, gint channel); qq_group *qq_room_search_ext_id(PurpleConnection *gc, guint32 ext_id); qq_group *qq_room_search_id(PurpleConnection *gc, guint32 room_id); +qq_group *qq_room_get_next(PurpleConnection *gc, guint32 room_id); +qq_group *qq_room_get_next_conv(PurpleConnection *gc, guint32 room_id); + #endif
--- a/libpurple/protocols/qq/group_free.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_free.c Tue Sep 16 20:01:24 2008 +0000 @@ -54,9 +54,9 @@ { g_return_if_fail(group != NULL); qq_group_free_member(group); - g_free(group->my_status_desc); - g_free(group->group_name_utf8); - g_free(group->group_desc_utf8); + g_free(group->my_role_desc); + g_free(group->title_utf8); + g_free(group->desc_utf8); g_free(group->notice_utf8); g_free(group); } @@ -64,16 +64,18 @@ void qq_group_free_all(qq_data *qd) { qq_group *group; - gint i; - g_return_if_fail(qd != NULL); + gint count; - i = 0; + g_return_if_fail(qd != NULL); + count = 0; while (qd->groups != NULL) { - i++; group = (qq_group *) qd->groups->data; qd->groups = g_list_remove(qd->groups, group); qq_group_free(group); + count++; } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "%d groups are freed\n", i); + if (count > 0) { + purple_debug_info("QQ", "%d rooms are freed\n", count); + } }
--- a/libpurple/protocols/qq/group_im.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_im.c Tue Sep 16 20:01:24 2008 +0000 @@ -37,10 +37,12 @@ #include "group_info.h" #include "group_im.h" #include "group_opt.h" +#include "group_conv.h" #include "im.h" #include "header_info.h" #include "packet_parse.h" #include "qq_network.h" +#include "qq_process.h" #include "utils.h" typedef struct _qq_recv_group_im { @@ -85,12 +87,12 @@ if (bytes == data_len) /* create OK */ qq_send_room_cmd(gc, QQ_ROOM_CMD_SEND_MSG, group->id, raw_data, data_len); else - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "Fail creating group_im packet, expect %d bytes, build %d bytes\n", data_len, bytes); } /* this is the ACK */ -void qq_process_group_cmd_im(guint8 *data, gint len, PurpleConnection *gc) +void qq_process_group_cmd_im(guint8 *data, gint len, PurpleConnection *gc) { /* return should be the internal group id * but we have nothing to do with it */ @@ -98,7 +100,7 @@ } /* receive an application to join the group */ -void qq_process_recv_group_im_apply_join(guint8 *data, gint len, guint32 id, PurpleConnection *gc) +void qq_process_room_msg_apply_join(guint8 *data, gint len, guint32 id, PurpleConnection *gc) { guint32 ext_id, user_uid; guint8 type8; @@ -119,8 +121,8 @@ bytes += convert_as_pascal_string(data + bytes, &reason_utf8, QQ_CHARSET_DEFAULT); - msg = g_strdup_printf(_("User %d requested to join group %d"), user_uid, ext_id); - reason = g_strdup_printf(_("Reason: %s"), reason_utf8); + msg = g_strdup_printf(_("%d request to join Qun %d"), user_uid, ext_id); + reason = g_strdup_printf(_("Message: %s"), reason_utf8); g = g_new0(group_member_opt, 1); g->gc = gc; @@ -149,7 +151,7 @@ } /* the request to join a group is rejected */ -void qq_process_recv_group_im_been_rejected(guint8 *data, gint len, guint32 id, PurpleConnection *gc) +void qq_process_room_msg_been_rejected(guint8 *data, gint len, guint32 id, PurpleConnection *gc) { guint32 ext_id, admin_uid; guint8 type8; @@ -170,14 +172,14 @@ bytes += convert_as_pascal_string(data + bytes, &reason_utf8, QQ_CHARSET_DEFAULT); msg = g_strdup_printf - (_("Your request to join group %d has been rejected by admin %d"), ext_id, admin_uid); - reason = g_strdup_printf(_("Reason: %s"), reason_utf8); + (_("Failed to join Qun %d, operated by admin %d"), ext_id, admin_uid); + reason = g_strdup_printf(_("Message: %s"), reason_utf8); purple_notify_warning(gc, _("QQ Qun Operation"), msg, reason); group = qq_room_search_id(gc, id); if (group != NULL) { - group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER; + group->my_role = QQ_ROOM_ROLE_NO; qq_group_refresh(gc, group); } @@ -187,7 +189,7 @@ } /* the request to join a group is approved */ -void qq_process_recv_group_im_been_approved(guint8 *data, gint len, guint32 id, PurpleConnection *gc) +void qq_process_room_msg_been_approved(guint8 *data, gint len, guint32 id, PurpleConnection *gc) { guint32 ext_id, admin_uid; guint8 type8; @@ -208,13 +210,13 @@ bytes += convert_as_pascal_string(data + bytes, &reason_utf8, QQ_CHARSET_DEFAULT); msg = g_strdup_printf - (_("Your request to join group %d has been approved by admin %d"), ext_id, admin_uid); + (_("Successed to join Qun %d, operated by admin %d"), ext_id, admin_uid); purple_notify_warning(gc, _("QQ Qun Operation"), msg, NULL); group = qq_room_search_id(gc, id); if (group != NULL) { - group->my_status = QQ_GROUP_MEMBER_STATUS_IS_MEMBER; + group->my_role = QQ_ROOM_ROLE_YES; qq_group_refresh(gc, group); } @@ -223,7 +225,7 @@ } /* process the packet when removed from a group */ -void qq_process_recv_group_im_been_removed(guint8 *data, gint len, guint32 id, PurpleConnection *gc) +void qq_process_room_msg_been_removed(guint8 *data, gint len, guint32 id, PurpleConnection *gc) { guint32 ext_id, uid; guint8 type8; @@ -241,12 +243,12 @@ g_return_if_fail(ext_id > 0 && uid > 0); - msg = g_strdup_printf(_("You [%d] have left group \"%d\""), uid, ext_id); - purple_notify_info(gc, _("QQ Qun Operation"), msg, NULL); + msg = g_strdup_printf(_("[%d] removed from Qun \"%d\""), uid, ext_id); + purple_notify_info(gc, _("QQ Qun Operation"), _("Notice:"), msg); group = qq_room_search_id(gc, id); if (group != NULL) { - group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER; + group->my_role = QQ_ROOM_ROLE_NO; qq_group_refresh(gc, group); } @@ -254,7 +256,7 @@ } /* process the packet when added to a group */ -void qq_process_recv_group_im_been_added(guint8 *data, gint len, guint32 id, PurpleConnection *gc) +void qq_process_room_msg_been_added(guint8 *data, gint len, guint32 id, PurpleConnection *gc) { guint32 ext_id, uid; guint8 type8; @@ -272,18 +274,18 @@ g_return_if_fail(ext_id > 0 && uid > 0); - msg = g_strdup_printf(_("You [%d] have been added to group \"%d\""), uid, ext_id); - purple_notify_info(gc, _("QQ Qun Operation"), msg, _("This group has been added to your buddy list")); + msg = g_strdup_printf(_("[%d] added to Qun \"%d\""), uid, ext_id); + purple_notify_info(gc, _("QQ Qun Operation"), _("Notice:"), msg); group = qq_room_search_id(gc, id); if (group != NULL) { - group->my_status = QQ_GROUP_MEMBER_STATUS_IS_MEMBER; + group->my_role = QQ_ROOM_ROLE_YES; qq_group_refresh(gc, group); } else { /* no such group, try to create a dummy first, and then update */ group = qq_group_create_internal_record(gc, id, ext_id, NULL); - group->my_status = QQ_GROUP_MEMBER_STATUS_IS_MEMBER; + group->my_role = QQ_ROOM_ROLE_YES; qq_group_refresh(gc, group); - qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_INFO, group->id); + qq_update_room(gc, 0, group->id); /* the return of this cmd will automatically update the group in blist */ } @@ -291,7 +293,7 @@ } /* recv an IM from a group chat */ -void qq_process_recv_group_im(guint8 *data, gint data_len, guint32 id, PurpleConnection *gc, guint16 im_type) +void qq_process_room_msg_normal(guint8 *data, gint data_len, guint32 id, PurpleConnection *gc, guint16 im_type) { gchar *msg_with_purple_smiley, *msg_utf8_encoded, *im_src_name; guint16 unknown; @@ -310,7 +312,9 @@ qd = (qq_data *) gc->proto_data; - /* qq_hex_dump(PURPLE_DEBUG_INFO, "QQ", data, data_len, "group im hex dump"); */ +#if 0 + qq_hex_dump(PURPLE_DEBUG_INFO, "QQ", data, data_len, "group im hex dump"); +#endif im_group = g_newa(qq_recv_group_im, 1); @@ -374,13 +378,9 @@ group = qq_room_search_id(gc, id); g_return_if_fail(group != NULL); - conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, group->group_name_utf8, purple_connection_get_account(gc)); - if (conv == NULL && purple_prefs_get_bool("/plugins/prpl/qq/prompt_group_msg_on_recv")) { - /* New conv should open, get group info*/ - qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_INFO, group->id); - - serv_got_joined_chat(gc, qd->channel++, group->group_name_utf8); - conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, group->group_name_utf8, purple_connection_get_account(gc)); + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, group->title_utf8, purple_connection_get_account(gc)); + if (conv == NULL && purple_prefs_get_bool("/plugins/prpl/qq/show_room_when_newin")) { + conv = qq_room_conv_create(gc, group); } if (conv != NULL) {
--- a/libpurple/protocols/qq/group_im.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_im.h Tue Sep 16 20:01:24 2008 +0000 @@ -31,30 +31,17 @@ void qq_send_packet_group_im(PurpleConnection *gc, qq_group *group, const gchar *msg); -/* void qq_process_group_cmd_im(guint8 *data, guint8 **cursor, gint len, PurpleConnection *gc); */ void qq_process_group_cmd_im(guint8 *data, gint len, PurpleConnection *gc); -/* void qq_process_recv_group_im(guint8 *data, guint8 **cursor, - * gint data_len, guint32 id, PurpleConnection *gc, guint16 im_type); */ -void qq_process_recv_group_im(guint8 *data, gint data_len, guint32 id, PurpleConnection *gc, guint16 im_type); +void qq_process_room_msg_normal(guint8 *data, gint data_len, guint32 id, PurpleConnection *gc, guint16 im_type); -/* void qq_process_recv_group_im_apply_join(guint8 *data, guint8 **cursor, gint len, - * guint32 id, PurpleConnection *gc); */ -void qq_process_recv_group_im_apply_join(guint8 *data, gint len, guint32 id, PurpleConnection *gc); +void qq_process_room_msg_apply_join(guint8 *data, gint len, guint32 id, PurpleConnection *gc); -/* void qq_process_recv_group_im_been_rejected(guint8 *data, guint8 **cursor, gint len, - * guint32 id, PurpleConnection *gc); */ -void qq_process_recv_group_im_been_rejected(guint8 *data, gint len, guint32 id, PurpleConnection *gc); +void qq_process_room_msg_been_rejected(guint8 *data, gint len, guint32 id, PurpleConnection *gc); -/* void qq_process_recv_group_im_been_approved(guint8 *data, guint8 **cursor, gint len, - * guint32 id, PurpleConnection *gc); */ -void qq_process_recv_group_im_been_approved(guint8 *data, gint len, guint32 id, PurpleConnection *gc); +void qq_process_room_msg_been_approved(guint8 *data, gint len, guint32 id, PurpleConnection *gc); -/* void qq_process_recv_group_im_been_removed(guint8 *data, guint8 **cursor, gint len, - * guint32 id, PurpleConnection *gc); */ -void qq_process_recv_group_im_been_removed(guint8 *data, gint len, guint32 id, PurpleConnection *gc); +void qq_process_room_msg_been_removed(guint8 *data, gint len, guint32 id, PurpleConnection *gc); -/* void qq_process_recv_group_im_been_added(guint8 *data, guint8 **cursor, gint len, - * guint32 id, PurpleConnection *gc); */ -void qq_process_recv_group_im_been_added(guint8 *data, gint len, guint32 id, PurpleConnection *gc); +void qq_process_room_msg_been_added(guint8 *data, gint len, guint32 id, PurpleConnection *gc); #endif
--- a/libpurple/protocols/qq/group_info.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_info.c Tue Sep 16 20:01:24 2008 +0000 @@ -41,16 +41,16 @@ * this interval determines if their member info is outdated */ #define QQ_GROUP_CHAT_REFRESH_NICKNAME_INTERNAL 180 -static gboolean _is_group_member_need_update_info(qq_buddy *member) +static gboolean check_update_interval(qq_buddy *member) { g_return_val_if_fail(member != NULL, FALSE); return (member->nickname == NULL) || - (time(NULL) - member->last_refresh) > QQ_GROUP_CHAT_REFRESH_NICKNAME_INTERNAL; + (time(NULL) - member->last_update) > QQ_GROUP_CHAT_REFRESH_NICKNAME_INTERNAL; } /* this is done when we receive the reply to get_online_members sub_cmd * all member are set offline, and then only those in reply packets are online */ -static void _qq_group_set_members_all_offline(qq_group *group) +static void set_all_offline(qq_group *group) { GList *list; qq_buddy *member; @@ -59,65 +59,29 @@ list = group->members; while (list != NULL) { member = (qq_buddy *) list->data; - member->status = QQ_BUDDY_ONLINE_OFFLINE; + member->status = QQ_BUDDY_CHANGE_TO_OFFLINE; list = list->next; } } -/* send packet to get online group member, called by keep_alive */ -void qq_send_cmd_group_all_get_online_members(PurpleConnection *gc) -{ - qq_data *qd; - qq_group *group; - GList *list; - - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - qd = (qq_data *) gc->proto_data; - - list = qd->groups; - while (list != NULL) { - group = (qq_group *) list->data; - if (group->my_status == QQ_GROUP_MEMBER_STATUS_IS_MEMBER || - group->my_status == QQ_GROUP_MEMBER_STATUS_IS_ADMIN) - /* no need to get info time and time again, online members enough */ - qq_send_cmd_group_get_online_members(gc, group); - - list = list->next; - } -} - -void qq_send_cmd_group_get_online_members(PurpleConnection *gc, qq_group *group) -{ - g_return_if_fail(group != NULL); - - /* only get online members when conversation window is on */ - if (NULL == purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT,group->group_name_utf8, purple_connection_get_account(gc))) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Conversation \"%s\" is not open, ignore to get online members\n", group->group_name_utf8); - return; - } - - qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_ONLINES, group->id); -} - /* send packet to get info for each group member */ -void qq_send_cmd_group_get_members_info(PurpleConnection *gc, qq_group *group) +gint qq_request_room_get_buddies(PurpleConnection *gc, qq_group *group, gint update_class) { guint8 *raw_data; gint bytes, num; GList *list; qq_buddy *member; - g_return_if_fail(group != NULL); + g_return_val_if_fail(group != NULL, 0); for (num = 0, list = group->members; list != NULL; list = list->next) { member = (qq_buddy *) list->data; - if (_is_group_member_need_update_info(member)) + if (check_update_interval(member)) num++; } if (num <= 0) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "No group member info needs to be updated now.\n"); - return; + purple_debug_info("QQ", "No group member info needs to be updated now.\n"); + return 0; } raw_data = g_newa(guint8, 4 * num); @@ -127,12 +91,14 @@ list = group->members; while (list != NULL) { member = (qq_buddy *) list->data; - if (_is_group_member_need_update_info(member)) + if (check_update_interval(member)) bytes += qq_put32(raw_data + bytes, member->uid); list = list->next; } - qq_send_room_cmd(gc, QQ_ROOM_CMD_GET_MEMBER_INFO, group->id, raw_data, bytes); + qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_BUDDIES, group->id, raw_data, bytes, + update_class, 0); + return num; } void qq_process_room_cmd_get_info(guint8 *data, gint data_len, PurpleConnection *gc) @@ -174,8 +140,8 @@ bytes += qq_get32(&(group->creator_uid), data + bytes); bytes += qq_get8(&(group->auth_type), data + bytes); bytes += qq_get32(&unknown4, data + bytes); /* oldCategory */ - bytes += qq_get16(&unknown, data + bytes); - bytes += qq_get32(&(group->group_category), data + bytes); + bytes += qq_get16(&unknown, data + bytes); + bytes += qq_get32(&(group->category), data + bytes); bytes += qq_get16(&max_members, data + bytes); bytes += qq_get8(&unknown1, data + bytes); /* the following, while Eva: @@ -183,17 +149,17 @@ * 2(qunNoticeLen), qunNoticeLen(qunNoticeContent, 1(qunDescLen), * qunDestLen(qunDestcontent)) */ bytes += qq_get8(&unknown1, data + bytes); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "type=%u creatorid=%u category=%u maxmembers=%u\n", - group->type8, group->creator_uid, group->group_category, max_members); - + purple_debug_info("QQ", "type=%u creatorid=%u category=%u maxmembers=%u\n", + group->type8, group->creator_uid, group->category, max_members); + /* strlen + <str content> */ - bytes += convert_as_pascal_string(data + bytes, &(group->group_name_utf8), QQ_CHARSET_DEFAULT); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "group \"%s\"\n", group->group_name_utf8); + bytes += convert_as_pascal_string(data + bytes, &(group->title_utf8), QQ_CHARSET_DEFAULT); bytes += qq_get16(&unknown, data + bytes); /* 0x0000 */ bytes += convert_as_pascal_string(data + bytes, ¬ice, QQ_CHARSET_DEFAULT); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "notice \"%s\"\n", notice); - bytes += convert_as_pascal_string(data + bytes, &(group->group_desc_utf8), QQ_CHARSET_DEFAULT); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "group_desc \"%s\"\n", group->group_desc_utf8); + bytes += convert_as_pascal_string(data + bytes, &(group->desc_utf8), QQ_CHARSET_DEFAULT); + + purple_debug_info("QQ", "room [%s] notice [%s] desc [%s] unknow 0x%04X\n", + group->title_utf8, notice, group->desc_utf8, unknown); num = 0; /* now comes the member list separated by 0x00 */ @@ -205,7 +171,7 @@ #if 0 if(organization != 0 || role != 0) { - purple_debug(PURPLE_DEBUG_INFO, "QQ_GRP", "%d, organization=%d, role=%d\n", member_uid, organization, role); + purple_debug_info("QQ_GRP", "%d, organization=%d, role=%d\n", member_uid, organization, role); } #endif @@ -214,30 +180,31 @@ member->role = role; } if(bytes > data_len) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "group_cmd_get_group_info: Dangerous error! maybe protocol changed, notify me!"); } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "group \"%s\" has %d members\n", group->group_name_utf8, num); + purple_debug_info("QQ", "group \"%s\" has %d members\n", group->title_utf8, num); if (group->creator_uid == qd->uid) - group->my_status = QQ_GROUP_MEMBER_STATUS_IS_ADMIN; - - qq_group_refresh(gc, group); - - purple_conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, - group->group_name_utf8, purple_connection_get_account(gc)); - if(NULL == purple_conv) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Conversation \"%s\" is not open, do not set topic\n", group->group_name_utf8); - return; - } + group->my_role = QQ_ROOM_ROLE_ADMIN; /* filter \r\n in notice */ qq_filter_str(notice); group->notice_utf8 = strdup(notice); g_free(notice); - + + qq_group_refresh(gc, group); + + purple_conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, + group->title_utf8, purple_connection_get_account(gc)); + if(NULL == purple_conv) { + purple_debug_warning("QQ", + "Conversation \"%s\" is not open, do not set topic\n", group->title_utf8); + return; + } + + purple_debug_info("QQ", "Set chat topic to %s\n", group->notice_utf8); purple_conv_chat_set_topic(PURPLE_CONV_CHAT(purple_conv), NULL, group->notice_utf8); } @@ -252,7 +219,7 @@ g_return_if_fail(data != NULL && len > 0); if (len <= 3) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Invalid group online member reply, discard it!\n"); + purple_debug_error("QQ", "Invalid group online member reply, discard it!\n"); return; } @@ -263,13 +230,12 @@ group = qq_room_search_id(gc, id); if (group == NULL) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "We have no group info for internal id [%d]\n", id); + purple_debug_error("QQ", "We have no group info for internal id [%d]\n", id); return; } /* set all offline first, then update those online */ - _qq_group_set_members_all_offline(group); + set_all_offline(group); num = 0; while (bytes < len) { bytes += qq_get32(&member_uid, data + bytes); @@ -279,15 +245,15 @@ member->status = QQ_BUDDY_ONLINE_NORMAL; } if(bytes > len) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "group_cmd_get_online_members: Dangerous error! maybe protocol changed, notify developers!"); + purple_debug_error("QQ", + "group_cmd_get_online_members: Dangerous error! maybe protocol changed, notify developers!"); } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Group \"%s\" has %d online members\n", group->group_name_utf8, num); + purple_debug_info("QQ", "Group \"%s\" has %d online members\n", group->title_utf8, num); } /* process the reply to get_members_info packet */ -void qq_process_room_cmd_get_members(guint8 *data, gint len, PurpleConnection *gc) +void qq_process_room_cmd_get_buddies(guint8 *data, gint len, PurpleConnection *gc) { gint bytes; gint num; @@ -300,7 +266,7 @@ g_return_if_fail(data != NULL && len > 0); #if 0 - qq_show_packet("qq_process_room_cmd_get_members", data, len); + qq_show_packet("qq_process_room_cmd_get_buddies", data, len); #endif bytes = 0; @@ -331,19 +297,19 @@ qq_filter_str(nick); member->nickname = g_strdup(nick); g_free(nick); - + #if 0 - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "member [%09d]: ext_flag=0x%02x, comm_flag=0x%02x, nick=%s\n", member_uid, member->ext_flag, member->comm_flag, member->nickname); #endif - member->last_refresh = time(NULL); + member->last_update = time(NULL); } if (bytes > len) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "group_cmd_get_members_info: Dangerous error! maybe protocol changed, notify developers!"); } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Group \"%s\" obtained %d member info\n", group->group_name_utf8, num); + purple_debug_info("QQ", "Group \"%s\" obtained %d member info\n", group->title_utf8, num); }
--- a/libpurple/protocols/qq/group_info.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_info.h Tue Sep 16 20:01:24 2008 +0000 @@ -29,12 +29,9 @@ #include "connection.h" #include "group.h" -void qq_send_cmd_group_get_online_members(PurpleConnection *gc, qq_group *group); -void qq_send_cmd_group_all_get_online_members(PurpleConnection *gc); - -void qq_send_cmd_group_get_members_info(PurpleConnection *gc, qq_group *group); +gint qq_request_room_get_buddies(PurpleConnection *gc, qq_group *group, gint update_class); void qq_process_room_cmd_get_info(guint8 *data, gint len, PurpleConnection *gc); void qq_process_room_cmd_get_onlines(guint8 *data, gint len, PurpleConnection *gc); -void qq_process_room_cmd_get_members(guint8 *data, gint len, PurpleConnection *gc); +void qq_process_room_cmd_get_buddies(guint8 *data, gint len, PurpleConnection *gc); #endif
--- a/libpurple/protocols/qq/group_internal.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_internal.c Tue Sep 16 20:01:24 2008 +0000 @@ -31,49 +31,49 @@ #include "group_internal.h" #include "utils.h" -static gchar *_qq_group_set_my_status_desc(qq_group *group) +static gchar *get_role_desc(qq_group *group) { - const char *status_desc; + const char *role_desc; g_return_val_if_fail(group != NULL, g_strdup("")); - switch (group->my_status) { - case QQ_GROUP_MEMBER_STATUS_NOT_MEMBER: - status_desc = _("I am not a member"); + switch (group->my_role) { + case QQ_ROOM_ROLE_NO: + role_desc = _("I am not a member"); break; - case QQ_GROUP_MEMBER_STATUS_IS_MEMBER: - status_desc = _("I am a member"); + case QQ_ROOM_ROLE_YES: + role_desc = _("I am a member"); break; - case QQ_GROUP_MEMBER_STATUS_APPLYING: - status_desc = _("I am applying to join"); + case QQ_ROOM_ROLE_REQUESTING: + role_desc = _("I am requesting"); break; - case QQ_GROUP_MEMBER_STATUS_IS_ADMIN: - status_desc = _("I am the admin"); + case QQ_ROOM_ROLE_ADMIN: + role_desc = _("I am the admin"); break; default: - status_desc = _("Unknown status"); + role_desc = _("Unknown status"); } - return g_strdup(status_desc); + return g_strdup(role_desc); } -static void _qq_group_add_to_blist(PurpleConnection *gc, qq_group *group) +static void add_room_to_blist(PurpleConnection *gc, qq_group *group) { GHashTable *components; PurpleGroup *g; PurpleChat *chat; components = qq_group_to_hashtable(group); - chat = purple_chat_new(purple_connection_get_account(gc), group->group_name_utf8, components); + chat = purple_chat_new(purple_connection_get_account(gc), group->title_utf8, components); g = qq_get_purple_group(PURPLE_GROUP_QQ_QUN); purple_blist_add_chat(chat, g, NULL); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "You have added group \"%s\" to blist locally\n", group->group_name_utf8); + purple_debug_info("QQ", "You have added group \"%s\" to blist locally\n", group->title_utf8); } /* Create a dummy qq_group, which includes only internal_id, ext_id, - * and potentially group_name_utf8, in case we need to call group_conv_show_window + * and potentially title_utf8, in case we need to call group_conv_show_window * right after creation. All other attributes are set to empty. * We need to send a get_group_info to the QQ server to update it right away */ qq_group *qq_group_create_internal_record(PurpleConnection *gc, - guint32 internal_id, guint32 ext_id, gchar *group_name_utf8) + guint32 internal_id, guint32 ext_id, gchar *title_utf8) { qq_group *group; qq_data *qd; @@ -82,21 +82,21 @@ qd = (qq_data *) gc->proto_data; group = g_new0(qq_group, 1); - group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER; - group->my_status_desc = _qq_group_set_my_status_desc(group); + group->my_role = QQ_ROOM_ROLE_NO; + group->my_role_desc = get_role_desc(group); group->id = internal_id; group->ext_id = ext_id; group->type8 = 0x01; /* assume permanent Qun */ group->creator_uid = 10000; /* assume by QQ admin */ - group->group_category = 0x01; + group->category = 0x01; group->auth_type = 0x02; /* assume need auth */ - group->group_name_utf8 = g_strdup(group_name_utf8 == NULL ? "" : group_name_utf8); - group->group_desc_utf8 = g_strdup(""); + group->title_utf8 = g_strdup(title_utf8 == NULL ? "" : title_utf8); + group->desc_utf8 = g_strdup(""); group->notice_utf8 = g_strdup(""); group->members = NULL; qd->groups = g_list_append(qd->groups, group); - _qq_group_add_to_blist(gc, group); + add_room_to_blist(gc, group); return group; } @@ -124,26 +124,26 @@ { GHashTable *components; components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_MEMBER_STATUS), g_strdup_printf("%d", group->my_status)); - group->my_status_desc = _qq_group_set_my_status_desc(group); + g_hash_table_insert(components, g_strdup(QQ_ROOM_KEY_ROLE), g_strdup_printf("%d", group->my_role)); + group->my_role_desc = get_role_desc(group); g_hash_table_insert(components, - g_strdup(QQ_GROUP_KEY_INTERNAL_ID), g_strdup_printf("%d", group->id)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_EXTERNAL_ID), + g_strdup(QQ_ROOM_KEY_INTERNAL_ID), g_strdup_printf("%d", group->id)); + g_hash_table_insert(components, g_strdup(QQ_ROOM_KEY_EXTERNAL_ID), g_strdup_printf("%d", group->ext_id)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_TYPE), g_strdup_printf("%d", group->type8)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_CREATOR_UID), g_strdup_printf("%d", group->creator_uid)); + g_hash_table_insert(components, g_strdup(QQ_ROOM_KEY_TYPE), g_strdup_printf("%d", group->type8)); + g_hash_table_insert(components, g_strdup(QQ_ROOM_KEY_CREATOR_UID), g_strdup_printf("%d", group->creator_uid)); g_hash_table_insert(components, - g_strdup(QQ_GROUP_KEY_GROUP_CATEGORY), g_strdup_printf("%d", group->group_category)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_AUTH_TYPE), g_strdup_printf("%d", group->auth_type)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_MEMBER_STATUS_DESC), g_strdup(group->my_status_desc)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_GROUP_NAME_UTF8), g_strdup(group->group_name_utf8)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_GROUP_DESC_UTF8), g_strdup(group->group_desc_utf8)); + g_strdup(QQ_ROOM_KEY_CATEGORY), g_strdup_printf("%d", group->category)); + g_hash_table_insert(components, g_strdup(QQ_ROOM_KEY_AUTH_TYPE), g_strdup_printf("%d", group->auth_type)); + g_hash_table_insert(components, g_strdup(QQ_ROOM_KEY_ROLE_DESC), g_strdup(group->my_role_desc)); + g_hash_table_insert(components, g_strdup(QQ_ROOM_KEY_TITLE_UTF8), g_strdup(group->title_utf8)); + g_hash_table_insert(components, g_strdup(QQ_ROOM_KEY_DESC_UTF8), g_strdup(group->desc_utf8)); return components; } /* create a qq_group from hashtable */ -qq_group *qq_group_from_hashtable(PurpleConnection *gc, GHashTable *data) +qq_group *qq_room_create_by_hashtable(PurpleConnection *gc, GHashTable *data) { qq_data *qd; qq_group *group; @@ -152,25 +152,25 @@ qd = (qq_data *) gc->proto_data; group = g_new0(qq_group, 1); - group->my_status = + group->my_role = qq_string_to_dec_value (NULL == g_hash_table_lookup(data, - QQ_GROUP_KEY_MEMBER_STATUS) ? - g_strdup_printf("%d", QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) : - g_hash_table_lookup(data, QQ_GROUP_KEY_MEMBER_STATUS)); - group->id = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_INTERNAL_ID)); - group->ext_id = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_EXTERNAL_ID)); - group->type8 = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_TYPE)); - group->creator_uid = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_CREATOR_UID)); - group->group_category = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_CATEGORY)); - group->auth_type = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_AUTH_TYPE)); - group->group_name_utf8 = g_strdup(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_NAME_UTF8)); - group->group_desc_utf8 = g_strdup(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_DESC_UTF8)); - group->my_status_desc = _qq_group_set_my_status_desc(group); + QQ_ROOM_KEY_ROLE) ? + g_strdup_printf("%d", QQ_ROOM_ROLE_NO) : + g_hash_table_lookup(data, QQ_ROOM_KEY_ROLE)); + group->id = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_ROOM_KEY_INTERNAL_ID)); + group->ext_id = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_ROOM_KEY_EXTERNAL_ID)); + group->type8 = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_ROOM_KEY_TYPE)); + group->creator_uid = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_ROOM_KEY_CREATOR_UID)); + group->category = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_ROOM_KEY_CATEGORY)); + group->auth_type = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_ROOM_KEY_AUTH_TYPE)); + group->title_utf8 = g_strdup(g_hash_table_lookup(data, QQ_ROOM_KEY_TITLE_UTF8)); + group->desc_utf8 = g_strdup(g_hash_table_lookup(data, QQ_ROOM_KEY_DESC_UTF8)); + group->my_role_desc = get_role_desc(group); + group->is_got_info = FALSE; qd->groups = g_list_append(qd->groups, group); - return group; } @@ -184,48 +184,54 @@ ext_id = g_strdup_printf("%d", group->ext_id); chat = purple_blist_find_chat(purple_connection_get_account(gc), ext_id); g_free(ext_id); - if (chat == NULL && group->my_status != QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) { - _qq_group_add_to_blist(gc, group); - } else if (chat != NULL) { /* we have a local record, update its info */ - /* if there is group_name_utf8, we update the group name */ - if (group->group_name_utf8 != NULL && strlen(group->group_name_utf8) > 0) - purple_blist_alias_chat(chat, group->group_name_utf8); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_MEMBER_STATUS), g_strdup_printf("%d", group->my_status)); - group->my_status_desc = _qq_group_set_my_status_desc(group); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_MEMBER_STATUS_DESC), g_strdup(group->my_status_desc)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_INTERNAL_ID), - g_strdup_printf("%d", group->id)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_EXTERNAL_ID), - g_strdup_printf("%d", group->ext_id)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_TYPE), g_strdup_printf("%d", group->type8)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_CREATOR_UID), g_strdup_printf("%d", group->creator_uid)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_GROUP_CATEGORY), - g_strdup_printf("%d", group->group_category)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_AUTH_TYPE), g_strdup_printf("%d", group->auth_type)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_GROUP_NAME_UTF8), g_strdup(group->group_name_utf8)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_GROUP_DESC_UTF8), g_strdup(group->group_desc_utf8)); + if (chat == NULL && group->my_role != QQ_ROOM_ROLE_NO) { + add_room_to_blist(gc, group); + return; + } + + if (chat == NULL) { + return; } + + /* we have a local record, update its info */ + /* if there is title_utf8, we update the group name */ + if (group->title_utf8 != NULL && strlen(group->title_utf8) > 0) + purple_blist_alias_chat(chat, group->title_utf8); + g_hash_table_replace(chat->components, + g_strdup(QQ_ROOM_KEY_ROLE), g_strdup_printf("%d", group->my_role)); + group->my_role_desc = get_role_desc(group); + g_hash_table_replace(chat->components, + g_strdup(QQ_ROOM_KEY_ROLE_DESC), g_strdup(group->my_role_desc)); + g_hash_table_replace(chat->components, + g_strdup(QQ_ROOM_KEY_INTERNAL_ID), + g_strdup_printf("%d", group->id)); + g_hash_table_replace(chat->components, + g_strdup(QQ_ROOM_KEY_EXTERNAL_ID), + g_strdup_printf("%d", group->ext_id)); + g_hash_table_replace(chat->components, + g_strdup(QQ_ROOM_KEY_TYPE), g_strdup_printf("%d", group->type8)); + g_hash_table_replace(chat->components, + g_strdup(QQ_ROOM_KEY_CREATOR_UID), g_strdup_printf("%d", group->creator_uid)); + g_hash_table_replace(chat->components, + g_strdup(QQ_ROOM_KEY_CATEGORY), + g_strdup_printf("%d", group->category)); + g_hash_table_replace(chat->components, + g_strdup(QQ_ROOM_KEY_AUTH_TYPE), g_strdup_printf("%d", group->auth_type)); + g_hash_table_replace(chat->components, + g_strdup(QQ_ROOM_KEY_TITLE_UTF8), g_strdup(group->title_utf8)); + g_hash_table_replace(chat->components, + g_strdup(QQ_ROOM_KEY_DESC_UTF8), g_strdup(group->desc_utf8)); } -/* NOTE: If we knew how to convert between an external and internal group id, as the official +/* NOTE: If we knew how to convert between an external and internal group id, as the official * client seems to, the following would be unnecessary. That would be ideal. */ /* Use list to specify if id's alternate id is pending discovery. */ void qq_set_pending_id(GSList **list, guint32 id, gboolean pending) { - if (pending) + if (pending) *list = g_slist_prepend(*list, GINT_TO_POINTER(id)); - else + else *list = g_slist_remove(*list, GINT_TO_POINTER(id)); }
--- a/libpurple/protocols/qq/group_internal.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_internal.h Tue Sep 16 20:01:24 2008 +0000 @@ -28,23 +28,23 @@ #include <glib.h> #include "group.h" -#define QQ_GROUP_KEY_MEMBER_STATUS "my_status_code" -#define QQ_GROUP_KEY_MEMBER_STATUS_DESC "my_status_desc" -#define QQ_GROUP_KEY_INTERNAL_ID "id" -#define QQ_GROUP_KEY_EXTERNAL_ID "ext_id" -#define QQ_GROUP_KEY_TYPE "type" -#define QQ_GROUP_KEY_CREATOR_UID "creator_uid" -#define QQ_GROUP_KEY_GROUP_CATEGORY "category" -#define QQ_GROUP_KEY_AUTH_TYPE "auth_type" -#define QQ_GROUP_KEY_GROUP_NAME_UTF8 "name_utf8" -#define QQ_GROUP_KEY_GROUP_DESC_UTF8 "desc_utf8" +#define QQ_ROOM_KEY_ROLE "my_role" +#define QQ_ROOM_KEY_ROLE_DESC "my_role_desc" +#define QQ_ROOM_KEY_INTERNAL_ID "id" +#define QQ_ROOM_KEY_EXTERNAL_ID "ext_id" +#define QQ_ROOM_KEY_TYPE "type" +#define QQ_ROOM_KEY_CREATOR_UID "creator_uid" +#define QQ_ROOM_KEY_CATEGORY "category" +#define QQ_ROOM_KEY_AUTH_TYPE "auth_type" +#define QQ_ROOM_KEY_TITLE_UTF8 "title_utf8" +#define QQ_ROOM_KEY_DESC_UTF8 "desc_utf8" -qq_group *qq_group_create_internal_record(PurpleConnection *gc, +qq_group *qq_group_create_internal_record(PurpleConnection *gc, guint32 internal_id, guint32 ext_id, gchar *group_name_utf8); void qq_group_delete_internal_record(qq_data *qd, guint32 id); GHashTable *qq_group_to_hashtable(qq_group *group); -qq_group *qq_group_from_hashtable(PurpleConnection *gc, GHashTable *data); +qq_group *qq_room_create_by_hashtable(PurpleConnection *gc, GHashTable *data); void qq_group_refresh(PurpleConnection *gc, qq_group *group);
--- a/libpurple/protocols/qq/group_join.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_join.c Tue Sep 16 20:01:24 2008 +0000 @@ -38,14 +38,17 @@ #include "group_info.h" #include "group_join.h" #include "group_opt.h" +#include "group_conv.h" #include "group_search.h" #include "header_info.h" #include "packet_parse.h" #include "qq_network.h" +#include "qq_process.h" enum { - QQ_GROUP_JOIN_OK = 0x01, - QQ_GROUP_JOIN_NEED_AUTH = 0x02, + QQ_ROOM_JOIN_OK = 0x01, + QQ_ROOM_JOIN_NEED_AUTH = 0x02, + QQ_ROOM_JOIN_DENIED = 0x03, }; static void _qq_group_exit_with_gc_and_id(gc_and_uid *g) @@ -64,24 +67,28 @@ } /* send packet to join a group without auth */ -void qq_send_cmd_group_join_group(PurpleConnection *gc, qq_group *group) +void qq_request_room_join(PurpleConnection *gc, qq_group *group) { g_return_if_fail(group != NULL); - if (group->my_status == QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) { - group->my_status = QQ_GROUP_MEMBER_STATUS_APPLYING; + if (group->my_role == QQ_ROOM_ROLE_NO) { + group->my_role = QQ_ROOM_ROLE_REQUESTING; qq_group_refresh(gc, group); } switch (group->auth_type) { - case QQ_GROUP_AUTH_TYPE_NO_AUTH: - case QQ_GROUP_AUTH_TYPE_NEED_AUTH: + case QQ_ROOM_AUTH_TYPE_NO_AUTH: + case QQ_ROOM_AUTH_TYPE_NEED_AUTH: break; - case QQ_GROUP_AUTH_TYPE_NO_ADD: - purple_notify_warning(gc, NULL, _("This group does not allow others to join"), NULL); - return; + case QQ_ROOM_AUTH_TYPE_NO_ADD: + if (group->my_role == QQ_ROOM_ROLE_NO + && group->my_role == QQ_ROOM_ROLE_REQUESTING) { + purple_notify_warning(gc, NULL, _("The Qun does not allow others to join"), NULL); + return; + } + break; default: - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Unknown group auth type: %d\n", group->auth_type); + purple_debug_error("QQ", "Unknown room auth type: %d\n", group->auth_type); break; } @@ -99,10 +106,10 @@ group = qq_room_search_id(gc, id); if (group == NULL) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Can not find qq_group by internal_id: %d\n", id); + purple_debug_error("QQ", "Can not find qq_group by internal_id: %d\n", id); return; } else { /* everything is OK */ - qq_send_cmd_group_auth(gc, group, QQ_GROUP_AUTH_REQUEST_APPLY, 0, reason_utf8); + qq_send_cmd_group_auth(gc, group, QQ_ROOM_AUTH_REQUEST_APPLY, 0, reason_utf8); } } @@ -112,10 +119,9 @@ gc_and_uid *g; g_return_if_fail(group != NULL); - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "Group (internal id: %d) needs authentication\n", group->id); + purple_debug_info("QQ", "Group (internal id: %d) needs authentication\n", group->id); - msg = g_strdup_printf("Group \"%s\" needs authentication\n", group->group_name_utf8); + msg = g_strdup_printf("Group \"%s\" needs authentication\n", group->title_utf8); g = g_new0(gc_and_uid, 1); g->gc = gc; g->uid = group->id; @@ -125,7 +131,7 @@ _("Send"), G_CALLBACK(_qq_group_join_auth_with_gc_and_id), _("Cancel"), G_CALLBACK(qq_do_nothing_with_gc_and_uid), - purple_connection_get_account(gc), group->group_name_utf8, NULL, + purple_connection_get_account(gc), group->title_utf8, NULL, g); g_free(msg); } @@ -143,8 +149,8 @@ else reason_qq = utf8_to_qq(reason_utf8, QQ_CHARSET_DEFAULT); - if (opt == QQ_GROUP_AUTH_REQUEST_APPLY) { - group->my_status = QQ_GROUP_MEMBER_STATUS_APPLYING; + if (opt == QQ_ROOM_AUTH_REQUEST_APPLY) { + group->my_role = QQ_ROOM_ROLE_REQUESTING; qq_group_refresh(gc, group); uid = 0; } @@ -173,8 +179,7 @@ qd = (qq_data *) gc->proto_data; if (len < 4) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "Invalid exit group reply, expect %d bytes, read %d bytes\n", 4, len); + purple_debug_error("QQ", "Invalid exit group reply, expect %d bytes, read %d bytes\n", 4, len); return; } @@ -189,7 +194,7 @@ purple_blist_remove_chat(chat); qq_group_delete_internal_record(qd, id); } - purple_notify_info(gc, _("QQ Qun Operation"), _("You have successfully left the group"), NULL); + purple_notify_info(gc, _("QQ Qun Operation"), _("Successed:"), _("Remove from Qun")); } /* Process the reply to group_auth subcmd */ @@ -203,16 +208,15 @@ qd = (qq_data *) gc->proto_data; if (len < 4) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "Invalid join group reply, expect %d bytes, read %d bytes\n", 4, len); + purple_debug_error("QQ", + "Invalid join room reply, expect %d bytes, read %d bytes\n", 4, len); return; } bytes = 0; bytes += qq_get32(&id, data + bytes); g_return_if_fail(id > 0); - purple_notify_info(gc, _("QQ Group Auth"), - _("Your authorization request has been accepted by the QQ server"), NULL); + purple_notify_info(gc, _("QQ Qun Operation"), _("Successed:"), _("Join to Qun")); } /* process group cmd reply "join group" */ @@ -222,15 +226,16 @@ guint32 id; guint8 reply; qq_group *group; + gchar *msg; g_return_if_fail(data != NULL && len > 0); if (len < 5) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "Invalid join group reply, expect %d bytes, read %d bytes\n", 5, len); return; } - + bytes = 0; bytes += qq_get32(&id, data + bytes); bytes += qq_get8(&reply, data + bytes); @@ -240,26 +245,32 @@ /* need to check if group is NULL or not. */ g_return_if_fail(group != NULL); switch (reply) { - case QQ_GROUP_JOIN_OK: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed joining group \"%s\"\n", group->group_name_utf8); - group->my_status = QQ_GROUP_MEMBER_STATUS_IS_MEMBER; + case QQ_ROOM_JOIN_OK: + purple_debug_info("QQ", "Successed in joining group \"%s\"\n", group->title_utf8); + group->my_role = QQ_ROOM_ROLE_YES; qq_group_refresh(gc, group); /* this must be shown before getting online members */ - qq_group_conv_show_window(gc, group); - qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_INFO, group->id); + qq_room_conv_create(gc, group); break; - case QQ_GROUP_JOIN_NEED_AUTH: - purple_debug(PURPLE_DEBUG_INFO, "QQ", + case QQ_ROOM_JOIN_NEED_AUTH: + purple_debug_info("QQ", "Fail joining group [%d] %s, needs authentication\n", - group->ext_id, group->group_name_utf8); - group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER; + group->ext_id, group->title_utf8); + group->my_role = QQ_ROOM_ROLE_NO; qq_group_refresh(gc, group); _qq_group_join_auth(gc, group); break; + case QQ_ROOM_JOIN_DENIED: + msg = g_strdup_printf(_("Qun %d denied to join"), group->ext_id); + purple_notify_info(gc, _("QQ Qun Operation"), _("Failed:"), msg); + g_free(msg); + break; default: - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "Error joining group [%d] %s, unknown reply: 0x%02x\n", - group->ext_id, group->group_name_utf8, reply); + purple_debug_info("QQ", + "Failed joining group [%d] %s, unknown reply: 0x%02x\n", + group->ext_id, group->title_utf8, reply); + + purple_notify_info(gc, _("QQ Qun Operation"), _("Failed:"), _("Join Qun, Unknow Reply")); } } @@ -274,7 +285,7 @@ g_return_if_fail(data != NULL); qd = (qq_data *) gc->proto_data; - ext_id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_EXTERNAL_ID); + ext_id_ptr = g_hash_table_lookup(data, QQ_ROOM_KEY_EXTERNAL_ID); g_return_if_fail(ext_id_ptr != NULL); errno = 0; ext_id = strtol(ext_id_ptr, NULL, 10); @@ -286,7 +297,7 @@ group = qq_room_search_ext_id(gc, ext_id); if (group) { - qq_send_cmd_group_join_group(gc, group); + qq_request_room_join(gc, group); } else { qq_set_pending_id(&qd->joining_groups, ext_id, TRUE); qq_send_cmd_group_search_group(gc, ext_id); @@ -301,7 +312,7 @@ g_return_if_fail(data != NULL); - id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_INTERNAL_ID); + id_ptr = g_hash_table_lookup(data, QQ_ROOM_KEY_INTERNAL_ID); id = strtol(id_ptr, NULL, 10); g_return_if_fail(id > 0); @@ -312,8 +323,7 @@ purple_request_action(gc, _("QQ Qun Operation"), _("Are you sure you want to leave this Qun?"), - _ - ("Note, if you are the creator, \nthis operation will eventually remove this Qun."), + _("Note, if you are the creator, \nthis operation will eventually remove this Qun."), 1, purple_connection_get_account(gc), NULL, NULL, g, 2, _("Cancel"),
--- a/libpurple/protocols/qq/group_join.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_join.h Tue Sep 16 20:01:24 2008 +0000 @@ -30,20 +30,20 @@ #include "group.h" enum { - QQ_GROUP_AUTH_TYPE_NO_AUTH = 0x01, - QQ_GROUP_AUTH_TYPE_NEED_AUTH = 0x02, - QQ_GROUP_AUTH_TYPE_NO_ADD = 0x03 + QQ_ROOM_AUTH_TYPE_NO_AUTH = 0x01, + QQ_ROOM_AUTH_TYPE_NEED_AUTH = 0x02, + QQ_ROOM_AUTH_TYPE_NO_ADD = 0x03 }; enum { - QQ_GROUP_AUTH_REQUEST_APPLY = 0x01, - QQ_GROUP_AUTH_REQUEST_APPROVE = 0x02, - QQ_GROUP_AUTH_REQUEST_REJECT = 0x03 + QQ_ROOM_AUTH_REQUEST_APPLY = 0x01, + QQ_ROOM_AUTH_REQUEST_APPROVE = 0x02, + QQ_ROOM_AUTH_REQUEST_REJECT = 0x03 }; void qq_send_cmd_group_auth(PurpleConnection *gc, qq_group *group, guint8 opt, guint32 uid, const gchar *reason_utf8); void qq_group_join(PurpleConnection *gc, GHashTable *data); -void qq_send_cmd_group_join_group(PurpleConnection *gc, qq_group *group); +void qq_request_room_join(PurpleConnection *gc, qq_group *group); void qq_group_exit(PurpleConnection *gc, GHashTable *data); void qq_process_group_cmd_exit_group(guint8 *data, gint len, PurpleConnection *gc); void qq_process_group_cmd_join_group_auth(guint8 *data, gint len, PurpleConnection *gc);
--- a/libpurple/protocols/qq/group_opt.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_opt.c Tue Sep 16 20:01:24 2008 +0000 @@ -38,6 +38,7 @@ #include "header_info.h" #include "packet_parse.h" #include "qq_network.h" +#include "qq_process.h" #include "utils.h" static int _compare_guint32(const void *a, @@ -67,7 +68,7 @@ } data_len = 6 + count * 4; data = g_newa(guint8, data_len); - + bytes = 0; bytes += qq_put8(data + bytes, operation); for (i = 0; i < count; i++) @@ -88,7 +89,7 @@ g_return_if_fail(g != NULL && g->gc != NULL && g->id > 0 && g->member > 0); group = qq_room_search_id(g->gc, g->id); g_return_if_fail(group != NULL); - qq_send_cmd_group_auth(g->gc, group, QQ_GROUP_AUTH_REQUEST_REJECT, g->member, msg_utf8); + qq_send_cmd_group_auth(g->gc, group, QQ_ROOM_AUTH_REQUEST_REJECT, g->member, msg_utf8); g_free(g); } @@ -111,11 +112,11 @@ g_return_if_fail(g != NULL && g->gc != NULL && g->member > 0); msg1 = g_strdup_printf(_("You rejected %d's request"), g->member); - msg2 = g_strdup(_("Enter your reason:")); + msg2 = g_strdup(_("Message:")); nombre = uid_to_purple_name(g->member); purple_request_input(g->gc, /* title */ NULL, msg1, msg2, - _("Sorry, you are not my type..."), /* multiline */ TRUE, /* masked */ FALSE, + _("Sorry, you are not my style..."), /* multiline */ TRUE, /* masked */ FALSE, /* hint */ NULL, _("Send"), G_CALLBACK(_qq_group_reject_application_real), _("Cancel"), G_CALLBACK(_qq_group_do_nothing_with_struct), @@ -133,7 +134,7 @@ g_return_if_fail(g != NULL && g->gc != NULL && g->id > 0 && g->member > 0); group = qq_room_search_id(g->gc, g->id); g_return_if_fail(group != NULL); - qq_send_cmd_group_auth(g->gc, group, QQ_GROUP_AUTH_REQUEST_APPROVE, g->member, ""); + qq_send_cmd_group_auth(g->gc, group, QQ_ROOM_AUTH_REQUEST_APPROVE, g->member, ""); qq_group_find_or_add_member(g->gc, group, g->member); g_free(g); } @@ -189,9 +190,9 @@ qq_group_find_or_add_member(gc, group, add_members[i]); if (del > 0) - _qq_group_member_opt(gc, group, QQ_GROUP_MEMBER_DEL, del_members); + _qq_group_member_opt(gc, group, QQ_ROOM_MEMBER_DEL, del_members); if (add > 0) - _qq_group_member_opt(gc, group, QQ_GROUP_MEMBER_ADD, add_members); + _qq_group_member_opt(gc, group, QQ_ROOM_MEMBER_ADD, add_members); } void qq_group_process_modify_members_reply(guint8 *data, gint len, PurpleConnection *gc) @@ -209,9 +210,9 @@ group = qq_room_search_id(gc, id); g_return_if_fail(group != NULL); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in modify members for Qun %d\n", group->ext_id); + purple_debug_info("QQ", "Succeed in modify members for room %d\n", group->ext_id); - purple_notify_info(gc, _("QQ Qun Operation"), _("You have successfully modified Qun member"), NULL); + purple_notify_info(gc, _("QQ Qun Operation"), _("Successed:"), _("Change Qun member")); } void qq_room_change_info(PurpleConnection *gc, qq_group *group) @@ -223,8 +224,8 @@ g_return_if_fail(group != NULL); - group_name = group->group_name_utf8 == NULL ? "" : utf8_to_qq(group->group_name_utf8, QQ_CHARSET_DEFAULT); - group_desc = group->group_desc_utf8 == NULL ? "" : utf8_to_qq(group->group_desc_utf8, QQ_CHARSET_DEFAULT); + group_name = group->title_utf8 == NULL ? "" : utf8_to_qq(group->title_utf8, QQ_CHARSET_DEFAULT); + group_desc = group->desc_utf8 == NULL ? "" : utf8_to_qq(group->desc_utf8, QQ_CHARSET_DEFAULT); notice = group->notice_utf8 == NULL ? "" : utf8_to_qq(group->notice_utf8, QQ_CHARSET_DEFAULT); data_len = 64 + strlen(group_name) + strlen(group_desc) + strlen(notice); @@ -237,7 +238,7 @@ /* 007-008 */ bytes += qq_put16(data + bytes, 0x0000); /* 009-010 */ - bytes += qq_put16(data + bytes, group->group_category); + bytes += qq_put16(data + bytes, group->category); bytes += qq_put8(data + bytes, strlen(group_name)); bytes += qq_putdata(data + bytes, (guint8 *) group_name, strlen(group_name)); @@ -251,7 +252,7 @@ bytes += qq_putdata(data + bytes, (guint8 *) group_desc, strlen(group_desc)); if (bytes > data_len) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "Overflow in qq_room_change_info, max %d bytes, now %d bytes\n", data_len, bytes); return; @@ -274,10 +275,10 @@ group = qq_room_search_id(gc, id); g_return_if_fail(group != NULL); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in modify info for Qun %d\n", group->ext_id); + purple_debug_info("QQ", "Succeed in modify info for Qun %d\n", group->ext_id); qq_group_refresh(gc, group); - purple_notify_info(gc, _("QQ Qun Operation"), _("You have successfully modified Qun information"), NULL); + purple_notify_info(gc, _("QQ Qun Operation"), _("Successed:"), _("Change Qun information")); } /* we create a very simple group first, and then let the user to modify */ @@ -297,9 +298,9 @@ bytes = 0; /* we create the simpleset group, only group name is given */ /* 001 */ - bytes += qq_put8(data + bytes, QQ_GROUP_TYPE_PERMANENT); + bytes += qq_put8(data + bytes, QQ_ROOM_TYPE_PERMANENT); /* 002 */ - bytes += qq_put8(data + bytes, QQ_GROUP_AUTH_TYPE_NEED_AUTH); + bytes += qq_put8(data + bytes, QQ_ROOM_AUTH_TYPE_NEED_AUTH); /* 003-004 */ bytes += qq_put16(data + bytes, 0x0000); /* 005-006 */ @@ -313,7 +314,7 @@ bytes += qq_put32(data + bytes, qd->uid); /* I am member of coz */ if (bytes > data_len) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "Overflow in qq_room_create, max %d bytes, now %d bytes\n", data_len, bytes); return; @@ -352,14 +353,14 @@ g_return_if_fail(id > 0 && ext_id); group = qq_group_create_internal_record(gc, id, ext_id, NULL); - group->my_status = QQ_GROUP_MEMBER_STATUS_IS_ADMIN; + group->my_role = QQ_ROOM_ROLE_ADMIN; group->creator_uid = qd->uid; qq_group_refresh(gc, group); qq_send_room_cmd_only(gc, QQ_ROOM_CMD_ACTIVATE, id); - qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_INFO, id); + qq_update_room(gc, 0, group->id); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in create Qun, external ID %d\n", group->ext_id); + purple_debug_info("QQ", "Succeed in create Qun, external ID %d\n", group->ext_id); g = g_new0(gc_and_uid, 1); g->gc = gc; @@ -368,7 +369,7 @@ purple_request_action(gc, _("QQ Qun Operation"), _("You have successfully created a Qun"), _ - ("Would you like to set up the Qun details now?"), + ("Would you like to set up the detail information now?"), 1, purple_connection_get_account(gc), NULL, NULL, g, 2, @@ -391,7 +392,7 @@ group = qq_room_search_id(gc, id); g_return_if_fail(group != NULL); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in activate Qun %d\n", group->ext_id); + purple_debug_info("QQ", "Succeed in activate Qun %d\n", group->ext_id); } void qq_group_manage_group(PurpleConnection *gc, GHashTable *data) @@ -402,7 +403,7 @@ g_return_if_fail(data != NULL); - id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_INTERNAL_ID); + id_ptr = g_hash_table_lookup(data, QQ_ROOM_KEY_INTERNAL_ID); id = strtol(id_ptr, NULL, 10); g_return_if_fail(id > 0);
--- a/libpurple/protocols/qq/group_opt.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_opt.h Tue Sep 16 20:01:24 2008 +0000 @@ -38,13 +38,13 @@ } group_member_opt; enum { - QQ_GROUP_TYPE_PERMANENT = 0x01, - QQ_GROUP_TYPE_TEMPORARY + QQ_ROOM_TYPE_PERMANENT = 0x01, + QQ_ROOM_TYPE_TEMPORARY }; enum { - QQ_GROUP_MEMBER_ADD = 0x01, - QQ_GROUP_MEMBER_DEL + QQ_ROOM_MEMBER_ADD = 0x01, + QQ_ROOM_MEMBER_DEL }; void qq_group_modify_members(PurpleConnection *gc, qq_group *group, guint32 *new_members);
--- a/libpurple/protocols/qq/group_search.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/group_search.c Tue Sep 16 20:01:24 2008 +0000 @@ -38,8 +38,8 @@ #include "qq_network.h" enum { - QQ_GROUP_SEARCH_TYPE_BY_ID = 0x01, - QQ_GROUP_SEARCH_TYPE_DEMO = 0x02 + QQ_ROOM_SEARCH_TYPE_BY_ID = 0x01, + QQ_ROOM_SEARCH_TYPE_DEMO = 0x02 }; /* send packet to search for qq_group */ @@ -49,7 +49,7 @@ gint bytes = 0; guint8 type; - type = (ext_id == 0x00000000) ? QQ_GROUP_SEARCH_TYPE_DEMO : QQ_GROUP_SEARCH_TYPE_BY_ID; + type = (ext_id == 0x00000000) ? QQ_ROOM_SEARCH_TYPE_DEMO : QQ_ROOM_SEARCH_TYPE_BY_ID; bytes = 0; bytes += qq_put8(raw_data + bytes, type); @@ -63,21 +63,21 @@ PurpleRoomlistRoom *room; gchar field[11]; - room = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM, group->group_name_utf8, NULL); + room = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM, group->title_utf8, NULL); g_snprintf(field, sizeof(field), "%d", group->ext_id); purple_roomlist_room_add_field(qd->roomlist, room, field); g_snprintf(field, sizeof(field), "%d", group->creator_uid); purple_roomlist_room_add_field(qd->roomlist, room, field); - purple_roomlist_room_add_field(qd->roomlist, room, group->group_desc_utf8); + purple_roomlist_room_add_field(qd->roomlist, room, group->desc_utf8); g_snprintf(field, sizeof(field), "%d", group->id); purple_roomlist_room_add_field(qd->roomlist, room, field); g_snprintf(field, sizeof(field), "%d", group->type8); purple_roomlist_room_add_field(qd->roomlist, room, field); g_snprintf(field, sizeof(field), "%d", group->auth_type); purple_roomlist_room_add_field(qd->roomlist, room, field); - g_snprintf(field, sizeof(field), "%d", group->group_category); + g_snprintf(field, sizeof(field), "%d", group->category); purple_roomlist_room_add_field(qd->roomlist, room, field); - purple_roomlist_room_add_field(qd->roomlist, room, group->group_name_utf8); + purple_roomlist_room_add_field(qd->roomlist, room, group->title_utf8); purple_roomlist_room_add(qd->roomlist, room); purple_roomlist_set_in_progress(qd->roomlist, FALSE); @@ -109,14 +109,14 @@ bytes += qq_get16(&(unknown), data + bytes); bytes += qq_get16(&(unknown), data + bytes); bytes += qq_get16(&(unknown), data + bytes); - bytes += qq_get32(&(group.group_category), data + bytes); - bytes += convert_as_pascal_string(data + bytes, &(group.group_name_utf8), QQ_CHARSET_DEFAULT); + bytes += qq_get32(&(group.category), data + bytes); + bytes += convert_as_pascal_string(data + bytes, &(group.title_utf8), QQ_CHARSET_DEFAULT); bytes += qq_get16(&(unknown), data + bytes); bytes += qq_get8(&(group.auth_type), data + bytes); - bytes += convert_as_pascal_string(data + bytes, &(group.group_desc_utf8), QQ_CHARSET_DEFAULT); + bytes += convert_as_pascal_string(data + bytes, &(group.desc_utf8), QQ_CHARSET_DEFAULT); /* end of one qq_group */ if(bytes != len) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "group_cmd_search_group: Dangerous error! maybe protocol changed, notify developers!"); } @@ -124,9 +124,9 @@ if (pending_id != NULL) { qq_set_pending_id(&qd->joining_groups, group.ext_id, FALSE); if (qq_room_search_id(gc, group.id) == NULL) - qq_group_create_internal_record(gc, - group.id, group.ext_id, group.group_name_utf8); - qq_send_cmd_group_join_group(gc, &group); + qq_group_create_internal_record(gc, + group.id, group.ext_id, group.title_utf8); + qq_request_room_join(gc, &group); } else { _qq_setup_roomlist(qd, &group); }
--- a/libpurple/protocols/qq/header_info.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/header_info.c Tue Sep 16 20:01:24 2008 +0000 @@ -122,7 +122,7 @@ case QQ_SERVER_0100: return "QQ Server 0100"; default: - return "Unknown"; + return "Unknown Version"; } } @@ -138,16 +138,16 @@ return "QQ_CMD_UPDATE_INFO"; case QQ_CMD_SEARCH_USER: return "QQ_CMD_SEARCH_USER"; - case QQ_CMD_GET_USER_INFO: - return "QQ_CMD_GET_USER_INFO"; + case QQ_CMD_GET_BUDDY_INFO: + return "QQ_CMD_GET_BUDDY_INFO"; case QQ_CMD_ADD_BUDDY_WO_AUTH: return "QQ_CMD_ADD_BUDDY_WO_AUTH"; case QQ_CMD_DEL_BUDDY: return "QQ_CMD_DEL_BUDDY"; case QQ_CMD_BUDDY_AUTH: return "QQ_CMD_BUDDY_AUTH"; - case QQ_CMD_CHANGE_ONLINE_STATUS: - return "QQ_CMD_CHANGE_ONLINE_STATUS"; + case QQ_CMD_CHANGE_STATUS: + return "QQ_CMD_CHANGE_STATUS"; case QQ_CMD_ACK_SYS_MSG: return "QQ_CMD_ACK_SYS_MSG"; case QQ_CMD_SEND_IM: @@ -172,10 +172,10 @@ return "QQ_CMD_TOKEN"; case QQ_CMD_RECV_MSG_SYS: return "QQ_CMD_RECV_MSG_SYS"; - case QQ_CMD_RECV_MSG_BUDDY_CHANGE_STATUS: - return "QQ_CMD_RECV_MSG_BUDDY_CHANGE_STATUS"; + case QQ_CMD_BUDDY_CHANGE_STATUS: + return "QQ_CMD_BUDDY_CHANGE_STATUS"; default: - return "Unknown"; + return "Unknown CMD"; } } @@ -204,8 +204,8 @@ return "QQ_ROOM_CMD_SEND_MSG"; case QQ_ROOM_CMD_GET_ONLINES: return "QQ_ROOM_CMD_GET_ONLINES"; - case QQ_ROOM_CMD_GET_MEMBER_INFO: - return "QQ_ROOM_CMD_GET_MEMBER_INFO"; + case QQ_ROOM_CMD_GET_BUDDIES: + return "QQ_ROOM_CMD_GET_BUDDIES"; case QQ_ROOM_CMD_CHANGE_CARD: return "QQ_ROOM_CMD_CHANGE_CARD"; case QQ_ROOM_CMD_GET_REALNAMES: @@ -231,6 +231,6 @@ case QQ_ROOM_CMD_TEMP_GET_MEMBERS: return "QQ_ROOM_CMD_TEMP_GET_MEMBERS"; default: - return "Unknown QQ Room Command"; + return "Unknown Room Command"; } }
--- a/libpurple/protocols/qq/header_info.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/header_info.h Tue Sep 16 20:01:24 2008 +0000 @@ -43,11 +43,11 @@ QQ_CMD_KEEP_ALIVE = 0x0002, /* get onlines from tencent */ QQ_CMD_UPDATE_INFO = 0x0004, /* update information */ QQ_CMD_SEARCH_USER = 0x0005, /* search for user */ - QQ_CMD_GET_USER_INFO = 0x0006, /* get user information */ + QQ_CMD_GET_BUDDY_INFO = 0x0006, /* get user information */ QQ_CMD_ADD_BUDDY_WO_AUTH = 0x0009, /* add buddy without auth */ QQ_CMD_DEL_BUDDY = 0x000a, /* delete a buddy */ QQ_CMD_BUDDY_AUTH = 0x000b, /* buddy authentication */ - QQ_CMD_CHANGE_ONLINE_STATUS = 0x000d, /* change my online status */ + QQ_CMD_CHANGE_STATUS = 0x000d, /* change my online status */ QQ_CMD_ACK_SYS_MSG = 0x0012, /* ack system message */ QQ_CMD_SEND_IM = 0x0016, /* send message */ QQ_CMD_RECV_IM = 0x0017, /* receive message */ @@ -59,11 +59,11 @@ QQ_CMD_GET_BUDDIES_ONLINE = 0x0027, /* get online buddies list */ QQ_CMD_CELL_PHONE_2 = 0x0029, /* cell phone 2 */ QQ_CMD_ROOM = 0x0030, /* room command */ - QQ_CMD_GET_BUDDIES_AND_ROOMS = 0x0058, + QQ_CMD_GET_BUDDIES_AND_ROOMS = 0x0058, QQ_CMD_GET_LEVEL = 0x005C, /* get level for one or more buddies */ QQ_CMD_TOKEN = 0x0062, /* get login token */ QQ_CMD_RECV_MSG_SYS = 0x0080, /* receive a system message */ - QQ_CMD_RECV_MSG_BUDDY_CHANGE_STATUS = 0x0081, /* buddy change status */ + QQ_CMD_BUDDY_CHANGE_STATUS = 0x0081, /* buddy change status */ }; const gchar *qq_get_cmd_desc(gint type); @@ -80,7 +80,7 @@ QQ_ROOM_CMD_QUIT = 0x09, QQ_ROOM_CMD_SEND_MSG = 0x0a, QQ_ROOM_CMD_GET_ONLINES = 0x0b, - QQ_ROOM_CMD_GET_MEMBER_INFO = 0x0c, + QQ_ROOM_CMD_GET_BUDDIES = 0x0c, QQ_ROOM_CMD_CHANGE_CARD = 0x0E, QQ_ROOM_CMD_GET_REALNAMES = 0x0F,
--- a/libpurple/protocols/qq/im.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/im.c Tue Sep 16 20:01:24 2008 +0000 @@ -209,21 +209,17 @@ return "QQ_RECV_IM_TEMP_QUN_IM"; case QQ_RECV_IM_QUN_IM: return "QQ_RECV_IM_QUN_IM"; + case QQ_RECV_IM_NEWS: + return "QQ_RECV_IM_NEWS"; + case QQ_RECV_IM_FROM_BUDDY_2006: + return "QQ_RECV_IM_FROM_BUDDY_2006"; + case QQ_RECV_IM_FROM_UNKNOWN_2006: + return "QQ_RECV_IM_FROM_UNKNOWN_2006"; default: return "QQ_RECV_IM_UNKNOWN"; } } -/* when we receive a message, - * we send an ACK which is the first 16 bytes of incoming packet */ -static void _qq_send_packet_recv_im_ack(PurpleConnection *gc, guint16 seq, guint8 *data) -{ - qq_data *qd; - - qd = (qq_data *) gc->proto_data; - qq_send_cmd_detail(qd, QQ_CMD_RECV_IM, seq, FALSE, data, 16); -} - /* read the common parts of the normal_im, * returns the bytes read if succeed, or -1 if there is any error */ static gint _qq_normal_im_common_read(guint8 *data, gint len, qq_recv_normal_im_common *common) @@ -240,13 +236,64 @@ bytes += qq_get16(&(common->normal_im_type), data + bytes); if (bytes != 28) { /* read common place fail */ - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Expect 28 bytes, read %d bytes\n", bytes); + purple_debug_error("QQ", "Expect 28 bytes, read %d bytes\n", bytes); return -1; } return bytes; } +static void _qq_process_recv_news(guint8 *data, gint data_len, PurpleConnection *gc) +{ + qq_data *qd = (qq_data *) gc->proto_data; + gint bytes; + guint8 *temp; + guint8 temp_len; + gchar *title, *brief, *url; + gchar *title_utf8; + gchar *content, *content_utf8; + + g_return_if_fail(data != NULL && data_len != 0); + +#if 0 + qq_show_packet("Rcv news", data, data_len); +#endif + + temp = g_newa(guint8, data_len); + bytes = 4; /* ignore unknown 4 bytes */ + + bytes += qq_get8(&temp_len, data + bytes); + g_return_if_fail(bytes + temp_len <= data_len); + bytes += qq_getdata(temp, temp_len, data+bytes); + title = g_strndup((gchar *)temp, temp_len); + + bytes += qq_get8(&temp_len, data + bytes); + g_return_if_fail(bytes + temp_len <= data_len); + bytes += qq_getdata(temp, temp_len, data+bytes); + brief = g_strndup((gchar *)temp, temp_len); + + bytes += qq_get8(&temp_len, data + bytes); + g_return_if_fail(bytes + temp_len <= data_len); + bytes += qq_getdata(temp, temp_len, data+bytes); + url = g_strndup((gchar *)temp, temp_len); + + title_utf8 = qq_to_utf8(title, QQ_CHARSET_DEFAULT); + content = g_strdup_printf(_("%s\n\n%s"), brief, url); + content_utf8 = qq_to_utf8(content, QQ_CHARSET_DEFAULT); + + if (qd->is_show_news) { + purple_notify_info(gc, _("QQ Server News"), title_utf8, content_utf8); + } else { + purple_debug_info("QQ", "QQ Server news:\n%s\n%s", title_utf8, content_utf8); + } + g_free(title); + g_free(title_utf8); + g_free(brief); + g_free(url); + g_free(content); + g_free(content_utf8); +} + /* process received normal text IM */ static void _qq_process_recv_normal_im_text(guint8 *data, gint len, qq_recv_normal_im_common *common, PurpleConnection *gc) { @@ -266,7 +313,7 @@ /* now it is QQ_NORMAL_IM_TEXT */ /* if (*cursor >= (data + len - 1)) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Received normal IM text is empty\n"); + purple_debug_warning("QQ", "Received normal IM text is empty\n"); return; } else */ @@ -313,9 +360,9 @@ } qq_b = (b == NULL) ? NULL : (qq_buddy *) b->proto_data; if (qq_b != NULL) { - qq_b->client_version = common->sender_ver; + qq_b->client_version = common->sender_ver; } - + purple_msg_type = (im_text->msg_type == QQ_IM_AUTO_REPLY) ? PURPLE_MESSAGE_AUTO_RESP : 0; msg_with_purple_smiley = qq_smiley_to_purple(im_text->msg); @@ -350,19 +397,18 @@ bytes = _qq_normal_im_common_read(data, len, common); if (bytes < 0) { - purple_debug (PURPLE_DEBUG_ERROR, "QQ", - "Fail read the common part of normal IM\n"); + purple_debug_error("QQ", "Fail read the common part of normal IM\n"); return; } switch (common->normal_im_type) { case QQ_NORMAL_IM_TEXT: - purple_debug (PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "Normal IM, text type:\n [%d] => [%d], src: %s (%04X)\n", common->sender_uid, common->receiver_uid, qq_get_ver_desc (common->sender_ver), common->sender_ver); if (bytes >= len - 1) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Received normal IM text is empty\n"); + purple_debug_warning("QQ", "Received normal IM text is empty\n"); return; } _qq_process_recv_normal_im_text(data + bytes, len - bytes, common, gc); @@ -382,16 +428,50 @@ case QQ_NORMAL_IM_FILE_NOTIFY: qq_process_recv_file_notify(data + bytes, len - bytes, common->sender_uid, gc); break; + case QQ_NORMAL_IM_FILE_REQUEST_TCP: + /* Check ReceivedFileIM::parseContents in eva*/ + /* some client use this function for detect invisable buddy*/ + purple_debug_warning("QQ", "Normal IM, not support QQ_NORMAL_IM_FILE_REQUEST_TCP\n"); + qq_show_packet ("Not support", data, len); + break; + case QQ_NORMAL_IM_FILE_APPROVE_TCP: + purple_debug_warning("QQ", "Normal IM, not support QQ_NORMAL_IM_FILE_APPROVE_TCP\n"); + qq_show_packet ("Not support", data, len); + break; + case QQ_NORMAL_IM_FILE_REJECT_TCP: + purple_debug_warning("QQ", "Normal IM, not support QQ_NORMAL_IM_FILE_REJECT_TCP\n"); + qq_show_packet ("Not support", data, len); + break; + case QQ_NORMAL_IM_FILE_PASV: + purple_debug_warning("QQ", "Normal IM, not support QQ_NORMAL_IM_FILE_PASV\n"); + qq_show_packet ("Not support", data, len); + break; + case QQ_NORMAL_IM_FILE_EX_REQUEST_UDP: + purple_debug_warning("QQ", "Normal IM, not support QQ_NORMAL_IM_FILE_REQUEST_TCP\n"); + qq_show_packet ("QQ", data, len); + break; + case QQ_NORMAL_IM_FILE_EX_REQUEST_ACCEPT: + purple_debug_warning("QQ", "Normal IM, not support QQ_NORMAL_IM_FILE_EX_REQUEST_ACCEPT\n"); + qq_show_packet ("QQ", data, len); + break; + case QQ_NORMAL_IM_FILE_EX_REQUEST_CANCEL: + purple_debug_warning("QQ", "Normal IM, not support QQ_NORMAL_IM_FILE_EX_REQUEST_CANCEL\n"); + qq_show_packet ("Not support", data, len); + break; + case QQ_NORMAL_IM_FILE_EX_NOTIFY_IP: + purple_debug_warning("QQ", "Normal IM, not support QQ_NORMAL_IM_FILE_EX_NOTIFY_IP\n"); + qq_show_packet ("Not support", data, len); + break; default: im_unprocessed = g_newa (qq_recv_normal_im_unprocessed, 1); im_unprocessed->common = common; im_unprocessed->unknown = data + bytes; im_unprocessed->length = len - bytes; /* a simple process here, maybe more later */ - purple_debug (PURPLE_DEBUG_WARNING, "QQ", + purple_debug_warning("QQ", "Normal IM, unprocessed type [0x%04x], len %d\n", common->normal_im_type, im_unprocessed->length); - qq_show_packet ("QQ unk-im", im_unprocessed->unknown, im_unprocessed->length); + qq_show_packet ("QQ", im_unprocessed->unknown, im_unprocessed->length); return; } } @@ -412,7 +492,7 @@ reply = strtol(segments[0], NULL, 10); if (reply == QQ_RECV_SYS_IM_KICK_OUT) - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "We are kicked out by QQ server\n"); + purple_debug_warning("QQ", "We are kicked out by QQ server\n"); msg_utf8 = qq_to_utf8(segments[1], QQ_CHARSET_DEFAULT); purple_notify_warning(gc, NULL, _("System Message"), msg_utf8); } @@ -475,7 +555,7 @@ g_datalist_clear(&attribs); } - purple_debug(PURPLE_DEBUG_INFO, "QQ_MESG", "send mesg: %s\n", msg); + purple_debug_info("QQ_MESG", "send mesg: %s\n", msg); msg_filtered = purple_markup_strip_html(msg); msg_len = strlen(msg_filtered); now = time(NULL); @@ -526,9 +606,9 @@ qq_show_packet("QQ_raw_data debug", raw_data, bytes); if (bytes == raw_len) /* create packet OK */ - qq_send_cmd(qd, QQ_CMD_SEND_IM, raw_data, bytes); + qq_send_cmd(gc, QQ_CMD_SEND_IM, raw_data, bytes); else - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "Fail creating send_im packet, expect %d bytes, build %d bytes\n", raw_len, bytes); if (font_color) @@ -549,10 +629,10 @@ qd = gc->proto_data; if (data[0] != QQ_SEND_IM_REPLY_OK) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Send IM fail\n"); + purple_debug_warning("QQ", "Send IM fail\n"); purple_notify_error(gc, _("Error"), _("Failed to send IM."), NULL); } else { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "IM ACK OK\n"); + purple_debug_info("QQ", "IM ACK OK\n"); } } @@ -569,16 +649,17 @@ qd = (qq_data *) gc->proto_data; if (data_len < 16) { /* we need to ack with the first 16 bytes */ - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "IM is too short\n"); + purple_debug_error("QQ", "MSG is too short\n"); return; } else { - _qq_send_packet_recv_im_ack(gc, seq, data); + /* when we receive a message, + * we send an ACK which is the first 16 bytes of incoming packet */ + qq_send_server_reply(gc, QQ_CMD_RECV_IM, seq, data, 16); } /* check len first */ if (data_len < 20) { /* length of im_header */ - purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "Fail read recv IM header, len should longer than 20 bytes, read %d bytes\n", data_len); + purple_debug_error("QQ", "Invald MSG header, len %d < 20\n", data_len); return; } @@ -594,77 +675,71 @@ /* im_header prepared */ if (im_header->receiver_uid != qd->uid) { /* should not happen */ - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "IM to [%d], NOT me\n", im_header->receiver_uid); + purple_debug_error("QQ", "MSG to [%d], NOT me\n", im_header->receiver_uid); return; } /* check bytes */ if (bytes >= data_len - 1) { - purple_debug (PURPLE_DEBUG_WARNING, "QQ", "Received IM is empty\n"); + purple_debug_warning("QQ", "Empty MSG\n"); return; } switch (im_header->im_type) { + case QQ_RECV_IM_NEWS: + _qq_process_recv_news(data + bytes, data_len - bytes, gc); + break; + case QQ_RECV_IM_FROM_BUDDY_2006: + case QQ_RECV_IM_FROM_UNKNOWN_2006: + case QQ_RECV_IM_TO_UNKNOWN: case QQ_RECV_IM_TO_BUDDY: - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "IM from buddy [%d], I am in his/her buddy list\n", im_header->sender_uid); - _qq_process_recv_normal_im(data + bytes, data_len - bytes, gc); /* position and rest length */ - break; - case QQ_RECV_IM_TO_UNKNOWN: - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "IM from buddy [%d], I am a stranger to him/her\n", im_header->sender_uid); + purple_debug_info("QQ", "MSG from buddy [%d]\n", im_header->sender_uid); _qq_process_recv_normal_im(data + bytes, data_len - bytes, gc); break; case QQ_RECV_IM_UNKNOWN_QUN_IM: case QQ_RECV_IM_TEMP_QUN_IM: case QQ_RECV_IM_QUN_IM: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "IM from group, internal_id [%d]\n", im_header->sender_uid); + purple_debug_info("QQ", "MSG from room [%d]\n", im_header->sender_uid); /* sender_uid is in fact id */ - qq_process_recv_group_im(data + bytes, data_len - bytes, im_header->sender_uid, gc, im_header->im_type); + qq_process_room_msg_normal(data + bytes, data_len - bytes, im_header->sender_uid, gc, im_header->im_type); break; case QQ_RECV_IM_ADD_TO_QUN: - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "IM from group, added by group internal_id [%d]\n", im_header->sender_uid); + purple_debug_info("QQ", "Notice from [%d], Added\n", im_header->sender_uid); /* sender_uid is group id * we need this to create a dummy group and add to blist */ - qq_process_recv_group_im_been_added(data + bytes, data_len - bytes, im_header->sender_uid, gc); + qq_process_room_msg_been_added(data + bytes, data_len - bytes, im_header->sender_uid, gc); break; case QQ_RECV_IM_DEL_FROM_QUN: - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "IM from group, removed by group internal_ID [%d]\n", im_header->sender_uid); + purple_debug_info("QQ", "Notice from room [%d], Removed\n", im_header->sender_uid); /* sender_uid is group id */ - qq_process_recv_group_im_been_removed(data + bytes, data_len - bytes, im_header->sender_uid, gc); + qq_process_room_msg_been_removed(data + bytes, data_len - bytes, im_header->sender_uid, gc); break; case QQ_RECV_IM_APPLY_ADD_TO_QUN: - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "IM from group, apply to join group internal_ID [%d]\n", im_header->sender_uid); + purple_debug_info("QQ", "Notice from room [%d], Joined\n", im_header->sender_uid); /* sender_uid is group id */ - qq_process_recv_group_im_apply_join(data + bytes, data_len - bytes, im_header->sender_uid, gc); + qq_process_room_msg_apply_join(data + bytes, data_len - bytes, im_header->sender_uid, gc); break; case QQ_RECV_IM_APPROVE_APPLY_ADD_TO_QUN: - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "IM for group system info, approved by group internal_id [%d]\n", + purple_debug_info("QQ", "Notice from room [%d], Confirm add in\n", im_header->sender_uid); /* sender_uid is group id */ - qq_process_recv_group_im_been_approved(data + bytes, data_len - bytes, im_header->sender_uid, gc); + qq_process_room_msg_been_approved(data + bytes, data_len - bytes, im_header->sender_uid, gc); break; case QQ_RECV_IM_REJCT_APPLY_ADD_TO_QUN: - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "IM for group system info, rejected by group internal_id [%d]\n", + purple_debug_info("QQ", "Notice from room [%d], Refuse add in\n", im_header->sender_uid); /* sender_uid is group id */ - qq_process_recv_group_im_been_rejected(data + bytes, data_len - bytes, im_header->sender_uid, gc); + qq_process_room_msg_been_rejected(data + bytes, data_len - bytes, im_header->sender_uid, gc); break; case QQ_RECV_IM_SYS_NOTIFICATION: - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "IM from [%d], should be a system administrator\n", im_header->sender_uid); + purple_debug_info("QQ", "Admin notice from [%d]\n", im_header->sender_uid); _qq_process_recv_sys_im(data + bytes, data_len - bytes, gc); break; default: - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "IM from [%d], [0x%02x] %s is not processed\n", - im_header->sender_uid, - im_header->im_type, qq_get_recv_im_type_str(im_header->im_type)); + purple_debug_warning("QQ", "MSG from [%d], unknown type %s [0x%02x]\n", + im_header->sender_uid, qq_get_recv_im_type_str(im_header->im_type), + im_header->im_type); + qq_show_packet("Unknown MSG type", data, data_len); } }
--- a/libpurple/protocols/qq/im.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/im.h Tue Sep 16 20:01:24 2008 +0000 @@ -41,6 +41,7 @@ enum { QQ_RECV_IM_TO_BUDDY = 0x0009, QQ_RECV_IM_TO_UNKNOWN = 0x000a, + QQ_RECV_IM_NEWS = 0x0018, QQ_RECV_IM_UNKNOWN_QUN_IM = 0x0020, QQ_RECV_IM_ADD_TO_QUN = 0x0021, QQ_RECV_IM_DEL_FROM_QUN = 0x0022, @@ -50,7 +51,9 @@ QQ_RECV_IM_CREATE_QUN = 0x0026, QQ_RECV_IM_TEMP_QUN_IM = 0x002A, QQ_RECV_IM_QUN_IM = 0x002B, - QQ_RECV_IM_SYS_NOTIFICATION = 0x0030 + QQ_RECV_IM_SYS_NOTIFICATION = 0x0030, + QQ_RECV_IM_FROM_BUDDY_2006 = 0x0084, + QQ_RECV_IM_FROM_UNKNOWN_2006 = 0x0085, }; guint8 *qq_get_send_im_tail(const gchar *font_color,
--- a/libpurple/protocols/qq/packet_parse.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/packet_parse.c Tue Sep 16 20:01:24 2008 +0000 @@ -46,8 +46,8 @@ memcpy(&b_dest, buf, sizeof(b_dest)); *b = b_dest; #ifdef PARSER_DEBUG - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][get8] buf %p\n", (void *)buf); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][get8] b_dest 0x%2x, *b 0x%02x\n", b_dest, *b); + purple_debug_info("QQ", "[DBG][get8] buf %p\n", (void *)buf); + purple_debug_info("QQ", "[DBG][get8] b_dest 0x%2x, *b 0x%02x\n", b_dest, *b); #endif return sizeof(b_dest); } @@ -61,8 +61,8 @@ memcpy(&w_dest, buf, sizeof(w_dest)); *w = g_ntohs(w_dest); #ifdef PARSER_DEBUG - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][get16] buf %p\n", (void *)buf); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][get16] w_dest 0x%04x, *w 0x%04x\n", w_dest, *w); + purple_debug_info("QQ", "[DBG][get16] buf %p\n", (void *)buf); + purple_debug_info("QQ", "[DBG][get16] w_dest 0x%04x, *w 0x%04x\n", w_dest, *w); #endif return sizeof(w_dest); } @@ -75,8 +75,8 @@ memcpy(&dw_dest, buf, sizeof(dw_dest)); *dw = g_ntohl(dw_dest); #ifdef PARSER_DEBUG - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][get32] buf %p\n", (void *)buf); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][get32] dw_dest 0x%08x, *dw 0x%08x\n", dw_dest, *dw); + purple_debug_info("QQ", "[DBG][get32] buf %p\n", (void *)buf); + purple_debug_info("QQ", "[DBG][get32] dw_dest 0x%08x, *dw 0x%08x\n", dw_dest, *dw); #endif return sizeof(dw_dest); } @@ -93,7 +93,7 @@ { memcpy(data, buf, datalen); #ifdef PARSER_DEBUG - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][getdata] buf %p\n", (void *)buf); + purple_debug_info("QQ", "[DBG][getdata] buf %p\n", (void *)buf); #endif return datalen; } @@ -107,12 +107,12 @@ guint32 dw_dest; memcpy(&dw_dest, buf, sizeof(dw_dest)); #ifdef PARSER_DEBUG - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][getime] buf %p\n", (void *)buf); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][getime] dw_dest before 0x%08x\n", dw_dest); + purple_debug_info("QQ", "[DBG][getime] buf %p\n", (void *)buf); + purple_debug_info("QQ", "[DBG][getime] dw_dest before 0x%08x\n", dw_dest); #endif dw_dest = g_ntohl(dw_dest); #ifdef PARSER_DEBUG - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][getime] dw_dest after 0x%08x\n", dw_dest); + purple_debug_info("QQ", "[DBG][getime] dw_dest after 0x%08x\n", dw_dest); #endif memcpy(t, &dw_dest, sizeof(dw_dest)); return sizeof(dw_dest); @@ -125,8 +125,8 @@ { memcpy(buf, &b, sizeof(b)); #ifdef PARSER_DEBUG - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][put8] buf %p\n", (void *)buf); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][put8] b 0x%02x\n", b); + purple_debug_info("QQ", "[DBG][put8] buf %p\n", (void *)buf); + purple_debug_info("QQ", "[DBG][put8] b 0x%02x\n", b); #endif return sizeof(b); } @@ -139,8 +139,8 @@ guint16 w_porter; w_porter = g_htons(w); #ifdef PARSER_DEBUG - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][put16] buf %p\n", (void *)buf); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][put16] w 0x%04x, w_porter 0x%04x\n", w, w_porter); + purple_debug_info("QQ", "[DBG][put16] buf %p\n", (void *)buf); + purple_debug_info("QQ", "[DBG][put16] w 0x%04x, w_porter 0x%04x\n", w, w_porter); #endif memcpy(buf, &w_porter, sizeof(w_porter)); return sizeof(w_porter); @@ -154,8 +154,8 @@ guint32 dw_porter; dw_porter = g_htonl(dw); #ifdef PARSER_DEBUG - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][put32] buf %p\n", (void *)buf); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][put32] dw 0x%08x, dw_porter 0x%08x\n", dw, dw_porter); + purple_debug_info("QQ", "[DBG][put32] buf %p\n", (void *)buf); + purple_debug_info("QQ", "[DBG][put32] dw 0x%08x, dw_porter 0x%08x\n", dw, dw_porter); #endif memcpy(buf, &dw_porter, sizeof(dw_porter)); return sizeof(dw_porter); @@ -173,7 +173,7 @@ { memcpy(buf, data, datalen); #ifdef PARSER_DEBUG - purple_debug(PURPLE_DEBUG_INFO, "QQ", "[DBG][putdata] buf %p\n", (void *)buf); + purple_debug_info("QQ", "[DBG][putdata] buf %p\n", (void *)buf); #endif return datalen; }
--- a/libpurple/protocols/qq/qq.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/qq.c Tue Sep 16 20:01:24 2008 +0000 @@ -24,10 +24,6 @@ #include "internal.h" -#ifdef _WIN32 -#define random rand -#endif - #include "accountopt.h" #include "debug.h" #include "notify.h" @@ -62,79 +58,69 @@ #define OPENQ_AUTHOR "Puzzlebird" #define OPENQ_WEBSITE "http://openq.sourceforge.net" -#define QQ_TCP_PORT 8000 -#define QQ_UDP_PORT 8000 +static GList *server_list_build(gchar select) +{ + GList *list = NULL; -static void server_list_create(PurpleAccount *account) { + if ( select == 'T' || select == 'A') { + list = g_list_append(list, "tcpconn.tencent.com:8000"); + list = g_list_append(list, "tcpconn2.tencent.com:8000"); + list = g_list_append(list, "tcpconn3.tencent.com:8000"); + list = g_list_append(list, "tcpconn4.tencent.com:8000"); + list = g_list_append(list, "tcpconn5.tencent.com:8000"); + list = g_list_append(list, "tcpconn6.tencent.com:8000"); + } + if ( select == 'U' || select == 'A') { + list = g_list_append(list, "sz.tencent.com:8000"); + list = g_list_append(list, "sz2.tencent.com:8000"); + list = g_list_append(list, "sz3.tencent.com:8000"); + list = g_list_append(list, "sz4.tencent.com:8000"); + list = g_list_append(list, "sz5.tencent.com:8000"); + list = g_list_append(list, "sz6.tencent.com:8000"); + list = g_list_append(list, "sz7.tencent.com:8000"); + list = g_list_append(list, "sz8.tencent.com:8000"); + list = g_list_append(list, "sz9.tencent.com:8000"); + } + return list; +} + +static void server_list_create(PurpleAccount *account) +{ PurpleConnection *gc; qq_data *qd; + PurpleProxyInfo *gpi; const gchar *user_server; - int port; - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Create server list\n"); gc = purple_account_get_connection(account); g_return_if_fail(gc != NULL && gc->proto_data != NULL); qd = gc->proto_data; + gpi = purple_proxy_get_setup(account); + qd->use_tcp = purple_account_get_bool(account, "use_tcp", TRUE); - port = purple_account_get_int(account, "port", 0); - if (port == 0) { - if (qd->use_tcp) { - port = QQ_TCP_PORT; - } else { - port = QQ_UDP_PORT; - } - } - qd->user_port = port; - g_return_if_fail(qd->user_server == NULL); user_server = purple_account_get_string(account, "server", NULL); - if (user_server != NULL && strlen(user_server) > 0) { - qd->user_server = g_strdup(user_server); + purple_debug_info("QQ", "Select server '%s'\n", user_server); + if ( (user_server != NULL && strlen(user_server) > 0) && strcasecmp(user_server, "auto") != 0) { + qd->servers = g_list_append(qd->servers, g_strdup(user_server)); + return; } - if (qd->user_server != NULL) { - qd->servers = g_list_append(qd->servers, qd->user_server); - return; - } if (qd->use_tcp) { - qd->servers = g_list_append(qd->servers, "tcpconn.tencent.com"); - qd->servers = g_list_append(qd->servers, "tcpconn2.tencent.com"); - qd->servers = g_list_append(qd->servers, "tcpconn3.tencent.com"); - qd->servers = g_list_append(qd->servers, "tcpconn4.tencent.com"); - qd->servers = g_list_append(qd->servers, "tcpconn5.tencent.com"); - qd->servers = g_list_append(qd->servers, "tcpconn6.tencent.com"); + qd->servers = server_list_build('T'); return; } - - qd->servers = g_list_append(qd->servers, "sz.tencent.com"); - qd->servers = g_list_append(qd->servers, "sz2.tencent.com"); - qd->servers = g_list_append(qd->servers, "sz3.tencent.com"); - qd->servers = g_list_append(qd->servers, "sz4.tencent.com"); - qd->servers = g_list_append(qd->servers, "sz5.tencent.com"); - qd->servers = g_list_append(qd->servers, "sz6.tencent.com"); - qd->servers = g_list_append(qd->servers, "sz7.tencent.com"); - qd->servers = g_list_append(qd->servers, "sz8.tencent.com"); - qd->servers = g_list_append(qd->servers, "sz9.tencent.com"); + + qd->servers = server_list_build('U'); } -static void server_list_remove_all(qq_data *qd) { +static void server_list_remove_all(qq_data *qd) +{ g_return_if_fail(qd != NULL); - if (qd->real_hostname) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "free real_hostname\n"); - g_free(qd->real_hostname); - qd->real_hostname = NULL; - } - - if (qd->user_server != NULL) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "free user_server\n"); - g_free(qd->user_server); - qd->user_server = NULL; - } - - purple_debug(PURPLE_DEBUG_INFO, "QQ", "free server list\n"); + purple_debug_info("QQ", "free server list\n"); g_list_free(qd->servers); + qd->curr_server = NULL; } static void qq_login(PurpleAccount *account) @@ -151,6 +137,7 @@ gc->flags |= PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_NO_BGCOLOR | PURPLE_CONNECTION_AUTO_RESP; qd = g_new0(qq_data, 1); + memset(qd, 0, sizeof(qq_data)); qd->gc = gc; gc->proto_data = qd; @@ -165,10 +152,36 @@ } server_list_create(account); - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "Server list has %d\n", g_list_length(qd->servers)); + purple_debug_info("QQ", "Server list has %d\n", g_list_length(qd->servers)); + + qd->is_show_notice = purple_account_get_bool(account, "show_notice", TRUE); + qd->is_show_news = purple_account_get_bool(account, "show_news", TRUE); + + qd->resend_times = purple_prefs_get_int("/plugins/prpl/qq/resend_times"); + if (qd->resend_times <= 1) qd->itv_config.resend = 4; + + qd->itv_config.resend = purple_prefs_get_int("/plugins/prpl/qq/resend_interval"); + if (qd->itv_config.resend <= 0) qd->itv_config.resend = 3; + purple_debug_info("QQ", "Resend interval %d, retries %d\n", + qd->itv_config.resend, qd->resend_times); - qq_connect(account); + qd->itv_config.keep_alive = purple_account_get_int(account, "keep_alive_interval", 60); + if (qd->itv_config.keep_alive < 30) qd->itv_config.keep_alive = 30; + qd->itv_config.keep_alive /= qd->itv_config.resend; + qd->itv_count.keep_alive = qd->itv_config.keep_alive; + + qd->itv_config.update = purple_account_get_int(account, "update_interval", 300); + if (qd->itv_config.update > 0) { + if (qd->itv_config.update < qd->itv_config.keep_alive) { + qd->itv_config.update = qd->itv_config.keep_alive; + } + qd->itv_config.update /= qd->itv_config.resend; + qd->itv_count.update = qd->itv_config.update; + } else { + qd->itv_config.update = 0; + } + + qd->connect_watcher = purple_timeout_add_seconds(0, qq_connect_later, gc); } /* clean up the given QQ connection and free all resources */ @@ -179,12 +192,20 @@ g_return_if_fail(gc != NULL && gc->proto_data); qd = gc->proto_data; + if (qd->check_watcher > 0) { + purple_timeout_remove(qd->check_watcher); + qd->check_watcher = 0; + } + + if (qd->connect_watcher > 0) { + purple_timeout_remove(qd->connect_watcher); + qd->connect_watcher = 0; + } + qq_disconnect(gc); - server_list_remove_all(qd); - + g_free(qd); - gc->proto_data = NULL; } @@ -212,10 +233,10 @@ g_string_append(status, _("Offline")); break; case QQ_BUDDY_ONLINE_NORMAL: - return NULL; + g_string_append(status, _("Online")); break; /* TODO What does this status mean? Labelling it as offline... */ - case QQ_BUDDY_ONLINE_OFFLINE: + case QQ_BUDDY_CHANGE_TO_OFFLINE: g_string_append(status, _("Offline")); break; case QQ_BUDDY_ONLINE_AWAY: @@ -303,8 +324,8 @@ g_string_append( str, _(" Video") ); } - if (q_bud->ext_flag & QQ_EXT_FLAG_SPACE) { - g_string_append( str, _(" Space") ); + if (q_bud->ext_flag & QQ_EXT_FLAG_ZONE) { + g_string_append( str, _(" Zone") ); } purple_notify_user_info_add_pair(user_info, _("Flag"), str->str); @@ -329,7 +350,7 @@ { /* each char** are refering to a filename in pixmaps/purple/status/default/ */ qq_buddy *q_bud; - + if (!b || !(q_bud = b->proto_data)) { return NULL; } @@ -374,11 +395,11 @@ } /* initiate QQ away with proper change_status packet */ -static void _qq_set_away(PurpleAccount *account, PurpleStatus *status) +static void _qq_change_status(PurpleAccount *account, PurpleStatus *status) { PurpleConnection *gc = purple_account_get_connection(account); - qq_send_packet_change_status(gc); + qq_request_change_status(gc, 0); } /* IMPORTANT: PurpleConvImFlags -> PurpleMessageFlags */ @@ -444,12 +465,12 @@ uid = purple_name_to_uid(who); if (uid <= 0) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Not valid QQid: %s\n", who); + purple_debug_error("QQ", "Not valid QQid: %s\n", who); purple_notify_error(gc, NULL, _("Invalid name"), NULL); return; } - qq_send_packet_get_level(gc, uid); + qq_request_get_level(gc, uid); qq_send_packet_get_info(gc, uid, TRUE); } @@ -502,7 +523,7 @@ */ /* show a brief summary of what we get from login packet */ -static void _qq_menu_show_login_info(PurplePluginAction *action) +static void _qq_menu_account_info(PurplePluginAction *action) { PurpleConnection *gc = (PurpleConnection *) action->context; qq_data *qd; @@ -516,10 +537,17 @@ g_string_append(info, "<hr>\n"); - g_string_append_printf(info, _("<b>Server</b>: %s: %d<br>\n"), qd->server_name, qd->real_port); + g_string_append_printf(info, _("<b>Server</b>: %s<br>\n"), qd->curr_server); g_string_append_printf(info, _("<b>Connection Mode</b>: %s<br>\n"), qd->use_tcp ? "TCP" : "UDP"); - g_string_append_printf(info, _("<b>Real hostname</b>: %s: %d<br>\n"), qd->real_hostname, qd->real_port); - g_string_append_printf(info, _("<b>My Public IP</b>: %s<br>\n"), inet_ntoa(qd->my_ip)); + g_string_append_printf(info, _("<b>My Internet Address</b>: %s<br>\n"), inet_ntoa(qd->my_ip)); + + g_string_append(info, "<hr>\n"); + g_string_append(info, "<i>Network Status</i><br>\n"); + g_string_append_printf(info, _("<b>Sent</b>: %lu<br>\n"), qd->net_stat.sent); + g_string_append_printf(info, _("<b>Resend</b>: %lu<br>\n"), qd->net_stat.resend); + g_string_append_printf(info, _("<b>Lost</b>: %lu<br>\n"), qd->net_stat.lost); + g_string_append_printf(info, _("<b>Received</b>: %lu<br>\n"), qd->net_stat.rcved); + g_string_append_printf(info, _("<b>Received Duplicate</b>: %lu<br>\n"), qd->net_stat.rcved_dup); g_string_append(info, "<hr>\n"); g_string_append(info, "<i>Information below may not be accurate</i><br>\n"); @@ -612,7 +640,7 @@ act = purple_plugin_action_new(_("Change Password"), _qq_menu_change_password); m = g_list_append(m, act); - act = purple_plugin_action_new(_("Show Login Information"), _qq_menu_show_login_info); + act = purple_plugin_action_new(_("Account Information"), _qq_menu_account_info); m = g_list_append(m, act); /* @@ -633,7 +661,7 @@ PurpleMenuAction *act; m = NULL; - act = purple_menu_action_new(_("Leave this QQ Qun"), PURPLE_CALLBACK(_qq_menu_unsubscribe_group), NULL, NULL); + act = purple_menu_action_new(_("Leave the QQ Qun"), PURPLE_CALLBACK(_qq_menu_unsubscribe_group), NULL, NULL); m = g_list_append(m, act); /* TODO: enable this @@ -708,7 +736,7 @@ NULL, /* set_info */ NULL, /* send_typing */ _qq_get_info, /* get_info */ - _qq_set_away, /* set_away */ + _qq_change_status, /* change status */ NULL, /* set_idle */ NULL, /* change_passwd */ qq_add_buddy, /* add_buddy */ @@ -800,17 +828,43 @@ static void init_plugin(PurplePlugin *plugin) { PurpleAccountOption *option; + PurpleKeyValuePair *kvp; + GList *list = NULL; + GList *kvlist = NULL; + GList *entry; - option = purple_account_option_string_new(_("Server"), "server", NULL); + list = server_list_build('A'); + + purple_prefs_add_string_list("/plugins/prpl/qq/serverlist", list); + list = purple_prefs_get_string_list("/plugins/prpl/qq/serverlist"); + + kvlist = NULL; + kvp = g_new0(PurpleKeyValuePair, 1); + kvp->key = g_strdup(_("Auto")); + kvp->value = g_strdup("auto"); + kvlist = g_list_append(kvlist, kvp); + + entry = list; + while(entry) { + if (entry->data != NULL && strlen(entry->data) > 0) { + kvp = g_new0(PurpleKeyValuePair, 1); + kvp->key = g_strdup(entry->data); + kvp->value = g_strdup(entry->data); + kvlist = g_list_append(kvlist, kvp); + } + entry = entry->next; + } + + option = purple_account_option_list_new(_("Server"), "server", kvlist); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - option = purple_account_option_int_new(_("Port"), "port", 0); + option = purple_account_option_bool_new(_("Connect by TCP"), "use_tcp", TRUE); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - option = purple_account_option_bool_new(_("Connect using TCP"), "use_tcp", TRUE); + option = purple_account_option_bool_new(_("Show server notice"), "show_notice", TRUE); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - option = purple_account_option_int_new(_("resend interval(s)"), "resend_interval", 10); + option = purple_account_option_bool_new(_("Show server news"), "show_news", TRUE); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); option = purple_account_option_int_new(_("Keep alive interval(s)"), "keep_alive_interval", 60); @@ -822,7 +876,9 @@ purple_prefs_add_none("/plugins/prpl/qq"); purple_prefs_add_bool("/plugins/prpl/qq/show_status_by_icon", TRUE); purple_prefs_add_bool("/plugins/prpl/qq/show_fake_video", FALSE); - purple_prefs_add_bool("/plugins/prpl/qq/prompt_group_msg_on_recv", TRUE); + purple_prefs_add_bool("/plugins/prpl/qq/show_room_when_newin", TRUE); + purple_prefs_add_int("/plugins/prpl/qq/resend_interval", 3); + purple_prefs_add_int("/plugins/prpl/qq/resend_times", 4); } PURPLE_INIT_PLUGIN(qq, init_plugin, info);
--- a/libpurple/protocols/qq/qq.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/qq.h Tue Sep 16 20:01:24 2008 +0000 @@ -39,11 +39,20 @@ typedef struct _qq_data qq_data; typedef struct _qq_buddy qq_buddy; typedef struct _qq_interval qq_interval; +typedef struct _qq_net_stat qq_net_stat; struct _qq_interval { gint resend; gint keep_alive; - gint update; + gint update; +}; + +struct _qq_net_stat { + glong sent; + glong resend; + glong lost; + glong rcved; + glong rcved_dup; }; struct _qq_buddy { @@ -63,44 +72,51 @@ guint16 timeRemainder; time_t signon; time_t idle; - time_t last_refresh; + time_t last_update; gint8 role; /* role in group, used only in group->members list */ }; +typedef struct _qq_connection qq_connection; +struct _qq_connection { + int fd; /* socket file handler */ + int input_handler; + + /* tcp related */ + int can_write_handler; /* use in tcp_send_out */ + PurpleCircBuffer *tcp_txbuf; + guint8 *tcp_rxqueue; + int tcp_rxlen; +}; + struct _qq_data { PurpleConnection *gc; - /* common network resource */ - GList *servers; - gchar *user_server; - gint user_port; + GSList *openconns; gboolean use_tcp; /* network in tcp or udp */ - - gchar *server_name; - gboolean is_redirect; - gchar *real_hostname; /* from real connction */ - guint16 real_port; - guint reconnect_timeout; - gint reconnect_times; + PurpleProxyConnectData *conn_data; +#ifndef purple_proxy_connect_udp + PurpleDnsQueryData *udp_query_data; /* udp related */ + gint udp_can_write_handler; /* socket can_write handle, use in udp connecting and tcp send out */ +#endif + gint fd; /* socket file handler */ + qq_net_stat net_stat; - PurpleProxyConnectData *connect_data; - gint fd; /* socket file handler */ - gint tx_handler; /* socket can_write handle, use in udp connecting and tcp send out */ + GList *servers; + gchar *curr_server; /* point to servers->data, do not free*/ + + struct in_addr redirect_ip; + guint16 redirect_port; + guint check_watcher; + guint connect_watcher; + gint connect_retry; qq_interval itv_config; qq_interval itv_count; - guint network_timeout; - - GList *transactions; /* check ack packet and resend */ + guint network_watcher; + gint resend_times; - /* tcp related */ - PurpleCircBuffer *tcp_txbuf; - guint8 *tcp_rxqueue; - int tcp_rxlen; - - /* udp related */ - PurpleDnsQueryData *udp_query_data; + GList *transactions; /* check ack packet and resend */ guint32 uid; /* QQ number */ guint8 *token; /* get from server*/ @@ -112,7 +128,7 @@ guint16 send_seq; /* send sequence number */ guint8 login_mode; /* online of invisible */ - gboolean logged_in; /* used by qq-add_buddy */ + gboolean is_login; /* used by qq-add_buddy */ PurpleXfer *xfer; /* file transfer handler */ @@ -143,6 +159,9 @@ /* TODO pass qq_send_packet_get_info() a callback and use signals to get rid of these */ gboolean modifying_info; gboolean modifying_face; + + gboolean is_show_notice; + gboolean is_show_news; }; #endif
--- a/libpurple/protocols/qq/qq_base.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/qq_base.c Tue Sep 16 20:01:24 2008 +0000 @@ -48,7 +48,7 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x14, 0x11, 0x20, 0x03, 0x9d, 0xb2, 0xe6, 0xb3, 0x11, 0xb7, 0x13, - 0x95, 0x67, 0xda, 0x2c, 0x01 + 0x95, 0x67, 0xda, 0x2c, 0x01 }; */ /* for QQ 2003iii 0304, fixed value */ @@ -139,7 +139,7 @@ { guint8 src[QQ_KEY_LENGTH + QQ_KEY_LENGTH]; gint bytes = 0; - + bytes += qq_put32(src + bytes, uid); bytes += qq_putdata(src + bytes, session_key, QQ_KEY_LENGTH); @@ -161,7 +161,7 @@ bytes += qq_get8(&lrop.result, data + bytes); /* 001-016: session key */ bytes += qq_getdata(lrop.session_key, sizeof(lrop.session_key), data + bytes); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Got session_key\n"); + purple_debug_info("QQ", "Got session_key\n"); /* 017-020: login uid */ bytes += qq_get32(&lrop.uid, data + bytes); /* 021-024: server detected user public IP */ @@ -200,16 +200,16 @@ bytes += qq_getdata((guint8 *) &lrop.unknown6, 8, data + bytes); if (bytes != QQ_LOGIN_REPLY_OK_PACKET_LEN) { /* fail parsing login info */ - purple_debug(PURPLE_DEBUG_WARNING, "QQ", + purple_debug_warning("QQ", "Fail parsing login info, expect %d bytes, read %d bytes\n", QQ_LOGIN_REPLY_OK_PACKET_LEN, bytes); } /* but we still go on as login OK */ memcpy(qd->session_key, lrop.session_key, sizeof(qd->session_key)); get_session_md5(qd->session_md5, qd->uid, qd->session_key); - + qd->my_ip.s_addr = lrop.client_ip.s_addr; - + qd->my_port = lrop.client_port; qd->login_time = lrop.login_time; qd->last_login_time = lrop.last_login_time; @@ -237,39 +237,19 @@ bytes += qq_get16(&lrrp.new_server_port, data + bytes); if (bytes != QQ_LOGIN_REPLY_REDIRECT_PACKET_LEN) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "Fail parsing login redirect packet, expect %d bytes, read %d bytes\n", QQ_LOGIN_REPLY_REDIRECT_PACKET_LEN, bytes); return QQ_LOGIN_REPLY_ERR_MISC; } - + /* redirect to new server, do not disconnect or connect here * those connect should be called at packet_process */ - if (qd->real_hostname) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "free real_hostname\n"); - g_free(qd->real_hostname); - qd->real_hostname = NULL; - } - qd->real_hostname = g_strdup( inet_ntoa(lrrp.new_server_ip) ); - qd->real_port = lrrp.new_server_port; - + qd->redirect_ip.s_addr = lrrp.new_server_ip.s_addr; + qd->redirect_port = lrrp.new_server_port; return QQ_LOGIN_REPLY_REDIRECT; } -/* process login reply which says wrong password */ -static gint8 process_login_wrong_pwd(PurpleConnection *gc, guint8 *data, gint len) -{ - gchar *server_reply, *server_reply_utf8; - server_reply = g_new0(gchar, len); - g_memmove(server_reply, data + 1, len - 1); - server_reply_utf8 = qq_to_utf8(server_reply, QQ_CHARSET_DEFAULT); - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Wrong password, server msg in UTF8: %s\n", server_reply_utf8); - g_free(server_reply); - g_free(server_reply_utf8); - - return QQ_LOGIN_REPLY_ERR_PWD; -} - /* request before login */ void qq_send_packet_token(PurpleConnection *gc) { @@ -281,9 +261,9 @@ qd = (qq_data *) gc->proto_data; bytes += qq_put8(buf + bytes, 0); - + qd->send_seq++; - qq_send_data(qd, QQ_CMD_TOKEN, qd->send_seq, TRUE, buf, bytes); + qq_send_cmd_encrypted(gc, QQ_CMD_TOKEN, qd->send_seq, buf, bytes, TRUE); } /* send login packet to QQ server */ @@ -312,14 +292,14 @@ memset(raw_data, 0, QQ_LOGIN_DATA_LENGTH); encrypted_data = g_newa(guint8, QQ_LOGIN_DATA_LENGTH + 16); /* 16 bytes more */ - + bytes = 0; /* now generate the encrypted data * 000-015 use password_twice_md5 as key to encrypt empty string */ encrypted_len = qq_encrypt(raw_data + bytes, (guint8 *) "", 0, qd->password_twice_md5); g_return_if_fail(encrypted_len == 16); bytes += encrypted_len; - + /* 016-016 */ bytes += qq_put8(raw_data + bytes, 0x00); /* 017-020, used to be IP, now zero */ @@ -349,14 +329,15 @@ bytes += qq_putdata(buf + bytes, encrypted_data, encrypted_len); qd->send_seq++; - qq_send_data(qd, QQ_CMD_LOGIN, qd->send_seq, TRUE, buf, bytes); + qq_send_cmd_encrypted(gc, QQ_CMD_LOGIN, qd->send_seq, buf, bytes, TRUE); } -guint8 qq_process_token_reply(PurpleConnection *gc, gchar *error_msg, guint8 *buf, gint buf_len) +guint8 qq_process_token_reply(PurpleConnection *gc, guint8 *buf, gint buf_len) { qq_data *qd; guint8 ret; int token_len; + gchar *error_msg; g_return_val_if_fail(buf != NULL && buf_len != 0, -1); @@ -364,30 +345,37 @@ qd = (qq_data *) gc->proto_data; ret = buf[0]; - + if (ret != QQ_TOKEN_REPLY_OK) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Unknown request login token reply code : %d\n", buf[0]); + purple_debug_error("QQ", "Failed to request token: %d\n", buf[0]); qq_hex_dump(PURPLE_DEBUG_WARNING, "QQ", buf, buf_len, ">>> [default] decrypt and dump"); error_msg = try_dump_as_gbk(buf, buf_len); + if (error_msg == NULL) { + error_msg = g_strdup_printf( _("Invalid token reply code, 0x%02X"), ret); + } + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_msg); + g_free(error_msg); return ret; } - + token_len = buf_len-2; if (token_len <= 0) { error_msg = g_strdup_printf( _("Invalid token len, %d"), token_len); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_msg); + g_free(error_msg); return -1; } - + if (buf[1] != token_len) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "Invalid token len. Packet specifies length of %d, actual length is %d\n", buf[1], buf_len-2); } qq_hex_dump(PURPLE_DEBUG_INFO, "QQ", buf+2, token_len, "<<< got a token -> [default] decrypt and dump"); - + qd->token = g_new0(guint8, token_len); qd->token_len = token_len; g_memmove(qd->token, buf + 2, qd->token_len); @@ -402,48 +390,85 @@ qd = (qq_data *) gc->proto_data; for (i = 0; i < 4; i++) - qq_send_cmd_detail(qd, QQ_CMD_LOGOUT, 0xffff, FALSE, qd->password_twice_md5, QQ_KEY_LENGTH); + qq_send_cmd(gc, QQ_CMD_LOGOUT, qd->password_twice_md5, QQ_KEY_LENGTH); - qd->logged_in = FALSE; /* update login status AFTER sending logout packets */ + qd->is_login = FALSE; /* update login status AFTER sending logout packets */ } /* process the login reply packet */ -guint8 qq_process_login_reply(guint8 *data, gint data_len, PurpleConnection *gc) +guint8 qq_process_login_reply( PurpleConnection *gc, guint8 *data, gint data_len) { qq_data *qd; - gchar* error_msg; + guint8 ret = data[0]; + gchar *server_reply, *server_reply_utf8; + gchar *error_msg; g_return_val_if_fail(data != NULL && data_len != 0, QQ_LOGIN_REPLY_ERR_MISC); qd = (qq_data *) gc->proto_data; - switch (data[0]) { + switch (ret) { case QQ_LOGIN_REPLY_OK: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login reply is OK\n"); + purple_debug_info("QQ", "Login OK\n"); return process_login_ok(gc, data, data_len); case QQ_LOGIN_REPLY_REDIRECT: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login reply is redirect\n"); + purple_debug_info("QQ", "Redirect new server\n"); return process_login_redirect(gc, data, data_len); + + case QQ_LOGIN_REPLY_REDIRECT_EX: + purple_debug_error("QQ", "Extend redirect new server, not supported yet\n"); + error_msg = g_strdup( _("Unable login for not support Redirect_EX now") ); + return QQ_LOGIN_REPLY_REDIRECT_EX; + case QQ_LOGIN_REPLY_ERR_PWD: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login reply is error password\n"); - return process_login_wrong_pwd(gc, data, data_len); + server_reply = g_strndup((gchar *)data + 1, data_len - 1); + server_reply_utf8 = qq_to_utf8(server_reply, QQ_CHARSET_DEFAULT); + + purple_debug_error("QQ", "Error password: %s\n", server_reply_utf8); + error_msg = g_strdup_printf( _("Error password: %s"), server_reply_utf8); + + g_free(server_reply); + g_free(server_reply_utf8); + + if (!purple_account_get_remember_password(gc->account)) { + purple_account_set_password(gc->account, NULL); + } + + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, error_msg); + g_free(error_msg); + + return QQ_LOGIN_REPLY_ERR_PWD; + case QQ_LOGIN_REPLY_NEED_REACTIVE: - case QQ_LOGIN_REPLY_REDIRECT_EX: - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login reply is not actived or redirect extend\n"); + server_reply = g_strndup((gchar *)data + 1, data_len - 1); + server_reply_utf8 = qq_to_utf8(server_reply, QQ_CHARSET_DEFAULT); + + purple_debug_error("QQ", "Need active: %s\n", server_reply_utf8); + error_msg = g_strdup_printf( _("Need active: %s"), server_reply_utf8); + + g_free(server_reply); + g_free(server_reply_utf8); + break; + default: - break; + purple_debug_error("QQ", + "Unable login for unknow reply code 0x%02X\n", data[0]); + qq_hex_dump(PURPLE_DEBUG_WARNING, "QQ", + data, data_len, + ">>> [default] decrypt and dump"); + error_msg = try_dump_as_gbk(data, data_len); + if (error_msg == NULL) { + error_msg = g_strdup_printf( + _("Unable login for unknow reply code 0x%02X"), data[0] ); + } + break; } - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Unknown reply code: 0x%02X\n", data[0]); - qq_hex_dump(PURPLE_DEBUG_WARNING, "QQ", - data, data_len, - ">>> [default] decrypt and dump"); - error_msg = try_dump_as_gbk(data, data_len); - if (error_msg) { - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_msg); - g_free(error_msg); - } - return QQ_LOGIN_REPLY_ERR_MISC; + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_msg); + g_free(error_msg); + return ret; } /* send keep-alive packet to QQ server (it is a heart-beat) */ @@ -460,11 +485,11 @@ * the amount of online QQ users, my ip and port */ bytes += qq_put32(raw_data + bytes, qd->uid); - qq_send_cmd(qd, QQ_CMD_KEEP_ALIVE, raw_data, 4); + qq_send_cmd(gc, QQ_CMD_KEEP_ALIVE, raw_data, 4); } /* parse the return of keep-alive packet, it includes some system information */ -gboolean qq_process_keep_alive(guint8 *data, gint data_len, PurpleConnection *gc) +gboolean qq_process_keep_alive(guint8 *data, gint data_len, PurpleConnection *gc) { qq_data *qd; gchar **segments; @@ -478,7 +503,7 @@ /* the last one is 60, don't know what it is */ if (NULL == (segments = split_data(data, data_len, "\x1f", 6))) return TRUE; - + /* segments[0] and segment[1] are all 0x30 ("0") */ qd->total_online = strtol(segments[2], NULL, 10); if(0 == qd->total_online) { @@ -488,9 +513,9 @@ qd->my_ip.s_addr = inet_addr(segments[3]); qd->my_port = strtol(segments[4], NULL, 10); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "keep alive, %s:%d\n", + purple_debug_info("QQ", "keep alive, %s:%d\n", inet_ntoa(qd->my_ip), qd->my_port); - + g_strfreev(segments); return TRUE; }
--- a/libpurple/protocols/qq/qq_base.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/qq_base.h Tue Sep 16 20:01:24 2008 +0000 @@ -44,10 +44,10 @@ #define QQ_UPDATE_ONLINE_INTERVAL 300 /* in sec */ void qq_send_packet_token(PurpleConnection *gc); -guint8 qq_process_token_reply(PurpleConnection *gc, gchar *error_msg, guint8 *buf, gint buf_len); +guint8 qq_process_token_reply(PurpleConnection *gc, guint8 *buf, gint buf_len); void qq_send_packet_login(PurpleConnection *gc); -guint8 qq_process_login_reply(guint8 *data, gint data_len, PurpleConnection *gc); +guint8 qq_process_login_reply( PurpleConnection *gc, guint8 *data, gint data_len); void qq_send_packet_logout(PurpleConnection *gc);
--- a/libpurple/protocols/qq/qq_network.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/qq_network.c Tue Sep 16 20:01:24 2008 +0000 @@ -26,11 +26,6 @@ #include "debug.h" #include "internal.h" -#ifdef _WIN32 -#define random rand -#define srandom srand -#endif - #include "buddy_info.h" #include "group_info.h" #include "group_free.h" @@ -44,63 +39,100 @@ #include "utils.h" #include "qq_process.h" -/* set QQ_RECONNECT_MAX to 1, when test reconnecting */ -#define QQ_RECONNECT_MAX 4 -#define QQ_RECONNECT_INTERVAL 5000 -#define QQ_KEEP_ALIVE_INTERVAL 60000 -#define QQ_TRANS_INTERVAL 10000 +#define QQ_DEFAULT_PORT 8000 + +/* set QQ_CONNECT_MAX to 1, when test reconnecting */ +#define QQ_CONNECT_MAX 3 +#define QQ_CONNECT_INTERVAL 2 +#define QQ_CONNECT_CHECK 5 +#define QQ_KEEP_ALIVE_INTERVAL 60 +#define QQ_TRANS_INTERVAL 10 + +gboolean connect_to_server(PurpleConnection *gc, gchar *server, gint port); + +static qq_connection *connection_find(qq_data *qd, int fd) { + qq_connection *ret = NULL; + GSList *entry = qd->openconns; + while(entry) { + ret = entry->data; + if(ret->fd == fd) return ret; + entry = entry->next; + } + return NULL; +} +static qq_connection *connection_create(qq_data *qd, int fd) { + qq_connection *ret = g_new0(qq_connection, 1); + ret->fd = fd; + qd->openconns = g_slist_append(qd->openconns, ret); + return ret; +} + +static void connection_remove(qq_data *qd, int fd) { + qq_connection *conn = connection_find(qd, fd); + qd->openconns = g_slist_remove(qd->openconns, conn); + + g_return_if_fail( conn != NULL ); + + purple_debug_info("QQ", "Close socket %d\n", conn->fd); + if(conn->input_handler > 0) purple_input_remove(conn->input_handler); + if(conn->can_write_handler > 0) purple_input_remove(conn->can_write_handler); + + if (conn->fd >= 0) close(conn->fd); + if(conn->tcp_txbuf != NULL) purple_circ_buffer_destroy(conn->tcp_txbuf); + if (conn->tcp_rxqueue != NULL) g_free(conn->tcp_rxqueue); + + g_free(conn); +} + +static void connection_free_all(qq_data *qd) { + qq_connection *ret = NULL; + GSList *entry = qd->openconns; + while(entry) { + ret = entry->data; + connection_remove(qd, ret->fd); + entry = qd->openconns; + } +} static gboolean set_new_server(qq_data *qd) { gint count; gint index; GList *it = NULL; - + g_return_val_if_fail(qd != NULL, FALSE); if (qd->servers == NULL) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Server list is NULL\n"); + purple_debug_info("QQ", "Server list is NULL\n"); return FALSE; } - if (qd->real_hostname) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "free real_hostname\n"); - g_free(qd->real_hostname); - qd->real_hostname = NULL; - } + /* remove server used before */ + if (qd->curr_server != NULL) { + purple_debug_info("QQ", + "Remove current [%s] from server list\n", qd->curr_server); + qd->servers = g_list_remove(qd->servers, qd->curr_server); + qd->curr_server = NULL; + } - /* remove server used before */ - if (qd->server_name != NULL) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "Remove previous server [%s]\n", qd->server_name); - qd->servers = g_list_remove(qd->servers, qd->server_name); - qd->server_name = NULL; - } - count = g_list_length(qd->servers); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Server list has %d\n", count); + purple_debug_info("QQ", "Server list has %d\n", count); if (count <= 0) { /* no server left, disconnect when result is false */ qd->servers = NULL; return FALSE; } - + /* get new server */ - index = random() % count; + index = rand() % count; it = g_list_nth(qd->servers, index); - qd->server_name = it->data; /* do not free server_name */ - if (qd->server_name == NULL || strlen(qd->server_name) <= 0 ) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Server name at %d is empty\n", index); + qd->curr_server = it->data; /* do not free server_name */ + if (qd->curr_server == NULL || strlen(qd->curr_server) <= 0 ) { + purple_debug_info("QQ", "Server name at %d is empty\n", index); return FALSE; } - qd->real_hostname = g_strdup(qd->server_name); - qd->real_port = qd->user_port; - - qd->reconnect_times = QQ_RECONNECT_MAX; - - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "set new server to %s:%d\n", qd->real_hostname, qd->real_port); + purple_debug_info("QQ", "set new server to %s\n", qd->curr_server); return TRUE; } @@ -115,152 +147,199 @@ return bytes; } -static gboolean reconnect_later_cb(gpointer data) +static gboolean connect_check(gpointer data) { - PurpleConnection *gc; + PurpleConnection *gc = (PurpleConnection *) data; qq_data *qd; - gc = (PurpleConnection *) data; + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, FALSE); + qd = (qq_data *) gc->proto_data; + + if (qd->connect_watcher > 0) { + purple_timeout_remove(qd->connect_watcher); + qd->connect_watcher = 0; + } + + if (qd->fd >= 0 && qd->token != NULL && qd->token_len >= 0) { + purple_debug_info("QQ", "Connect ok\n"); + return FALSE; + } + + qd->connect_watcher = purple_timeout_add_seconds(0, qq_connect_later, gc); + return FALSE; +} + +/* Warning: qq_connect_later destory all connection + * Any function should be care of use qq_data after call this function + * Please conside tcp_pending and udp_pending */ +gboolean qq_connect_later(gpointer data) +{ + PurpleConnection *gc = (PurpleConnection *) data; + qq_data *qd; + char *server; + int port; + gchar **segments; + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, FALSE); qd = (qq_data *) gc->proto_data; - qd->reconnect_timeout = 0; + if (qd->check_watcher > 0) { + purple_timeout_remove(qd->check_watcher); + qd->check_watcher = 0; + } + qq_disconnect(gc); + + if (qd->redirect_ip.s_addr != 0) { + /* redirect to new server */ + server = g_strdup_printf("%s:%d", inet_ntoa(qd->redirect_ip), qd->redirect_port); + qd->servers = g_list_append(qd->servers, server); + qd->curr_server = server; + + qd->redirect_ip.s_addr = 0; + qd->redirect_port = 0; + qd->connect_retry = QQ_CONNECT_MAX; + } - qq_connect(gc->account); + if (qd->curr_server == NULL || strlen (qd->curr_server) == 0 || qd->connect_retry <= 0) { + if ( set_new_server(qd) != TRUE) { + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Failed to connect all servers")); + return FALSE; + } + qd->connect_retry = QQ_CONNECT_MAX; + } + + segments = g_strsplit_set(qd->curr_server, ":", 0); + server = g_strdup(segments[0]); + port = atoi(segments[1]); + if (port <= 0) { + purple_debug_info("QQ", "Port not define in %s\n", qd->curr_server); + port = QQ_DEFAULT_PORT; + } + g_strfreev(segments); + + qd->connect_retry--; + if ( !connect_to_server(gc, server, port) ) { + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to connect.")); + } + + qd->check_watcher = purple_timeout_add_seconds(QQ_CONNECT_CHECK, connect_check, gc); return FALSE; /* timeout callback stops */ } -static void reconnect_later(PurpleConnection *gc) -{ - qq_data *qd; - - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - qd = (qq_data *) gc->proto_data; - - qd->reconnect_times--; - if (qd->reconnect_times < 0) { - if ( set_new_server(qd) != TRUE) { - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Failed to connect server")); - return; - } - } - - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "Reconnect to server %s:%d next retries %d in %d ms\n", - qd->real_hostname, qd->real_port, - qd->reconnect_times, QQ_RECONNECT_INTERVAL); - - qd->reconnect_timeout = purple_timeout_add(QQ_RECONNECT_INTERVAL, - reconnect_later_cb, gc); -} - /* process the incoming packet from qq_pending */ -static void packet_process(PurpleConnection *gc, guint8 *buf, gint buf_len) +static gboolean packet_process(PurpleConnection *gc, guint8 *buf, gint buf_len) { qq_data *qd; gint bytes, bytes_not_read; - gboolean prev_login_status; - guint8 header_tag; guint16 source_tag; guint16 cmd; guint16 seq; /* May be ack_seq or send_seq, depends on cmd */ - guint8 room_cmd; guint32 room_id; + gint update_class; + guint32 ship32; qq_transaction *trans; - g_return_if_fail(buf != NULL && buf_len > 0); + g_return_val_if_fail(buf != NULL && buf_len > 0, TRUE); qd = (qq_data *) gc->proto_data; - prev_login_status = qd->logged_in; + qd->net_stat.rcved++; + if (qd->net_stat.rcved <= 0) memset(&(qd->net_stat), 0, sizeof(qd->net_stat)); /* Len, header and tail tag have been checked before */ bytes = 0; bytes += packet_get_header(&header_tag, &source_tag, &cmd, &seq, buf + bytes); #if 1 - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "==> [%05d] 0x%04X %s, from (0x%04X %s) len %d\n", - seq, cmd, qq_get_cmd_desc(cmd), source_tag, qq_get_ver_desc(source_tag), buf_len); -#endif + purple_debug_info("QQ", "==> [%05d] %s 0x%04X, source tag 0x%04X len %d\n", + seq, qq_get_cmd_desc(cmd), cmd, source_tag, buf_len); +#endif + /* this is the length of all the encrypted data (also remove tail tag) */ bytes_not_read = buf_len - bytes - 1; /* ack packet, we need to update send tranactions */ /* we do not check duplication for server ack */ - trans = qq_trans_find_rcved(qd, cmd, seq); + trans = qq_trans_find_rcved(gc, cmd, seq); if (trans == NULL) { /* new server command */ - qq_trans_add_server_cmd(qd, cmd, seq, buf + bytes, bytes_not_read); - if ( qd->logged_in ) { - qq_proc_cmd_server(gc, cmd, seq, buf + bytes, bytes_not_read); + if ( !qd->is_login ) { + qq_trans_add_remain(gc, cmd, seq, buf + bytes, bytes_not_read); + } else { + qq_trans_add_server_cmd(gc, cmd, seq, buf + bytes, bytes_not_read); + qq_proc_server_cmd(gc, cmd, seq, buf + bytes, bytes_not_read); } - return; + return TRUE; } if (qq_trans_is_dup(trans)) { - purple_debug(PURPLE_DEBUG_WARNING, - "QQ", "dup [%05d] %s, discard...\n", seq, qq_get_cmd_desc(cmd)); - return; - } - - if (qq_trans_is_server(trans)) { - if ( qd->logged_in ) { - qq_proc_cmd_server(gc, cmd, seq, buf + bytes, bytes_not_read); - } - return; + qd->net_stat.rcved_dup++; + purple_debug_info("QQ", "dup [%05d] %s, discard...\n", seq, qq_get_cmd_desc(cmd)); + return TRUE; } - /* this is the length of all the encrypted data (also remove tail tag */ - if (cmd == QQ_CMD_ROOM) { - room_cmd = qq_trans_get_room_cmd(trans); - room_id = qq_trans_get_room_id(trans); + update_class = qq_trans_get_class(trans); + ship32 = qq_trans_get_ship(trans); + + switch (cmd) { + case QQ_CMD_TOKEN: + if (qq_process_token_reply(gc, buf + bytes, bytes_not_read) == QQ_TOKEN_REPLY_OK) { + qq_send_packet_login(gc); + } + break; + case QQ_CMD_LOGIN: + qq_proc_login_cmd(gc, buf + bytes, bytes_not_read); + /* check is redirect or not, and do it now */ + if (qd->redirect_ip.s_addr != 0) { + if (qd->check_watcher > 0) { + purple_timeout_remove(qd->check_watcher); + qd->check_watcher = 0; + } + if (qd->connect_watcher > 0) purple_timeout_remove(qd->connect_watcher); + qd->connect_watcher = purple_timeout_add_seconds(QQ_CONNECT_INTERVAL, qq_connect_later, gc); + return FALSE; /* do nothing after this function and return now */ + } + break; + case QQ_CMD_ROOM: + room_cmd = qq_trans_get_room_cmd(trans); + room_id = qq_trans_get_room_id(trans); #if 1 - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "%s (0x%02X ) for room %d, len %d\n", - qq_get_room_cmd_desc(room_cmd), room_cmd, room_id, buf_len); -#endif - qq_proc_room_cmd_reply(gc, seq, room_cmd, room_id, buf + bytes, bytes_not_read); - } else { - qq_proc_cmd_reply(gc, cmd, seq, buf + bytes, bytes_not_read); - } - - /* check is redirect or not, and do it now */ - if (qd->is_redirect) { - /* free resource except real_hostname and port */ - qq_disconnect(gc); - qd->reconnect_times = QQ_RECONNECT_MAX; - reconnect_later(gc); - return; + purple_debug_info("QQ", "%s (0x%02X) for room %d, len %d\n", + qq_get_room_cmd_desc(room_cmd), room_cmd, room_id, buf_len); +#endif + qq_proc_room_cmd(gc, seq, room_cmd, room_id, buf + bytes, bytes_not_read, update_class, ship32); + break; + default: + qq_proc_client_cmd(gc, cmd, seq, buf + bytes, bytes_not_read, update_class, ship32); + break; } - if (prev_login_status != qd->logged_in && qd->logged_in == TRUE) { - /* logged_in, but we have packets before login */ - qq_trans_process_before_login(qd); - } + return TRUE; } static void tcp_pending(gpointer data, gint source, PurpleInputCondition cond) { - PurpleConnection *gc; + PurpleConnection *gc = (PurpleConnection *) data; qq_data *qd; + qq_connection *conn; guint8 buf[1024]; /* set to 16 when test tcp_rxqueue */ gint buf_len; gint bytes; - + guint8 *pkt; guint16 pkt_len; - + gchar *error_msg; guint8 *jump; gint jump_len; - gc = (PurpleConnection *) data; g_return_if_fail(gc != NULL && gc->proto_data != NULL); + qd = (qq_data *) gc->proto_data; if(cond != PURPLE_INPUT_READ) { purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, @@ -268,8 +347,9 @@ return; } - qd = (qq_data *) gc->proto_data; - + conn = connection_find(qd, source); + g_return_if_fail(conn != NULL); + /* test code, not using tcp_rxqueue memset(pkt,0, sizeof(pkt)); buf_len = read(qd->fd, pkt, sizeof(pkt)); @@ -278,8 +358,8 @@ } return; */ - - buf_len = read(qd->fd, buf, sizeof(buf)); + + buf_len = read(source, buf, sizeof(buf)); if (buf_len < 0) { if (errno == EAGAIN) /* No worries */ @@ -299,93 +379,93 @@ * QQ need a keep alive packet in every 60 seconds gc->last_received = time(NULL); */ - /* - purple_debug(PURPLE_DEBUG_INFO, "TCP_PENDING", - "Read %d bytes from socket, rxlen is %d\n", buf_len, qd->tcp_rxlen); - */ - qd->tcp_rxqueue = g_realloc(qd->tcp_rxqueue, buf_len + qd->tcp_rxlen); - memcpy(qd->tcp_rxqueue + qd->tcp_rxlen, buf, buf_len); - qd->tcp_rxlen += buf_len; - + /* purple_debug_info("TCP_PENDING", "Read %d bytes, rxlen is %d\n", buf_len, conn->tcp_rxlen); */ + conn->tcp_rxqueue = g_realloc(conn->tcp_rxqueue, buf_len + conn->tcp_rxlen); + memcpy(conn->tcp_rxqueue + conn->tcp_rxlen, buf, buf_len); + conn->tcp_rxlen += buf_len; + pkt = g_newa(guint8, MAX_PACKET_SIZE); - while (1) { - if (qd->tcp_rxlen < QQ_TCP_HEADER_LENGTH) { + while (PURPLE_CONNECTION_IS_VALID(gc)) { + if (qd->openconns == NULL) { break; } - - bytes = 0; - bytes += qq_get16(&pkt_len, qd->tcp_rxqueue + bytes); - if (qd->tcp_rxlen < pkt_len) { + if (conn->tcp_rxqueue == NULL) { + conn->tcp_rxlen = 0; + break; + } + if (conn->tcp_rxlen < QQ_TCP_HEADER_LENGTH) { break; } - /* - purple_debug(PURPLE_DEBUG_INFO, "TCP_PENDING", - "Packet len is %d bytes, rxlen is %d\n", pkt_len, qd->tcp_rxlen); - */ - if ( pkt_len < QQ_TCP_HEADER_LENGTH - || *(qd->tcp_rxqueue + bytes) != QQ_PACKET_TAG - || *(qd->tcp_rxqueue + pkt_len - 1) != QQ_PACKET_TAIL) { - /* HEY! This isn't even a QQ. What are you trying to pull? */ + bytes = 0; + bytes += qq_get16(&pkt_len, conn->tcp_rxqueue + bytes); + if (conn->tcp_rxlen < pkt_len) { + break; + } - purple_debug(PURPLE_DEBUG_ERROR, "TCP_PENDING", - "Packet error, failed to check header and tail tag\n"); + /* purple_debug_info("TCP_PENDING", "Packet len=%d, rxlen=%d\n", pkt_len, conn->tcp_rxlen); */ + if ( pkt_len < QQ_TCP_HEADER_LENGTH + || *(conn->tcp_rxqueue + bytes) != QQ_PACKET_TAG + || *(conn->tcp_rxqueue + pkt_len - 1) != QQ_PACKET_TAIL) { + /* HEY! This isn't even a QQ. What are you trying to pull? */ + purple_debug_warning("TCP_PENDING", "Packet error, no header or tail tag\n"); - jump = memchr(qd->tcp_rxqueue + 1, QQ_PACKET_TAIL, qd->tcp_rxlen - 1); + jump = memchr(conn->tcp_rxqueue + 1, QQ_PACKET_TAIL, conn->tcp_rxlen - 1); if ( !jump ) { - purple_debug(PURPLE_DEBUG_INFO, "TCP_PENDING", - "Failed to find next QQ_PACKET_TAIL, clear receive buffer\n"); - g_free(qd->tcp_rxqueue); - qd->tcp_rxqueue = NULL; - qd->tcp_rxlen = 0; + purple_debug_warning("TCP_PENDING", "Failed to find next tail, clear receive buffer\n"); + g_free(conn->tcp_rxqueue); + conn->tcp_rxqueue = NULL; + conn->tcp_rxlen = 0; return; } /* jump and over QQ_PACKET_TAIL */ - jump_len = (jump - qd->tcp_rxqueue) + 1; - purple_debug(PURPLE_DEBUG_INFO, "TCP_PENDING", - "Find next QQ_PACKET_TAIL at %d, jump %d bytes\n", jump_len, jump_len + 1); - g_memmove(qd->tcp_rxqueue, jump, qd->tcp_rxlen - jump_len); - qd->tcp_rxlen -= jump_len; + jump_len = (jump - conn->tcp_rxqueue) + 1; + purple_debug_warning("TCP_PENDING", "Find next tail at %d, jump %d\n", jump_len, jump_len + 1); + g_memmove(conn->tcp_rxqueue, jump, conn->tcp_rxlen - jump_len); + conn->tcp_rxlen -= jump_len; continue; } memset(pkt, 0, MAX_PACKET_SIZE); - g_memmove(pkt, qd->tcp_rxqueue + bytes, pkt_len - bytes); - + g_memmove(pkt, conn->tcp_rxqueue + bytes, pkt_len - bytes); + /* jump to next packet */ - qd->tcp_rxlen -= pkt_len; - if (qd->tcp_rxlen) { - /* - purple_debug(PURPLE_DEBUG_ERROR, "TCP_PENDING", "shrink tcp_rxqueue to %d\n", qd->tcp_rxlen); - */ - jump = g_memdup(qd->tcp_rxqueue + pkt_len, qd->tcp_rxlen); - g_free(qd->tcp_rxqueue); - qd->tcp_rxqueue = jump; + conn->tcp_rxlen -= pkt_len; + if (conn->tcp_rxlen) { + /* purple_debug_info("TCP_PENDING", "shrink tcp_rxqueue to %d\n", conn->tcp_rxlen); */ + jump = g_memdup(conn->tcp_rxqueue + pkt_len, conn->tcp_rxlen); + g_free(conn->tcp_rxqueue); + conn->tcp_rxqueue = jump; } else { - /* purple_debug(PURPLE_DEBUG_ERROR, "TCP_PENDING", "free tcp_rxqueue\n"); */ - g_free(qd->tcp_rxqueue); - qd->tcp_rxqueue = NULL; + /* purple_debug_info("TCP_PENDING", "free tcp_rxqueue\n"); */ + g_free(conn->tcp_rxqueue); + conn->tcp_rxqueue = NULL; } if (pkt == NULL) { continue; } - /* do not call packet_process before jump - * packet_process may call disconnect and destory tcp_rxqueue */ - packet_process(gc, pkt, pkt_len - bytes); + /* packet_process may call disconnect and destory data like conn + * do not call packet_process before jump, + * break if packet_process return FALSE */ + if (packet_process(gc, pkt, pkt_len - bytes) == FALSE) { + purple_debug_info("TCP_PENDING", "Connection has been destory\n"); + break; + } } } static void udp_pending(gpointer data, gint source, PurpleInputCondition cond) { - PurpleConnection *gc; + PurpleConnection *gc = (PurpleConnection *) data; qq_data *qd; guint8 *buf; gint buf_len; gc = (PurpleConnection *) data; g_return_if_fail(gc != NULL && gc->proto_data != NULL); + qd = (qq_data *) gc->proto_data; if(cond != PURPLE_INPUT_READ) { purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, @@ -393,13 +473,10 @@ return; } - qd = (qq_data *) gc->proto_data; - g_return_if_fail(qd->fd >= 0); - buf = g_newa(guint8, MAX_PACKET_SIZE); /* here we have UDP proxy suppport */ - buf_len = read(qd->fd, buf, MAX_PACKET_SIZE); + buf_len = read(source, buf, MAX_PACKET_SIZE); if (buf_len <= 0) { purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to read from socket")); @@ -419,73 +496,95 @@ return; } } - + + /* packet_process may call disconnect and destory data like conn + * do not call packet_process before jump, + * break if packet_process return FALSE */ packet_process(gc, buf, buf_len); } -static gint udp_send_out(qq_data *qd, guint8 *data, gint data_len) +static gint udp_send_out(PurpleConnection *gc, guint8 *data, gint data_len) { + qq_data *qd; gint ret; - g_return_val_if_fail(qd != NULL && qd->fd >= 0 && data != NULL && data_len > 0, -1); + g_return_val_if_fail(data != NULL && data_len > 0, -1); + + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); + qd = (qq_data *) gc->proto_data; - /* - purple_debug(PURPLE_DEBUG_INFO, "UDP_SEND_OUT", "Send %d bytes to socket %d\n", data_len, qd->fd); - */ - +#if 0 + purple_debug_info("UDP_SEND_OUT", "Send %d bytes to socket %d\n", data_len, qd->fd); +#endif + errno = 0; ret = send(qd->fd, data, data_len, 0); if (ret < 0 && errno == EAGAIN) { return ret; } - + if (ret < 0) { /* TODO: what to do here - do we really have to disconnect? */ - purple_debug(PURPLE_DEBUG_ERROR, "UDP_SEND_OUT", "Send failed: %d, %s\n", errno, g_strerror(errno)); - purple_connection_error_reason(qd->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, g_strerror(errno)); + purple_debug_error("UDP_SEND_OUT", "Send failed: %d, %s\n", errno, g_strerror(errno)); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, g_strerror(errno)); } return ret; } static void tcp_can_write(gpointer data, gint source, PurpleInputCondition cond) { - qq_data *qd = data; + PurpleConnection *gc = (PurpleConnection *) data; + qq_data *qd; + qq_connection *conn; int ret, writelen; - writelen = purple_circ_buffer_get_max_read(qd->tcp_txbuf); + g_return_if_fail(gc != NULL && gc->proto_data != NULL); + qd = (qq_data *) gc->proto_data; + + conn = connection_find(qd, source); + g_return_if_fail(conn != NULL); + + writelen = purple_circ_buffer_get_max_read(conn->tcp_txbuf); if (writelen == 0) { - purple_input_remove(qd->tx_handler); - qd->tx_handler = 0; + purple_input_remove(conn->can_write_handler); + conn->can_write_handler = 0; return; } - ret = write(qd->fd, qd->tcp_txbuf->outptr, writelen); - purple_debug(PURPLE_DEBUG_ERROR, "TCP_CAN_WRITE", - "total %d bytes is sent %d\n", writelen, ret); + ret = write(source, conn->tcp_txbuf->outptr, writelen); + purple_debug_info("TCP_CAN_WRITE", "total %d bytes is sent %d\n", writelen, ret); if (ret < 0 && errno == EAGAIN) return; else if (ret < 0) { /* TODO: what to do here - do we really have to disconnect? */ - purple_connection_error_reason(qd->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Write Error")); return; } - purple_circ_buffer_mark_read(qd->tcp_txbuf, ret); + purple_circ_buffer_mark_read(conn->tcp_txbuf, ret); } -static gint tcp_send_out(qq_data *qd, guint8 *data, gint data_len) +static gint tcp_send_out(PurpleConnection *gc, guint8 *data, gint data_len) { + qq_data *qd; + qq_connection *conn; gint ret; - g_return_val_if_fail(qd != NULL && qd->fd >= 0 && data != NULL && data_len > 0, -1); + g_return_val_if_fail(data != NULL && data_len > 0, -1); + + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); + qd = (qq_data *) gc->proto_data; - /* - purple_debug(PURPLE_DEBUG_INFO, "TCP_SEND_OUT", "Send %d bytes to socket %d\n", data_len, qd->fd); - */ + conn = connection_find(qd, qd->fd); + g_return_val_if_fail(conn, -1); - if (qd->tx_handler == 0) { +#if 0 + purple_debug_info("TCP_SEND_OUT", "Send %d bytes to socket %d\n", data_len, qd->fd); +#endif + + if (conn->can_write_handler == 0) { ret = write(qd->fd, data, data_len); } else { ret = -1; @@ -493,28 +592,28 @@ } /* - purple_debug(PURPLE_DEBUG_INFO, "TCP_SEND_OUT", + purple_debug_info("TCP_SEND_OUT", "Socket %d, total %d bytes is sent %d\n", qd->fd, data_len, ret); */ if (ret < 0 && errno == EAGAIN) { /* socket is busy, send later */ - purple_debug(PURPLE_DEBUG_INFO, "TCP_SEND_OUT", "Socket is busy and send later\n"); + purple_debug_info("TCP_SEND_OUT", "Socket is busy and send later\n"); ret = 0; } else if (ret <= 0) { /* TODO: what to do here - do we really have to disconnect? */ - purple_debug(PURPLE_DEBUG_ERROR, "TCP_SEND_OUT", + purple_debug_error("TCP_SEND_OUT", "Send to socket %d failed: %d, %s\n", qd->fd, errno, g_strerror(errno)); - purple_connection_error_reason(qd->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, g_strerror(errno)); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, g_strerror(errno)); return ret; } if (ret < data_len) { - purple_debug(PURPLE_DEBUG_INFO, "TCP_SEND_OUT", + purple_debug_info("TCP_SEND_OUT", "Add %d bytes to buffer\n", data_len - ret); - if (qd->tx_handler == 0) { - qd->tx_handler = purple_input_add(qd->fd, PURPLE_INPUT_WRITE, tcp_can_write, qd); + if (conn->can_write_handler == 0) { + conn->can_write_handler = purple_input_add(qd->fd, PURPLE_INPUT_WRITE, tcp_can_write, gc); } - purple_circ_buffer_append(qd->tcp_txbuf, data + ret, data_len - ret); + purple_circ_buffer_append(conn->tcp_txbuf, data + ret, data_len - ret); } return ret; } @@ -528,17 +627,17 @@ g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, TRUE); qd = (qq_data *) gc->proto_data; - is_lost_conn = qq_trans_scan(qd); + is_lost_conn = qq_trans_scan(gc); if (is_lost_conn) { purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Connection lost")); return TRUE; } - if ( !qd->logged_in ) { + if ( !qd->is_login ) { return TRUE; } - + qd->itv_count.keep_alive--; if (qd->itv_count.keep_alive <= 0) { qd->itv_count.keep_alive = qd->itv_config.keep_alive; @@ -553,55 +652,29 @@ qd->itv_count.update--; if (qd->itv_count.update <= 0) { qd->itv_count.update = qd->itv_config.update; - qq_send_packet_get_buddies_online(gc, 0); - - qq_send_cmd_group_all_get_online_members(gc); + qq_update_online(gc, 0); return TRUE; } return TRUE; /* if return FALSE, timeout callback stops */ } -/* the callback function after socket is built - * we setup the qq protocol related configuration here */ -static void qq_connect_cb(gpointer data, gint source, const gchar *error_message) +static void do_request_token(PurpleConnection *gc) { qq_data *qd; - PurpleConnection *gc; gchar *conn_msg; const gchar *passwd; - PurpleAccount *account ; - - gc = (PurpleConnection *) data; - - if (!PURPLE_CONNECTION_IS_VALID(gc)) { - purple_debug(PURPLE_DEBUG_INFO, "QQ_CONN", "Invalid connection\n"); - close(source); - return; - } - - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - - qd = (qq_data *) gc->proto_data; - account = purple_connection_get_account(gc); - - /* Connect is now complete; clear the PurpleProxyConnectData */ - qd->connect_data = NULL; - - if (source < 0) { /* socket returns -1 */ - purple_debug(PURPLE_DEBUG_INFO, "QQ_CONN", "Invalid connection, source is < 0\n"); - qq_disconnect(gc); - reconnect_later(gc); - return; - } /* _qq_show_socket("Got login socket", source); */ + g_return_if_fail(gc != NULL && gc->proto_data != NULL); + qd = (qq_data *) gc->proto_data; + /* QQ use random seq, to minimize duplicated packets */ - srandom(time(NULL)); - qd->send_seq = random() & 0x0000ffff; - qd->fd = source; - qd->logged_in = FALSE; + srand(time(NULL)); + qd->send_seq = rand() & 0xffff; + + qd->is_login = FALSE; qd->channel = 1; qd->uid = strtol(purple_account_get_username(purple_connection_get_account(gc)), NULL, 10); @@ -614,41 +687,63 @@ qq_get_md5(qd->password_twice_md5, sizeof(qd->password_twice_md5), qd->password_twice_md5, sizeof(qd->password_twice_md5)); - g_return_if_fail(qd->network_timeout == 0); - qd->itv_config.resend = purple_account_get_int(account, "resend_interval", 10); - if (qd->itv_config.resend <= 0) qd->itv_config.resend = 10; - - qd->itv_config.keep_alive = purple_account_get_int(account, "keep_alive_interval", 60); - if (qd->itv_config.keep_alive < 30) qd->itv_config.keep_alive = 30; - qd->itv_config.keep_alive /= qd->itv_config.resend; - qd->itv_count.keep_alive = qd->itv_config.keep_alive; - - qd->itv_config.update = purple_account_get_int(account, "update_interval", 300); - if (qd->itv_config.update > 0) { - if (qd->itv_config.update < qd->itv_config.keep_alive) { - qd->itv_config.update = qd->itv_config.keep_alive; - } - qd->itv_config.update /= qd->itv_config.resend; - qd->itv_count.update = qd->itv_config.update; - } else { - qd->itv_config.update = 0; - } - - qd->network_timeout = purple_timeout_add(qd->itv_config.resend *1000, network_timeout, gc); - - if (qd->use_tcp) - gc->inpa = purple_input_add(qd->fd, PURPLE_INPUT_READ, tcp_pending, gc); - else - gc->inpa = purple_input_add(qd->fd, PURPLE_INPUT_READ, udp_pending, gc); + g_return_if_fail(qd->network_watcher == 0); + qd->network_watcher = purple_timeout_add_seconds(qd->itv_config.resend, network_timeout, gc); /* Update the login progress status display */ - conn_msg = g_strdup_printf("Login as %d", qd->uid); - purple_connection_update_progress(gc, conn_msg, QQ_CONNECT_STEPS - 1, QQ_CONNECT_STEPS); + conn_msg = g_strdup_printf(_("Request token")); + purple_connection_update_progress(gc, conn_msg, 2, QQ_CONNECT_STEPS); g_free(conn_msg); qq_send_packet_token(gc); } +/* the callback function after socket is built + * we setup the qq protocol related configuration here */ +static void connect_cb(gpointer data, gint source, const gchar *error_message) +{ + PurpleConnection *gc; + qq_data *qd; + PurpleAccount *account ; + qq_connection *conn; + + gc = (PurpleConnection *) data; + g_return_if_fail(gc != NULL && gc->proto_data != NULL); + + qd = (qq_data *) gc->proto_data; + account = purple_connection_get_account(gc); + + /* conn_data will be destoryed */ + qd->conn_data = NULL; + + if (!PURPLE_CONNECTION_IS_VALID(gc)) { + purple_debug_info("QQ_CONN", "Invalid connection\n"); + close(source); + return; + } + + if (source < 0) { /* socket returns -1 */ + purple_debug_info("QQ_CONN", + "Could not establish a connection with the server:\n%s\n", + error_message); + if (qd->connect_watcher > 0) purple_timeout_remove(qd->connect_watcher); + qd->connect_watcher = purple_timeout_add_seconds(QQ_CONNECT_INTERVAL, qq_connect_later, gc); + return; + } + + /* _qq_show_socket("Got login socket", source); */ + qd->fd = source; + conn = connection_create(qd, source); + if (qd->use_tcp) { + conn->input_handler = purple_input_add(source, PURPLE_INPUT_READ, tcp_pending, gc); + } else { + conn->input_handler = purple_input_add(source, PURPLE_INPUT_READ, udp_pending, gc); + } + + do_request_token( gc ); +} + +#ifndef purple_proxy_connect_udp static void udp_can_write(gpointer data, gint source, PurpleInputCondition cond) { PurpleConnection *gc; @@ -679,22 +774,22 @@ ret = getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len); if (ret == 0 && error == EINPROGRESS) return; /* we'll be called again later */ - - purple_input_remove(qd->tx_handler); - qd->tx_handler = 0; + + purple_input_remove(qd->udp_can_write_handler); + qd->udp_can_write_handler = 0; if (ret < 0 || error != 0) { - if(ret != 0) + if(ret != 0) error = errno; close(source); purple_debug_error("proxy", "getsockopt SO_ERROR check: %s\n", g_strerror(error)); - qq_connect_cb(gc, -1, _("Unable to connect")); + connect_cb(gc, -1, _("Unable to connect")); return; } - qq_connect_cb(gc, source, NULL); + connect_cb(gc, source, NULL); } static void udp_host_resolved(GSList *hosts, gpointer data, const char *error_message) { @@ -725,7 +820,7 @@ hosts = g_slist_remove(hosts, hosts->data); memcpy(&server_addr, hosts->data, addr_size); g_free(hosts->data); - + hosts = g_slist_remove(hosts, hosts->data); while(hosts) { hosts = g_slist_remove(hosts, hosts->data); @@ -735,7 +830,7 @@ fd = socket(PF_INET, SOCK_DGRAM, 0); if (fd < 0) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "Unable to create socket: %s\n", g_strerror(errno)); return; } @@ -752,122 +847,97 @@ * If a UDP socket is unconnected, which is the normal state after a * bind() call, then send() or write() are not allowed, since no * destination is available; only sendto() can be used to send data. - * + * * Calling connect() on the socket simply records the specified address * and port number as being the desired communications partner. That * means that send() or write() are now allowed; they use the destination * address and port given on the connect call as the destination of packets. */ if (connect(fd, &server_addr, addr_size) >= 0) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Connected.\n"); + purple_debug_info("QQ", "Connected.\n"); flags = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, flags & ~O_NONBLOCK); - qq_connect_cb(gc, fd, NULL); + connect_cb(gc, fd, NULL); return; } - + /* [EINPROGRESS] - * The socket is marked as non-blocking and the connection cannot be - * completed immediately. It is possible to select for completion by + * The socket is marked as non-blocking and the connection cannot be + * completed immediately. It is possible to select for completion by * selecting the socket for writing. * [EINTR] - * A signal interrupted the call. + * A signal interrupted the call. * The connection is established asynchronously. */ if ((errno == EINPROGRESS) || (errno == EINTR)) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Connect in asynchronous mode.\n"); - qd->tx_handler = purple_input_add(fd, PURPLE_INPUT_WRITE, udp_can_write, gc); + purple_debug_warning( "QQ", "Connect in asynchronous mode.\n"); + qd->udp_can_write_handler = purple_input_add(fd, PURPLE_INPUT_WRITE, udp_can_write, gc); return; } - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Connection failed: %s\n", g_strerror(errno)); + purple_debug_error("QQ", "Connection failed: %s\n", g_strerror(errno)); close(fd); } +#endif -/* establish a generic QQ connection - * TCP/UDP, and direct/redirected */ -void qq_connect(PurpleAccount *account) +gboolean connect_to_server(PurpleConnection *gc, gchar *server, gint port) { - PurpleConnection *gc; + PurpleAccount *account ; qq_data *qd; gchar *conn_msg; - gc = purple_account_get_connection(account); - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, FALSE); + account = purple_connection_get_account(gc); qd = (qq_data *) gc->proto_data; - - /* test set_new_server - while (set_new_server(qd)) { - purple_debug(PURPLE_DEBUG_INFO, "QQ_TEST", - "New server %s:%d Real server %s:%d\n", - qd->server_name, qd->user_port, qd->real_hostname, qd->real_port); - } - purple_debug(PURPLE_DEBUG_INFO, "QQ_TEST", "qd->servers %lu\n", - qd->servers); - exit(1); - */ - if (qd->server_name == NULL) { - /* must be first call this function */ - if ( set_new_server(qd) != TRUE) { - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Failed to connect server")); - return; - } + if (server == NULL || strlen(server) == 0 || port == 0) { + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Invalid server or port")); + return FALSE; } - if (qd->real_hostname == NULL || qd->real_port == 0) { - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("hostname is NULL or port is 0")); - return; - } - - conn_msg = g_strdup_printf( _("Connecting server %s, retries %d"), - qd->real_hostname, qd->reconnect_times); + conn_msg = g_strdup_printf( _("Connecting server %s, retries %d"), server, port); purple_connection_update_progress(gc, conn_msg, 1, QQ_CONNECT_STEPS); g_free(conn_msg); - if (qd->is_redirect) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Redirect to %s:%d\n", - qd->real_hostname, qd->real_port); - } - qd->is_redirect = FALSE; + purple_debug_info("QQ", "Connect to %s:%d\n", server, port); + + if (qd->conn_data != NULL) { + purple_proxy_connect_cancel(qd->conn_data); + qd->conn_data = NULL; + } - qd->fd = -1; - qd->tx_handler = 0; - - /* QQ connection via UDP/TCP. +#ifdef purple_proxy_connect_udp + if (qd->use_tcp) { + qd->conn_data = purple_proxy_connect(gc, account, server, port, connect_cb, gc); + } else { + qd->conn_data = purple_proxy_connect_udp(gc, account, server, port, connect_cb, gc); + } + if ( qd->conn_data == NULL ) { + purple_debug_error("QQ", _("Couldn't create socket")); + return FALSE; + } +#else + /* QQ connection via UDP/TCP. * Now use Purple proxy function to provide TCP proxy support, * and qq_udp_proxy.c to add UDP proxy support (thanks henry) */ if(qd->use_tcp) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "TCP Connect to %s:%d\n", - qd->real_hostname, qd->real_port); - - /* TODO: is there a good default grow size? */ - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Create tcp_txbuf\n"); - qd->tcp_txbuf = purple_circ_buffer_new(0); - - qd->connect_data = purple_proxy_connect(NULL, account, - qd->real_hostname, qd->real_port, qq_connect_cb, gc); - if (qd->connect_data == NULL) { - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Unable to connect.")); + qd->conn_data = purple_proxy_connect(gc, account, server, port, connect_cb, gc); + if ( qd->conn_data == NULL ) { + purple_debug_error("QQ", "Unable to connect."); + return FALSE; } - return; + return TRUE; } - - purple_debug(PURPLE_DEBUG_INFO, "QQ", "UDP Connect to %s:%d\n", - qd->real_hostname, qd->real_port); - g_return_if_fail(qd->udp_query_data == NULL); - qd->udp_query_data = purple_dnsquery_a(qd->real_hostname, qd->real_port, - udp_host_resolved, gc); - if (qd->udp_query_data == NULL) { - purple_connection_error_reason(qd->gc, - PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Could not resolve hostname")); + purple_debug_info("QQ", "UDP Connect to %s:%d\n", server, port); + qd->udp_query_data = purple_dnsquery_a(server, port, udp_host_resolved, gc); + if ( qd->udp_query_data == NULL ) { + purple_debug_error("QQ", "Could not resolve hostname"); + return FALSE; } +#endif + return TRUE; } /* clean up qq_data structure and all its components @@ -879,65 +949,43 @@ g_return_if_fail(gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Disconnecting ...\n"); + purple_debug_info("QQ", "Disconnecting ...\n"); - if (qd->network_timeout > 0) { - purple_timeout_remove(qd->network_timeout); - qd->network_timeout = 0; + if (qd->network_watcher > 0) { + purple_debug_info("QQ", "Remove network watcher\n"); + purple_timeout_remove(qd->network_watcher); + qd->network_watcher = 0; } /* finish all I/O */ - if (qd->fd >= 0 && qd->logged_in) { + if (qd->fd >= 0 && qd->is_login) { qq_send_packet_logout(gc); } - if (gc->inpa > 0) { - purple_input_remove(gc->inpa); - gc->inpa = 0; - } - - if (qd->fd >= 0) { - close(qd->fd); - qd->fd = -1; - } - - if (qd->reconnect_timeout > 0) { - purple_timeout_remove(qd->reconnect_timeout); - qd->reconnect_timeout = 0; - } - - if (qd->connect_data != NULL) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Cancel connect_data\n"); - purple_proxy_connect_cancel(qd->connect_data); + /* not connected */ + if (qd->conn_data != NULL) { + purple_debug_info("QQ", "Connect cancel\n"); + purple_proxy_connect_cancel(qd->conn_data); + qd->conn_data = NULL; } - - if(qd->tcp_txbuf != NULL) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "destroy tcp_txbuf\n"); - purple_circ_buffer_destroy(qd->tcp_txbuf); - qd->tcp_txbuf = NULL; +#ifndef purple_proxy_connect_udp + if (qd->udp_can_write_handler) { + purple_input_remove(qd->udp_can_write_handler); + qd->udp_can_write_handler = 0; } - - if (qd->tx_handler) { - purple_input_remove(qd->tx_handler); - qd->tx_handler = 0; - } - if (qd->tcp_rxqueue != NULL) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "destroy tcp_rxqueue\n"); - g_free(qd->tcp_rxqueue); - qd->tcp_rxqueue = NULL; - qd->tcp_rxlen = 0; - } - if (qd->udp_query_data != NULL) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "destroy udp_query_data\n"); + purple_debug_info("QQ", "destroy udp_query_data\n"); purple_dnsquery_destroy(qd->udp_query_data); qd->udp_query_data = NULL; } +#endif + connection_free_all(qd); + qd->fd = -1; - qq_trans_remove_all(qd); - + qq_trans_remove_all(gc); + if (qd->token) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "free token\n"); + purple_debug_info("QQ", "free token\n"); g_free(qd->token); qd->token = NULL; qd->token_len = 0; @@ -955,13 +1003,13 @@ qq_buddies_list_free(gc->account, qd); } -static gint encap(qq_data *qd, guint8 *buf, gint maxlen, guint16 cmd, guint16 seq, +static gint packet_encap(qq_data *qd, guint8 *buf, gint maxlen, guint16 cmd, guint16 seq, guint8 *data, gint data_len) { gint bytes = 0; g_return_val_if_fail(qd != NULL && buf != NULL && maxlen > 0, -1); g_return_val_if_fail(data != NULL && data_len > 0, -1); - + /* QQ TCP packet has two bytes in the begining defines packet length * so leave room here to store packet size */ if (qd->use_tcp) { @@ -971,7 +1019,7 @@ bytes += qq_put8(buf + bytes, QQ_PACKET_TAG); bytes += qq_put16(buf + bytes, QQ_CLIENT); bytes += qq_put16(buf + bytes, cmd); - + bytes += qq_put16(buf + bytes, seq); bytes += qq_put32(buf + bytes, qd->uid); @@ -987,109 +1035,168 @@ } /* data has been encrypted before */ -gint qq_send_data(qq_data *qd, guint16 cmd, guint16 seq, gboolean need_ack, - guint8 *data, gint data_len) +static gint packet_send_out(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *data, gint data_len) { + qq_data *qd; guint8 *buf; gint buf_len; gint bytes_sent; - g_return_val_if_fail(qd != NULL, -1); + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); + qd = (qq_data *)gc->proto_data; g_return_val_if_fail(data != NULL && data_len > 0, -1); buf = g_newa(guint8, MAX_PACKET_SIZE); memset(buf, 0, MAX_PACKET_SIZE); - buf_len = encap(qd, buf, MAX_PACKET_SIZE, cmd, seq, data, data_len); + buf_len = packet_encap(qd, buf, MAX_PACKET_SIZE, cmd, seq, data, data_len); if (buf_len <= 0) { return -1; } + qd->net_stat.sent++; if (qd->use_tcp) { - bytes_sent = tcp_send_out(qd, buf, buf_len); + bytes_sent = tcp_send_out(gc, buf, buf_len); } else { - bytes_sent = udp_send_out(qd, buf, buf_len); + bytes_sent = udp_send_out(gc, buf, buf_len); } - if (need_ack) { - qq_trans_add_client_cmd(qd, cmd, seq, data, data_len); - } - -#if 1 - /* qq_show_packet("QQ_SEND_DATA", buf, buf_len); */ - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "<== [%05d], 0x%04X %s, total %d bytes is sent %d\n", - seq, cmd, qq_get_cmd_desc(cmd), buf_len, bytes_sent); -#endif return bytes_sent; } -/* Encrypt data with session_key, then call qq_send_data */ -gint qq_send_cmd_detail(qq_data *qd, guint16 cmd, guint16 seq, gboolean need_ack, - guint8 *data, gint data_len) +gint qq_send_cmd_encrypted(PurpleConnection *gc, guint16 cmd, guint16 seq, + guint8 *encrypted_data, gint encrypted_len, gboolean is_save2trans) { + gint sent_len; + +#if 1 + /* qq_show_packet("qq_send_cmd_encrypted", data, data_len); */ + purple_debug_info("QQ", "<== [%05d], %s(0x%04X), datalen %d\n", + seq, qq_get_cmd_desc(cmd), cmd, encrypted_len); +#endif + + sent_len = packet_send_out(gc, cmd, seq, encrypted_data, encrypted_len); + if (is_save2trans) { + qq_trans_add_client_cmd(gc, cmd, seq, encrypted_data, encrypted_len, 0, 0); + } + return sent_len; +} + +/* Encrypt data with session_key, and send packet out */ +static gint send_cmd_detail(PurpleConnection *gc, guint16 cmd, guint16 seq, + guint8 *data, gint data_len, gboolean is_save2trans, gint update_class, guint32 ship32) +{ + qq_data *qd; guint8 *encrypted_data; gint encrypted_len; + gint bytes_sent; - g_return_val_if_fail(qd != NULL, -1); + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); + qd = (qq_data *)gc->proto_data; g_return_val_if_fail(data != NULL && data_len > 0, -1); /* at most 16 bytes more */ encrypted_data = g_newa(guint8, data_len + 16); -#if 0 - purple_debug(PURPLE_DEBUG_INFO, "QQ_ENCRYPT", - "Before %d: [%05d] 0x%04X %s\n", - data_len, seq, cmd, qq_get_cmd_desc(cmd)); -#endif encrypted_len = qq_encrypt(encrypted_data, data, data_len, qd->session_key); if (encrypted_len < 16) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ_ENCRYPT", - "Error len %d: [%05d] 0x%04X %s\n", + purple_debug_error("QQ_ENCRYPT", "Error len %d: [%05d] 0x%04X %s\n", encrypted_len, seq, cmd, qq_get_cmd_desc(cmd)); return -1; } -#if 0 - purple_debug(PURPLE_DEBUG_INFO, "QQ_ENCRYPT", - "After %d: [%05d] 0x%04X %s\n", - encrypted_len, seq, cmd, qq_get_cmd_desc(cmd)); -#endif - return qq_send_data(qd, cmd, seq, need_ack, encrypted_data, encrypted_len); + bytes_sent = packet_send_out(gc, cmd, seq, encrypted_data, encrypted_len); + + if (is_save2trans) { + qq_trans_add_client_cmd(gc, cmd, seq, encrypted_data, encrypted_len, + update_class, ship32); + } + return bytes_sent; } -/* set seq and need_ack, then call qq_send_cmd_detail */ -gint qq_send_cmd(qq_data *qd, guint16 cmd, guint8 *data, gint data_len) +gint qq_send_cmd_mess(PurpleConnection *gc, guint16 cmd, guint8 *data, gint data_len, + gint update_class, guint32 ship32) { - g_return_val_if_fail(qd != NULL, -1); + qq_data *qd; + guint16 seq; + + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); + qd = (qq_data *) gc->proto_data; g_return_val_if_fail(data != NULL && data_len > 0, -1); - qd->send_seq++; - return qq_send_cmd_detail(qd, cmd, qd->send_seq, TRUE, data, data_len); + seq = ++qd->send_seq; +#if 1 + purple_debug_info("QQ", "<== [%05d], %s(0x%04X), datalen %d\n", + seq, qq_get_cmd_desc(cmd), cmd, data_len); +#endif + return send_cmd_detail(gc, cmd, seq, data, data_len, TRUE, update_class, ship32); } -gint qq_send_room_cmd_noid(PurpleConnection *gc, guint8 room_cmd, - guint8 *data, gint data_len) +/* set seq and is_save2trans, then call send_cmd_detail */ +gint qq_send_cmd(PurpleConnection *gc, guint16 cmd, guint8 *data, gint data_len) { - return qq_send_room_cmd(gc, room_cmd, 0, data, data_len); + qq_data *qd; + guint16 seq; + gboolean is_save2trans; + + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); + qd = (qq_data *) gc->proto_data; + g_return_val_if_fail(data != NULL && data_len > 0, -1); + + if (cmd != QQ_CMD_LOGOUT) { + seq = ++qd->send_seq; + is_save2trans = TRUE; + } else { + seq = 0xFFFF; + is_save2trans = FALSE; + } +#if 1 + purple_debug_info("QQ", "<== [%05d], %s(0x%04X), datalen %d\n", + seq, qq_get_cmd_desc(cmd), cmd, data_len); +#endif + return send_cmd_detail(gc, cmd, seq, data, data_len, is_save2trans, 0, 0); } -gint qq_send_room_cmd_only(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) +/* set seq and is_save2trans, then call send_cmd_detail */ +gint qq_send_server_reply(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *data, gint data_len) { - g_return_val_if_fail(room_cmd > 0 && room_id > 0, -1); - return qq_send_room_cmd(gc, room_cmd, room_id, NULL, 0); + qq_data *qd; + guint8 *encrypted_data; + gint encrypted_len; + gint bytes_sent; + + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); + qd = (qq_data *)gc->proto_data; + g_return_val_if_fail(data != NULL && data_len > 0, -1); + +#if 1 + purple_debug_info("QQ", "<== [SRV-%05d], %s(0x%04X), datalen %d\n", + seq, qq_get_cmd_desc(cmd), cmd, data_len); +#endif + /* at most 16 bytes more */ + encrypted_data = g_newa(guint8, data_len + 16); + encrypted_len = qq_encrypt(encrypted_data, data, data_len, qd->session_key); + if (encrypted_len < 16) { + purple_debug_error("QQ_ENCRYPT", "Error len %d: [%05d] 0x%04X %s\n", + encrypted_len, seq, cmd, qq_get_cmd_desc(cmd)); + return -1; + } + + bytes_sent = packet_send_out(gc, cmd, seq, encrypted_data, encrypted_len); + qq_trans_add_server_reply(gc, cmd, seq, encrypted_data, encrypted_len); + + return bytes_sent; } -gint qq_send_room_cmd(PurpleConnection *gc, guint8 room_cmd, guint32 room_id, - guint8 *data, gint data_len) +static gint send_room_cmd(PurpleConnection *gc, guint8 room_cmd, guint32 room_id, + guint8 *data, gint data_len, gint update_class, guint32 ship32) { qq_data *qd; - guint8 *buf; gint buf_len; guint8 *encrypted_data; gint encrypted_len; gint bytes_sent; guint16 seq; - + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); qd = (qq_data *) gc->proto_data; @@ -1106,6 +1213,7 @@ if (data != NULL && data_len > 0) { buf_len += qq_putdata(buf + buf_len, data, data_len); } + qd->send_seq++; seq = qd->send_seq; @@ -1114,32 +1222,44 @@ encrypted_data = g_newa(guint8, buf_len + 16); encrypted_len = qq_encrypt(encrypted_data, buf, buf_len, qd->session_key); if (encrypted_len < 16) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ_ENCRYPT", - "Error len %d: [%05d] QQ_CMD_ROOM.(0x%02X %s)\n", - encrypted_len, seq, room_cmd, qq_get_room_cmd_desc(room_cmd)); - return -1; - } - - /* Encap header to buf */ - buf_len = encap(qd, buf, MAX_PACKET_SIZE, QQ_CMD_ROOM, seq, encrypted_data, encrypted_len); - if (buf_len <= 0) { + purple_debug_error("QQ_ENCRYPT", "Error len %d: [%05d] %s (0x%02X)\n", + encrypted_len, seq, qq_get_room_cmd_desc(room_cmd), room_cmd); return -1; } - if (qd->use_tcp) { - bytes_sent = tcp_send_out(qd, buf, buf_len); - } else { - bytes_sent = udp_send_out(qd, buf, buf_len); - } + bytes_sent = packet_send_out(gc, QQ_CMD_ROOM, seq, encrypted_data, encrypted_len); +#if 1 + /* qq_show_packet("send_room_cmd", buf, buf_len); */ + purple_debug_info("QQ", + "<== [%05d], %s (0x%02X) to room %d, datalen %d\n", + seq, qq_get_room_cmd_desc(room_cmd), room_cmd, room_id, buf_len); +#endif - qq_trans_add_room_cmd(qd, seq, room_cmd, room_id, buf, buf_len); - -#if 1 - /* qq_show_packet("QQ_SEND_DATA", buf, buf_len); */ - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "<== [%05d], QQ_CMD_ROOM.(0x%02X %s) to room %d, total %d bytes is sent %d\n", - seq, room_cmd, qq_get_room_cmd_desc(room_cmd), room_id, - buf_len, bytes_sent); -#endif + qq_trans_add_room_cmd(gc, seq, room_cmd, room_id, encrypted_data, encrypted_len, + update_class, ship32); return bytes_sent; } + +gint qq_send_room_cmd_mess(PurpleConnection *gc, guint8 room_cmd, guint32 room_id, + guint8 *data, gint data_len, gint update_class, guint32 ship32) +{ + return send_room_cmd(gc, room_cmd, room_id, data, data_len, update_class, ship32); +} + +gint qq_send_room_cmd(PurpleConnection *gc, guint8 room_cmd, guint32 room_id, + guint8 *data, gint data_len) +{ + return send_room_cmd(gc, room_cmd, room_id, data, data_len, 0, 0); +} + +gint qq_send_room_cmd_noid(PurpleConnection *gc, guint8 room_cmd, + guint8 *data, gint data_len) +{ + return send_room_cmd(gc, room_cmd, 0, data, data_len, 0, 0); +} + +gint qq_send_room_cmd_only(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) +{ + g_return_val_if_fail(room_cmd > 0 && room_id > 0, -1); + return send_room_cmd(gc, room_cmd, room_id, NULL, 0, 0, 0); +}
--- a/libpurple/protocols/qq/qq_network.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/qq_network.h Tue Sep 16 20:01:24 2008 +0000 @@ -32,19 +32,23 @@ #define QQ_CONNECT_STEPS 3 /* steps in connection */ -void qq_connect(PurpleAccount *account); +gboolean qq_connect_later(gpointer data); void qq_disconnect(PurpleConnection *gc); -void qq_connect_later(PurpleConnection *gc); -gint qq_send_cmd(qq_data *qd, guint16 cmd, guint8 *data, gint datalen); -gint qq_send_data(qq_data *qd, guint16 cmd, guint16 seq, gboolean need_ack, - guint8 *data, gint data_len); -gint qq_send_cmd_detail(qq_data *qd, guint16 cmd, guint16 seq, gboolean need_ack, - guint8 *data, gint data_len); +gint qq_send_cmd_encrypted(PurpleConnection *gc, guint16 cmd, guint16 seq, + guint8 *encrypted_data, gint encrypted_len, gboolean is_save2trans); +gint qq_send_cmd(PurpleConnection *gc, guint16 cmd, guint8 *data, gint datalen); +gint qq_send_cmd_mess(PurpleConnection *gc, guint16 cmd, guint8 *data, gint data_len, + gint update_class, guint32 ship32); + +gint qq_send_server_reply(PurpleConnection *gc, guint16 cmd, guint16 seq, + guint8 *data, gint data_len); gint qq_send_room_cmd(PurpleConnection *gc, guint8 room_cmd, guint32 room_id, guint8 *data, gint data_len); +gint qq_send_room_cmd_mess(PurpleConnection *gc, guint8 room_cmd, guint32 room_id, + guint8 *data, gint data_len, gint update_class, guint32 ship32); gint qq_send_room_cmd_only(PurpleConnection *gc, guint8 room_cmd, guint32 room_id); -gint qq_send_room_cmd_noid(PurpleConnection *gc, guint8 room_cmd, +gint qq_send_room_cmd_noid(PurpleConnection *gc, guint8 room_cmd, guint8 *data, gint data_len); #endif
--- a/libpurple/protocols/qq/qq_process.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/qq_process.c Tue Sep 16 20:01:24 2008 +0000 @@ -26,11 +26,6 @@ #include "debug.h" #include "internal.h" -#ifdef _WIN32 -#define random rand -#define srandom srand -#endif - #include "buddy_info.h" #include "buddy_list.h" #include "buddy_opt.h" @@ -65,7 +60,7 @@ }; /* default process, decrypt and dump */ -static void process_cmd_unknow(PurpleConnection *gc,gchar *title, guint8 *data, gint data_len, guint16 cmd, guint16 seq) +static void process_cmd_unknow(PurpleConnection *gc,const gchar *title, guint8 *data, gint data_len, guint16 cmd, guint16 seq) { qq_data *qd; gchar *msg_utf8 = NULL; @@ -82,14 +77,13 @@ seq, qq_get_cmd_desc(cmd)); msg_utf8 = try_dump_as_gbk(data, data_len); - if (msg_utf8) { - purple_notify_info(gc, NULL, msg_utf8, NULL); + if (msg_utf8 != NULL) { + purple_notify_info(gc, _("QQ Error"), title, msg_utf8); g_free(msg_utf8); } } -void qq_proc_cmd_server(PurpleConnection *gc, - guint16 cmd, guint16 seq, guint8 *rcved, gint rcved_len) +void qq_proc_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *rcved, gint rcved_len) { qq_data *qd; @@ -102,20 +96,20 @@ data = g_newa(guint8, rcved_len); data_len = qq_decrypt(data, rcved, rcved_len, qd->session_key); if (data_len < 0) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Can not decrypt server cmd by session key, [%05d], 0x%04X %s, len %d\n", + purple_debug_warning("QQ", + "Can not decrypt server cmd by session key, [%05d], 0x%04X %s, len %d\n", seq, cmd, qq_get_cmd_desc(cmd), rcved_len); qq_show_packet("Can not decrypted", rcved, rcved_len); return; } if (data_len <= 0) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Server cmd decrypted is empty, [%05d], 0x%04X %s, len %d\n", + purple_debug_warning("QQ", + "Server cmd decrypted is empty, [%05d], 0x%04X %s, len %d\n", seq, cmd, qq_get_cmd_desc(cmd), rcved_len); return; } - + /* now process the packet */ switch (cmd) { case QQ_CMD_RECV_IM: @@ -124,107 +118,208 @@ case QQ_CMD_RECV_MSG_SYS: qq_process_msg_sys(data, data_len, seq, gc); break; - case QQ_CMD_RECV_MSG_BUDDY_CHANGE_STATUS: + case QQ_CMD_BUDDY_CHANGE_STATUS: qq_process_buddy_change_status(data, data_len, gc); break; default: - process_cmd_unknow(gc, "Unknow SERVER CMD", data, data_len, cmd, seq); + process_cmd_unknow(gc, _("Unknow SERVER CMD"), data, data_len, cmd, seq); break; } } -static void process_cmd_login(PurpleConnection *gc, guint8 *data, gint data_len) +static void process_room_cmd_notify(PurpleConnection *gc, + guint8 room_cmd, guint8 room_id, guint8 reply, guint8 *data, gint data_len) { - qq_data *qd; - guint ret_8; - - g_return_if_fail (gc != NULL && gc->proto_data != NULL); - - qd = (qq_data *) gc->proto_data; - - ret_8 = qq_process_login_reply(data, data_len, gc); - if (ret_8 == QQ_LOGIN_REPLY_OK) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login repliess OK; everything is fine\n"); - - purple_connection_set_state(gc, PURPLE_CONNECTED); - qd->logged_in = TRUE; /* must be defined after sev_finish_login */ - - /* now initiate QQ Qun, do it first as it may take longer to finish */ - qq_group_init(gc); - - /* Now goes on updating my icon/nickname, not showing info_window */ - qd->modifying_face = FALSE; - - qq_send_packet_get_info(gc, qd->uid, FALSE); - /* grab my level */ - qq_send_packet_get_level(gc, qd->uid); - - qq_send_packet_change_status(gc); - - /* refresh buddies */ - qq_send_packet_get_buddies_list(gc, 0); - - /* refresh groups */ - qq_send_packet_get_buddies_and_rooms(gc, 0); - - return; - } - - if (ret_8 == QQ_LOGIN_REPLY_REDIRECT) { - qd->is_redirect = TRUE; - /* - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Redirected to new server: %s:%d\n", qd->real_hostname, qd->real_port); - */ - return; - } - - if (ret_8 == QQ_LOGIN_REPLY_ERR_PWD) { - if (!purple_account_get_remember_password(gc->account)) { - purple_account_set_password(gc->account, NULL); - } - purple_connection_error_reason(gc, - PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Incorrect password.")); - return; - } - - if (ret_8 == QQ_LOGIN_REPLY_ERR_MISC) { - if (purple_debug_is_enabled()) - purple_connection_error_reason(gc, - PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login. Check debug log.")); - else - purple_connection_error_reason(gc, - PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login")); - return; - } -} - -static void process_room_cmd_notify(PurpleConnection *gc, - guint8 room_cmd, guint8 room_id, guint8 reply_cmd, guint8 reply, guint8 *data, gint data_len) -{ + gchar *prim; gchar *msg, *msg_utf8; g_return_if_fail(data != NULL && data_len > 0); msg = g_strndup((gchar *) data, data_len); /* it will append 0x00 */ msg_utf8 = qq_to_utf8(msg, QQ_CHARSET_DEFAULT); g_free(msg); - - msg = g_strdup_printf(_( - "Reply %s(0x%02X )\n" - "Sent %s(0x%02X )\n" - "Room id %d, reply [0x%02X]: \n" - "%s"), - qq_get_room_cmd_desc(reply_cmd), reply_cmd, - qq_get_room_cmd_desc(room_cmd), room_cmd, - room_id, reply, msg_utf8); - - purple_notify_error(gc, NULL, _("Failed room reply"), msg); - g_free(msg); + + prim = g_strdup_printf(_("Error reply of %s(0x%02X)\nRoom %d, reply 0x%02X"), + qq_get_room_cmd_desc(room_cmd), room_cmd, room_id, reply); + + purple_notify_error(gc, _("QQ Qun Command"), prim, msg_utf8); + + g_free(prim); g_free(msg_utf8); } -void qq_proc_room_cmd_reply(PurpleConnection *gc, - guint16 seq, guint8 room_cmd, guint32 room_id, guint8 *rcved, gint rcved_len) +void qq_update_room(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) +{ + qq_data *qd; + qq_group *group; + gint ret; + + g_return_if_fail (gc != NULL && gc->proto_data != NULL); + qd = (qq_data *) gc->proto_data; + + group = qq_room_search_id(gc, room_id); + if (group == NULL && room_id <= 0) { + purple_debug_info("QQ", "No room, nothing update\n"); + return; + } + if (group == NULL ) { + purple_debug_warning("QQ", "Failed search room id [%d]\n", room_id); + return; + } + + switch (room_cmd) { + case 0: + qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, group->id, NULL, 0, + QQ_CMD_CLASS_UPDATE_ROOM, 0); + break; + case QQ_ROOM_CMD_GET_INFO: + ret = qq_request_room_get_buddies(gc, group, QQ_CMD_CLASS_UPDATE_ROOM); + if (ret <= 0) { + qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_ONLINES, group->id, NULL, 0, + QQ_CMD_CLASS_UPDATE_ROOM, 0); + } + break; + case QQ_ROOM_CMD_GET_BUDDIES: + qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_ONLINES, group->id, NULL, 0, + QQ_CMD_CLASS_UPDATE_ROOM, 0); + break; + case QQ_ROOM_CMD_GET_ONLINES: + /* last command */ + default: + break; + } +} + +static void update_all_rooms(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) +{ + qq_data *qd; + gboolean is_new_turn = FALSE; + qq_group *next_group; + + g_return_if_fail (gc != NULL && gc->proto_data != NULL); + qd = (qq_data *) gc->proto_data; + + next_group = qq_room_get_next(gc, room_id); + if (next_group == NULL && room_id <= 0) { + purple_debug_info("QQ", "No room. Finished update\n"); + return; + } + if (next_group == NULL ) { + is_new_turn = TRUE; + next_group = qq_room_get_next(gc, 0); + g_return_if_fail(next_group != NULL); + } + + switch (room_cmd) { + case 0: + qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, next_group->id, NULL, 0, + QQ_CMD_CLASS_UPDATE_ALL, 0); + break; + case QQ_ROOM_CMD_GET_INFO: + if (!is_new_turn) { + qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, next_group->id, NULL, 0, + QQ_CMD_CLASS_UPDATE_ALL, 0); + } else { + qq_request_room_get_buddies(gc, next_group, QQ_CMD_CLASS_UPDATE_ALL); + } + break; + case QQ_ROOM_CMD_GET_BUDDIES: + /* last command */ + if (!is_new_turn) { + qq_request_room_get_buddies(gc, next_group, QQ_CMD_CLASS_UPDATE_ALL); + } else { + purple_debug_info("QQ", "Finished update\n"); + } + break; + default: + break; + } +} + +void qq_update_all(PurpleConnection *gc, guint16 cmd) +{ + qq_data *qd; + + g_return_if_fail (gc != NULL && gc->proto_data != NULL); + qd = (qq_data *) gc->proto_data; + + switch (cmd) { + case 0: + qq_request_buddy_info(gc, qd->uid, QQ_CMD_CLASS_UPDATE_ALL, QQ_BUDDY_INFO_UPDATE_ONLY); + break; + case QQ_CMD_GET_BUDDY_INFO: + qq_request_change_status(gc, QQ_CMD_CLASS_UPDATE_ALL); + break; + case QQ_CMD_CHANGE_STATUS: + qq_request_get_buddies_list(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); + break; + case QQ_CMD_GET_BUDDIES_LIST: + qq_request_get_buddies_and_rooms(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); + break; + case QQ_CMD_GET_BUDDIES_AND_ROOMS: + qq_request_get_buddies_level(gc, QQ_CMD_CLASS_UPDATE_ALL); + break; + case QQ_CMD_GET_LEVEL: + qq_request_get_buddies_online(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); + break; + case QQ_CMD_GET_BUDDIES_ONLINE: + /* last command */ + update_all_rooms(gc, 0, 0); + break; + default: + break; + } +} + +static void update_all_rooms_online(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) +{ + qq_data *qd; + qq_group *next_group; + + g_return_if_fail (gc != NULL && gc->proto_data != NULL); + qd = (qq_data *) gc->proto_data; + + next_group = qq_room_get_next_conv(gc, room_id); + if (next_group == NULL && room_id <= 0) { + purple_debug_info("QQ", "No room in conversation, no update online buddies\n"); + return; + } + if (next_group == NULL ) { + purple_debug_info("QQ", "finished update rooms' online buddies\n"); + return; + } + + switch (room_cmd) { + case 0: + qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_ONLINES, next_group->id, NULL, 0, + QQ_CMD_CLASS_UPDATE_ALL, 0); + break; + case QQ_ROOM_CMD_GET_ONLINES: + qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_ONLINES, next_group->id, NULL, 0, + QQ_CMD_CLASS_UPDATE_ALL, 0); + break; + default: + break; + } +} + +void qq_update_online(PurpleConnection *gc, guint16 cmd) +{ + switch (cmd) { + case 0: + qq_request_get_buddies_online(gc, 0, QQ_CMD_CLASS_UPDATE_ONLINE); + break; + case QQ_CMD_GET_BUDDIES_ONLINE: + /* last command */ + update_all_rooms_online(gc, 0, 0); + break; + default: + break; + } +} + +void qq_proc_room_cmd(PurpleConnection *gc, guint16 seq, + guint8 room_cmd, guint32 room_id, guint8 *rcved, gint rcved_len, + gint update_class, guint32 ship32) { qq_data *qd; guint8 *data; @@ -239,58 +334,57 @@ data = g_newa(guint8, rcved_len); data_len = qq_decrypt(data, rcved, rcved_len, qd->session_key); if (data_len < 0) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Can not decrypt room cmd by session key, [%05d], 0x%02X %s for %d, len %d\n", + purple_debug_warning("QQ", + "Can not decrypt room cmd by session key, [%05d], 0x%02X %s for %d, len %d\n", seq, room_cmd, qq_get_room_cmd_desc(room_cmd), room_id, rcved_len); qq_show_packet("Can not decrypted", rcved, rcved_len); return; } if (room_id <= 0) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Invaild room id, [%05d], 0x%02X %s for %d, len %d\n", + purple_debug_warning("QQ", + "Invaild room id, [%05d], 0x%02X %s for %d, len %d\n", + seq, room_cmd, qq_get_room_cmd_desc(room_cmd), room_id, rcved_len); + /* Some room cmd has no room id, like QQ_ROOM_CMD_SEARCH */ + } + + if (data_len <= 2) { + purple_debug_warning("QQ", + "Invaild len of room cmd decrypted, [%05d], 0x%02X %s for %d, len %d\n", seq, room_cmd, qq_get_room_cmd_desc(room_cmd), room_id, rcved_len); return; } - if (data_len <= 2) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Invaild len of room cmd decrypted, [%05d], 0x%02X %s for %d, len %d\n", - seq, room_cmd, qq_get_room_cmd_desc(room_cmd), room_id, rcved_len); - return; - } - group = qq_room_search_id(gc, room_id); if (group == NULL) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Missing room id in [%05d], 0x%02X %s for %d, len %d\n", + purple_debug_warning("QQ", + "Missing room id in [%05d], 0x%02X %s for %d, len %d\n", seq, room_cmd, qq_get_room_cmd_desc(room_cmd), room_id, rcved_len); } - + bytes = 0; bytes += qq_get8(&reply_cmd, data + bytes); bytes += qq_get8(&reply, data + bytes); if (reply_cmd != room_cmd) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Missing room cmd in reply 0x%02X %s, [%05d], 0x%02X %s for %d, len %d\n", + purple_debug_warning("QQ", + "Missing room cmd in reply 0x%02X %s, [%05d], 0x%02X %s for %d, len %d\n", reply_cmd, qq_get_room_cmd_desc(reply_cmd), seq, room_cmd, qq_get_room_cmd_desc(room_cmd), room_id, rcved_len); } - + /* now process the packet */ if (reply != QQ_ROOM_CMD_REPLY_OK) { if (group != NULL) { qq_set_pending_id(&qd->joining_groups, group->ext_id, FALSE); } - + switch (reply) { /* this should be all errors */ case QQ_ROOM_CMD_REPLY_NOT_MEMBER: if (group != NULL) { - purple_debug(PURPLE_DEBUG_WARNING, - "QQ", - _("You are not a member of group \"%s\"\n"), group->group_name_utf8); - group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER; + purple_debug_warning("QQ", + _("You are not a member of QQ Qun \"%s\"\n"), group->title_utf8); + group->my_role = QQ_ROOM_ROLE_NO; qq_group_refresh(gc, group); } break; @@ -300,7 +394,7 @@ purple_roomlist_set_in_progress(qd->roomlist, FALSE); } default: - process_room_cmd_notify(gc, room_cmd, room_id, reply_cmd, reply, data + bytes, data_len - bytes); + process_room_cmd_notify(gc, reply_cmd, room_id, reply, data + bytes, data_len - bytes); } return; } @@ -309,10 +403,6 @@ switch (reply_cmd) { case QQ_ROOM_CMD_GET_INFO: qq_process_room_cmd_get_info(data + bytes, data_len - bytes, gc); - if (group != NULL) { - qq_send_cmd_group_get_members_info(gc, group); - qq_send_cmd_group_get_online_members(gc, group); - } break; case QQ_ROOM_CMD_CREATE: qq_group_process_create_group_reply(data + bytes, data_len - bytes, gc); @@ -346,20 +436,88 @@ if (group != NULL) qq_group_conv_refresh_online_member(gc, group); break; - case QQ_ROOM_CMD_GET_MEMBER_INFO: - qq_process_room_cmd_get_members(data + bytes, data_len - bytes, gc); - if (group != NULL) + case QQ_ROOM_CMD_GET_BUDDIES: + qq_process_room_cmd_get_buddies(data + bytes, data_len - bytes, gc); + if (group != NULL) { + group->is_got_info = TRUE; qq_group_conv_refresh_online_member(gc, group); + } break; default: - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Unknow room cmd 0x%02X %s\n", + purple_debug_warning("QQ", "Unknow room cmd 0x%02X %s\n", reply_cmd, qq_get_room_cmd_desc(reply_cmd)); } + + if (update_class == QQ_CMD_CLASS_NONE) + return; + + purple_debug_info("QQ", "Update class %d\n", update_class); + if (update_class == QQ_CMD_CLASS_UPDATE_ALL) { + update_all_rooms(gc, room_cmd, room_id); + return; + } + if (update_class == QQ_CMD_CLASS_UPDATE_ONLINE) { + update_all_rooms_online(gc, room_cmd, room_id); + return; + } + if (update_class == QQ_CMD_CLASS_UPDATE_ROOM) { + qq_update_room(gc, room_cmd, room_id); + } } -void qq_proc_cmd_reply(PurpleConnection *gc, - guint16 cmd, guint16 seq, guint8 *rcved, gint rcved_len) +void qq_proc_login_cmd(PurpleConnection *gc, guint8 *rcved, gint rcved_len) +{ + qq_data *qd; + guint8 *data; + gint data_len; + guint ret_8; + + g_return_if_fail (gc != NULL && gc->proto_data != NULL); + qd = (qq_data *) gc->proto_data; + + data = g_newa(guint8, rcved_len); + /* May use password_twice_md5 in the past version like QQ2005*/ + data_len = qq_decrypt(data, rcved, rcved_len, qd->inikey); + if (data_len >= 0) { + purple_debug_warning("QQ", + "Decrypt login reply packet with inikey, %d bytes\n", data_len); + } else { + data_len = qq_decrypt(data, rcved, rcved_len, qd->password_twice_md5); + if (data_len >= 0) { + purple_debug_warning("QQ", + "Decrypt login reply packet with password_twice_md5, %d bytes\n", data_len); + } else { + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Can not decrypt login reply")); + return; + } + } + + ret_8 = qq_process_login_reply(gc, data, data_len); + if (ret_8 != QQ_LOGIN_REPLY_OK) { + return; + } + + purple_debug_info("QQ", "Login repliess OK; everything is fine\n"); + + purple_connection_set_state(gc, PURPLE_CONNECTED); + qd->is_login = TRUE; /* must be defined after sev_finish_login */ + + /* now initiate QQ Qun, do it first as it may take longer to finish */ + qq_group_init(gc); + + /* Now goes on updating my icon/nickname, not showing info_window */ + qd->modifying_face = FALSE; + + /* is_login, but we have packets before login */ + qq_trans_process_remained(gc); + + qq_update_all(gc, 0); + return; +} + +void qq_proc_client_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, + guint8 *rcved, gint rcved_len, gint update_class, guint32 ship32) { qq_data *qd; @@ -369,7 +527,7 @@ guint8 ret_8 = 0; guint16 ret_16 = 0; guint32 ret_32 = 0; - gchar *error_msg = NULL; + gboolean is_unknow = FALSE; g_return_if_fail(rcved_len > 0); @@ -377,61 +535,23 @@ qd = (qq_data *) gc->proto_data; data = g_newa(guint8, rcved_len); - if (cmd == QQ_CMD_TOKEN) { - g_memmove(data, rcved, rcved_len); - data_len = rcved_len; - } else if (cmd == QQ_CMD_LOGIN) { - /* May use password_twice_md5 in the past version like QQ2005*/ - data_len = qq_decrypt(data, rcved, rcved_len, qd->inikey); - if (data_len >= 0) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Decrypt login reply packet with inikey, %d bytes\n", data_len); - } else { - data_len = qq_decrypt(data, rcved, rcved_len, qd->password_twice_md5); - if (data_len >= 0) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Decrypt login reply packet with password_twice_md5, %d bytes\n", data_len); - } else { - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Can not decrypt login reply")); - return; - } - } - } else { - data_len = qq_decrypt(data, rcved, rcved_len, qd->session_key); - if (data_len < 0) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Can not reply by session key, [%05d], 0x%04X %s, len %d\n", - seq, cmd, qq_get_cmd_desc(cmd), rcved_len); - qq_show_packet("Can not decrypted", rcved, rcved_len); - return; - } + data_len = qq_decrypt(data, rcved, rcved_len, qd->session_key); + if (data_len < 0) { + purple_debug_warning("QQ", + "Reply can not be decrypted by session key, [%05d], 0x%04X %s, len %d\n", + seq, cmd, qq_get_cmd_desc(cmd), rcved_len); + qq_show_packet("Can not decrypted", rcved, rcved_len); + return; } - + if (data_len <= 0) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Reply decrypted is empty, [%05d], 0x%04X %s, len %d\n", + purple_debug_warning("QQ", + "Reply decrypted is empty, [%05d], 0x%04X %s, len %d\n", seq, cmd, qq_get_cmd_desc(cmd), rcved_len); return; } switch (cmd) { - case QQ_CMD_TOKEN: - ret_8 = qq_process_token_reply(gc, error_msg, data, data_len); - if (ret_8 != QQ_TOKEN_REPLY_OK) { - if (error_msg == NULL) { - error_msg = g_strdup_printf( _("Invalid token reply code, 0x%02X"), ret_8); - } - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_msg); - g_free(error_msg); - return; - } - - qq_send_packet_login(gc); - break; - case QQ_CMD_LOGIN: - process_cmd_login(gc, data, data_len); - break; case QQ_CMD_UPDATE_INFO: qq_process_modify_info_reply(data, data_len, gc); break; @@ -447,10 +567,10 @@ case QQ_CMD_BUDDY_AUTH: qq_process_add_buddy_auth_reply(data, data_len, gc); break; - case QQ_CMD_GET_USER_INFO: - qq_process_get_info_reply(data, data_len, gc); + case QQ_CMD_GET_BUDDY_INFO: + qq_process_get_buddy_info(data, data_len, gc); break; - case QQ_CMD_CHANGE_ONLINE_STATUS: + case QQ_CMD_CHANGE_STATUS: qq_process_change_status_reply(data, data_len, gc); break; case QQ_CMD_SEND_IM: @@ -462,41 +582,53 @@ case QQ_CMD_GET_BUDDIES_ONLINE: ret_8 = qq_process_get_buddies_online_reply(data, data_len, gc); if (ret_8 > 0 && ret_8 < 0xff) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Requesting for more online buddies\n"); - qq_send_packet_get_buddies_online(gc, ret_8); - } else { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "All online buddies received\n"); - /* Fixme: this should not be called once*/ - qq_send_packet_get_buddies_levels(gc); - - qq_refresh_all_buddy_status(gc); + purple_debug_info("QQ", "Requesting for more online buddies\n"); + qq_request_get_buddies_online(gc, ret_8, update_class); + return; } + purple_debug_info("QQ", "All online buddies received\n"); + qq_refresh_all_buddy_status(gc); break; case QQ_CMD_GET_LEVEL: qq_process_get_level_reply(data, data_len, gc); break; case QQ_CMD_GET_BUDDIES_LIST: ret_16 = qq_process_get_buddies_list_reply(data, data_len, gc); - if (ret_16 > 0 && ret_16 < 0xffff) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Requesting for more buddies\n"); - qq_send_packet_get_buddies_list(gc, ret_16); - } else { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "All buddies received. Requesting buddies' levels\n"); - qq_send_packet_get_buddies_online(gc, 0); + if (ret_16 > 0 && ret_16 < 0xffff) { + purple_debug_info("QQ", "Requesting for more buddies\n"); + qq_request_get_buddies_list(gc, ret_16, update_class); + return; } + purple_debug_info("QQ", "All buddies received. Requesting buddies' levels\n"); break; case QQ_CMD_GET_BUDDIES_AND_ROOMS: ret_32 = qq_process_get_buddies_and_rooms(data, data_len, gc); if (ret_32 > 0 && ret_32 < 0xffffffff) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Requesting for more buddies and groups\n"); - qq_send_packet_get_buddies_and_rooms(gc, ret_32); - } else { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "All buddies and groups received\n"); + purple_debug_info("QQ", "Requesting for more buddies and groups\n"); + qq_request_get_buddies_and_rooms(gc, ret_32, update_class); + return; } + purple_debug_info("QQ", "All buddies and groups received\n"); break; default: - process_cmd_unknow(gc, "Unknow reply CMD", data, data_len, cmd, seq); + process_cmd_unknow(gc, _("Unknow reply CMD"), data, data_len, cmd, seq); + is_unknow = TRUE; break; } + if (is_unknow) + return; + + if (update_class == QQ_CMD_CLASS_NONE) + return; + + purple_debug_info("QQ", "Update class %d\n", update_class); + if (update_class == QQ_CMD_CLASS_UPDATE_ALL) { + qq_update_all(gc, cmd); + return; + } + if (update_class == QQ_CMD_CLASS_UPDATE_ONLINE) { + qq_update_online(gc, cmd); + return; + } }
--- a/libpurple/protocols/qq/qq_process.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/qq_process.h Tue Sep 16 20:01:24 2008 +0000 @@ -30,12 +30,24 @@ #include "qq.h" -void qq_proc_cmd_reply(PurpleConnection *gc, - guint16 cmd, guint16 seq, guint8 *rcved, gint rcved_len); -void qq_proc_room_cmd_reply(PurpleConnection *gc, - guint16 seq, guint8 room_cmd, guint32 room_id, guint8 *rcved, gint rcved_len); - -void qq_proc_cmd_server(PurpleConnection *gc, - guint16 cmd, guint16 seq, guint8 *rcved, gint rcved_len); +enum { + QQ_CMD_CLASS_NONE = 0, + QQ_CMD_CLASS_UPDATE_ALL, + QQ_CMD_CLASS_UPDATE_ONLINE, + QQ_CMD_CLASS_UPDATE_ROOM, +}; + +void qq_proc_login_cmd(PurpleConnection *gc, guint8 *rcved, gint rcved_len); +void qq_proc_client_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, + guint8 *rcved, gint rcved_len, gint update_class, guint32 ship32); +void qq_proc_room_cmd(PurpleConnection *gc, guint16 seq, + guint8 room_cmd, guint32 room_id, guint8 *rcved, gint rcved_len, + gint update_class, guint32 ship32); + +void qq_proc_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *rcved, gint rcved_len); + +void qq_update_all(PurpleConnection *gc, guint16 cmd); +void qq_update_online(PurpleConnection *gc, guint16 cmd); +void qq_update_room(PurpleConnection *gc, guint8 room_cmd, guint32 room_id); #endif
--- a/libpurple/protocols/qq/qq_trans.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/qq_trans.c Tue Sep 16 20:01:24 2008 +0000 @@ -35,55 +35,47 @@ #include "qq_process.h" #include "qq_trans.h" -#define QQ_RESEND_MAX 3 /* max resend per packet */ +enum { + QQ_TRANS_IS_SERVER = 0x01, /* Is server command or client command */ + QQ_TRANS_IS_IMPORT = 0x02, /* Only notice if not get reply; or resend, disconn if reties get 0*/ + QQ_TRANS_REMAINED = 0x04, /* server command before login*/ + QQ_TRANS_IS_REPLY = 0x08, /* server command before login*/ +}; -qq_transaction *qq_trans_find_rcved(qq_data *qd, guint16 cmd, guint16 seq) -{ - GList *curr; - GList *next; - qq_transaction *trans; - - if (qd->transactions == NULL) { - return NULL; - } +struct _qq_transaction { + guint8 flag; + guint16 seq; + guint16 cmd; - next = qd->transactions; - while( (curr = next) ) { - next = curr->next; - - trans = (qq_transaction *) (curr->data); - if(trans->cmd == cmd && trans->seq == seq) { - if (trans->rcved_times == 0) { - trans->scan_times = 0; - } - trans->rcved_times++; - if (qq_trans_is_server(trans) && qq_trans_is_dup(trans)) { - /* server may not get our confirm reply before, send reply again*/ - if (trans->data != NULL && trans->data_len > 0) { - qq_send_data(qd, trans->cmd, trans->seq, FALSE, trans->data, trans->data_len); - } - } - return trans; - } - } + guint8 room_cmd; + guint32 room_id; + + guint8 *data; + gint data_len; - return NULL; -} + gint fd; + gint send_retries; + gint rcved_times; + gint scan_times; -gboolean qq_trans_is_server(qq_transaction *trans) + gint update_class; + guint32 ship32; +}; + +gboolean qq_trans_is_server(qq_transaction *trans) { g_return_val_if_fail(trans != NULL, FALSE); - + if (trans->flag & QQ_TRANS_IS_SERVER) return TRUE; else return FALSE; } -gboolean qq_trans_is_dup(qq_transaction *trans) +gboolean qq_trans_is_dup(qq_transaction *trans) { g_return_val_if_fail(trans != NULL, TRUE); - + if (trans->rcved_times > 1) return TRUE; else @@ -102,115 +94,203 @@ return trans->room_id; } -/* Remove a packet with seq from send trans */ -static void trans_remove(qq_data *qd, qq_transaction *trans) +gint qq_trans_get_class(qq_transaction *trans) +{ + g_return_val_if_fail(trans != NULL, QQ_CMD_CLASS_NONE); + return trans->update_class; +} + +gint qq_trans_get_ship(qq_transaction *trans) +{ + g_return_val_if_fail(trans != NULL, 0); + return trans->ship32; +} + +static qq_transaction *trans_create(PurpleConnection *gc, gint fd, + guint16 cmd, guint16 seq, guint8 *data, gint data_len, gint update_class, guint32 ship32) { - g_return_if_fail(qd != NULL && trans != NULL); - - purple_debug(PURPLE_DEBUG_INFO, "QQ_TRANS", + qq_data *qd; + qq_transaction *trans; + + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL); + qd = (qq_data *) gc->proto_data; + + trans = g_new0(qq_transaction, 1); + + memset(trans, 0, sizeof(qq_transaction)); + trans->fd = fd; + trans->cmd = cmd; + trans->seq = seq; + + trans->data = NULL; + trans->data_len = 0; + if (data != NULL && data_len > 0) { + /* don't use g_strdup, may have 0x00 */ + trans->data = g_memdup(data, data_len); + trans->data_len = data_len; + } + + trans->update_class = update_class; + return trans; +} + +/* Remove a packet with seq from send trans */ +static void trans_remove(PurpleConnection *gc, qq_transaction *trans) +{ + qq_data *qd = (qq_data *)gc->proto_data; + + g_return_if_fail(gc != NULL && gc->proto_data != NULL); + qd = (qq_data *) gc->proto_data; + + g_return_if_fail(trans != NULL); +#if 0 + purple_debug_info("QQ_TRANS", "Remove [%s%05d] retry %d rcved %d scan %d %s\n", (trans->flag & QQ_TRANS_IS_SERVER) ? "SRV-" : "", trans->seq, trans->send_retries, trans->rcved_times, trans->scan_times, qq_get_cmd_desc(trans->cmd)); - +#endif if (trans->data) g_free(trans->data); qd->transactions = g_list_remove(qd->transactions, trans); g_free(trans); } -void qq_trans_add_client_cmd(qq_data *qd, guint16 cmd, guint16 seq, guint8 *data, gint data_len) +static qq_transaction *trans_find(PurpleConnection *gc, guint16 cmd, guint16 seq) { - qq_transaction *trans = g_new0(qq_transaction, 1); + qq_data *qd; + GList *list; + qq_transaction *trans; - g_return_if_fail(trans != NULL); + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL); + qd = (qq_data *) gc->proto_data; - trans->flag = 0; - if (cmd == QQ_CMD_TOKEN || cmd == QQ_CMD_LOGIN || cmd == QQ_CMD_KEEP_ALIVE) { - trans->flag |= QQ_TRANS_CLI_IMPORT; + list = qd->transactions; + while (list != NULL) { + trans = (qq_transaction *) list->data; + if(trans->cmd == cmd && trans->seq == seq) { + return trans; + } + list = list->next; } - trans->fd = qd->fd; - trans->cmd = cmd; - trans->seq = seq; - trans->room_cmd = 0; - trans->room_id = 0; - trans->send_retries = QQ_RESEND_MAX; - trans->rcved_times = 0; - trans->scan_times = 0; + + return NULL; +} - trans->data = NULL; - trans->data_len = 0; - if (data != NULL && data_len > 0) { - trans->data = g_memdup(data, data_len); /* don't use g_strdup, may have 0x00 */ - trans->data_len = data_len; +void qq_trans_add_client_cmd(PurpleConnection *gc, + guint16 cmd, guint16 seq, guint8 *data, gint data_len, gint update_class, guint32 ship32) +{ + qq_data *qd = (qq_data *)gc->proto_data; + qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, data, data_len, update_class, ship32); + + if (cmd == QQ_CMD_TOKEN || cmd == QQ_CMD_LOGIN || cmd == QQ_CMD_KEEP_ALIVE) { + trans->flag |= QQ_TRANS_IS_IMPORT; } - purple_debug(PURPLE_DEBUG_INFO, "QQ_TRANS", - "Add client cmd, seq = %d, data = %p, len = %d\n", + trans->send_retries = qd->resend_times; +#if 0 + purple_debug_info("QQ_TRANS", "Add client cmd, seq %d, data %p, len %d\n", trans->seq, trans->data, trans->data_len); +#endif qd->transactions = g_list_append(qd->transactions, trans); } -void qq_trans_add_room_cmd(qq_data *qd, guint16 seq, guint8 room_cmd, guint32 room_id, - guint8 *data, gint data_len) +qq_transaction *qq_trans_find_rcved(PurpleConnection *gc, guint16 cmd, guint16 seq) { - qq_transaction *trans = g_new0(qq_transaction, 1); + qq_transaction *trans; + + trans = trans_find(gc, cmd, seq); + if (trans == NULL) { + return NULL; + } - g_return_if_fail(trans != NULL); + if (trans->rcved_times == 0) { + trans->scan_times = 0; + } + trans->rcved_times++; + /* server may not get our confirm reply before, send reply again*/ + if (qq_trans_is_server(trans) && (trans->flag & QQ_TRANS_IS_REPLY)) { + if (trans->data != NULL && trans->data_len > 0) { + qq_send_cmd_encrypted(gc, trans->cmd, trans->seq, trans->data, trans->data_len, FALSE); + } + } + return trans; +} - trans->flag = 0; - trans->fd = qd->fd; - trans->seq = seq; - trans->cmd = QQ_CMD_ROOM; +void qq_trans_add_room_cmd(PurpleConnection *gc, + guint16 seq, guint8 room_cmd, guint32 room_id, guint8 *data, gint data_len, + gint update_class, guint32 ship32) +{ + qq_data *qd = (qq_data *)gc->proto_data; + qq_transaction *trans = trans_create(gc, qd->fd, QQ_CMD_ROOM, seq, data, data_len, + update_class, ship32); + trans->room_cmd = room_cmd; trans->room_id = room_id; - trans->send_retries = QQ_RESEND_MAX; - trans->rcved_times = 0; - trans->scan_times = 0; - - trans->data = NULL; - trans->data_len = 0; - if (data != NULL && data_len > 0) { - trans->data = g_memdup(data, data_len); /* don't use g_strdup, may have 0x00 */ - trans->data_len = data_len; - } - purple_debug(PURPLE_DEBUG_INFO, "QQ_TRANS", - "Add room cmd, seq = %d, data = %p, len = %d\n", + trans->send_retries = qd->resend_times; +#if 0 + purple_debug_info("QQ_TRANS", "Add room cmd, seq %d, data %p, len %d\n", trans->seq, trans->data, trans->data_len); +#endif qd->transactions = g_list_append(qd->transactions, trans); } -void qq_trans_add_server_cmd(qq_data *qd, guint16 cmd, guint16 seq, guint8 *data, gint data_len) +void qq_trans_add_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, + guint8 *rcved, gint rcved_len) { - qq_transaction *trans = g_new0(qq_transaction, 1); - - g_return_if_fail(trans != NULL); + qq_data *qd = (qq_data *)gc->proto_data; + qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, rcved, rcved_len, QQ_CMD_CLASS_NONE, 0); trans->flag = QQ_TRANS_IS_SERVER; - if ( !qd->logged_in ) { - trans->flag |= QQ_TRANS_BEFORE_LOGIN; - } - trans->fd = qd->fd; - trans->cmd = cmd; - trans->seq = seq; - trans->room_cmd = 0; - trans->room_id = 0; trans->send_retries = 0; trans->rcved_times = 1; - trans->scan_times = 0; - trans->data = NULL; - trans->data_len = 0; - if (data != NULL && data_len > 0) { - trans->data = g_memdup(data, data_len); /* don't use g_strdup, may have 0x00 */ - trans->data_len = data_len; - } - purple_debug(PURPLE_DEBUG_INFO, "QQ_TRANS", - "Add server cmd, seq = %d, data = %p, len = %d\n", +#if 0 + purple_debug_info("QQ_TRANS", "Add server cmd, seq %d, data %p, len %d\n", trans->seq, trans->data, trans->data_len); +#endif qd->transactions = g_list_append(qd->transactions, trans); } -void qq_trans_process_before_login(qq_data *qd) +void qq_trans_add_server_reply(PurpleConnection *gc, guint16 cmd, guint16 seq, + guint8 *reply, gint reply_len) { + qq_transaction *trans; + + g_return_if_fail(reply != NULL && reply_len > 0); + + trans = trans_find(gc, cmd, seq); + if (trans == NULL) { + return; + } + + g_return_if_fail(trans->flag & QQ_TRANS_IS_SERVER); + trans->flag |= QQ_TRANS_IS_REPLY; + + if (trans->data) g_free(trans->data); + + trans->data = g_memdup(reply, reply_len); + trans->data_len = reply_len; +} + +void qq_trans_add_remain(PurpleConnection *gc, guint16 cmd, guint16 seq, + guint8 *data, gint data_len) +{ + qq_data *qd = (qq_data *)gc->proto_data; + qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, data, data_len, QQ_CMD_CLASS_NONE, 0); + + trans->flag = QQ_TRANS_IS_SERVER; + trans->flag |= QQ_TRANS_REMAINED; + trans->send_retries = 0; + trans->rcved_times = 1; +#if 1 + purple_debug_info("QQ_TRANS", "Add server cmd and remained, seq %d, data %p, len %d\n", + trans->seq, trans->data, trans->data_len); +#endif + qd->transactions = g_list_append(qd->transactions, trans); +} + +void qq_trans_process_remained(PurpleConnection *gc) +{ + qq_data *qd = (qq_data *)gc->proto_data; GList *curr; GList *next; qq_transaction *trans; @@ -221,43 +301,46 @@ while( (curr = next) ) { next = curr->next; trans = (qq_transaction *) (curr->data); - /* purple_debug(PURPLE_DEBUG_ERROR, "QQ_TRANS", "Scan [%d]\n", trans->seq); */ - +#if 0 + purple_debug_info("QQ_TRANS", "Scan [%d]\n", trans->seq); +#endif if ( !(trans->flag & QQ_TRANS_IS_SERVER) ) { continue; } - if ( !(trans->flag & QQ_TRANS_BEFORE_LOGIN) ) { + if ( !(trans->flag & QQ_TRANS_REMAINED) ) { continue; } - // set QQ_TRANS_BEFORE_LOGIN off - trans->flag &= ~QQ_TRANS_BEFORE_LOGIN; + /* set QQ_TRANS_REMAINED off */ + trans->flag &= ~QQ_TRANS_REMAINED; - purple_debug(PURPLE_DEBUG_ERROR, "QQ_TRANS", - "Process server cmd before login, seq %d, data %p, len %d, send_retries %d\n", +#if 1 + purple_debug_info("QQ_TRANS", + "Process server cmd remained, seq %d, data %p, len %d, send_retries %d\n", trans->seq, trans->data, trans->data_len, trans->send_retries); - - qq_proc_cmd_reply(qd->gc, trans->seq, trans->cmd, trans->data, trans->data_len); +#endif + qq_proc_server_cmd(gc, trans->cmd, trans->seq, trans->data, trans->data_len); } - /* purple_debug(PURPLE_DEBUG_INFO, "QQ_TRANS", "Scan finished\n"); */ + /* purple_debug_info("QQ_TRANS", "Scan finished\n"); */ return; } -gboolean qq_trans_scan(qq_data *qd) +gboolean qq_trans_scan(PurpleConnection *gc) { + qq_data *qd = (qq_data *)gc->proto_data; GList *curr; GList *next; qq_transaction *trans; g_return_val_if_fail(qd != NULL, FALSE); - + next = qd->transactions; while( (curr = next) ) { next = curr->next; trans = (qq_transaction *) (curr->data); - /* purple_debug(PURPLE_DEBUG_INFO, "QQ_TRANS", "Scan [%d]\n", trans->seq); */ - - if (trans->flag & QQ_TRANS_BEFORE_LOGIN) { + /* purple_debug_info("QQ_TRANS", "Scan [%d]\n", trans->seq); */ + + if (trans->flag & QQ_TRANS_REMAINED) { /* keep server cmd before login*/ continue; } @@ -270,67 +353,62 @@ if (trans->rcved_times > 0) { /* Has been received */ - trans_remove(qd, trans); + trans_remove(gc, trans); continue; } if (trans->flag & QQ_TRANS_IS_SERVER) { continue; } - + /* Never get reply */ trans->send_retries--; if (trans->send_retries <= 0) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ_TRANS", + purple_debug_warning("QQ_TRANS", "[%d] %s is lost.\n", trans->seq, qq_get_cmd_desc(trans->cmd)); - if (trans->flag & QQ_TRANS_CLI_IMPORT) { + if (trans->flag & QQ_TRANS_IS_IMPORT) { return TRUE; } - purple_debug(PURPLE_DEBUG_ERROR, "QQ_TRANS", + qd->net_stat.lost++; + purple_debug_error("QQ_TRANS", "Lost [%d] %s, data %p, len %d, retries %d\n", trans->seq, qq_get_cmd_desc(trans->cmd), trans->data, trans->data_len, trans->send_retries); - trans_remove(qd, trans); + trans_remove(gc, trans); continue; } - purple_debug(PURPLE_DEBUG_ERROR, "QQ_TRANS", + qd->net_stat.resend++; + purple_debug_warning("QQ_TRANS", "Resend [%d] %s data %p, len %d, send_retries %d\n", trans->seq, qq_get_cmd_desc(trans->cmd), trans->data, trans->data_len, trans->send_retries); - qq_send_data(qd, trans->cmd, trans->seq, FALSE, trans->data, trans->data_len); + qq_send_cmd_encrypted(gc, trans->cmd, trans->seq, trans->data, trans->data_len, FALSE); } - /* purple_debug(PURPLE_DEBUG_INFO, "QQ_TRANS", "Scan finished\n"); */ + /* purple_debug_info("QQ_TRANS", "Scan finished\n"); */ return FALSE; } /* clean up send trans and free all contents */ -void qq_trans_remove_all(qq_data *qd) +void qq_trans_remove_all(PurpleConnection *gc) { - GList *curr; - GList *next; + qq_data *qd = (qq_data *)gc->proto_data; qq_transaction *trans; gint count = 0; - curr = qd->transactions; - while(curr) { - next = curr->next; - - trans = (qq_transaction *) (curr->data); - /* - purple_debug(PURPLE_DEBUG_ERROR, "QQ_TRANS", - "Remove to transaction, seq = %d, buf = %p, len = %d\n", - trans->seq, trans->buf, trans->len); - */ - trans_remove(qd, trans); + while(qd->transactions != NULL) { + trans = (qq_transaction *) (qd->transactions->data); + qd->transactions = g_list_remove(qd->transactions, trans); + + if (trans->data) g_free(trans->data); + g_free(trans); count++; - curr = next; } - g_list_free(qd->transactions); - - purple_debug(PURPLE_DEBUG_INFO, "QQ_TRANS", "Free all %d packets\n", count); + if (count > 0) { + purple_debug_info("QQ_TRANS", "Free all %d packets\n", count); + } }
--- a/libpurple/protocols/qq/qq_trans.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/qq_trans.h Tue Sep 16 20:01:24 2008 +0000 @@ -28,44 +28,30 @@ #include <glib.h> #include "qq.h" -enum { - QQ_TRANS_IS_SERVER = 0x01, /* Is server command or client command */ - /* prefix QQ_TRANS_CLI is for client command*/ - QQ_TRANS_CLI_EMERGE = 0x02, /* send at once; or may wait for next reply*/ - QQ_TRANS_CLI_IMPORT = 0x04, /* Only notice if not get reply; or resend, disconn if reties get 0*/ - QQ_TRANS_BEFORE_LOGIN = 0x08, /* server command before login*/ -}; - -typedef struct _qq_transaction { - guint8 flag; - guint16 seq; - guint16 cmd; +typedef struct _qq_transaction qq_transaction; - guint8 room_cmd; - guint32 room_id; - - guint8 *data; - gint data_len; - - gint fd; - gint send_retries; - gint rcved_times; - gint scan_times; -} qq_transaction; - -qq_transaction *qq_trans_find_rcved(qq_data *qd, guint16 cmd, guint16 seq); +qq_transaction *qq_trans_find_rcved(PurpleConnection *gc, guint16 cmd, guint16 seq); gboolean qq_trans_is_server(qq_transaction *trans) ; gboolean qq_trans_is_dup(qq_transaction *trans); guint8 qq_trans_get_room_cmd(qq_transaction *trans); guint32 qq_trans_get_room_id(qq_transaction *trans); +gint qq_trans_get_class(qq_transaction *trans); +gint qq_trans_get_ship(qq_transaction *trans); -void qq_trans_add_client_cmd(qq_data *qd, guint16 cmd, guint16 seq, guint8 *data, gint data_len); -void qq_trans_add_server_cmd(qq_data *qd, guint16 cmd, guint16 seq, guint8 *data, gint data_len); -void qq_trans_add_room_cmd(qq_data *qd, guint16 seq, guint8 room_cmd, guint32 room_id, +void qq_trans_add_client_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, + guint8 *data, gint data_len, gint update_class, guint32 ship32); +void qq_trans_add_room_cmd(PurpleConnection *gc, + guint16 seq, guint8 room_cmd, guint32 room_id, + guint8 *data, gint data_len, gint update_class, guint32 ship32); +void qq_trans_add_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, + guint8 *rcved, gint rcved_len); +void qq_trans_add_server_reply(PurpleConnection *gc, guint16 cmd, guint16 seq, + guint8 *reply, gint reply_len); +void qq_trans_add_remain(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *data, gint data_len); -void qq_trans_process_before_login(qq_data *qd); -gboolean qq_trans_scan(qq_data *qd); -void qq_trans_remove_all(qq_data *qd); +void qq_trans_process_remained(PurpleConnection *gc); +gboolean qq_trans_scan(PurpleConnection *gc); +void qq_trans_remove_all(PurpleConnection *gc); #endif
--- a/libpurple/protocols/qq/send_file.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/send_file.c Tue Sep 16 20:01:24 2008 +0000 @@ -54,7 +54,7 @@ static int _qq_in_same_lan(ft_info *info) { if (info->remote_internet_ip == info->local_internet_ip) return 1; - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "Not in the same LAN, remote internet ip[%x], local internet ip[%x]\n", info->remote_internet_ip , info->local_internet_ip); @@ -87,7 +87,7 @@ info = (ft_info *) xfer->data; sinlen = sizeof(sin); r = recvfrom(info->recv_fd, buf, len, 0, (struct sockaddr *) &sin, &sinlen); - purple_debug(PURPLE_DEBUG_INFO, "QQ", + purple_debug_info("QQ", "==> recv %d bytes from File UDP Channel, remote ip[%s], remote port[%d]\n", r, inet_ntoa(sin.sin_addr), g_ntohs(sin.sin_port)); return r; @@ -121,7 +121,7 @@ sin.sin_port = g_htons(info->remote_minor_port); sin.sin_addr.s_addr = g_htonl(info->remote_real_ip); } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "sending to channel: %d.%d.%d.%d:%d\n", + purple_debug_info("QQ", "sending to channel: %d.%d.%d.%d:%d\n", (int)sin.sin_addr.s_addr & 0xff, (int)(sin.sin_addr.s_addr >> 8) & 0xff, (int)(sin.sin_addr.s_addr >> 16) & 0xff, @@ -207,20 +207,20 @@ qq_xfer_close_file(xfer); if (info->dest_fp != NULL) { fclose(info->dest_fp); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "file closed\n"); + purple_debug_info("QQ", "file closed\n"); } if (info->major_fd != 0) { close(info->major_fd); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "major port closed\n"); + purple_debug_info("QQ", "major port closed\n"); } if (info->minor_fd != 0) { close(info->minor_fd); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "minor port closed\n"); + purple_debug_info("QQ", "minor port closed\n"); } /* if (info->buffer != NULL) { munmap(info->buffer, purple_xfer_get_size(xfer)); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "file mapping buffer is freed.\n"); + purple_debug_info("QQ", "file mapping buffer is freed.\n"); } */ g_free(info); @@ -235,7 +235,7 @@ real_ip_str = gen_ip_str((guint8 *) &ip); ip = g_htonl(info->remote_internet_ip); internet_ip_str = gen_ip_str((guint8 *) &ip); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "remote internet ip[%s:%d], major port[%d], real ip[%s], minor port[%d]\n", + purple_debug_info("QQ", "remote internet ip[%s:%d], major port[%d], real ip[%s], minor port[%d]\n", internet_ip_str, info->remote_internet_port, info->remote_major_port, real_ip_str, info->remote_minor_port ); @@ -393,7 +393,7 @@ info->local_real_ip = 0x7f000001; */ info->local_real_ip = g_ntohl(inet_addr(purple_network_get_my_ip(-1))); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "local real ip is %x", info->local_real_ip); + purple_debug_info("QQ", "local real ip is %x", info->local_real_ip); for (i = 0; i < 2; i++) { sockfd = socket(PF_INET, SOCK_DGRAM, 0); @@ -412,13 +412,13 @@ case 0: info->local_major_port = listen_port; info->major_fd = sockfd; - purple_debug(PURPLE_DEBUG_INFO, "QQ", "UDP Major Channel created on port[%d]\n", + purple_debug_info("QQ", "UDP Major Channel created on port[%d]\n", info->local_major_port); break; case 1: info->local_minor_port = listen_port; info->minor_fd = sockfd; - purple_debug(PURPLE_DEBUG_INFO, "QQ", "UDP Minor Channel created on port[%d]\n", + purple_debug_info("QQ", "UDP Minor Channel created on port[%d]\n", info->local_minor_port); break; } @@ -475,9 +475,9 @@ bytes += qq_putdata (raw_data + bytes, (guint8 *) filelen_str, filelen_strlen); if (packet_len == bytes) - qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); + qq_send_cmd(gc, QQ_CMD_SEND_IM, raw_data, bytes); else - purple_debug (PURPLE_DEBUG_INFO, "qq_send_packet_file_request", + purple_debug_info("qq_send_packet_file_request", "%d bytes expected but got %d bytes\n", packet_len, bytes); @@ -497,7 +497,7 @@ qd = (qq_data *) gc->proto_data; info = (ft_info *) qd->xfer->data; - purple_debug(PURPLE_DEBUG_INFO, "QQ", "I've accepted the file transfer request from %d\n", to_uid); + purple_debug_info("QQ", "I've accepted the file transfer request from %d\n", to_uid); _qq_xfer_init_socket(qd->xfer); packet_len = 79; @@ -516,9 +516,9 @@ info->local_real_ip = real_ip; if (packet_len == bytes) - qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); + qq_send_cmd(gc, QQ_CMD_SEND_IM, raw_data, bytes); else - purple_debug (PURPLE_DEBUG_INFO, "qq_send_packet_file_accept", + purple_debug_info("qq_send_packet_file_accept", "%d bytes expected but got %d bytes\n", packet_len, bytes); } @@ -539,13 +539,13 @@ raw_data = g_newa (guint8, packet_len); bytes = 0; - purple_debug(PURPLE_DEBUG_INFO, "QQ", "<== sending qq file notify ip packet\n"); + purple_debug_info("QQ", "<== sending qq file notify ip packet\n"); bytes += _qq_create_packet_file_header(raw_data + bytes, to_uid, QQ_FILE_TRANS_NOTIFY, qd, TRUE); bytes += qq_fill_conn_info(raw_data + bytes, info); if (packet_len == bytes) - qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); + qq_send_cmd(gc, QQ_CMD_SEND_IM, raw_data, bytes); else - purple_debug (PURPLE_DEBUG_INFO, "qq_send_packet_file_notify", + purple_debug_info("qq_send_packet_file_notify", "%d bytes expected but got %d bytes\n", packet_len, bytes); @@ -561,7 +561,7 @@ guint8 *raw_data; gint packet_len, bytes; - purple_debug(PURPLE_DEBUG_INFO, "_qq_send_packet_file_reject", "start"); + purple_debug_info("_qq_send_packet_file_reject", "start"); qd = (qq_data *) gc->proto_data; packet_len = 64; @@ -571,9 +571,9 @@ bytes += _qq_create_packet_file_header(raw_data + bytes, to_uid, QQ_FILE_TRANS_DENY_UDP, qd, TRUE); if (packet_len == bytes) - qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); + qq_send_cmd(gc, QQ_CMD_SEND_IM, raw_data, bytes); else - purple_debug (PURPLE_DEBUG_INFO, "qq_send_packet_file", + purple_debug_info("qq_send_packet_file", "%d bytes expected but got %d bytes\n", packet_len, bytes); } @@ -585,27 +585,27 @@ guint8 *raw_data; gint packet_len, bytes; - purple_debug(PURPLE_DEBUG_INFO, "_qq_send_packet_file_cancel", "start\n"); + purple_debug_info("_qq_send_packet_file_cancel", "start\n"); qd = (qq_data *) gc->proto_data; packet_len = 64; raw_data = g_newa (guint8, packet_len); bytes = 0; - purple_debug(PURPLE_DEBUG_INFO, "_qq_send_packet_file_cancel", "before create header\n"); + purple_debug_info("_qq_send_packet_file_cancel", "before create header\n"); bytes += _qq_create_packet_file_header(raw_data + bytes, to_uid, QQ_FILE_TRANS_CANCEL, qd, TRUE); - purple_debug(PURPLE_DEBUG_INFO, "_qq_send_packet_file_cancel", "end create header\n"); + purple_debug_info("_qq_send_packet_file_cancel", "end create header\n"); if (packet_len == bytes) { - purple_debug(PURPLE_DEBUG_INFO, "_qq_send_packet_file_cancel", "before send cmd\n"); - qq_send_cmd (qd, QQ_CMD_SEND_IM, raw_data, bytes); + purple_debug_info("_qq_send_packet_file_cancel", "before send cmd\n"); + qq_send_cmd(gc, QQ_CMD_SEND_IM, raw_data, bytes); } else - purple_debug (PURPLE_DEBUG_INFO, "qq_send_packet_file", + purple_debug_info("qq_send_packet_file", "%d bytes expected but got %d bytes\n", packet_len, bytes); - purple_debug (PURPLE_DEBUG_INFO, "qq_send_packet_file_cancel", "end\n"); + purple_debug_info("qq_send_packet_file_cancel", "end\n"); } /* request to send a file */ @@ -694,7 +694,7 @@ /* border has been checked before if (*cursor >= (data + data_len - 1)) { - purple_debug (PURPLE_DEBUG_WARNING, "QQ", + purple_debug_warning("QQ", "Received file reject message is empty\n"); return; } @@ -724,8 +724,7 @@ /* border has been checked before if (*cursor >= (data + data_len - 1)) { - purple_debug (PURPLE_DEBUG_WARNING, "QQ", - "Received file reject message is empty\n"); + purple_debug_warning("QQ", "Received file reject message is empty\n"); return; } */ @@ -755,8 +754,7 @@ info = (ft_info *) qd->xfer->data; if (data_len <= 30 + QQ_CONN_INFO_LEN) { - purple_debug (PURPLE_DEBUG_WARNING, "QQ", - "Received file reject message is empty\n"); + purple_debug_warning("QQ", "Received file reject message is empty\n"); return; } @@ -789,8 +787,7 @@ info->to_uid = sender_uid; if (data_len <= 2 + 30 + QQ_CONN_INFO_LEN) { - purple_debug (PURPLE_DEBUG_WARNING, "QQ", - "Received file request message is empty\n"); + purple_debug_warning("QQ", "Received file request message is empty\n"); return; } bytes = 0; @@ -806,7 +803,7 @@ /* FACE from IP detector, ignored by gfhuang */ if(g_ascii_strcasecmp(fileinfo[0], "FACE") == 0) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", + purple_debug_warning("QQ", "Received a FACE ip detect from qq-%d, so he/she must be online :)\n", sender_uid); b = purple_find_buddy(gc->account, sender_name); @@ -826,11 +823,11 @@ qq_update_buddy_contact(gc, q_bud); } else - purple_debug(PURPLE_DEBUG_INFO, "QQ", "buddy %d is already online\n", sender_uid); + purple_debug_info("QQ", "buddy %d is already online\n", sender_uid); } else - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "buddy %d is not in list\n", sender_uid); + purple_debug_warning("QQ", "buddy %d is not in list\n", sender_uid); g_free(sender_name); g_strfreev(fileinfo); @@ -892,8 +889,7 @@ xfer = qd->xfer; info = (ft_info *) qd->xfer->data; if (data_len <= 2 + 30 + QQ_CONN_INFO_LEN) { - purple_debug (PURPLE_DEBUG_WARNING, "QQ", - "Received file notify message is empty\n"); + purple_debug_warning("QQ", "Received file notify message is empty\n"); return; }
--- a/libpurple/protocols/qq/sys_msg.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/sys_msg.c Tue Sep 16 20:01:24 2008 +0000 @@ -84,7 +84,7 @@ nombre = uid_to_purple_name(uid); purple_request_action - (gc, NULL, _("Do you want to approve the request?"), "", + (gc, NULL, _("Do you approve the requestion?"), "", PURPLE_DEFAULT_ACTION_NONE, purple_connection_get_account(gc), nombre, NULL, g, 2, @@ -108,7 +108,7 @@ qq_send_packet_get_info(gc, uid, TRUE); /* we want to see window */ nombre = uid_to_purple_name(uid); purple_request_action - (gc, NULL, _("Do you want to add this buddy?"), "", + (gc, NULL, _("Do you add the buddy?"), "", PURPLE_DEFAULT_ACTION_NONE, purple_connection_get_account(gc), nombre, NULL, g, 2, @@ -126,7 +126,7 @@ gint ack_len, bytes; qd = (qq_data *) gc->proto_data; - + str = g_strdup_printf("%d", from); bar = 0x1e; ack_len = 1 + 1 + strlen(str) + 1 + 2; @@ -142,9 +142,9 @@ g_free(str); if (bytes == ack_len) /* creation OK */ - qq_send_cmd_detail(qd, QQ_CMD_ACK_SYS_MSG, 0, FALSE, ack, ack_len); + qq_send_server_reply(gc, QQ_CMD_ACK_SYS_MSG, 0, ack, ack_len); else - purple_debug(PURPLE_DEBUG_ERROR, "QQ", + purple_debug_error("QQ", "Fail creating sys msg ACK, expect %d bytes, build %d bytes\n", ack_len, bytes); } @@ -178,9 +178,9 @@ _("Add"), G_CALLBACK(qq_add_buddy_with_gc_and_uid), _("Search"), G_CALLBACK(_qq_search_before_add_with_gc_and_uid)); } else { - message = g_strdup_printf(_("%s has added you [%s] to his or her buddy list"), from, to); + message = g_strdup_printf(_("%s added you [%s] to buddy list"), from, to); _qq_sys_msg_log_write(gc, message, from); - purple_notify_info(gc, NULL, message, NULL); + purple_notify_info(gc, _("QQ Budy"), _("Successed:"), message); } g_free(name); @@ -194,11 +194,11 @@ g_return_if_fail(from != NULL && to != NULL); - message = g_strdup_printf(_("User %s rejected your request"), from); - reason = g_strdup_printf(_("Reason: %s"), msg_utf8); + message = g_strdup_printf(_("Requestion rejected by %s"), from); + reason = g_strdup_printf(_("Message: %s"), msg_utf8); _qq_sys_msg_log_write(gc, message, from); - purple_notify_info(gc, NULL, message, reason); + purple_notify_info(gc, _("QQ Buddy"), message, reason); g_free(message); g_free(reason); } @@ -214,9 +214,9 @@ qd = (qq_data *) gc->proto_data; qq_add_buddy_by_recv_packet(gc, strtol(from, NULL, 10), TRUE, TRUE); - message = g_strdup_printf(_("User %s approved your request"), from); + message = g_strdup_printf(_("Requestion approved by %s"), from); _qq_sys_msg_log_write(gc, message, from); - purple_notify_info(gc, NULL, message, NULL); + purple_notify_info(gc, _("QQ Buddy"), _("Notice:"), message); g_free(message); } @@ -263,9 +263,9 @@ g2 = g_new0(gc_and_uid, 1); g2->gc = gc; g2->uid = strtol(from, NULL, 10); - message = g_strdup_printf(_("%s is not in your buddy list"), from); + message = g_strdup_printf(_("%s is not in buddy list"), from); purple_request_action(gc, NULL, message, - _("Would you like to add him?"), PURPLE_DEFAULT_ACTION_NONE, + _("Would you add?"), PURPLE_DEFAULT_ACTION_NONE, purple_connection_get_account(gc), name, NULL, g2, 3, _("Cancel"), NULL, @@ -279,14 +279,19 @@ static void _qq_process_msg_sys_notice(PurpleConnection *gc, gchar *from, gchar *to, gchar *msg_utf8) { + qq_data *qd = (qq_data *) gc->proto_data; gchar *title, *content; g_return_if_fail(from != NULL && to != NULL); - title = g_strdup_printf(_("Notice from: %s"), from); + title = g_strdup_printf(_("From %s:"), from); content = g_strdup_printf(_("%s"), msg_utf8); - purple_notify_info(gc, NULL, title, content); + if (qd->is_show_notice) { + purple_notify_info(gc, _("QQ Server Notice"), title, content); + } else { + purple_debug_info("QQ", "QQ Server notice from %s:\n%s", from, msg_utf8); +} g_free(title); g_free(content); } @@ -310,12 +315,19 @@ _qq_send_packet_ack_msg_sys(gc, code[0], strtol(from, NULL, 10), seq); if (strtol(to, NULL, 10) != qd->uid) { /* not to me */ - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Recv sys msg to [%s], not me!, discard\n", to); + purple_debug_error("QQ", "Recv sys msg to [%s], not me!, discard\n", to); g_strfreev(segments); return; } msg_utf8 = qq_to_utf8(msg, QQ_CHARSET_DEFAULT); + if (from == NULL && msg_utf8) { + purple_debug_error("QQ", "Recv NULL sys msg to [%s], discard\n", to); + g_strfreev(segments); + g_free(msg_utf8); + return; + } + switch (strtol(code, NULL, 10)) { case QQ_MSG_SYS_BEING_ADDED: _qq_process_msg_sys_being_added(gc, from, to, msg_utf8); @@ -333,12 +345,12 @@ _qq_process_msg_sys_notice(gc, from, to, msg_utf8); break; case QQ_MSG_SYS_NEW_VERSION: - purple_debug(PURPLE_DEBUG_WARNING, "QQ", + purple_debug_warning("QQ", "QQ server says there is newer version than %s\n", qq_get_ver_desc(QQ_CLIENT)); break; default: - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Recv unknown sys msg code: %s\n", code); - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "the msg is : %s\n", msg_utf8); + purple_debug_warning("QQ", "Recv unknown sys msg code: %s\n", code); + purple_debug_warning("QQ", "the msg is : %s\n", msg_utf8); } g_free(msg_utf8); g_strfreev(segments);
--- a/libpurple/protocols/qq/utils.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/qq/utils.c Tue Sep 16 20:01:24 2008 +0000 @@ -47,8 +47,8 @@ struct sockaddr_in sin; socklen_t len = sizeof(sin); getsockname(fd, (struct sockaddr *)&sin, &len); - purple_debug(PURPLE_DEBUG_INFO, desc, "%s:%d\n", - inet_ntoa(sin.sin_addr), g_ntohs(sin.sin_port)); + purple_debug_info(desc, "%s:%d\n", + inet_ntoa(sin.sin_addr), g_ntohs(sin.sin_port)); } */ @@ -121,16 +121,16 @@ for (i = 0; segments[i] != NULL; i++) {; } if (i < expected_fields) { /* not enough fields */ - purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "Invalid data, expect %d fields, found only %d, discard\n", expected_fields, i); + purple_debug_error("QQ", "Invalid data, expect %d fields, found only %d, discard\n", + expected_fields, i); g_strfreev(segments); return NULL; } else if (i > expected_fields) { /* more fields, OK */ - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Dangerous data, expect %d fields, found %d, return all\n", expected_fields, i); + purple_debug_warning("QQ", "Dangerous data, expect %d fields, found %d, return all\n", + expected_fields, i); /* free up those not used */ for (j = expected_fields; j < i; j++) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "field[%d] is %s\n", j, segments[j]); + purple_debug_warning("QQ", "field[%d] is %s\n", j, segments[j]); g_free(segments[j]); } @@ -218,7 +218,7 @@ msg_utf8 = i < len ? qq_to_utf8((gchar *) &incoming[i], QQ_CHARSET_DEFAULT) : NULL; if (msg_utf8 != NULL) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Try extract GB msg: %s\n", msg_utf8); + purple_debug_warning("QQ", "Try extract GB msg: %s\n", msg_utf8); } return msg_utf8; } @@ -257,7 +257,7 @@ hex_buffer = strstrip(buffer); if (strlen(hex_buffer) % 2 != 0) { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", + purple_debug_warning("QQ", "Unable to convert an odd number of nibbles to a string of bytes!\n"); g_free(hex_buffer); return NULL; @@ -272,8 +272,8 @@ } else if (g_ascii_isalpha(*cursor) && (gint) *cursor - 87 < 16) { nibble1 = (gint) *cursor - 87; } else { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Invalid char \'%c\' found in hex string!\n", *cursor); + purple_debug_warning("QQ", "Invalid char \'%c\' found in hex string!\n", + *cursor); g_free(hex_str); return NULL; } @@ -284,8 +284,7 @@ } else if (g_ascii_isalpha(*cursor) && (gint) (*cursor - 87) < 16) { nibble2 = (gint) *cursor - 87; } else { - purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Invalid char found in hex string!\n"); + purple_debug_warning("QQ", "Invalid char found in hex string!\n"); g_free(hex_str); return NULL; } @@ -362,22 +361,7 @@ void qq_show_packet(const gchar *desc, const guint8 *buf, gint len) { - /* - char buf1[8*len+2], buf2[10]; - int i; - buf1[0] = 0; - for (i = 0; i < len; i++) { - sprintf(buf2, " %02x(%d)", buf[i] & 0xff, buf[i] & 0xff); - strcat(buf1, buf2); - } - strcat(buf1, "\n"); - purple_debug(PURPLE_DEBUG_INFO, desc, "%s", buf1); - */ - - /* modified by s3e, 20080424 */ - qq_hex_dump(PURPLE_DEBUG_INFO, desc, - buf, len, - ""); + qq_hex_dump(PURPLE_DEBUG_INFO, "QQ", buf, len, desc); } /* convert face num from packet (0-299) to local face (1-100) */
--- a/libpurple/protocols/yahoo/yahoo_auth.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo_auth.c Tue Sep 16 20:01:24 2008 +0000 @@ -1,9 +1,22 @@ /* * yahoo_auth.c: Authentication routines. - * + * * Written by Kevin Kurtz and Scott Werndorfer + * Copyright(c) 2003 Cerulean Studios * - * Copyright(c) 2003 Cerulean Studios + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * */
--- a/libpurple/protocols/yahoo/yahoo_auth.h Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo_auth.h Tue Sep 16 20:01:24 2008 +0000 @@ -2,6 +2,21 @@ * yahoo_auth.h: Header for Yahoo Messenger authentication schemes. Eew. * * Copyright(c) 2003 Cerulean Studios + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + * */ #ifndef _YAHOO_AUTH_H_
--- a/libpurple/proxy.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/proxy.c Tue Sep 16 20:01:24 2008 +0000 @@ -212,19 +212,21 @@ { static PurpleProxyInfo info = {0, NULL, 0, NULL, NULL}; gboolean use_same_proxy = FALSE; - gchar *tmp, *err; + gchar *tmp, *err = NULL; tmp = g_find_program_in_path("gconftool-2"); if (tmp == NULL) return purple_global_proxy_get_info(); g_free(tmp); + tmp = NULL; /* Check whether to use a proxy. */ if (!g_spawn_command_line_sync("gconftool-2 -g /system/proxy/mode", &tmp, &err, NULL, NULL)) return purple_global_proxy_get_info(); g_free(err); + err = NULL; if (!strcmp(tmp, "none\n")) { info.type = PURPLE_PROXY_NONE; @@ -239,6 +241,7 @@ } g_free(tmp); + tmp = NULL; /* Free the old fields */ if (info.host) { @@ -258,28 +261,31 @@ &tmp, &err, NULL, NULL)) return purple_global_proxy_get_info(); g_free(err); + err = NULL; if (!strcmp(tmp, "true\n")) use_same_proxy = TRUE; g_free(tmp); + tmp = NULL; - if (!use_same_proxy && !g_spawn_command_line_sync("gconftool-2 -g /system/proxy/socks_host", + if (!use_same_proxy) { + if (!g_spawn_command_line_sync("gconftool-2 -g /system/proxy/socks_host", &info.host, &err, NULL, NULL)) - return purple_global_proxy_get_info(); - g_free(err); - g_strchomp(info.host); + return purple_global_proxy_get_info(); + g_free(err); + err = NULL; + } - if (!use_same_proxy && *info.host != '\0') { + if(info.host != NULL) + g_strchomp(info.host); + + if (!use_same_proxy && (info.host != NULL) && (*info.host != '\0')) { info.type = PURPLE_PROXY_SOCKS5; if (!g_spawn_command_line_sync("gconftool-2 -g /system/proxy/socks_port", &tmp, &err, NULL, NULL)) { g_free(info.host); info.host = NULL; - g_free(info.username); - info.username = NULL; - g_free(info.password); - info.password = NULL; return purple_global_proxy_get_info(); } g_free(err); @@ -291,6 +297,8 @@ &info.host, &err, NULL, NULL)) return purple_global_proxy_get_info(); g_free(err); + err = NULL; + /* If we get this far then we know we're using an HTTP proxy */ info.type = PURPLE_PROXY_HTTP; @@ -310,11 +318,10 @@ { g_free(info.host); info.host = NULL; - g_free(info.username); - info.username = NULL; return purple_global_proxy_get_info(); } g_free(err); + err = NULL; g_strchomp(info.username); if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/authentication_password", @@ -327,6 +334,7 @@ return purple_global_proxy_get_info(); } g_free(err); + err = NULL; g_strchomp(info.password); if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/port", @@ -1505,62 +1513,31 @@ } static void -s5_readchap(gpointer data, gint source, PurpleInputCondition cond) +s5_readchap(gpointer data, gint source, PurpleInputCondition cond); + +/* + * Return how many bytes we processed + * -1 means we've shouldn't keep reading from the buffer + */ +static gssize +s5_parse_chap_msg(PurpleProxyConnectData *connect_data) { - guchar *cmdbuf, *buf; - PurpleProxyConnectData *connect_data = data; + guchar *buf, *cmdbuf = connect_data->read_buffer; int len, navas, currentav; - purple_debug(PURPLE_DEBUG_INFO, "socks5 proxy", "Got CHAP response.\n"); - - if (connect_data->read_buffer == NULL) { - /* A big enough butfer to read the message header (2 bytes) and at least one complete attribute and value (1 + 1 + 255). */ - connect_data->read_buf_len = 259; - connect_data->read_buffer = g_malloc(connect_data->read_buf_len); - connect_data->read_len = 0; - } - - if (connect_data->read_buf_len - connect_data->read_len == 0) { - /*If the stuff below is right, this shouldn't be possible. */ - purple_debug_error("socks5 proxy", "This is about to suck because the read buffer is full (shouldn't happen).\n"); - } - - len = read(connect_data->fd, connect_data->read_buffer + connect_data->read_len, - connect_data->read_buf_len - connect_data->read_len); - - if (len == 0) - { - purple_proxy_connect_data_disconnect(connect_data, - _("Server closed the connection.")); - return; - } - - if (len < 0) - { - if (errno == EAGAIN) - /* No worries */ - return; - - /* Error! */ - purple_proxy_connect_data_disconnect_formatted(connect_data, - _("Lost connection with server:\n%s"), g_strerror(errno)); - return; - } - - connect_data->read_len += len; - if (connect_data->read_len < 2) - return; - - cmdbuf = connect_data->read_buffer; + purple_debug_misc("socks5 proxy", "Reading CHAP message: %x\n", *cmdbuf); if (*cmdbuf != 0x01) { purple_proxy_connect_data_disconnect(connect_data, _("Received invalid data on connection with server.")); - return; + return -1; } cmdbuf++; navas = *cmdbuf; + + purple_debug_misc("socks5 proxy", "Expecting %d attribute(s).\n", navas); + cmdbuf++; for (currentav = 0; currentav < navas; currentav++) { @@ -1575,7 +1552,10 @@ memmove((connect_data->read_buffer + 2), cmdbuf, len); /* Decrease the read count accordingly */ connect_data->read_len = len + 2; - return; + + purple_debug_info("socks5 proxy", "Need more data to retrieve attribute %d.\n", currentav); + + return -1; } buf = cmdbuf + 2; @@ -1605,7 +1585,11 @@ purple_proxy_connect_data_disconnect(connect_data, _("Authentication failed")); } - return; + return -1; + case 0x01: + /* We've already validated that cmdbuf[1] is sane. */ + purple_debug_info("socks5 proxy", "Received TEXT-MESSAGE of '%.*s'\n", (int) cmdbuf[1], buf); + break; case 0x03: purple_debug_info("socks5 proxy", "Received CHALLENGE\n"); /* Server wants our credentials */ @@ -1617,6 +1601,7 @@ hmacmd5_chap(buf, cmdbuf[1], purple_proxy_info_get_password(connect_data->gpi), connect_data->write_buffer + 4); + /* TODO: What about USER-IDENTITY? */ connect_data->write_buffer[0] = 0x01; connect_data->write_buffer[1] = 0x01; connect_data->write_buffer[2] = 0x04; @@ -1632,7 +1617,7 @@ PURPLE_INPUT_WRITE, proxy_do_write, connect_data); proxy_do_write(connect_data, connect_data->fd, PURPLE_INPUT_WRITE); - return; + return -1; case 0x11: purple_debug_info("socks5 proxy", "Received ALGORIGTHMS of %x\n", buf[0]); /* Server wants to select an algorithm */ @@ -1646,7 +1631,7 @@ "Disconnecting..."); purple_proxy_connect_data_disconnect(connect_data, _("Received invalid data on connection with server.")); - return; + return -1; } break; default: @@ -1655,10 +1640,85 @@ cmdbuf = buf + cmdbuf[1]; } + return (cmdbuf - connect_data->read_buffer); +} + +static void +s5_readchap(gpointer data, gint source, PurpleInputCondition cond) +{ + gssize msg_ret; + PurpleProxyConnectData *connect_data = data; + int len; + + purple_debug(PURPLE_DEBUG_INFO, "socks5 proxy", "Got CHAP response.\n"); + + if (connect_data->read_buffer == NULL) { + /* A big enough butfer to read the message header (2 bytes) and at least one complete attribute and value (1 + 1 + 255). */ + connect_data->read_buf_len = 259; + connect_data->read_buffer = g_malloc(connect_data->read_buf_len); + connect_data->read_len = 0; + } + + if (connect_data->read_buf_len - connect_data->read_len == 0) { + /*If the stuff below is right, this shouldn't be possible. */ + purple_debug_error("socks5 proxy", "This is about to suck because the read buffer is full (shouldn't happen).\n"); + } + + len = read(connect_data->fd, connect_data->read_buffer + connect_data->read_len, + connect_data->read_buf_len - connect_data->read_len); + + if (len == 0) { + purple_proxy_connect_data_disconnect(connect_data, + _("Server closed the connection.")); + return; + } + + if (len < 0) { + if (errno == EAGAIN) + /* No worries */ + return; + + /* Error! */ + purple_proxy_connect_data_disconnect_formatted(connect_data, + _("Lost connection with server:\n%s"), g_strerror(errno)); + return; + } + + connect_data->read_len += len; + + /* We may have read more than one message into the buffer, we need to make sure to process them all */ + while (1) { + + /* We need more to be able to read this message */ + if (connect_data->read_len < 2) + return; + + msg_ret = s5_parse_chap_msg(connect_data); + + if (msg_ret < 0) + return; + + /* See if we have another message already in the buffer */ + if ((len = connect_data->read_len - msg_ret) > 0) { + + /* Move on to the next message */ + memmove(connect_data->read_buffer, connect_data->read_buffer + msg_ret, len); + /* Decrease the read count accordingly */ + connect_data->read_len = len; + + /* Try to read the message that connect_data->read_buffer now points to */ + continue; + } + + break; + } + /* Fell through. We ran out of CHAP events to process, but haven't * succeeded or failed authentication - there may be more to come. * If this is the case, come straight back here. */ + purple_debug_info("socks5 proxy", "Waiting for another message from which to read CHAP info.\n"); + /* We've processed all the available attributes, so get ready for a whole new message */ g_free(connect_data->read_buffer); connect_data->read_buffer = NULL;
--- a/libpurple/util.c Sat Sep 13 16:13:48 2008 +0000 +++ b/libpurple/util.c Tue Sep 16 20:01:24 2008 +0000 @@ -3763,9 +3763,7 @@ while((len = read(source, buf, sizeof(buf))) > 0) { if(gfud->max_len != -1 && (gfud->len + len) > gfud->max_len) { - /* TODO: Fix this when not string frozen */ - /*purple_util_fetch_url_error(gfud, _("Error reading from %s: response too long (%d bytes limit)"),*/ - purple_util_fetch_url_error(gfud, "Error reading from %s: response too long (%d bytes limit)", + purple_util_fetch_url_error(gfud, _("Error reading from %s: response too long (%d bytes limit)"), gfud->website.address, gfud->max_len); return; }
--- a/pidgin/artwork/art-tools/clean-svg-definitions.sh Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -#!/bin/bash - -for f in `ls *.svg` -do - echo "Processing $f file..." - inkscape --vacuum-defs $f -done
--- a/pidgin/artwork/art-tools/render-pidgin-emotes.rb Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -#!/usr/bin/env ruby - -require "rexml/document" -require "ftools" -include REXML -INKSCAPE = '/usr/bin/inkscape' -SRC = "./svg" - -def renderit(file) - svg = Document.new(File.new("#{SRC}/#{file}", 'r')) - svg.root.each_element("//g[contains(@inkscape:label,'plate')]") do |icon| - filename = icon.attributes["label"] - filename = `echo -n #{filename} | sed -e 's/plate\-//g'` - puts "#{file} #{filename}.png" - icon.each_element("rect") do |box| - if box.attributes['inkscape:label'] == '22x22' - dir = "#{box.attributes['width']}x#{box.attributes['height']}/" - cmd = "#{INKSCAPE} -i #{box.attributes['id']} -e #{dir}/#{filename}.png #{SRC}/#{file} > /dev/null 2>&1" - File.makedirs(dir) unless File.exists?(dir) - system(cmd) - print "." - elsif box.attributes['inkscape:label'] == '24x24' - dir = "#{box.attributes['width']}x#{box.attributes['height']}/" - cmd = "#{INKSCAPE} -i #{box.attributes['id']} -e #{dir}/#{filename}.png #{SRC}/#{file} > /dev/null 2>&1" - File.makedirs(dir) unless File.exists?(dir) - system(cmd) - print "." - end - end - puts '' - end -end - -if (ARGV[0].nil?) #render all SVGs - puts "Rendering from SVGs in #{SRC}" - Dir.foreach(SRC) do |file| - renderit(file) if file.match(/svg$/) - end - puts "\nrendered all SVGs" -else #only render the SVG passed - file = "#{ARGV[0]}.svg" - if (File.exists?("#{SRC}/#{file}")) - renderit(file) - puts "\nrendered #{file}" - else - puts "[E] No such file (#{file})" - end -end
--- a/pidgin/artwork/hicolor/24x24/emotes/Makefile.am Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,209 +0,0 @@ -SMILEYS = act-up.png \ - airplane.png \ - alien.png \ - angel.png \ - angry.png \ - arrogant.png \ - at-wits-end.png \ - bad.png \ - bashful.png \ - beat-up.png \ - beauty.png \ - beer.png \ - blowkiss.png \ - bomb.png \ - bowl.png \ - boy.png \ - brb.png \ - bulgy-eyes.png \ - bunny.png \ - bye.png \ - cake.png \ - call-me.png \ - camera.png \ - can.png \ - car.png \ - cat.png \ - chicken.png \ - cigarette.png \ - clap.png \ - clock.png \ - cloudy.png \ - clover.png \ - clown.png \ - coffee.png \ - coins.png \ - computer.png \ - confused.png \ - console.png \ - cowboy.png \ - cow.png \ - crying.png \ - curl-lip.png \ - curse.png \ - cute.png \ - cyclops.png \ - dance.png \ - dazed.png \ - desire.png \ - devil.png \ - disappointed.png \ - disdain.png \ - doctor.png \ - dog.png \ - doh.png \ - dont-know.png \ - drink.png \ - drool.png \ - eat.png \ - embarrassed.png \ - excruciating.png \ - eyeroll.png \ - female-fighter.png \ - film.png \ - fingers-crossed.png \ - flag.png \ - foot-in-mouth.png \ - freaked-out.png \ - ghost.png \ - giggle.png \ - girl.png \ - glasses-cool.png \ - glasses-nerdy.png \ - goat.png \ - go-away.png \ - good.png \ - hammer.png \ - handcuffs.png \ - handshake.png \ - highfive.png \ - hug-left.png \ - hug-right.png \ - hypnotized.png \ - in-love.png \ - island.png \ - jump.png \ - kissed.png \ - kissing.png \ - kiss.png \ - knife.png \ - lamp.png \ - lashes.png \ - laugh.png \ - liquor.png \ - loser.png \ - love-over.png \ - love.png \ - lying.png \ - mad-tongue.png \ - mail.png \ - male-fighter1.png \ - male-fighter2.png \ - mean.png \ - meeting.png \ - messed.png \ - mobile.png \ - mohawk.png \ - moneymouth.png \ - monkey.png \ - moon.png \ - msn-away.png \ - msn-busy.png \ - msn_online.png \ - msn.png \ - musical-note.png \ - music.png \ - nailbiting.png \ - neutral.png \ - on-the-phone.png \ - party.png \ - peace.png \ - phone.png \ - pig.png \ - pill.png \ - pirate.png \ - pissed-off.png \ - pizza.png \ - plate.png \ - poop.png \ - pray.png \ - present.png \ - pumpkin.png \ - qq.png \ - question.png \ - quiet.png \ - rainbow.png \ - rain.png \ - rose-dead.png \ - rose.png \ - rotfl.png \ - sad.png \ - sarcastic.png \ - search.png \ - secret.png \ - shame.png \ - sheep.png \ - shock.png \ - shout.png \ - shut-mouth.png \ - sick.png \ - sidefrown.png \ - silly.png \ - sinister.png \ - skeleton.png \ - skywalker.png \ - sleepy.png \ - smile-big.png \ - smile.png \ - smirk.png \ - snail.png \ - snicker.png \ - snowman.png \ - soccerball.png \ - soldier.png \ - star.png \ - starving.png \ - stop.png \ - struggle.png \ - sun.png \ - sweat.png \ - talktohand.png \ - teeth.png \ - terror.png \ - thinking.png \ - thunder.png \ - time-out.png \ - tongue.png \ - tremble.png \ - turtle.png \ - tv.png \ - umbrella.png \ - vampire.png \ - victory.png \ - waiting.png \ - watermelon.png \ - waving.png \ - weep.png \ - wilt.png \ - wink.png \ - worship.png \ - yawn.png \ - yin-yang.png - - -pidginsmileypix_in_files = default.theme.in - -if INSTALL_PIXMAPS -pidginsmileypixdir = $(datadir)/pixmaps/pidgin/emotes/default -pidginsmileypix_DATA = \ - $(SMILEYS) \ - theme - -theme: default.theme.in - sed -e 's/^_Name=/Name=/' \ - -e 's/^_Description=/Description=/' \ - -e 's/^_Author=/Author=/' \ - $< > $@ -endif - -EXTRA_DIST = $(SMILEYS) $(pidginsmileypix_in_files) theme
--- a/pidgin/artwork/hicolor/24x24/emotes/Makefile.mingw Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) --include ./Makefile.am.mingw - -.PHONY: install clean - -install: ./Makefile.am.mingw theme - if test '$(pidginsmileypix_DATA)'; then \ - mkdir -p $(pidginsmileypixdir); \ - cp $(pidginsmileypix_DATA) $(pidginsmileypixdir); \ - fi; - -clean: - rm -f theme - -./Makefile.am.mingw: ./Makefile.am - sed -e 's/^if\ INSTALL_PIXMAPS/ifeq (\$$(INSTALL_PIXMAPS), 1)/' ./Makefile.am > $@ - include $@ -
--- a/pidgin/artwork/hicolor/24x24/emotes/default.theme.in Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,394 +0,0 @@ -_Name=Default -_Description=Pidgin smileys -Icon=wink.png -Author=Hylke Bons - - -# Default smileys -[default] -smile.png :) :-) -smile-big.png :-D :-d :D :d -sad.png :-( :( -wink.png ;-) ;) -tongue.png :P :-P :-p :p -shock.png =-O =-o -kiss.png :-* -glasses-cool.png 8-) -embarrassed.png :-[ -crying.png :'( -thinking.png :-/ :-\\ -angel.png O:-) o:-) -shut-mouth.png :-X -moneymouth.png :-$ -foot-in-mouth.png :-! -shout.png >:o >:O -! skywalker.png C:-) c:-) C:) c:) -! monkey.png :-(|) :(|) 8-|) -! cyclops.png O-) o-) - - -# Following AIM 6.1 -[AIM] -smile.png :-) :) -wink.png ;-) ;) -sad.png :-( :( -tongue.png :-P :P :-p :p -shock.png =-O -kiss.png :-* -shout.png >:o -smile-big.png :-D :D -moneymouth.png :-$ -foot-in-mouth.png :-! -embarrassed.png :-[ -angel.png O:-) -thinking.png :-\\ :-/ -crying.png :'( -shut-mouth.png :-X -glasses-cool.png 8-) -! skywalker.png C:-) c:-) C:) c:) -! monkey.png :-(|) :(|) - - -# Following Windows Live Messenger 8.1 -[MSN] -smile.png :) :-) -smile-big.png :D :d :-D :-d -wink.png ;) ;-) -shock.png :-O :-o :O :o -tongue.png :P :p :-P :-p -glasses-cool.png (H) (h) -angry.png :@ :-@ -embarrassed.png :$ :-$ -confused.png :S :s :-S :-s -sad.png :( :-( -crying.png :'( -neutral.png :| :-| -devil.png (6) -angel.png (A) (a) -love.png (L) (l) -love-over.png (U) (u) -msn.png (M) (m) -cat.png (@) -dog.png (&) -moon.png (S) -star.png (*) -film.png (~) -musical-note.png (8) -mail.png (E) (e) -rose.png (F) (f) -rose-dead.png (W) (w) -clock.png (O) (o) -kiss.png (K) (k) -present.png (G) (g) -cake.png (^) -camera.png (P) (p) -lamp.png (I) (i) -coffee.png (C) (c) -phone.png (T) (t) -hug-left.png ({) -hug-right.png (}) -beer.png (B) (b) -drink.png (D) (d) -boy.png (Z) (z) -girl.png (X) (x) -good.png (Y) (y) -bad.png (N) (n) -vampire.png :[ :-[ -goat.png (nah) -sun.png (#) -rainbow.png (R) (r) -quiet.png :-# -teeth.png 8o| -glasses-nerdy.png 8-| -sarcastic.png ^o) -secret.png :-* -sick.png +o( -snail.png (sn) -turtle.png (tu) -plate.png (pl) -bowl.png (||) -pizza.png (pi) -soccerball.png (so) -car.png (au) -airplane.png (ap) -umbrella.png (um) -island.png (ip) -computer.png (co) -mobile.png (mp) -brb.png (brb) -rain.png (st) -highfive.png (h5) -coins.png (mo) -sheep.png (bah) -dont-know.png :^) -thinking.png *-) -thunder.png (li) -party.png <:o) -eyeroll.png 8-) -yawn.png |-) -bunny.png ('.') -! skywalker.png C:-) c:-) C:) c:) -! monkey.png :-(|) :(|) - -# Hidden MSN emotes -cigarette.png (ci) (CI) -handcuffs.png (%) -console.png (xx) (XX) -fingers-crossed.png (yn) (YN) - - -# Following QQ 2006 -[QQ] -shock.png /:O /jy /surprised -curl-lip.png /:~ /pz /curl_lip -desire.png /:* /se /desire -dazed.png /:| /dazed -party.png /8-) /dy /revel -crying.png /:< /ll /cry -bashful.png /:$ /hx /bashful -shut-mouth.png /:X /bz /shut_mouth -sleepy.png /:Z /shui /sleep -weep.png /:'( /dk /weep -embarrassed.png /:-| /gg /embarassed -pissed-off.png /:@ /fn /pissed_off -act-up.png /:P /tp /act_up -smile-big.png /:D /cy /toothy_smile -smile.png /:) /wx /small_smile -sad.png /:( /ng /sad -glasses-cool.png /:+ /kuk /cool -doctor.png /:# /feid /SARS -silly.png /:Q /zk /crazy -sick.png /:T /tu /vomit -snicker.png /;p /tx /titter -cute.png /;-D /ka /cute -disdain.png /;d /by /disdain -arrogant.png /;o /am /arrogant -starving.png /:g /jie /starving -yawn.png /|-) /kun /sleepy -terror.png /:! /jk /terror -sweat.png /:L /sweat -smirk.png /:> /hanx /smirk -soldier.png /:; /db /soldier -struggle.png /;f /fendou /struggle -curse.png /:-S /zhm /curse -question.png /? /yiw /question -quiet.png /;x /xu /shh -hypnotized.png /;@ /yun /dizzy -excruciating.png /:8 /zhem /excrutiating -freaked-out.png /;! /shuai /freaked_out -skeleton.png /!!! /kl /skeleton -hammer.png /xx /qiao /hammer -bye.png /bye /zj /bye -go-away.png /go /shan /go -tremble.png /shake /fad /shake -in-love.png /love /aiq /love -jump.png /jump /tiao /jump -search.png /find /zhao /search -lashes.png /& /mm /beautiful_eyebrows -pig.png /pig /zt /pig -cat.png /cat /mm /cat -dog.png /dog /xg /dog -hug-left.png /hug /yb /hug -coins.png /$ /qianc /money -lamp.png /! /dp /lightbulb -bowl.png /cup /bei /cup -cake.png /cake /dg /cake -thunder.png /li /shd /lightning -bomb.png /bome /zhd /bomb -knife.png /kn /dao /knife -soccerball.png /footb /zq /soccer -musical-note.png /music /yy /music -poop.png /shit /bb /shit -coffee.png /coffee /kf /coffee -eat.png /eat /fan /eat -pill.png /pill /yw /pill -rose.png /rose /mg /rose -wilt.png /fade /dx /wilt -kiss.png /kiss /wen /kiss -love.png /heart /xin /heart -love-over.png /break /xs /broken_heart -meeting.png /meeting /hy /meeting -present.png /gift /lw /gift -phone.png /phone /dh /phone -clock.png /time /sj /time -mail.png /email /yj /email -tv.png /TV /ds /TV -sun.png /sun /ty /sun -moon.png /moon /yl /moon -good.png /strong /qiang /thumbs_up -bad.png /weak /ruo /thumbs_down -handshake.png /share /ws /handshake -victory.png /v /shl /victory -beauty.png /<J> /mn /beauty -qq.png /<QQ> /qz /qq -blowkiss.png /<L> /fw /blow_kiss -angry.png /<O> /oh /angry -liquor.png /<B> /bj /baijiu -can.png /<U> /qsh /soda -watermelon.png /<W> /xigua /watermelon -rain.png /<!!> /xy /rain -cloudy.png /<~> /duoy /cloudy -snowman.png /<Z> /xr /snowman -star.png /<*> /xixing /star -girl.png /<00> /nv /woman -boy.png /<11> /nan /man -! skywalker.png C:-) c:-) C:) c:) -! monkey.png :-(|) :(|) - - -# Following ICQ 6.0 -[ICQ] -smile.png :-) :) -neutral.png :-$ -sad.png :-( :( -shock.png =-O -wink.png ;-) ;) -tongue.png :-P :P :-p :p -music.png [:-} -laugh.png *JOKINGLY* -sleepy.png *TIRED* -crying.png :'( :'-( -sick.png :-! -kissed.png *KISSED* -stop.png *STOP* -kiss.png :-{} :-* -kissing.png *KISSING* -victory.png *YAHOO* -silly.png %) -embarrassed.png :-[ -devil.png ]:-> -angel.png O:-) -rose.png @}->-- -shut-mouth.png :-X :X :-x :x -bomb.png @= -thinking.png :-\\ :-/ -good.png *THUMBS\ UP* -shout.png >:o >:O :-@ -beer.png *DRINK* -smile-big.png :-D :D -glasses-cool.png 8-) -in-love.png *IN\ LOVE* -! skywalker.png C:-) c:-) C:) c:) -! monkey.png :-(|) :(|) - - -# Following Yahoo! Messenger 8.1 -[Yahoo] -smile.png :) :-) -question.png :-/ :-\\ -shock.png :-O :O :-o :o -devil.png >:) -angel.png O:-) o:-) 0:-) -sick.png :-& -yawn.png (:| -hypnotized.png @-) -on-the-phone.png :)] -sad.png :( :-( -in-love.png :x :-x :X :-X -angry.png X-( x-( X( x( -crying.png :(( -glasses-nerdy.png :-B :-b -quiet.png :-$ -drool.png =P~ =p~ -lying.png :^O :^o -call-me.png :-c -wink.png ;) ;-) -embarrassed.png :"> -mean.png :-> :> -laugh.png :)) :-)) -bye.png =; -arrogant.png [-( -thinking.png :-? -waiting.png :-w :-W -at-wits-end.png ~x( ~X( -smile-big.png :D :-D :d :-d -tongue.png :-P :P :-p :p -glasses-cool.png B-) b-) -neutral.png :| :-| -sleepy.png I-) i-) |-) -clown.png :o) :O) -doh.png #-o #-O -weep.png :-< -go-away.png :-h -lashes.png ;;) -kiss.png :-* :* -confused.png :-S :-s -sarcastic.png /:) -eyeroll.png 8-| -silly.png 8-} -clap.png =D> =d> -mad-tongue.png >:P >:p -time-out.png :-t :-T -hug-left.png >:D< >:d< -love-over.png =(( -sweat.png #:-S #:-s -rotfl.png =)) :-j :-J -loser.png L-) l-) -party.png <:-P <:-p -nailbiting.png :-SS :-Ss :-sS :-ss -cowboy.png <):) -desire.png 8-> -! skywalker.png C:-) c:-) C:) c:) -! monkey.png :-(|) :(|) - -# Hidden Yahoo emotes -alien.png =:) >-) -beat-up.png b-( B-( -chicken.png ~:> -coffee.png ~o) ~O) -cow.png 3:-O 3:-o -dance.png \\:D/ \\:d/ -rose.png @};- -dont-know.png :-L :-l -skeleton.png 8-X 8-x -lamp.png *-:) -monkey.png :(|) -coins.png $-) -peace.png :)>- -pig.png :@) -pray.png [-o< [-O< -pumpkin.png (~~) -shame.png [-X [-x -flag.png **== -clover.png %%- -musical-note.png :-" -giggle.png ;)) -worship.png ^:)^ -star.png (*) -waving.png >:/ -talktohand.png :-@ - -# Only available after activating the Yahoo! Fighter IMVironment -male-fighter1.png o-> O-> -male-fighter2.png o=> O=> -female-fighter.png o-+ O-+ -yin-yang.png (%) - - -# Following MySpaceIM Beta 1.0.697.0 -[MySpaceIM] -smile-big.png :D :-D -devil.png }:) -confused.png :Z -glasses-nerdy.png B) -bulgy-eyes.png %) -freaked-out.png :E -smile.png :) :-) -in-love.png :X -laugh.png :)) -mohawk.png -: -mad-tongue.png X( -messed.png X) -glasses-nerdy.png Q) -doh.png :G -pirate.png P) -shock.png :O -sidefrown.png :{ -sinister.png :B -smirk.png :, -neutral.png :| -tongue.png :P :p -pissed-off.png B| -wink.png ;-) ;) -sad.png :[ -kiss.png :x
--- a/pidgin/artwork/hicolor/24x24/emotes/none/Makefile.am Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -pidginsmileypix_in_files = none.theme.in - -if INSTALL_PIXMAPS -pidginsmileypixdir = $(datadir)/pixmaps/pidgin/emotes/none -pidginsmileypix_DATA = theme - -theme: none.theme.in - sed -e 's/^_Name=/Name=/' \ - -e 's/^_Description=/Description=/' \ - -e 's/^_Author=/Author=/' \ - $< > $@ -endif - -EXTRA_DIST = \ - $(pidginsmileypix_in_files) \ - Makefile.mingw \ - theme
--- a/pidgin/artwork/hicolor/24x24/emotes/none/Makefile.mingw Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) --include ./Makefile.am.mingw - -.PHONY: install clean - -install: ./Makefile.am.mingw theme - if test '$(pidginsmileypix_DATA)'; then \ - mkdir -p $(pidginsmileypixdir); \ - cp $(pidginsmileypix_DATA) $(pidginsmileypixdir); \ - fi; - -clean: - rm -f theme - -./Makefile.am.mingw: ./Makefile.am - sed -e 's/^if\ INSTALL_PIXMAPS/ifeq (\$$(INSTALL_PIXMAPS), 1)/' ./Makefile.am > $@ - include $@ -
--- a/pidgin/artwork/hicolor/24x24/emotes/none/none.theme.in Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -_Name=None -_Description=Selecting this disables graphical emoticons. -_Author=Penguin Pimps
--- a/pidgin/artwork/hicolor/24x24/emotes/none/theme Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -Name=None -Description=Selecting this disables graphical emoticons. -Author=Penguin Pimps
--- a/pidgin/artwork/hicolor/24x24/emotes/theme Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,394 +0,0 @@ -Name=Default -Description=Pidgin smileys -Icon=wink.png -Author=Hylke Bons - - -# Default smileys -[default] -smile.png :) :-) -smile-big.png :-D :-d :D :d -sad.png :-( :( -wink.png ;-) ;) -tongue.png :P :-P :-p :p -shock.png =-O =-o -kiss.png :-* -glasses-cool.png 8-) -embarrassed.png :-[ -crying.png :'( -thinking.png :-/ :-\\ -angel.png O:-) o:-) -shut-mouth.png :-X -moneymouth.png :-$ -foot-in-mouth.png :-! -shout.png >:o >:O -! skywalker.png C:-) c:-) C:) c:) -! monkey.png :-(|) :(|) 8-|) -! cyclops.png O-) o-) - - -# Following AIM 6.1 -[AIM] -smile.png :-) :) -wink.png ;-) ;) -sad.png :-( :( -tongue.png :-P :P :-p :p -shock.png =-O -kiss.png :-* -shout.png >:o -smile-big.png :-D :D -moneymouth.png :-$ -foot-in-mouth.png :-! -embarrassed.png :-[ -angel.png O:-) -thinking.png :-\\ :-/ -crying.png :'( -shut-mouth.png :-X -glasses-cool.png 8-) -! skywalker.png C:-) c:-) C:) c:) -! monkey.png :-(|) :(|) - - -# Following Windows Live Messenger 8.1 -[MSN] -smile.png :) :-) -smile-big.png :D :d :-D :-d -wink.png ;) ;-) -shock.png :-O :-o :O :o -tongue.png :P :p :-P :-p -glasses-cool.png (H) (h) -angry.png :@ :-@ -embarrassed.png :$ :-$ -confused.png :S :s :-S :-s -sad.png :( :-( -crying.png :'( -neutral.png :| :-| -devil.png (6) -angel.png (A) (a) -love.png (L) (l) -love-over.png (U) (u) -msn.png (M) (m) -cat.png (@) -dog.png (&) -moon.png (S) -star.png (*) -film.png (~) -musical-note.png (8) -mail.png (E) (e) -rose.png (F) (f) -rose-dead.png (W) (w) -clock.png (O) (o) -kiss.png (K) (k) -present.png (G) (g) -cake.png (^) -camera.png (P) (p) -lamp.png (I) (i) -coffee.png (C) (c) -phone.png (T) (t) -hug-left.png ({) -hug-right.png (}) -beer.png (B) (b) -drink.png (D) (d) -boy.png (Z) (z) -girl.png (X) (x) -good.png (Y) (y) -bad.png (N) (n) -vampire.png :[ :-[ -goat.png (nah) -sun.png (#) -rainbow.png (R) (r) -quiet.png :-# -teeth.png 8o| -glasses-nerdy.png 8-| -sarcastic.png ^o) -secret.png :-* -sick.png +o( -snail.png (sn) -turtle.png (tu) -plate.png (pl) -bowl.png (||) -pizza.png (pi) -soccerball.png (so) -car.png (au) -airplane.png (ap) -umbrella.png (um) -island.png (ip) -computer.png (co) -mobile.png (mp) -brb.png (brb) -rain.png (st) -highfive.png (h5) -coins.png (mo) -sheep.png (bah) -dont-know.png :^) -thinking.png *-) -thunder.png (li) -party.png <:o) -eyeroll.png 8-) -yawn.png |-) -bunny.png ('.') -! skywalker.png C:-) c:-) C:) c:) -! monkey.png :-(|) :(|) - -# Hidden MSN emotes -cigarette.png (ci) (CI) -handcuffs.png (%) -console.png (xx) (XX) -fingers-crossed.png (yn) (YN) - - -# Following QQ 2006 -[QQ] -shock.png /:O /jy /surprised -curl-lip.png /:~ /pz /curl_lip -desire.png /:* /se /desire -dazed.png /:| /dazed -party.png /8-) /dy /revel -crying.png /:< /ll /cry -bashful.png /:$ /hx /bashful -shut-mouth.png /:X /bz /shut_mouth -sleepy.png /:Z /shui /sleep -weep.png /:'( /dk /weep -embarrassed.png /:-| /gg /embarassed -pissed-off.png /:@ /fn /pissed_off -act-up.png /:P /tp /act_up -smile-big.png /:D /cy /toothy_smile -smile.png /:) /wx /small_smile -sad.png /:( /ng /sad -glasses-cool.png /:+ /kuk /cool -doctor.png /:# /feid /SARS -silly.png /:Q /zk /crazy -sick.png /:T /tu /vomit -snicker.png /;p /tx /titter -cute.png /;-D /ka /cute -disdain.png /;d /by /disdain -arrogant.png /;o /am /arrogant -starving.png /:g /jie /starving -yawn.png /|-) /kun /sleepy -terror.png /:! /jk /terror -sweat.png /:L /sweat -smirk.png /:> /hanx /smirk -soldier.png /:; /db /soldier -struggle.png /;f /fendou /struggle -curse.png /:-S /zhm /curse -question.png /? /yiw /question -quiet.png /;x /xu /shh -hypnotized.png /;@ /yun /dizzy -excruciating.png /:8 /zhem /excrutiating -freaked-out.png /;! /shuai /freaked_out -skeleton.png /!!! /kl /skeleton -hammer.png /xx /qiao /hammer -bye.png /bye /zj /bye -go-away.png /go /shan /go -tremble.png /shake /fad /shake -in-love.png /love /aiq /love -jump.png /jump /tiao /jump -search.png /find /zhao /search -lashes.png /& /mm /beautiful_eyebrows -pig.png /pig /zt /pig -cat.png /cat /mm /cat -dog.png /dog /xg /dog -hug-left.png /hug /yb /hug -coins.png /$ /qianc /money -lamp.png /! /dp /lightbulb -bowl.png /cup /bei /cup -cake.png /cake /dg /cake -thunder.png /li /shd /lightning -bomb.png /bome /zhd /bomb -knife.png /kn /dao /knife -soccerball.png /footb /zq /soccer -musical-note.png /music /yy /music -poop.png /shit /bb /shit -coffee.png /coffee /kf /coffee -eat.png /eat /fan /eat -pill.png /pill /yw /pill -rose.png /rose /mg /rose -wilt.png /fade /dx /wilt -kiss.png /kiss /wen /kiss -love.png /heart /xin /heart -love-over.png /break /xs /broken_heart -meeting.png /meeting /hy /meeting -present.png /gift /lw /gift -phone.png /phone /dh /phone -clock.png /time /sj /time -mail.png /email /yj /email -tv.png /TV /ds /TV -sun.png /sun /ty /sun -moon.png /moon /yl /moon -good.png /strong /qiang /thumbs_up -bad.png /weak /ruo /thumbs_down -handshake.png /share /ws /handshake -victory.png /v /shl /victory -beauty.png /<J> /mn /beauty -qq.png /<QQ> /qz /qq -blowkiss.png /<L> /fw /blow_kiss -angry.png /<O> /oh /angry -liquor.png /<B> /bj /baijiu -can.png /<U> /qsh /soda -watermelon.png /<W> /xigua /watermelon -rain.png /<!!> /xy /rain -cloudy.png /<~> /duoy /cloudy -snowman.png /<Z> /xr /snowman -star.png /<*> /xixing /star -girl.png /<00> /nv /woman -boy.png /<11> /nan /man -! skywalker.png C:-) c:-) C:) c:) -! monkey.png :-(|) :(|) - - -# Following ICQ 6.0 -[ICQ] -smile.png :-) :) -neutral.png :-$ -sad.png :-( :( -shock.png =-O -wink.png ;-) ;) -tongue.png :-P :P :-p :p -music.png [:-} -laugh.png *JOKINGLY* -sleepy.png *TIRED* -crying.png :'( :'-( -sick.png :-! -kissed.png *KISSED* -stop.png *STOP* -kiss.png :-{} :-* -kissing.png *KISSING* -victory.png *YAHOO* -silly.png %) -embarrassed.png :-[ -devil.png ]:-> -angel.png O:-) -rose.png @}->-- -shut-mouth.png :-X :X :-x :x -bomb.png @= -thinking.png :-\\ :-/ -good.png *THUMBS\ UP* -shout.png >:o >:O :-@ -beer.png *DRINK* -smile-big.png :-D :D -glasses-cool.png 8-) -in-love.png *IN\ LOVE* -! skywalker.png C:-) c:-) C:) c:) -! monkey.png :-(|) :(|) - - -# Following Yahoo! Messenger 8.1 -[Yahoo] -smile.png :) :-) -question.png :-/ :-\\ -shock.png :-O :O :-o :o -devil.png >:) -angel.png O:-) o:-) 0:-) -sick.png :-& -yawn.png (:| -hypnotized.png @-) -on-the-phone.png :)] -sad.png :( :-( -in-love.png :x :-x :X :-X -angry.png X-( x-( X( x( -crying.png :(( -glasses-nerdy.png :-B :-b -quiet.png :-$ -drool.png =P~ =p~ -lying.png :^O :^o -call-me.png :-c -wink.png ;) ;-) -embarrassed.png :"> -mean.png :-> :> -laugh.png :)) :-)) -bye.png =; -arrogant.png [-( -thinking.png :-? -waiting.png :-w :-W -at-wits-end.png ~x( ~X( -smile-big.png :D :-D :d :-d -tongue.png :-P :P :-p :p -glasses-cool.png B-) b-) -neutral.png :| :-| -sleepy.png I-) i-) |-) -clown.png :o) :O) -doh.png #-o #-O -weep.png :-< -go-away.png :-h -lashes.png ;;) -kiss.png :-* :* -confused.png :-S :-s -sarcastic.png /:) -eyeroll.png 8-| -silly.png 8-} -clap.png =D> =d> -mad-tongue.png >:P >:p -time-out.png :-t :-T -hug-left.png >:D< >:d< -love-over.png =(( -sweat.png #:-S #:-s -rotfl.png =)) :-j :-J -loser.png L-) l-) -party.png <:-P <:-p -nailbiting.png :-SS :-Ss :-sS :-ss -cowboy.png <):) -desire.png 8-> -! skywalker.png C:-) c:-) C:) c:) -! monkey.png :-(|) :(|) - -# Hidden Yahoo emotes -alien.png =:) >-) -beat-up.png b-( B-( -chicken.png ~:> -coffee.png ~o) ~O) -cow.png 3:-O 3:-o -dance.png \\:D/ \\:d/ -rose.png @};- -dont-know.png :-L :-l -skeleton.png 8-X 8-x -lamp.png *-:) -monkey.png :(|) -coins.png $-) -peace.png :)>- -pig.png :@) -pray.png [-o< [-O< -pumpkin.png (~~) -shame.png [-X [-x -flag.png **== -clover.png %%- -musical-note.png :-" -giggle.png ;)) -worship.png ^:)^ -star.png (*) -waving.png >:/ -talktohand.png :-@ - -# Only available after activating the Yahoo! Fighter IMVironment -male-fighter1.png o-> O-> -male-fighter2.png o=> O=> -female-fighter.png o-+ O-+ -yin-yang.png (%) - - -# Following MySpaceIM Beta 1.0.697.0 -[MySpaceIM] -smile-big.png :D :-D -devil.png }:) -confused.png :Z -glasses-nerdy.png B) -bulgy-eyes.png %) -freaked-out.png :E -smile.png :) :-) -in-love.png :X -laugh.png :)) -mohawk.png -: -mad-tongue.png X( -messed.png X) -glasses-nerdy.png Q) -doh.png :G -pirate.png P) -shock.png :O -sidefrown.png :{ -sinister.png :B -smirk.png :, -neutral.png :| -tongue.png :P :p -pissed-off.png B| -wink.png ;-) ;) -sad.png :[ -kiss.png :x
--- a/pidgin/artwork/hicolor/scalable/apps/pidgin.svg Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,610 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="48px" - height="48px" - id="svg4345" - sodipodi:version="0.32" - inkscape:version="0.46" - sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/48/scalable" - sodipodi:docname="pidgin.svg" - inkscape:export-filename="/home/hbons/Desktop/pidgin48.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - inkscape:output_extension="org.inkscape.output.svg.inkscape"> - <defs - id="defs4347"> - <linearGradient - id="linearGradient8744" - inkscape:collect="always"> - <stop - id="stop8746" - offset="0" - style="stop-color:#7a1d90;stop-opacity:1" /> - <stop - id="stop8748" - offset="1" - style="stop-color:#6b3678;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8732"> - <stop - style="stop-color:#6b3678;stop-opacity:1;" - offset="0" - id="stop8734" /> - <stop - style="stop-color:#6b3678;stop-opacity:0;" - offset="1" - id="stop8736" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8904"> - <stop - style="stop-color:#729fcf;stop-opacity:1;" - offset="0" - id="stop8906" /> - <stop - style="stop-color:#25486d;stop-opacity:1" - offset="1" - id="stop8908" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8884"> - <stop - style="stop-color:#9a5ba8;stop-opacity:1;" - offset="0" - id="stop8886" /> - <stop - style="stop-color:#6b3e75;stop-opacity:1" - offset="1" - id="stop8888" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8876"> - <stop - style="stop-color:#9a5ba8;stop-opacity:1;" - offset="0" - id="stop8878" /> - <stop - style="stop-color:#744380;stop-opacity:1" - offset="1" - id="stop8880" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8868"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop8870" /> - <stop - style="stop-color:#a646b7;stop-opacity:1" - offset="1" - id="stop8872" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8860"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop8862" /> - <stop - style="stop-color:#a949b9;stop-opacity:1" - offset="1" - id="stop8864" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8848"> - <stop - style="stop-color:#000000;stop-opacity:1;" - offset="0" - id="stop8850" /> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="1" - id="stop8852" /> - </linearGradient> - <linearGradient - id="linearGradient8820" - inkscape:collect="always"> - <stop - id="stop8822" - offset="0" - style="stop-color:#522400;stop-opacity:1" /> - <stop - id="stop8824" - offset="1" - style="stop-color:#6e3100;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8808"> - <stop - style="stop-color:#6e3100;stop-opacity:1;" - offset="0" - id="stop8810" /> - <stop - style="stop-color:#6e3100;stop-opacity:0;" - offset="1" - id="stop8812" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8686"> - <stop - style="stop-color:#fdb751;stop-opacity:1" - offset="0" - id="stop8688" /> - <stop - style="stop-color:#ce5c00;stop-opacity:1" - offset="1" - id="stop8690" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient2834"> - <stop - style="stop-color:#7e408d;stop-opacity:1" - offset="0" - id="stop2836" /> - <stop - style="stop-color:#82508e;stop-opacity:0;" - offset="1" - id="stop2838" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient2826"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop2828" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop2830" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient2816"> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="0" - id="stop2818" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop2820" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6537"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop6539" /> - <stop - style="stop-color:#d3e1f1;stop-opacity:1" - offset="1" - id="stop6541" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6506"> - <stop - style="stop-color:#ffffff;stop-opacity:0.95477384" - offset="0" - id="stop6508" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop6510" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6506" - id="linearGradient6512" - x1="15.645709" - y1="40.668503" - x2="15.645709" - y2="47.022106" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.988192,1.5624997,-2.39645)" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient2816" - id="radialGradient2824" - cx="14.930223" - cy="25.801632" - fx="14.930223" - fy="25.801632" - r="16.390338" - gradientTransform="matrix(1.3364897,0,0,1.3894845,-0.759152,-10.711989)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2826" - id="linearGradient2832" - x1="13.191773" - y1="41.606163" - x2="13.191773" - y2="49.067719" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.988192,1.4473537,-2.486208)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2834" - id="linearGradient2840" - x1="11.373499" - y1="43.444576" - x2="11.373499" - y2="47.757988" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.988192,1.4473537,-2.486208)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8686" - id="linearGradient8692" - x1="18.5" - y1="29.911009" - x2="19.985121" - y2="29.853554" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.0769231,0,0,1.1428571,-0.905101,-4.6800586)" /> - <filter - inkscape:collect="always" - id="filter8730"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.27197245" - id="feGaussianBlur8732" /> - </filter> - <filter - inkscape:collect="always" - id="filter8792" - x="-0.095301818" - width="1.1906036" - y="-0.27704017" - height="1.5540803"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.31022727" - id="feGaussianBlur8794" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8820" - id="linearGradient8814" - x1="18.339697" - y1="29.338558" - x2="18.031723" - y2="30.431053" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8808" - id="linearGradient8818" - gradientUnits="userSpaceOnUse" - x1="17.969458" - y1="29.494703" - x2="18.143806" - y2="30.188351" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8848" - id="linearGradient8854" - x1="10.48653" - y1="25.21174" - x2="9.7512932" - y2="23.675837" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8848" - id="linearGradient8858" - gradientUnits="userSpaceOnUse" - x1="10.498732" - y1="24.936121" - x2="9.6415968" - y2="23.675837" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8860" - id="linearGradient8866" - x1="13.061977" - y1="10.027351" - x2="16.545418" - y2="12.891665" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.50247,0,0,1,-6.5946403,-2.139701)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8868" - id="linearGradient8874" - x1="12.409452" - y1="10.602999" - x2="16.140554" - y2="13.895189" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.236264,0,0,0.549587,-5.4828863,3.775206)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8876" - id="linearGradient8882" - x1="10.46875" - y1="25.3125" - x2="9.53125" - y2="19.6875" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8884" - id="linearGradient8890" - x1="23.881994" - y1="24.343237" - x2="24.973602" - y2="19.216713" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8904" - id="linearGradient8910" - x1="26.125" - y1="1.8037834" - x2="41.875" - y2="33.678783" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8744" - id="linearGradient8738" - x1="4.0852318" - y1="39.097038" - x2="4.0852318" - y2="44.321774" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8732" - id="linearGradient8742" - gradientUnits="userSpaceOnUse" - x1="4.0852318" - y1="40.416641" - x2="4.0852318" - y2="43.352409" - gradientTransform="matrix(-1,0,0,1,37.022732,0)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6537" - id="linearGradient7977" - gradientUnits="userSpaceOnUse" - x1="30.5" - y1="4.8871226" - x2="30.5" - y2="22.781603" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="2.828427" - inkscape:cx="63.722923" - inkscape:cy="33.120105" - inkscape:current-layer="layer1" - showgrid="true" - inkscape:grid-bbox="true" - inkscape:document-units="px" - inkscape:window-width="1434" - inkscape:window-height="840" - inkscape:window-x="-2" - inkscape:window-y="0" - showguides="true" - inkscape:guide-bbox="true" - inkscape:grid-points="true" - inkscape:snap-bbox="true" - inkscape:snap-nodes="false" - objecttolerance="10" - gridtolerance="10"> - <inkscape:grid - type="xygrid" - id="grid7914" - visible="true" - enabled="true" /> - </sodipodi:namedview> - <metadata - id="metadata4350"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="layer1" - inkscape:label="Layer 1" - inkscape:groupmode="layer"> - <path - style="fill:#efefef;fill-opacity:1;stroke:url(#linearGradient8910);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 20.53125,1.5 C 17.192693,1.5 14.5,4.611235 14.5,8.46875 L 14.5,20.53125 C 14.5,24.388765 17.192693,27.5 20.53125,27.5 L 34.530203,27.5 C 34.530203,27.5 34.406442,30.680041 32.92887,32.534344 C 38.120414,32.534344 39.353553,27.485509 39.353553,27.485509 L 41.5,27.5 C 45.512737,27.5 46.5,24.38319 46.5,20.53125 L 46.5,8.46875 C 46.5,4.6112353 43.807307,1.5 40.46875,1.5 L 20.53125,1.5 z" - id="rect5498" - sodipodi:nodetypes="cccccccccccc" /> - <path - style="fill:url(#linearGradient7977);fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 20.53125,2.5 C 17.815701,2.5 15.5,5.0778932 15.5,8.46875 L 15.5,20.53125 C 15.5,23.922107 17.815701,26.5 20.53125,26.5 L 34.53125,26.5 C 35.082875,26.501589 35.529661,26.948375 35.53125,27.5 C 35.53125,27.5 35.367799,30.212738 34.75,31.34218 C 36.852551,31.34218 38.53125,26.6875 38.53125,26.6875 C 38.704261,26.563588 38.912203,26.497922 39.125,26.5 L 41.5,26.5 C 43.246736,26.5 44.065452,25.932701 44.65625,24.9375 C 45.247048,23.942299 45.5,22.371547 45.5,20.53125 L 45.5,8.46875 C 45.5,5.0778935 43.184299,2.5 40.46875,2.5 L 20.53125,2.5 z" - id="path6535" - sodipodi:nodetypes="ccccccccccscccc" /> - <rect - style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect8734" - width="7" - height="1.8602936" - x="15.642976" - y="26.409245" - rx="0.81387848" - ry="0.93014681" /> - <path - style="fill:url(#linearGradient8866);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 10.968089,7.6821669 C 13.825874,5.8764931 18.683474,9.095739 19.201853,10.751964 L 15.25649,10.751964 C 15.19399,8.408214 10.968089,7.6821669 10.968089,7.6821669 z" - id="rect5189" - sodipodi:nodetypes="cccc" /> - <path - style="fill:url(#linearGradient8874);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 8.9209727,9.9271812 C 10.543462,8.0699992 15.5336,9.5097671 15.5336,10.860297 L 11.743475,11.411821 C 12.958815,9.7987339 8.9209727,9.9271812 8.9209727,9.9271812 z" - id="path5192" - sodipodi:nodetypes="cccc" /> - <path - style="opacity:1;fill:url(#linearGradient2840);fill-opacity:1;stroke:url(#linearGradient2832);stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 16.447354,10.481822 C 9.8233516,10.481822 3.9308558,15.93012 4.5098537,22.712688 C 5.7768579,37.554787 1.9403503,35.543378 1.5,42.316391 C 1.5,44.375904 2.4854201,45.355587 4.5920502,45.355587 C 5.7795388,45.355587 30.807389,45.5 33.498388,45.5 C 35.612515,45.5 35.447354,43.46472 35.447354,43.46472 C 35.447354,40.830782 29.045256,38.620654 27.260807,36.687231 C 25.432389,34.709838 27.447354,27.653648 27.447354,27.653648 C 28.08866,26.141912 28.447354,24.466812 28.447354,22.712688 C 28.447354,15.894164 23.071356,10.481822 16.447354,10.481822 z" - id="path5176" - sodipodi:nodetypes="cscccszcsc" /> - <path - style="opacity:0.55000000000000004;fill:url(#radialGradient2824);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-opacity:1" - d="M 16.25,11.5 C 10.237704,11.5 5.0276636,16.611038 5.4999997,22.834065 C 6.0644244,30.27036 5.8175038,32.821583 4.0236672,37.541192 C 1.1437418,42.286379 3.1235207,44.533069 5.4658637,44.533069 C 7.4024447,44.533069 25.520621,44.503627 31.346594,44.503627 C 32.513801,44.503627 34.5,45.001748 34.5,43.554478 C 34.5,43.335354 34.300249,42.923343 33.75,42.411881 C 33.199751,41.90042 32.37676,41.351214 31.46875,40.806069 C 30.56074,40.260924 29.59071,39.709456 28.71875,39.169376 C 27.84679,38.629297 27.074154,38.125147 26.53125,37.409159 C 25.921245,36.604678 25.641306,35.658991 25.586842,34.629869 C 25.532378,33.600747 25.670221,32.49665 25.787061,31.449126 C 26.020741,29.354077 26.53125,27.527239 26.53125,27.527239 C 26.54624,27.4637 26.567163,27.401673 26.59375,27.341953 C 27.181231,25.957097 27.5,24.414481 27.5,22.802446 C 27.5,16.531779 22.272436,11.5 16.25,11.5 z" - id="path5241" - sodipodi:nodetypes="cscccssssssscssc" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="1.0174263" - inkscape:original="M 9.96875 19 C 8.022221 19 6.9374998 21.081214 6.9375 23 C 6.9375 25.208 8.5222219 27 10.46875 27 C 11.889191 27 14 25.489251 14 23.28125 C 14 21.536852 11.915281 19 9.96875 19 z " - style="opacity:1;fill:url(#linearGradient8882);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - id="path8838" - d="M 9.96875,17.96875 C 8.6328774,17.96875 7.5286409,18.753017 6.875,19.71875 C 6.2213591,20.684483 5.9062499,21.848884 5.90625,23 C 5.90625,25.694817 7.8977844,28.03125 10.46875,28.03125 C 11.539674,28.03125 12.596335,27.527372 13.46875,26.71875 C 14.341165,25.910128 15.03125,24.709464 15.03125,23.28125 C 15.03125,22.003744 14.362496,20.808851 13.46875,19.8125 C 12.575004,18.816149 11.384009,17.96875 9.96875,17.96875 z" - transform="translate(1.09375,-0.96875)" /> - <path - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 15.09375,22.321339 C 15.09375,24.52934 12.987869,26.03125 11.567428,26.03125 C 9.6208995,26.03125 8.0411075,24.239249 8.0411075,22.031249 C 8.0411075,20.112462 9.1240375,18.03125 11.070566,18.03125 C 13.017097,18.03125 15.09375,20.576941 15.09375,22.321339 z" - id="path5157" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:#6b1a80;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5162" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(1.237779,0,0,1.544828,-1.0301916,-15.38768)" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:url(#linearGradient8854);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5164" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(0.4028775,0,0,0.772414,7.4966298,3.2519345)" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="1.0250763" - inkscape:original="M 24.71875 19 C 23.921039 19.030682 23.197708 19.355158 22.78125 19.8125 C 21.639847 21.065961 21.758036 23.254972 23.0625 24.6875 C 24.196099 25.932389 26.077347 26.565958 27.21875 25.3125 C 28.360153 24.05904 28.061824 21.069247 27.03125 19.9375 C 26.379019 19.221236 25.516461 18.969318 24.71875 19 z " - style="opacity:1;fill:url(#linearGradient8890);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - id="path8846" - d="M 24.6875,17.96875 C 23.636213,18.009185 22.683031,18.409233 22.03125,19.125 C 20.466122,20.843786 20.678782,23.580894 22.3125,25.375 C 23.011072,26.142154 23.917332,26.724837 24.9375,26.9375 C 25.957668,27.150163 27.151401,26.89759 27.96875,26 C 28.842555,25.04041 29.039766,23.753975 28.96875,22.53125 C 28.897734,21.308525 28.565932,20.111716 27.78125,19.25 C 26.906665,18.289553 25.728905,17.928695 24.6875,17.96875 z" - transform="translate(1.0348213,-0.9657729)" /> - <path - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 28.07086,18.984912 C 26.766398,17.552385 24.644242,17.934034 23.811326,18.848719 C 22.669923,20.102179 22.802261,22.282108 24.106725,23.714636 C 25.240323,24.959524 27.104889,25.612445 28.246292,24.358987 C 29.387696,23.105527 29.101434,20.116659 28.07086,18.984912 z" - id="path5169" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:#6b1a80;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5171" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(1.208632,0,0,1.598777,13.243467,-16.766194)" /> - <path - transform="matrix(0.9902622,0,0,1.0468412,0.6803699,-1.6322179)" - style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter8730)" - d="M 19.0625,25.21875 C 18.601377,25.21875 18.273569,25.504007 18.09375,25.71875 C 17.913931,25.933493 17.816385,26.151947 17.6875,26.375 C 17.42973,26.821106 17.161718,27.281061 16.8125,27.625 C 16.463282,27.968939 15.753081,28.431077 15.090677,28.457564 C 13.768981,28.152971 12.567412,27.574567 11.44337,27.388802 C 11.190855,27.626888 11.124903,28.002654 11.28125,28.3125 C 12.447615,30.480389 13.704893,31.652553 16.158709,32.98462 C 17.36658,33.640319 19.551532,34.28873 20.662703,34.736506 C 22.03071,33.835346 25.543472,30.338576 25.75,28.125 C 25.844084,27.808258 25.729503,27.466527 25.463497,27.270522 C 24.478872,27.816677 23.360045,28.165794 22.250307,28.426314 C 21.786763,28.408951 21.509989,27.99255 21.21875,27.65625 C 20.927511,27.31995 20.680079,26.828945 20.4375,26.375 C 20.31621,26.148027 20.208768,25.937142 20.03125,25.71875 C 19.853732,25.500358 19.525474,25.21875 19.0625,25.21875 z" - id="path8696" - sodipodi:nodetypes="cssscccsccccsssc" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="0.36336106" - inkscape:original="M 15.8125 27 C 15.361611 27 15 27.422198 15 27.9375 C 15 28.452801 15.361612 28.874999 15.8125 28.875 L 21.1875 28.875 C 21.638389 28.875 22 28.452801 22 27.9375 C 22 27.422199 21.638389 27 21.1875 27 L 15.8125 27 z " - style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter8792)" - id="path8738" - d="M 15.8125,26.625 C 15.134785,26.625 14.625,27.252207 14.625,27.9375 C 14.625,28.622793 15.134785,29.249998 15.8125,29.25 L 21.1875,29.25 C 21.865216,29.25 22.375,28.622793 22.375,27.9375 C 22.375,27.252207 21.865216,26.625 21.1875,26.625 L 15.8125,26.625 z" - transform="translate(1.0492259,-0.5907729)" /> - <rect - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect5215" - width="7" - height="1.8602936" - x="16.017977" - y="26.173933" - rx="0.81387848" - ry="0.93014681" /> - <path - style="fill:url(#linearGradient8692);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" - d="M 12.017976,27.284466 C 18.332186,30.947891 18.535242,25.034227 19.622035,25.034227 C 20.693875,25.034227 20.889384,30.946219 26.017976,27.230273 C 25.73271,30.311439 22.068246,33.065477 21.020058,34.065477 C 18.988153,32.971727 14.03875,31.7541 12.017976,27.284466 z" - id="rect5187" - sodipodi:nodetypes="czccc" /> - <path - sodipodi:type="arc" - style="opacity:0.61111109;fill:url(#linearGradient8814);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="path8806" - sodipodi:cx="18.097515" - sodipodi:cy="29.72571" - sodipodi:rx="0.28726214" - sodipodi:ry="0.6408155" - d="M 18.384777,29.72571 A 0.28726214,0.6408155 0 1 1 17.810253,29.72571 A 0.28726214,0.6408155 0 1 1 18.384777,29.72571 z" - transform="matrix(-1.0945752,0.9356227,0.6067766,1.5209514,23.290203,-33.120817)" /> - <path - sodipodi:type="arc" - style="opacity:0.61111109;fill:url(#linearGradient8818);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="path8816" - sodipodi:cx="18.097515" - sodipodi:cy="29.72571" - sodipodi:rx="0.28726214" - sodipodi:ry="0.6408155" - d="M 18.384777,29.72571 A 0.28726214,0.6408155 0 1 1 17.810253,29.72571 A 0.28726214,0.6408155 0 1 1 18.384777,29.72571 z" - transform="matrix(1.0945741,0.9356227,-0.606776,1.5209514,16.745752,-33.098342)" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:url(#linearGradient8858);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path8856" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(0.4028775,0,0,0.772414,21.437701,3.254912)" /> - <path - style="opacity:0.61111108999999997;fill:url(#linearGradient8738);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 3.375,44.9375 C 1.75,44.5625 1.125,41.0625 4.1875,35.75 C 5.3980639,40.757973 11,44.375 11,44.375 L 3.375,44.9375 z" - id="rect7959" - sodipodi:nodetypes="cccc" /> - <path - style="opacity:0.61111108999999997;fill:url(#linearGradient8742);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 33.647731,44.9375 C 35.272732,44.5625 36.772732,42.5625 28.772731,38.5625 C 29.124668,42.695473 26.022731,44.375 26.022731,44.375 L 33.647731,44.9375 z" - id="path8740" - sodipodi:nodetypes="cccc" /> - </g> -</svg>
--- a/pidgin/artwork/hicolor/scalable/status/pidgin-auth.svg Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,850 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="48" - height="48" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.46" - version="1.0" - sodipodi:docbase="/home/hbons/Desktop" - sodipodi:docname="auth.svg" - inkscape:export-filename="/home/hbons/Bureaublad/Projecten/Pidgin/pidgin-mtn/pidgin/pixmaps/dialogs/64/auth.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - sodipodi:modified="true"> - <defs - id="defs4"> - <linearGradient - inkscape:collect="always" - id="linearGradient9188"> - <stop - style="stop-color:#2e3436;stop-opacity:1;" - offset="0" - id="stop9190" /> - <stop - style="stop-color:#6f726d;stop-opacity:1" - offset="1" - id="stop9192" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient9166"> - <stop - style="stop-color:#3b73bb;stop-opacity:1;" - offset="0" - id="stop9168" /> - <stop - style="stop-color:#3b73bb;stop-opacity:0;" - offset="1" - id="stop9170" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient9158"> - <stop - style="stop-color:#729fcf;stop-opacity:1;" - offset="0" - id="stop9160" /> - <stop - style="stop-color:#bcd2e9;stop-opacity:1" - offset="1" - id="stop9162" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient9056"> - <stop - style="stop-color:#729fcf;stop-opacity:1;" - offset="0" - id="stop9058" /> - <stop - style="stop-color:#729fcf;stop-opacity:0;" - offset="1" - id="stop9060" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient9040"> - <stop - style="stop-color:#729fcf;stop-opacity:1" - offset="0" - id="stop9042" /> - <stop - style="stop-color:#3465a4;stop-opacity:1" - offset="1" - id="stop9044" /> - </linearGradient> - <linearGradient - id="linearGradient11669" - inkscape:collect="always"> - <stop - id="stop11671" - offset="0" - style="stop-color:#ffffff;stop-opacity:1" /> - <stop - id="stop11673" - offset="1" - style="stop-color:#2e3436;stop-opacity:1" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11653"> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="0" - id="stop11655" /> - <stop - style="stop-color:#2e3436;stop-opacity:1" - offset="1" - id="stop11657" /> - </linearGradient> - <linearGradient - id="linearGradient11493" - inkscape:collect="always"> - <stop - id="stop11495" - offset="0" - style="stop-color:#555753;stop-opacity:1" /> - <stop - id="stop11497" - offset="1" - style="stop-color:#070808;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient11487" - inkscape:collect="always"> - <stop - id="stop11489" - offset="0" - style="stop-color:#538ac5;stop-opacity:1" /> - <stop - id="stop11491" - offset="1" - style="stop-color:#ffffff;stop-opacity:1" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11474"> - <stop - style="stop-color:#558bc5;stop-opacity:1" - offset="0" - id="stop11476" /> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="1" - id="stop11478" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11333"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11335" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11337" /> - </linearGradient> - <linearGradient - id="linearGradient11316" - inkscape:collect="always"> - <stop - id="stop11318" - offset="0" - style="stop-color:#edd400;stop-opacity:1" /> - <stop - id="stop11320" - offset="1" - style="stop-color:#f6c93b;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11304"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11306" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11308" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11292"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11294" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11296" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11259"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11261" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11263" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11241"> - <stop - style="stop-color:#4f381b;stop-opacity:0.97254902" - offset="0" - id="stop11243" /> - <stop - style="stop-color:#a87b42;stop-opacity:0.96078432" - offset="1" - id="stop11245" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11208"> - <stop - style="stop-color:#c32f00;stop-opacity:1" - offset="0" - id="stop11210" /> - <stop - style="stop-color:#6c1300;stop-opacity:1" - offset="1" - id="stop11212" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11196"> - <stop - style="stop-color:#555753;stop-opacity:1" - offset="0" - id="stop11198" /> - <stop - style="stop-color:#000000;stop-opacity:1" - offset="1" - id="stop11200" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11241" - id="linearGradient10406" - gradientUnits="userSpaceOnUse" - x1="14.365882" - y1="19.515574" - x2="11.215483" - y2="8.2263536" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11493" - id="linearGradient11202" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11196" - id="linearGradient11206" - gradientUnits="userSpaceOnUse" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11316" - id="radialGradient11271" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.8771377,9.6878354e-8,-5.330884e-8,1.0893079,-10.4827,-2.6428601)" - cx="11.873854" - cy="12.147273" - fx="11.594166" - fy="8.8655272" - r="9.975256" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient11310" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient11314" - gradientUnits="userSpaceOnUse" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11259" - id="radialGradient11327" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.023438,0,0,0.8870879,-0.2709505,0.7064648)" - cx="11.736404" - cy="7.3689327" - fx="11.800528" - fy="1.1734189" - r="9.975256" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11339" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-2.0000685,1.885788e-7)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11343" - gradientUnits="userSpaceOnUse" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientTransform="translate(10.999931,1.885788e-7)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11487" - id="linearGradient11480" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-2.0000685,1.885788e-7)" /> - <filter - inkscape:collect="always" - id="filter11503" - x="-0.11697236" - width="1.2339447" - y="-0.32830241" - height="1.6566048"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.64772565" - id="feGaussianBlur11505" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11474" - id="linearGradient11507" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-1,0,0,1,45.999932,1.885788e-7)" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11669" - id="radialGradient11659" - cx="14" - cy="19.5" - fx="9.3258924" - fy="14.814685" - r="8" - gradientTransform="matrix(1.0000001,0,0,0.8124999,0.5000001,4.156251)" - gradientUnits="userSpaceOnUse" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11653" - id="radialGradient11667" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.0000001,0,0,0.8124999,15.5,4.156251)" - cx="14" - cy="19.5" - fx="9.3258924" - fy="14.814685" - r="8" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11241" - id="linearGradient8720" - gradientUnits="userSpaceOnUse" - x1="14.365882" - y1="19.515574" - x2="11.215483" - y2="8.2263536" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11259" - id="radialGradient8722" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.023438,0,0,0.8870879,-0.2709505,0.7064648)" - cx="11.736404" - cy="7.3689327" - fx="11.800528" - fy="1.1734189" - r="9.975256" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11493" - id="linearGradient8985" - gradientUnits="userSpaceOnUse" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11196" - id="linearGradient8993" - gradientUnits="userSpaceOnUse" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient8995" - gradientUnits="userSpaceOnUse" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient8997" - gradientUnits="userSpaceOnUse" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient9005" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-34.999933,2.0000002)" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11208" - id="linearGradient9018" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-0.9659258,0.1156321,0.258819,0.431545,39.417822,14.519987)" - x1="22.919643" - y1="33.491837" - x2="23.746914" - y2="36.579254" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11292" - id="radialGradient9036" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.5208182,0,0,0.3864192,-14.644203,17.599539)" - cx="24.00321" - cy="34.70562" - fx="24.00321" - fy="34.70562" - r="12.133846" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9040" - id="linearGradient9046" - x1="24" - y1="37" - x2="44.533825" - y2="40.875" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.1262515,0,0,1,-4.093162,0)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9056" - id="linearGradient9062" - x1="34.5" - y1="61.35038" - x2="34.5" - y2="33.72963" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9158" - id="linearGradient9164" - x1="29" - y1="35.649048" - x2="29" - y2="32.334484" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-1,0)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9166" - id="linearGradient9172" - x1="29.125" - y1="36.5625" - x2="25" - y2="31.9375" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9188" - id="linearGradient9194" - x1="37.5" - y1="42.295494" - x2="37.5" - y2="40.792892" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9166" - id="linearGradient9246" - gradientUnits="userSpaceOnUse" - x1="29.78125" - y1="37.09375" - x2="23.984375" - y2="30.40625" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1" - inkscape:cx="274.07651" - inkscape:cy="97.498181" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - fill="#fce94f" - inkscape:window-width="1440" - inkscape:window-height="847" - inkscape:window-x="0" - inkscape:window-y="0" - width="48px" - height="48px" - inkscape:snap-bbox="true" - inkscape:snap-nodes="false" - objecttolerance="10" - gridtolerance="10" - showguides="true" - inkscape:guide-bbox="true"> - <inkscape:grid - type="xygrid" - id="grid10393" - visible="true" - enabled="true" /> - </sodipodi:namedview> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <path - transform="matrix(2.257367,0,0,2.7454598,-1.263726,9.7889628)" - d="M 17.393564,10.457643 A 6.6449099,2.3675451 0 1 1 4.1037445,10.457643 A 6.6449099,2.3675451 0 1 1 17.393564,10.457643 z" - sodipodi:ry="2.3675451" - sodipodi:rx="6.6449099" - sodipodi:cy="10.457643" - sodipodi:cx="10.748654" - id="path17958" - style="opacity:0.73423419999999995;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter11503);enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(2.0549539,0,0,2.0549096,-2.2611787,1.4304378)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17960" - style="opacity:1;fill:#e08700;fill-opacity:1;stroke:url(#linearGradient10406);stroke-width:0.48784169999999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4874115,3.0804919)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11247" - style="opacity:1;fill:url(#radialGradient11271);fill-opacity:1;stroke:none;stroke-width:0.51155167999999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - style="opacity:0.37037036000000001;fill:url(#radialGradient9036);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" - d="M 10.826033,28.011426 C 10.520443,28.014045 10.234263,28.093756 10.050887,28.227332 C 9.8675105,28.360908 9.8075706,28.533318 9.8885335,28.694322 C 11.280177,31.722142 16.087826,34.020914 21.857283,34.020914 C 27.626736,34.020914 32.434391,31.722142 33.826033,28.694322 C 33.967019,28.436085 33.737888,28.160593 33.289106,28.048758 C 32.840324,27.936923 32.309315,28.02299 32.044783,28.25044 C 29.836827,29.981737 25.929281,31.047173 21.857283,31.047173 C 17.785285,31.047174 13.87774,29.981737 11.669783,28.25044 C 11.481718,28.097267 11.163547,28.007137 10.826033,28.011426 L 10.826033,28.011426 z" - id="path11288" - sodipodi:nodetypes="cscscscsccc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4873425,3.0804918)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11257" - style="opacity:1;fill:url(#radialGradient11327);fill-opacity:1;stroke:none;stroke-width:0.51155167999999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11329" - d="M 21.499931,19.500002 C 21.499931,22.812 18.811935,25.5 15.499932,25.5 C 12.187931,25.5 9.4999315,22.812 9.4999315,19.500002 C 9.4999315,16.188 12.187931,13.5 15.499932,13.5 C 18.811935,13.5 21.499931,16.188 21.499931,19.500002 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11339);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - sodipodi:nodetypes="cscsc" - id="path17974" - d="M 10.857282,29 C 12.147541,31.295706 16.56888,33.020914 21.857283,33.020914 C 27.145683,33.020914 31.567025,31.295706 32.857282,29 C 30.539039,30.486544 26.467508,31.996368 21.857283,31.996368 C 17.247058,31.99637 13.175526,30.486544 10.857282,29 z" - style="fill:url(#linearGradient9018);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(1.954837,0,0,-1.954837,-1.0791836,45.47002)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17964" - style="opacity:0.48699998999999999;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.51155167999999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path17966" - d="M 20.499932,19.5 C 20.499932,22.259999 18.259935,24.499999 15.499932,24.499999 C 12.739932,24.499999 10.499932,22.259999 10.499932,19.5 C 10.499932,16.739999 12.739932,14.499999 15.499932,14.499999 C 18.259935,14.499999 20.499932,16.739999 20.499932,19.5 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11480);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(2.4367989,0,0,1.5452869,-7.1539168,6.0838442)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path17968" - style="opacity:1;fill:url(#linearGradient11202);fill-opacity:1;stroke:none;stroke-width:0.98640185999999996;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.7380737,0.6989293,-0.7062659,1.8392838,3.5297812,-10.968438)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11325" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.36837955999999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.7380737,0.6989296,-0.7062659,1.8392846,3.5297812,-9.9684476)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17976" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837946999999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.7380737,0.6989293,0.7062659,1.8392838,40.47015,-10.968439)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11323" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.36837955999999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.7380737,0.6989293,0.7062659,1.8392838,40.47015,-9.9684388)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17978" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837955999999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11482" - d="M 23.499931,19.5 C 23.499931,22.259999 25.739928,24.499999 28.499931,24.499999 C 31.259931,24.499999 33.499931,22.259999 33.499931,19.5 C 33.499931,16.739999 31.259931,14.499999 28.499931,14.499999 C 25.739928,14.499999 23.499931,16.739999 23.499931,19.5 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11507);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(2.436799,0,0,1.5452869,3.846082,6.0838439)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11204" - style="opacity:1;fill:url(#linearGradient11206);fill-opacity:1;stroke:none;stroke-width:0.98640185999999996;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.4620795,0,0,1.0301913,2.3076208,11.055896)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11300" - style="opacity:1;fill:url(#linearGradient11310);fill-opacity:1;stroke:none;stroke-width:0.98640185999999996;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.4620795,0,0,1.0301913,13.30762,11.055896)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11312" - style="opacity:1;fill:url(#linearGradient11314);fill-opacity:1;stroke:none;stroke-width:0.98640185999999996;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11341" - d="M 34.499931,19.500002 C 34.499931,22.812 31.811935,25.5 28.499932,25.5 C 25.187931,25.5 22.499931,22.812 22.499931,19.500002 C 22.499931,16.188 25.187931,13.5 28.499932,13.5 C 31.811935,13.5 34.499931,16.188 34.499931,19.500002 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11343);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - style="opacity:0.80000000000000004;fill:url(#radialGradient11659);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 22.1875,18.537724 C 22.1875,22.656901 18.64,26.000001 14.5,26.000001 C 10.36,26.000001 7,22.656901 7,18.537724 C 7,14.418548 10.36,14.000001 14.5,14.000001 C 18.64,14.000001 22.53125,14.293548 22.1875,18.537724 z" - id="path11647" - sodipodi:nodetypes="csssc" /> - <rect - style="opacity:1;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="rect11649" - width="5.1303458" - height="1.0018942" - x="6.2930641" - y="14.833013" - rx="0.51303452" - ry="0.50094712" - transform="matrix(0.9676638,0.2522433,-0.265541,0.9640996,0,0)" /> - <rect - style="opacity:1;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="rect11651" - width="5.1303449" - height="1.0018942" - x="31.000992" - y="25.932768" - rx="0.51303446" - ry="0.50094712" - transform="matrix(0.9676638,-0.2522433,0.265541,0.9640996,0,0)" /> - <path - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:0.99999994000000003;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 14.5,13.5 C 10.084001,13.5 6.5,13.946414 6.5,18.408854 C 6.5,22.871297 10.084001,26.500001 14.5,26.5 C 17.950001,26.5 20.877881,24.27985 22,21.184896 C 23.122119,24.27985 26.049999,26.500001 29.5,26.5 C 33.916001,26.5 37.499998,22.871296 37.5,18.408854 C 37.5,13.946415 33.916,13.5 29.5,13.5 C 26.05,13.5 23.122119,13.790128 22,16.039063 C 20.877881,13.790128 17.950001,13.5 14.5,13.5 z" - id="path11661" /> - <path - style="opacity:0.80000000000000004;fill:url(#radialGradient11667);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 37,18.537724 C 37,22.656901 33.64,26.000001 29.5,26.000001 C 25.36,26.000001 21.849813,22.809207 21.78125,18.600224 C 21.711014,14.288526 25.36,14.000001 29.5,14.000001 C 33.64,14.000001 37,14.418548 37,18.537724 z" - id="path11663" - sodipodi:nodetypes="csssc" /> - <path - transform="matrix(0.651488,0,0,0.651488,28.30843,24.844692)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path8714" - style="opacity:1;fill:#e0a900;fill-opacity:1;stroke:url(#linearGradient8720);stroke-width:1.53875648999999992;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(0.5012403,0,0,0.5012402,30.082278,26.494867)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path8716" - style="opacity:1;fill:url(#radialGradient8722);fill-opacity:1;stroke:none;stroke-width:0.51155167999999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(0.5513643,0,0,-0.5513643,29.490506,38.055647)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path8718" - style="opacity:0.48699998999999999;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.81368314999999991;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <rect - style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient9046);stroke-width:0.99999994000000003;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="rect9038" - width="21.999998" - height="15" - x="23.499998" - y="29.5" - rx="1.331211" - ry="1.2101918" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="-1.0060635" - inkscape:original="M 25.71875 29.5 C 25.048304 29.5 24.5 30.048304 24.5 30.71875 L 24.5 43.28125 C 24.5 43.951696 25.048304 44.5 25.71875 44.5 L 43.28125 44.5 C 43.951696 44.5 44.5 43.951698 44.5 43.28125 L 44.5 30.71875 C 44.5 30.048304 43.951698 29.5 43.28125 29.5 L 25.71875 29.5 z " - style="opacity:1;fill:url(#linearGradient9062);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.94868326000000003;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="path9052" - d="M 25.71875,30.5 C 25.596823,30.5 25.5,30.596823 25.5,30.71875 L 25.5,43.28125 C 25.5,43.403177 25.596823,43.5 25.71875,43.5 L 43.28125,43.5 C 43.403179,43.5 43.5,43.403181 43.5,43.28125 L 43.5,30.71875 C 43.5,30.596821 43.403181,30.5 43.28125,30.5 L 25.71875,30.5 z" - transform="matrix(1.1111112,0,0,1,-3.833336,0)" /> - <rect - style="opacity:1;fill:url(#linearGradient9164);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient9246);stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="rect9064" - width="5" - height="6" - x="25.5" - y="31.5" - rx="0.53033006" - ry="0.53033006" /> - <path - style="fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 28 34 C 27.448 34 27 34.447999 27 35 C 27 35.552 27.448001 35.999999 28 36 C 28.552 36 29 35.551999 29 35 C 29 34.448 28.552001 33.999999 28 34 z M 28 36 C 27.448 36 27 36.448 27 37 C 27 37 29 37 29 37 C 29 36.448 28.552001 36 28 36 z " - id="path9242" /> - <path - style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:semi-condensed;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold Semi-Condensed" - d="M 33.000002,33.459106 L 33.308145,33.459106 L 33.308145,33.96439 L 33.761924,33.96439 L 33.761924,33.459106 L 34.069179,33.459106 L 34.069179,34.784921 L 33.761924,34.784921 L 33.761924,34.222804 L 33.308145,34.222804 L 33.308145,34.784921 L 33.000002,34.784921 L 33.000002,33.459106 M 34.237014,33.790338 L 34.523845,33.790338 L 34.764499,34.465233 L 34.968743,33.790338 L 35.254686,33.790338 L 34.878165,34.879051 C 34.840276,34.989757 34.796171,35.067015 34.74585,35.110824 C 34.695529,35.155225 34.629223,35.177425 34.546934,35.177426 L 34.380874,35.177426 L 34.380874,34.968741 L 34.470564,34.968741 C 34.519109,34.968741 34.554333,34.960157 34.576238,34.942988 C 34.598734,34.92582 34.616199,34.895035 34.628631,34.850634 L 34.636624,34.823106 L 34.237014,33.790338 M 35.420746,33.403161 L 35.706688,33.403161 L 35.706688,34.784921 L 35.420746,34.784921 L 35.420746,33.403161 M 35.985527,33.403161 L 36.271469,33.403161 L 36.271469,34.155314 L 36.600925,33.790338 L 36.933045,33.790338 L 36.496139,34.24678 L 36.967677,34.784921 L 36.620461,34.784921 L 36.271469,34.370215 L 36.271469,34.784921 L 35.985527,34.784921 L 35.985527,33.403161 M 37.919635,34.284965 L 37.919635,34.375543 L 37.250956,34.375543 C 37.257468,34.450137 37.281444,34.506083 37.322886,34.543379 C 37.364918,34.580676 37.423231,34.599325 37.497826,34.599324 C 37.55821,34.599325 37.61978,34.589556 37.682534,34.57002 C 37.745878,34.549891 37.810704,34.519699 37.87701,34.479442 L 37.87701,34.724535 C 37.80952,34.752952 37.741734,34.774265 37.673654,34.788473 C 37.606163,34.803273 37.538674,34.810673 37.471185,34.810673 C 37.308973,34.810673 37.182874,34.765088 37.092888,34.673918 C 37.003494,34.582156 36.958797,34.453689 36.958797,34.288517 C 36.958797,34.126306 37.002902,33.998727 37.091112,33.90578 C 37.179322,33.812835 37.300685,33.766362 37.455201,33.766361 C 37.596099,33.766362 37.708582,33.813427 37.792648,33.907556 C 37.877305,34.001687 37.919634,34.12749 37.919635,34.284965 M 37.625701,34.179291 C 37.6257,34.118906 37.609715,34.070361 37.577747,34.033655 C 37.54637,33.996359 37.504929,33.977711 37.453425,33.97771 C 37.398367,33.977711 37.353374,33.995175 37.318445,34.030103 C 37.284108,34.064441 37.2625,34.11417 37.25362,34.179291 L 37.625701,34.179291 M 39.193057,33.972382 C 39.241601,33.972383 39.278306,33.960542 39.303171,33.936861 C 39.328627,33.913182 39.341355,33.878253 39.341356,33.832075 C 39.341355,33.786491 39.328627,33.751858 39.303171,33.728176 C 39.278306,33.703905 39.241601,33.691769 39.193057,33.691767 L 39.023445,33.691767 L 39.023445,33.972382 L 39.193057,33.972382 M 39.203713,34.552259 C 39.265874,34.55226 39.312347,34.537755 39.343132,34.508746 C 39.374508,34.479738 39.390196,34.435929 39.390197,34.377319 C 39.390196,34.319894 39.374508,34.276974 39.343132,34.248556 C 39.312347,34.219548 39.265874,34.205044 39.203713,34.205043 L 39.023445,34.205043 L 39.023445,34.552259 L 39.203713,34.552259 M 39.489655,34.075392 C 39.55596,34.096706 39.607169,34.136074 39.643283,34.193499 C 39.679395,34.250925 39.697451,34.321374 39.697452,34.404848 C 39.697451,34.532723 39.658378,34.628037 39.580234,34.69079 C 39.502679,34.753544 39.384572,34.784921 39.225913,34.784921 L 38.715302,34.784921 L 38.715302,33.459106 L 39.177072,33.459106 C 39.342835,33.459107 39.462718,33.486932 39.536721,33.54258 C 39.611313,33.598231 39.64861,33.687329 39.648611,33.809874 C 39.64861,33.874405 39.634994,33.929462 39.607762,33.975046 C 39.581121,34.02004 39.541752,34.053489 39.489655,34.075392 M 40.375012,33.993694 C 40.311666,33.993695 40.263417,34.019152 40.230265,34.070064 C 40.197111,34.120386 40.180535,34.193204 40.180535,34.288517 C 40.180535,34.383832 40.197111,34.456946 40.230265,34.507858 C 40.263417,34.55818 40.311666,34.58334 40.375012,34.58334 C 40.437765,34.58334 40.485422,34.55818 40.517983,34.507858 C 40.551135,34.456946 40.567712,34.383832 40.567712,34.288517 C 40.567712,34.193204 40.551135,34.120386 40.517983,34.070064 C 40.485422,34.019152 40.437765,33.993695 40.375012,33.993694 M 40.375012,33.766361 C 40.529527,33.766362 40.650001,33.812539 40.736436,33.904892 C 40.822869,33.997247 40.866086,34.125122 40.866087,34.288517 C 40.866086,34.451913 40.822869,34.579788 40.736436,34.672142 C 40.650001,34.764496 40.529527,34.810673 40.375012,34.810673 C 40.221088,34.810673 40.100317,34.764496 40.0127,34.672142 C 39.925673,34.579788 39.88216,34.451913 39.882161,34.288517 C 39.88216,34.125122 39.925673,33.997247 40.0127,33.904892 C 40.100317,33.812539 40.221088,33.766362 40.375012,33.766361 M 41.975225,34.179291 L 41.975225,34.784921 L 41.687506,34.784921 L 41.687506,34.68635 L 41.687506,34.321374 C 41.687505,34.235533 41.685729,34.176331 41.682178,34.14377 C 41.678625,34.11121 41.672705,34.087233 41.664418,34.07184 C 41.653169,34.051121 41.637776,34.035136 41.618241,34.023887 C 41.599295,34.012048 41.577687,34.006127 41.553415,34.006127 C 41.493621,34.006127 41.446556,34.03188 41.41222,34.083385 C 41.378475,34.134298 41.361602,34.205044 41.361603,34.295621 L 41.361603,34.784921 L 41.07566,34.784921 L 41.07566,33.790338 L 41.361603,33.790338 L 41.361603,33.935973 C 41.404819,33.877957 41.4507,33.835332 41.499246,33.808098 C 41.54779,33.780274 41.601367,33.766362 41.659977,33.766361 C 41.762987,33.766362 41.841133,33.801587 41.894415,33.872036 C 41.948287,33.942486 41.975224,34.044904 41.975225,34.179291 M 42.939615,33.821418 L 42.939615,34.06296 C 42.878637,34.034544 42.819435,34.013232 42.762011,33.999023 C 42.705177,33.984815 42.6516,33.977711 42.601279,33.97771 C 42.546813,33.977711 42.506261,33.985407 42.47962,34.000799 C 42.453571,34.0156 42.440547,34.038688 42.440547,34.070064 C 42.440547,34.095521 42.450315,34.115058 42.469852,34.128674 C 42.48998,34.142291 42.526093,34.152355 42.578191,34.158866 L 42.62792,34.166858 C 42.774739,34.18758 42.873309,34.22162 42.923631,34.268981 C 42.974543,34.316342 42.999999,34.39064 43,34.491874 C 42.999999,34.597845 42.964775,34.67747 42.894326,34.730751 C 42.823876,34.784033 42.718793,34.810673 42.579079,34.810673 C 42.519877,34.810673 42.458603,34.805345 42.395258,34.794689 C 42.332505,34.784625 42.267975,34.769232 42.20167,34.748512 L 42.20167,34.50697 C 42.258503,34.537755 42.316816,34.560844 42.37661,34.576236 C 42.436995,34.591628 42.497972,34.599325 42.559542,34.599324 C 42.615191,34.599325 42.657224,34.59074 42.685641,34.573572 C 42.714057,34.556404 42.728265,34.530947 42.728266,34.497202 C 42.728265,34.468786 42.718497,34.447769 42.698961,34.434153 C 42.679424,34.419945 42.640648,34.408992 42.582631,34.401296 L 42.532014,34.394192 C 42.40473,34.376432 42.315336,34.343575 42.263831,34.295621 C 42.212918,34.247669 42.187462,34.174851 42.187462,34.077168 C 42.187462,33.971791 42.220022,33.893645 42.285144,33.842731 C 42.350265,33.791819 42.450019,33.766362 42.584407,33.766361 C 42.637095,33.766362 42.692449,33.770802 42.750467,33.779681 C 42.808483,33.788563 42.871533,33.802475 42.939615,33.821418" - id="flowRoot9140" /> - <path - style="opacity:1;fill:url(#linearGradient9194);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 31 40 L 31 43 L 32 43 L 32 40 L 31 40 z M 33 40 L 33 43 L 35 43 L 35 40 L 33 40 z M 36 40 L 36 43 L 36.9375 43 L 36.9375 40 L 36 40 z M 38 40 L 38 43 L 40 43 L 40 40 L 38 40 z M 41.28125 40 C 41.168464 40 41.0625 40.105962 41.0625 40.21875 L 41.0625 42.78125 C 41.0625 42.894036 41.168462 43 41.28125 43 L 41.78125 43 C 41.894036 43 42 42.894038 42 42.78125 L 42 40.21875 C 42 40.105964 41.894038 40 41.78125 40 L 41.28125 40 z M 43.0625 40 L 43.0625 43 L 44 43 L 44 40 L 43.0625 40 z " - id="rect9175" /> - <path - style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:semi-condensed;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold Semi-Condensed" - d="M 33,35.766614 L 33.543122,35.766614 C 33.704956,35.766616 33.829008,35.806602 33.915279,35.886573 C 34.001548,35.965918 34.044683,36.079265 34.044684,36.226615 C 34.044683,36.374597 34.001548,36.488574 33.915279,36.568546 C 33.829008,36.64789 33.704956,36.687561 33.543122,36.687561 L 33.327762,36.687561 L 33.327762,37.176843 L 33,37.176843 L 33,35.766614 M 33.327762,36.030147 L 33.327762,36.424028 L 33.508174,36.424028 C 33.571773,36.424029 33.62089,36.407027 33.655525,36.373022 C 33.690158,36.338389 33.707475,36.289587 33.707476,36.226615 C 33.707475,36.163646 33.690158,36.115158 33.655525,36.081153 C 33.62089,36.04715 33.571773,36.030148 33.508174,36.030147 L 33.327762,36.030147 M 34.260044,36.118936 L 34.564192,36.118936 L 34.564192,37.176843 L 34.260044,37.176843 L 34.260044,36.118936 M 34.260044,35.707107 L 34.564192,35.707107 L 34.564192,35.982918 L 34.260044,35.982918 L 34.260044,35.707107 M 35.508753,36.273843 L 35.508753,35.707107 L 35.814791,35.707107 L 35.814791,37.176843 L 35.508753,37.176843 L 35.508753,37.023824 C 35.466561,37.086166 35.420278,37.131819 35.369903,37.160786 C 35.319525,37.189752 35.260962,37.204235 35.194214,37.204235 C 35.077088,37.204235 34.980743,37.152599 34.905178,37.049327 C 34.830243,36.945426 34.792776,36.811928 34.792776,36.648834 C 34.792776,36.48574 34.830243,36.352558 34.905178,36.249285 C 34.980743,36.145384 35.077088,36.093433 35.194214,36.093432 C 35.260333,36.093433 35.318581,36.108231 35.368958,36.137827 C 35.419963,36.166794 35.466561,36.212133 35.508753,36.273843 M 35.307561,36.95865 C 35.37305,36.95865 35.422797,36.932202 35.456802,36.879307 C 35.491435,36.826412 35.508752,36.749587 35.508753,36.648834 C 35.508752,36.548081 35.491435,36.471257 35.456802,36.418361 C 35.422797,36.365467 35.37305,36.339019 35.307561,36.339018 C 35.243331,36.339019 35.193899,36.365467 35.159265,36.418361 C 35.125261,36.471257 35.108259,36.548081 35.108259,36.648834 C 35.108259,36.749587 35.125261,36.826412 35.159265,36.879307 C 35.193899,36.932202 35.243331,36.95865 35.307561,36.95865 M 36.759351,36.997376 C 36.71716,37.059088 36.670876,37.104427 36.6205,37.133394 C 36.570123,37.16236 36.511561,37.176843 36.444812,37.176843 C 36.328946,37.176843 36.232915,37.126152 36.156721,37.024769 C 36.081156,36.922757 36.043374,36.793037 36.043374,36.63561 C 36.043374,36.477554 36.081156,36.348149 36.156721,36.247396 C 36.232915,36.146014 36.328946,36.095322 36.444812,36.095322 C 36.511561,36.095322 36.570123,36.109806 36.6205,36.138771 C 36.670876,36.167739 36.71716,36.213392 36.759351,36.275732 L 36.759351,36.118936 L 37.065388,36.118936 L 37.065388,37.070108 C 37.065387,37.240129 37.0169,37.369848 36.919926,37.459267 C 36.82358,37.549315 36.68347,37.594339 36.499597,37.594339 C 36.440404,37.594339 36.382786,37.589301 36.326742,37.579226 C 36.271327,37.56915 36.215599,37.553722 36.159555,37.532943 L 36.159555,37.26941 C 36.21308,37.303414 36.265345,37.328602 36.316352,37.344975 C 36.367358,37.361977 36.418679,37.370478 36.470315,37.370478 C 36.569809,37.370478 36.642854,37.346234 36.689453,37.297747 C 36.736051,37.24926 36.75935,37.17338 36.759351,37.070108 L 36.759351,36.997376 M 36.55816,36.339018 C 36.495188,36.339019 36.446071,36.364837 36.410808,36.416472 C 36.376174,36.468108 36.358857,36.541155 36.358857,36.63561 C 36.358857,36.732585 36.375859,36.806261 36.409864,36.856637 C 36.443867,36.906384 36.493299,36.931257 36.55816,36.931257 C 36.621759,36.931257 36.671191,36.90544 36.706456,36.853803 C 36.741718,36.802168 36.75935,36.729437 36.759351,36.63561 C 36.75935,36.541155 36.741718,36.468108 36.706456,36.416472 C 36.671191,36.364837 36.621759,36.339019 36.55816,36.339018 M 37.36198,36.118936 L 37.666129,36.118936 L 37.666129,37.176843 L 37.36198,37.176843 L 37.36198,36.118936 M 37.36198,35.707107 L 37.666129,35.707107 L 37.666129,35.982918 L 37.36198,35.982918 L 37.36198,35.707107 M 38.919561,36.532653 L 38.919561,37.176843 L 38.613523,37.176843 L 38.613523,37.071997 L 38.613523,36.683783 C 38.613522,36.592476 38.611633,36.529505 38.607856,36.494871 C 38.604077,36.460237 38.597779,36.434734 38.588965,36.418361 C 38.577,36.396322 38.560627,36.37932 38.539847,36.367355 C 38.519696,36.354762 38.496712,36.348464 38.470894,36.348464 C 38.407293,36.348464 38.357232,36.375857 38.320709,36.43064 C 38.284816,36.484796 38.266869,36.560046 38.266869,36.65639 L 38.266869,37.176843 L 37.962721,37.176843 L 37.962721,36.118936 L 38.266869,36.118936 L 38.266869,36.273843 C 38.312838,36.212133 38.36164,36.166794 38.413276,36.137827 C 38.464912,36.108231 38.5219,36.093433 38.584242,36.093432 C 38.69381,36.093433 38.776931,36.130901 38.833606,36.205835 C 38.890908,36.280771 38.91956,36.38971 38.919561,36.532653" - id="flowRoot9198" /> - </g> -</svg>
--- a/pidgin/artwork/hicolor/scalable/status/pidgin-cool.svg Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,704 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="48" - height="48" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.46" - version="1.0" - sodipodi:docbase="/home/hbons/Desktop" - sodipodi:docname="cool.svg" - inkscape:export-filename="/home/hbons/Bureaublad/cool.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - sodipodi:modified="true"> - <defs - id="defs4"> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 24 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="48 : 24 : 1" - inkscape:persp3d-origin="24 : 16 : 1" - id="perspective105" /> - <linearGradient - id="linearGradient11669" - inkscape:collect="always"> - <stop - id="stop11671" - offset="0" - style="stop-color:#ffffff;stop-opacity:1" /> - <stop - id="stop11673" - offset="1" - style="stop-color:#3465a4;stop-opacity:1" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11653"> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="0" - id="stop11655" /> - <stop - style="stop-color:#3465a4;stop-opacity:1" - offset="1" - id="stop11657" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11586"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11588" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11590" /> - </linearGradient> - <linearGradient - id="linearGradient11493" - inkscape:collect="always"> - <stop - id="stop11495" - offset="0" - style="stop-color:#555753;stop-opacity:1" /> - <stop - id="stop11497" - offset="1" - style="stop-color:#070808;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient11487" - inkscape:collect="always"> - <stop - id="stop11489" - offset="0" - style="stop-color:#538ac5;stop-opacity:1" /> - <stop - id="stop11491" - offset="1" - style="stop-color:#ffffff;stop-opacity:1" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11474"> - <stop - style="stop-color:#558bc5;stop-opacity:1" - offset="0" - id="stop11476" /> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="1" - id="stop11478" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11418"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11420" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11422" /> - </linearGradient> - <linearGradient - id="linearGradient11346" - inkscape:collect="always"> - <stop - id="stop11348" - offset="0" - style="stop-color:#ef7700;stop-opacity:1" /> - <stop - id="stop11350" - offset="1" - style="stop-color:#fea523;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11333"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11335" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11337" /> - </linearGradient> - <linearGradient - id="linearGradient11316" - inkscape:collect="always"> - <stop - id="stop11318" - offset="0" - style="stop-color:#edd400;stop-opacity:1" /> - <stop - id="stop11320" - offset="1" - style="stop-color:#f6c93b;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11304"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11306" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11308" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11292"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11294" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11296" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11259"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11261" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11263" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11241"> - <stop - style="stop-color:#4f381b;stop-opacity:0.97254902" - offset="0" - id="stop11243" /> - <stop - style="stop-color:#a87b42;stop-opacity:0.96078432" - offset="1" - id="stop11245" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11208"> - <stop - style="stop-color:#c32f00;stop-opacity:1" - offset="0" - id="stop11210" /> - <stop - style="stop-color:#6c1300;stop-opacity:1" - offset="1" - id="stop11212" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11196"> - <stop - style="stop-color:#555753;stop-opacity:1" - offset="0" - id="stop11198" /> - <stop - style="stop-color:#000000;stop-opacity:1" - offset="1" - id="stop11200" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11241" - id="linearGradient10406" - gradientUnits="userSpaceOnUse" - x1="14.365882" - y1="19.515574" - x2="11.215483" - y2="8.2263536" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11346" - id="linearGradient10424" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-2.0000002,0,0,2.0000001,48.499999,-0.4999991)" - x1="8.9999981" - y1="10.5625" - x2="8.9999981" - y2="12.4375" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11493" - id="linearGradient11202" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11196" - id="linearGradient11206" - gradientUnits="userSpaceOnUse" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11208" - id="linearGradient11214" - x1="22.919643" - y1="33.491837" - x2="23.746914" - y2="36.579254" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-0.9659258,0.258819,0.258819,0.9659258,39.560471,-4.4105697)" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11316" - id="radialGradient11271" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.8771377,9.6878354e-8,-5.330884e-8,1.0893079,-10.4827,-2.6428601)" - cx="11.873854" - cy="12.147273" - fx="11.594166" - fy="8.8655272" - r="9.975256" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11292" - id="radialGradient11298" - cx="24.00321" - cy="34.70562" - fx="24.00321" - fy="34.70562" - r="12.133846" - gradientTransform="matrix(1.5208182,0,0,0.7073167,-12.501486,7.9416791)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient11310" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient11314" - gradientUnits="userSpaceOnUse" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11259" - id="radialGradient11327" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.023438,0,0,0.8870879,-0.2709505,0.7064648)" - cx="11.736404" - cy="7.3689327" - fx="11.800528" - fy="1.1734189" - r="9.975256" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11339" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-2.0000685,1.885788e-7)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11343" - gradientUnits="userSpaceOnUse" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientTransform="translate(10.999931,1.885788e-7)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11418" - id="linearGradient11424" - x1="22.915459" - y1="34.796875" - x2="22.854631" - y2="29.835938" - gradientUnits="userSpaceOnUse" /> - <filter - inkscape:collect="always" - id="filter11462" - x="-0.078992675" - width="1.1579853" - y="-0.19133781" - height="1.3826756"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.448448" - id="feGaussianBlur11464" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11487" - id="linearGradient11480" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-2.0000685,1.885788e-7)" /> - <filter - inkscape:collect="always" - id="filter11503" - x="-0.11697236" - width="1.2339447" - y="-0.32830241" - height="1.6566048"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.64772565" - id="feGaussianBlur11505" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11474" - id="linearGradient11507" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-1,0,0,1,45.999932,1.885788e-7)" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" /> - <filter - id="filter3405" - height="2.5649745" - y="-0.78248727" - width="1.5575919" - x="-0.27879593" - inkscape:collect="always"> - <feGaussianBlur - id="feGaussianBlur3407" - stdDeviation="1.5438116" - inkscape:collect="always" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11586" - id="linearGradient11592" - x1="39.704506" - y1="13.248698" - x2="54.781696" - y2="18.949747" - gradientUnits="userSpaceOnUse" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11669" - id="radialGradient11659" - cx="14" - cy="19.5" - fx="9.3258924" - fy="14.814685" - r="8" - gradientTransform="matrix(1.0000001,0,0,0.8124999,0.5000001,4.156251)" - gradientUnits="userSpaceOnUse" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11653" - id="radialGradient11667" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.0000001,0,0,0.8124999,15.5,4.156251)" - cx="14" - cy="19.5" - fx="9.3258924" - fy="14.814685" - r="8" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="8" - inkscape:cx="34.093743" - inkscape:cy="29.192709" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="true" - fill="#fce94f" - inkscape:window-width="1440" - inkscape:window-height="847" - inkscape:window-x="0" - inkscape:window-y="0" - width="48px" - height="48px" - inkscape:snap-bbox="true" - inkscape:snap-nodes="false" - objecttolerance="10" - gridtolerance="10" - showguides="true" - inkscape:guide-bbox="true"> - <inkscape:grid - type="xygrid" - id="grid10393" - visible="true" - enabled="true" /> - </sodipodi:namedview> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <path - transform="matrix(2.257367,0,0,2.7454598,-1.263726,9.7889628)" - d="M 17.393564,10.457643 A 6.6449099,2.3675451 0 1 1 4.1037445,10.457643 A 6.6449099,2.3675451 0 1 1 17.393564,10.457643 z" - sodipodi:ry="2.3675451" - sodipodi:rx="6.6449099" - sodipodi:cy="10.457643" - sodipodi:cx="10.748654" - id="path17958" - style="opacity:0.7342342;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter11503);enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(2.0549539,0,0,2.0549096,-2.2611787,1.4304378)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17960" - style="opacity:1;fill:#e08700;fill-opacity:1;stroke:url(#linearGradient10406);stroke-width:0.4878417;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4874115,3.0804919)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11247" - style="opacity:1;fill:url(#radialGradient11271);fill-opacity:1;stroke:none;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4873425,3.0804918)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11257" - style="opacity:1;fill:url(#radialGradient11327);fill-opacity:1;stroke:none;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11329" - d="M 21.499931,19.500002 C 21.499931,22.812 18.811935,25.5 15.499932,25.5 C 12.187931,25.5 9.4999315,22.812 9.4999315,19.500002 C 9.4999315,16.188 12.187931,13.5 15.499932,13.5 C 18.811935,13.5 21.499931,16.188 21.499931,19.500002 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11339);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(1.954837,0,0,-1.954837,-1.0791836,45.47002)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17964" - style="opacity:0.48699999;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path17966" - d="M 20.499932,19.5 C 20.499932,22.259999 18.259935,24.499999 15.499932,24.499999 C 12.739932,24.499999 10.499932,22.259999 10.499932,19.5 C 10.499932,16.739999 12.739932,14.499999 15.499932,14.499999 C 18.259935,14.499999 20.499932,16.739999 20.499932,19.5 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11480);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(2.4367989,0,0,1.5452869,-7.1539168,6.0838442)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path17968" - style="opacity:1;fill:url(#linearGradient11202);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="0.98821175" - inkscape:original="M 13 28 C 14.290259 33.138472 18.711597 37 24 37 C 29.288399 37 33.709743 33.138472 35 28 C 32.681757 31.327326 28.610225 35.09375 24 35.09375 C 19.389774 35.093751 15.318244 31.327326 13 28 z " - style="opacity:0.37037036;fill:url(#radialGradient11298);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - id="path11288" - d="M 12.96875,27 C 12.66316,27.004794 12.37698,27.150701 12.193604,27.395203 C 12.010227,27.639705 11.950287,27.955291 12.03125,28.25 C 13.422894,33.792238 18.230543,38 24,38 C 29.769453,38 34.577108,33.792239 35.96875,28.25 C 36.109736,27.777313 35.880605,27.273042 35.431823,27.068334 C 34.983041,26.863627 34.452032,27.021167 34.1875,27.4375 C 31.979544,30.606533 28.071998,34.09375 24,34.09375 C 19.928002,34.093751 16.020457,30.606534 13.8125,27.4375 C 13.624435,27.157127 13.306264,26.992149 12.96875,27 L 12.96875,27 z" - transform="matrix(0.9659258,-0.264782,0.258819,0.9881799,-6.825115,7.6473507)" /> - <path - sodipodi:nodetypes="cscsc" - id="path17974" - d="M 13,31.694019 C 15.576229,36.323459 20.846351,38.909081 25.954556,37.540342 C 31.062759,36.171603 34.33401,31.297326 34.250368,26 C 32.872293,29.813956 29.916568,34.514228 25.463432,35.707442 C 21.010298,36.900659 16.100427,34.307964 13,31.694019 z" - style="opacity:1;fill:url(#linearGradient11214);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.7380737,0.6989293,-0.7062659,1.8392838,3.5297812,-10.968438)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11325" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.36837956;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.7380737,0.6989296,-0.7062659,1.8392846,3.5297812,-9.9684476)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17976" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837947;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.7380737,0.6989293,0.7062659,1.8392838,40.47015,-12.968438)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11323" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.36837956;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.7380737,0.6989293,0.7062659,1.8392838,40.47015,-11.968438)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17978" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837956;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11482" - d="M 23.499931,19.5 C 23.499931,22.259999 25.739928,24.499999 28.499931,24.499999 C 31.259931,24.499999 33.499931,22.259999 33.499931,19.5 C 33.499931,16.739999 31.259931,14.499999 28.499931,14.499999 C 25.739928,14.499999 23.499931,16.739999 23.499931,19.5 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11507);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(2.436799,0,0,1.5452869,3.846082,6.0838439)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11204" - style="opacity:1;fill:url(#linearGradient11206);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.4620795,0,0,1.0301913,2.3076208,11.055896)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11300" - style="opacity:1;fill:url(#linearGradient11310);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.4620795,0,0,1.0301913,13.30762,11.055896)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11312" - style="opacity:1;fill:url(#linearGradient11314);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11341" - d="M 34.499931,19.500002 C 34.499931,22.812 31.811935,25.5 28.499932,25.5 C 25.187931,25.5 22.499931,22.812 22.499931,19.500002 C 22.499931,16.188 25.187931,13.5 28.499932,13.5 C 31.811935,13.5 34.499931,16.188 34.499931,19.500002 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11343);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:url(#linearGradient11424);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter11462);enable-background:accumulate" - id="path11416" - sodipodi:cx="23.25" - sodipodi:cy="30.1875" - sodipodi:rx="6.8125" - sodipodi:ry="2.8125" - d="M 30.0625,30.1875 A 6.8125,2.8125 0 1 1 16.4375,30.1875 A 6.8125,2.8125 0 1 1 30.0625,30.1875 z" - transform="matrix(0.9925109,-0.2659425,0.4601228,1.7172017,-13.102978,-15.495569)" /> - <path - style="opacity:0.59722218;fill:url(#radialGradient11659);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 22,18.537724 C 22,22.656901 18.64,26.000001 14.5,26.000001 C 10.36,26.000001 7,22.656901 7,18.537724 C 7,14.418548 10.36,14.000001 14.5,14.000001 C 18.64,14.000001 22,14.418548 22,18.537724 z" - id="path11647" - sodipodi:nodetypes="csssc" /> - <rect - style="opacity:1;fill:#204a87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="rect11649" - width="5.1303458" - height="1.0018942" - x="6.2930641" - y="14.833013" - rx="0.51303452" - ry="0.50094712" - transform="matrix(0.9676638,0.2522433,-0.265541,0.9640996,0,0)" /> - <rect - style="opacity:1;fill:#204a87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="rect11651" - width="5.1303449" - height="1.0018942" - x="31.000992" - y="25.932768" - rx="0.51303446" - ry="0.50094712" - transform="matrix(0.9676638,-0.2522433,0.265541,0.9640996,0,0)" /> - <path - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 14.5,13.5 C 10.084001,13.5 6.5,13.946414 6.5,18.408854 C 6.5,22.871297 10.084001,26.500001 14.5,26.5 C 17.950001,26.5 20.877881,24.27985 22,21.184896 C 23.122119,24.27985 26.049999,26.500001 29.5,26.5 C 33.916001,26.5 37.499998,22.871296 37.5,18.408854 C 37.5,13.946415 33.916,13.5 29.5,13.5 C 26.05,13.5 23.122119,13.790128 22,16.039063 C 20.877881,13.790128 17.950001,13.5 14.5,13.5 z" - id="path11661" /> - <path - style="opacity:0.59722218;fill:url(#radialGradient11667);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 37,18.537724 C 37,22.656901 33.64,26.000001 29.5,26.000001 C 25.36,26.000001 22,22.656901 22,18.537724 C 22,14.418548 25.36,14.000001 29.5,14.000001 C 33.64,14.000001 37,14.418548 37,18.537724 z" - id="path11663" - sodipodi:nodetypes="csssc" /> - </g> -</svg>
--- a/pidgin/artwork/hicolor/scalable/status/pidgin-dialog.svg Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,609 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="48" - height="48" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.46" - version="1.0" - sodipodi:docbase="/home/hbons/Desktop" - sodipodi:docname="dialog.svg" - inkscape:export-filename="/home/hbons/Bureaublad/dialog.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - sodipodi:modified="true"> - <defs - id="defs4"> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 24 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="48 : 24 : 1" - inkscape:persp3d-origin="24 : 16 : 1" - id="perspective89" /> - <linearGradient - inkscape:collect="always" - id="linearGradient9283"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop9285" /> - <stop - style="stop-color:#c9daee;stop-opacity:1" - offset="1" - id="stop9287" /> - </linearGradient> - <linearGradient - id="linearGradient11487" - inkscape:collect="always"> - <stop - id="stop11489" - offset="0" - style="stop-color:#538ac5;stop-opacity:1" /> - <stop - id="stop11491" - offset="1" - style="stop-color:#ffffff;stop-opacity:1" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11474"> - <stop - style="stop-color:#558bc5;stop-opacity:1" - offset="0" - id="stop11476" /> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="1" - id="stop11478" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11418"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11420" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11422" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11333"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11335" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11337" /> - </linearGradient> - <linearGradient - id="linearGradient11316" - inkscape:collect="always"> - <stop - id="stop11318" - offset="0" - style="stop-color:#edd400;stop-opacity:1" /> - <stop - id="stop11320" - offset="1" - style="stop-color:#f6c93b;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11304"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11306" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11308" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11292"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11294" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11296" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11259"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11261" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11263" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11241"> - <stop - style="stop-color:#4f381b;stop-opacity:0.97254902" - offset="0" - id="stop11243" /> - <stop - style="stop-color:#a87b42;stop-opacity:0.96078432" - offset="1" - id="stop11245" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11208"> - <stop - style="stop-color:#c32f00;stop-opacity:1" - offset="0" - id="stop11210" /> - <stop - style="stop-color:#6c1300;stop-opacity:1" - offset="1" - id="stop11212" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11196"> - <stop - style="stop-color:#555753;stop-opacity:1" - offset="0" - id="stop11198" /> - <stop - style="stop-color:#000000;stop-opacity:1" - offset="1" - id="stop11200" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11241" - id="linearGradient10406" - gradientUnits="userSpaceOnUse" - x1="14.365882" - y1="19.515574" - x2="11.215483" - y2="8.2263536" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11196" - id="linearGradient11206" - gradientUnits="userSpaceOnUse" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11208" - id="linearGradient11214" - x1="22.919643" - y1="33.491837" - x2="22.919643" - y2="36.402832" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-0.8636363,0,0,0.7777776,39.227274,9.2222251)" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11316" - id="radialGradient11271" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.8771377,9.6878354e-8,-5.330884e-8,1.0893079,-10.4827,-2.6428601)" - cx="11.873854" - cy="12.147273" - fx="11.594166" - fy="8.8655272" - r="9.975256" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11292" - id="radialGradient11298" - cx="24.00321" - cy="34.70562" - fx="24.00321" - fy="34.70562" - r="12.133846" - gradientTransform="matrix(1.5208182,0,0,0.7073167,-12.501486,7.9416791)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient11314" - gradientUnits="userSpaceOnUse" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11259" - id="radialGradient11327" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.023438,0,0,0.8870879,-0.2709505,0.7064648)" - cx="11.736404" - cy="7.3689327" - fx="11.800528" - fy="1.1734189" - r="9.975256" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11339" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.9166666,0,0,0.9166666,-3.0416663,6.1250012)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11343" - gradientUnits="userSpaceOnUse" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientTransform="matrix(0.9166667,0,0,0.9166666,7.9583347,6.1250012)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11418" - id="linearGradient11424" - x1="22.915459" - y1="34.796875" - x2="22.854631" - y2="29.835938" - gradientUnits="userSpaceOnUse" /> - <filter - inkscape:collect="always" - id="filter11462" - x="-0.078992675" - width="1.1579853" - y="-0.19133781" - height="1.3826756"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.448448" - id="feGaussianBlur11464" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11487" - id="linearGradient11480" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.9,0,0,0.9,-2.7500001,6.450001)" /> - <filter - inkscape:collect="always" - id="filter11503" - x="-0.11697236" - width="1.2339447" - y="-0.32830241" - height="1.6566048"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.64772565" - id="feGaussianBlur11505" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11474" - id="linearGradient11507" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-0.9,0,0,0.9,39.749999,6.450001)" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11196" - id="linearGradient7925" - gradientUnits="userSpaceOnUse" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient7927" - gradientUnits="userSpaceOnUse" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" /> - <linearGradient - id="linearGradient8904" - inkscape:collect="always"> - <stop - id="stop8906" - offset="0" - style="stop-color:#729fcf;stop-opacity:1;" /> - <stop - id="stop8908" - offset="1" - style="stop-color:#25486d;stop-opacity:1" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9283" - id="linearGradient8508" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.6666666,0,0,0.6587574,15.166665,0.8540557)" - x1="30.5" - y1="1.7319652" - x2="30.5" - y2="22.781603" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8904" - id="linearGradient8511" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.6875001,0,0,0.6767003,14.531249,0.4849495)" - x1="29.466667" - y1="6.8962817" - x2="42.829762" - y2="37.801281" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="11.313708" - inkscape:cx="42.212021" - inkscape:cy="27.33968" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="true" - fill="#fce94f" - inkscape:window-width="1430" - inkscape:window-height="837" - inkscape:window-x="2" - inkscape:window-y="7" - width="48px" - height="48px" - inkscape:snap-bbox="true" - inkscape:snap-nodes="false" - objecttolerance="10" - gridtolerance="10" - showguides="true" - inkscape:guide-bbox="true"> - <inkscape:grid - type="xygrid" - id="grid10393" - visible="true" - enabled="true" /> - </sodipodi:namedview> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <path - style="fill:#efefef;fill-opacity:1;stroke:url(#linearGradient8511);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 28.646485,1.5 C 26.351226,1.5 24.499999,3.6053736 24.499999,6.2157551 L 24.499999,14.378452 C 24.499999,16.988834 26.351226,19.471324 28.646485,19.471324 L 38.588405,19.471324 C 38.588405,19.471324 38.185679,21.246142 37.169849,22.500949 C 40.739034,22.500949 41.597375,20.059554 41.597375,19.461518 L 43.0625,19.471324 C 45.821256,19.471324 46.5,16.985061 46.5,14.378452 L 46.5,6.2157551 C 46.5,3.6053738 44.648774,1.5 42.353516,1.5 L 28.646485,1.5 z" - id="path8201" - sodipodi:nodetypes="cccccccccccc" /> - <path - style="fill:url(#linearGradient8508);fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 28.854165,2.5009492 C 27.043799,2.5009492 25.499999,4.1991556 25.499999,6.4329081 L 25.499999,14.379169 C 25.499999,16.612921 27.043799,18.498627 28.854165,18.498627 L 38.854706,18.498627 C 39.222454,18.499674 39.520313,18.606498 39.521372,18.969885 C 39.521372,18.969885 39.644477,20.147733 39.23261,20.89176 C 40.286203,20.514643 40.854165,18.434645 40.854165,18.434645 C 40.969505,18.353016 41.108134,18.309759 41.249998,18.311127 L 42.833331,18.311127 C 43.997822,18.311127 44.543633,17.937415 44.937499,17.28182 C 45.331364,16.626223 45.499999,15.591478 45.499999,14.379169 L 45.499999,6.4329081 C 45.499999,4.1991558 43.956197,2.5009492 42.145832,2.5009492 L 28.854165,2.5009492 z" - id="path8203" - sodipodi:nodetypes="ccccccccccscccc" /> - <path - transform="matrix(1.8058936,0,0,2.1118921,-0.410926,17.914587)" - d="M 17.393564,10.457643 A 6.6449099,2.3675451 0 1 1 4.1037445,10.457643 A 6.6449099,2.3675451 0 1 1 17.393564,10.457643 z" - sodipodi:ry="2.3675451" - sodipodi:rx="6.6449099" - sodipodi:cy="10.457643" - sodipodi:cx="10.748654" - id="path17958" - style="opacity:0.7342342;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter11503);enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.7040925,0,0,1.7040625,-1.6187858,8.7839416)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17960" - style="opacity:1;fill:#e08700;fill-opacity:1;stroke:url(#linearGradient10406);stroke-width:0.58828396;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.5795214,0,0,1.5795214,-0.1480796,10.152022)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11247" - style="opacity:1;fill:url(#radialGradient11271);fill-opacity:1;stroke:none;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.5538448,0,0,1.5538449,0.1550622,10.434085)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11257" - style="opacity:1;fill:url(#radialGradient11327);fill-opacity:1;stroke:none;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11329" - d="M 18.5,24.000001 C 18.5,27.035998 16.036004,29.499999 13.000001,29.499999 C 9.9640002,29.499999 7.5000003,27.035998 7.5000003,24.000001 C 7.5000003,20.964 9.9640002,18.5 13.000001,18.5 C 16.036004,18.5 18.5,20.964 18.5,24.000001 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11339);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(1.6039688,0,0,-1.6039689,-0.4367098,45.116428)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17964" - style="opacity:0.48699999;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.62345362;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path17966" - d="M 17.500001,24.000001 C 17.500001,26.484 15.484002,28.5 13,28.5 C 10.516001,28.5 8.5000003,26.484 8.5000003,24.000001 C 8.5000003,21.516 10.516001,19.5 13,19.5 C 15.484002,19.5 17.500001,21.516 17.500001,24.000001 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11480);stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(0.8744826,0,0,0.8193141,-2.4902353,7.8660638)" - style="opacity:0.37037036;fill:url(#radialGradient11298);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" - d="M 12.96875,27 C 12.66316,27.004794 12.37698,27.150701 12.193604,27.395203 C 12.010227,27.639705 11.950287,27.955291 12.03125,28.25 C 13.422894,33.792238 18.230543,38 24,38 C 29.769453,38 34.577108,33.792239 35.96875,28.25 C 36.109736,27.777313 35.880605,27.273042 35.431823,27.068334 C 34.983041,26.863627 34.452032,27.021167 34.1875,27.4375 C 31.979544,30.606533 28.071998,33.230703 24,33.230703 C 19.928002,33.230704 16.020457,30.606534 13.8125,27.4375 C 13.624435,27.157127 13.306264,26.992149 12.96875,27 L 12.96875,27 z" - id="path11288" - sodipodi:nodetypes="cscscscsccc" /> - <path - sodipodi:nodetypes="cscsc" - id="path17974" - d="M 9,31 C 10.114314,34.996589 13.932744,38 18.5,38 C 23.067256,38 26.885687,34.996589 28,31 C 25.997881,33.58792 22.481559,36.086622 18.5,36.086622 C 14.518443,36.086624 11.00212,33.58792 9,31 z" - style="opacity:1;fill:url(#linearGradient11214);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.0998724,0.5796011,-0.5856851,1.5252629,3.1832579,-1.498334)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11325" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.4442215;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.0998724,0.5796014,-0.5856851,1.5252636,3.1832579,-0.669072)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17976" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.44422138;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.0998724,0.5796011,0.5856851,1.5252629,33.816741,-1.498334)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11323" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.4442215;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.0998724,0.5796011,0.5856851,1.5252629,33.816741,-0.6690642)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17978" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.4442215;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11482" - d="M 19.499999,24.000001 C 19.499999,26.484 21.515997,28.5 23.999999,28.5 C 26.483998,28.5 28.499999,26.484 28.499999,24.000001 C 28.499999,21.516 26.483998,19.5 23.999999,19.5 C 21.515997,19.5 19.499999,21.516 19.499999,24.000001 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11507);stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(1.9494392,0,0,1.2877393,4.0769204,13.069868)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11204" - style="opacity:1;fill:url(#linearGradient11206);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(0.9747197,0,0,0.6878263,13.538459,18.695971)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11312" - style="opacity:1;fill:url(#linearGradient11314);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11341" - d="M 29.5,24.000001 C 29.5,27.035998 27.036004,29.499999 24.000002,29.499999 C 20.964001,29.499999 18.500001,27.035998 18.500001,24.000001 C 18.500001,20.964 20.964001,18.5 24.000002,18.5 C 27.036004,18.5 29.5,20.964 29.5,24.000001 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11343);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:url(#linearGradient11424);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter11462);enable-background:accumulate" - id="path11416" - sodipodi:cx="23.25" - sodipodi:cy="30.1875" - sodipodi:rx="6.8125" - sodipodi:ry="2.8125" - d="M 30.0625,30.1875 A 6.8125,2.8125 0 1 1 16.4375,30.1875 A 6.8125,2.8125 0 1 1 30.0625,30.1875 z" - transform="matrix(0.8520939,0,0,1.474258,-1.3111844,-12.857869)" /> - <path - transform="matrix(1.9494392,0,0,1.2877393,-4.9230796,13.069868)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path7921" - style="opacity:1;fill:url(#linearGradient7925);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(0.9747197,0,0,0.6878263,4.5384591,18.695971)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path7923" - style="opacity:1;fill:url(#linearGradient7927);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - </g> -</svg>
--- a/pidgin/artwork/hicolor/scalable/status/pidgin-error.svg Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,327 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="48" - height="48" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.46" - version="1.0" - sodipodi:docbase="/home/hbons/Desktop" - sodipodi:docname="error.svg" - inkscape:export-filename="/home/hbons/Bureaublad/error.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - sodipodi:modified="true"> - <defs - id="defs4"> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 24 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="48 : 24 : 1" - inkscape:persp3d-origin="24 : 16 : 1" - id="perspective47" /> - <linearGradient - inkscape:collect="always" - id="linearGradient8757"> - <stop - style="stop-color:#2e3436;stop-opacity:1;" - offset="0" - id="stop8759" /> - <stop - style="stop-color:#555753;stop-opacity:1" - offset="1" - id="stop8761" /> - </linearGradient> - <linearGradient - id="linearGradient11316" - inkscape:collect="always"> - <stop - id="stop11318" - offset="0" - style="stop-color:#edd400;stop-opacity:1" /> - <stop - id="stop11320" - offset="1" - style="stop-color:#f6c93b;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11292"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11294" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11296" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11259"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11261" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11263" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11241"> - <stop - style="stop-color:#4f381b;stop-opacity:0.97254902" - offset="0" - id="stop11243" /> - <stop - style="stop-color:#a87b42;stop-opacity:0.96078432" - offset="1" - id="stop11245" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11208"> - <stop - style="stop-color:#c32f00;stop-opacity:1" - offset="0" - id="stop11210" /> - <stop - style="stop-color:#6c1300;stop-opacity:1" - offset="1" - id="stop11212" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11241" - id="linearGradient10406" - gradientUnits="userSpaceOnUse" - x1="14.365882" - y1="19.515574" - x2="11.215483" - y2="8.2263536" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11208" - id="linearGradient11214" - x1="23.151463" - y1="36.068001" - x2="23.151463" - y2="31.364563" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-1,0,0,-1,46.004066,64)" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11316" - id="radialGradient11271" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.8771377,9.6878354e-8,-5.330884e-8,1.0893079,-10.4827,-2.6428601)" - cx="11.873854" - cy="12.147273" - fx="11.594166" - fy="8.8655272" - r="9.975256" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11292" - id="radialGradient11298" - cx="24.00321" - cy="44.452724" - fx="24.00321" - fy="44.452724" - r="12.133846" - gradientTransform="matrix(1.5208182,0,0,0.7073167,-12.501486,7.9416791)" - gradientUnits="userSpaceOnUse" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11259" - id="radialGradient11327" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.023438,0,0,0.8870879,-0.2709505,0.7064648)" - cx="11.736404" - cy="7.3689327" - fx="11.800528" - fy="1.1734189" - r="9.975256" /> - <filter - inkscape:collect="always" - id="filter11503" - x="-0.11697236" - width="1.2339447" - y="-0.32830241" - height="1.6566048"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.64772565" - id="feGaussianBlur11505" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8757" - id="linearGradient8763" - x1="22" - y1="17.615276" - x2="22" - y2="20.974033" - gradientUnits="userSpaceOnUse" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1" - inkscape:cx="50.073667" - inkscape:cy="41.753083" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - fill="#fce94f" - inkscape:window-width="1081" - inkscape:window-height="669" - inkscape:window-x="122" - inkscape:window-y="78" - width="48px" - height="48px" - inkscape:snap-bbox="true" - inkscape:snap-nodes="false" - objecttolerance="10" - gridtolerance="10" - showguides="true" - inkscape:guide-bbox="true"> - <inkscape:grid - type="xygrid" - id="grid10393" - visible="true" - enabled="true" /> - </sodipodi:namedview> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <path - transform="matrix(2.257367,0,0,2.7454598,-1.263726,9.7889628)" - d="M 17.393564,10.457643 A 6.6449099,2.3675451 0 1 1 4.1037445,10.457643 A 6.6449099,2.3675451 0 1 1 17.393564,10.457643 z" - sodipodi:ry="2.3675451" - sodipodi:rx="6.6449099" - sodipodi:cy="10.457643" - sodipodi:cx="10.748654" - id="path17958" - style="opacity:0.7342342;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter11503);enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(2.0549539,0,0,2.0549096,-2.2611787,1.4304378)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17960" - style="opacity:1;fill:#e08700;fill-opacity:1;stroke:url(#linearGradient10406);stroke-width:0.4878417;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4874115,3.0804919)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11247" - style="opacity:1;fill:url(#radialGradient11271);fill-opacity:1;stroke:none;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4874115,3.0804919)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11257" - style="opacity:1;fill:url(#radialGradient11327);fill-opacity:1;stroke:none;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.954837,0,0,-1.954837,-1.0791836,45.47002)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17964" - style="opacity:0.48699999;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="0.98821175" - inkscape:original="M 13 28 C 14.290259 33.138472 18.711597 37 24 37 C 29.288399 37 33.709743 33.138472 35 28 C 32.681757 31.327326 28.610225 35.09375 24 35.09375 C 19.389774 35.093751 15.318244 31.327326 13 28 z " - style="opacity:0.37037036000000001;fill:url(#radialGradient11298);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - id="path11288" - d="M 12.96875,27 C 12.66316,27.004794 12.37698,27.150701 12.193604,27.395203 C 12.010227,27.639705 11.950287,27.955291 12.03125,28.25 C 13.422894,33.792238 18.230543,38 24,38 C 29.769453,38 34.577108,33.792239 35.96875,28.25 C 36.109736,27.777313 35.880605,27.273042 35.431823,27.068334 C 34.983041,26.863627 34.452032,27.021167 34.1875,27.4375 C 31.979544,30.606533 28.071998,34.09375 24,34.09375 C 19.928002,34.093751 16.020457,30.606534 13.8125,27.4375 C 13.624435,27.157127 13.306264,26.992149 12.96875,27 L 12.96875,27 z" - transform="matrix(1,0,0,-1,-1.9959332,64)" /> - <path - sodipodi:nodetypes="cscsc" - id="path17974" - d="M 11.004066,36.000001 C 12.294325,30.861529 16.715664,27.000001 22.004067,27.000001 C 27.292467,27.000001 31.713809,30.861529 33.004066,36.000001 C 30.685823,32.672675 26.614292,28.897559 22.004067,28.897559 C 17.393842,28.897556 13.32231,32.672675 11.004066,36.000001 z" - style="opacity:1;fill:url(#linearGradient11214);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.4298057,-1.6425985,-1.1582421,-1.5938167,-5.185395,36.479745)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17978" - style="opacity:0.24537037;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837955999999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - style="opacity:0.74537037;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 14.03125,18 L 14.03125,19 L 15.03125,19 L 15.03125,18 L 14.03125,18 z M 15.03125,19 L 15.03125,20 L 16.03125,20 L 16.03125,19 L 15.03125,19 z M 16.03125,20 L 16.03125,21 L 17.03125,21 L 17.03125,20 L 16.03125,20 z M 17.03125,20 L 18.03125,20 L 18.03125,19 L 17.03125,19 L 17.03125,20 z M 18.03125,19 L 19.03125,19 L 19.03125,18 L 18.03125,18 L 18.03125,19 z M 17.03125,21 L 17.03125,22 L 18.03125,22 L 18.03125,21 L 17.03125,21 z M 18.03125,22 L 18.03125,23 L 19.03125,23 L 19.03125,22 L 18.03125,22 z M 16.03125,21 L 15.03125,21 L 15.03125,22 L 16.03125,22 L 16.03125,21 z M 25.03125,18 L 25.03125,19 L 26.03125,19 L 26.03125,18 L 25.03125,18 z M 26.03125,19 L 26.03125,20 L 27.03125,20 L 27.03125,19 L 26.03125,19 z M 27.03125,20 L 27.03125,21 L 28.03125,21 L 28.03125,20 L 27.03125,20 z M 28.03125,20 L 29.03125,20 L 29.03125,19 L 28.03125,19 L 28.03125,20 z M 29.03125,19 L 30.03125,19 L 30.03125,18 L 29.03125,18 L 29.03125,19 z M 28.03125,21 L 28.03125,22 L 29.03125,22 L 29.03125,21 L 28.03125,21 z M 29.03125,22 L 29.03125,23 L 30.03125,23 L 30.03125,22 L 29.03125,22 z M 27.03125,21 L 26.03125,21 L 26.03125,22 L 27.03125,22 L 27.03125,21 z M 14.03125,22.03125 L 14.03125,23.03125 L 15.03125,23.03125 L 15.03125,22.03125 L 14.03125,22.03125 z M 25.03125,22.03125 L 25.03125,23.03125 L 26.03125,23.03125 L 26.03125,22.03125 L 25.03125,22.03125 z" - id="path8765" - sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" /> - <path - style="opacity:1;fill:url(#linearGradient8763);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 14.03125,17 L 14.03125,18 L 15.03125,18 L 15.03125,17 L 14.03125,17 z M 15.03125,18 L 15.03125,19 L 16.03125,19 L 16.03125,18 L 15.03125,18 z M 16.03125,19 L 16.03125,20 L 17.03125,20 L 17.03125,19 L 16.03125,19 z M 17.03125,19 L 18.03125,19 L 18.03125,18 L 17.03125,18 L 17.03125,19 z M 18.03125,18 L 19.03125,18 L 19.03125,17 L 18.03125,17 L 18.03125,18 z M 17.03125,20 L 17.03125,21 L 18.03125,21 L 18.03125,20 L 17.03125,20 z M 18.03125,21 L 18.03125,22 L 19.03125,22 L 19.03125,21 L 18.03125,21 z M 16.03125,20 L 15.03125,20 L 15.03125,21 L 16.03125,21 L 16.03125,20 z M 25.03125,17 L 25.03125,18 L 26.03125,18 L 26.03125,17 L 25.03125,17 z M 26.03125,18 L 26.03125,19 L 27.03125,19 L 27.03125,18 L 26.03125,18 z M 27.03125,19 L 27.03125,20 L 28.03125,20 L 28.03125,19 L 27.03125,19 z M 28.03125,19 L 29.03125,19 L 29.03125,18 L 28.03125,18 L 28.03125,19 z M 29.03125,18 L 30.03125,18 L 30.03125,17 L 29.03125,17 L 29.03125,18 z M 28.03125,20 L 28.03125,21 L 29.03125,21 L 29.03125,20 L 28.03125,20 z M 29.03125,21 L 29.03125,22 L 30.03125,22 L 30.03125,21 L 29.03125,21 z M 27.03125,20 L 26.03125,20 L 26.03125,21 L 27.03125,21 L 27.03125,20 z M 14.03125,21.03125 L 14.03125,22.03125 L 15.03125,22.03125 L 15.03125,21.03125 L 14.03125,21.03125 z M 25.03125,21.03125 L 25.03125,22.03125 L 26.03125,22.03125 L 26.03125,21.03125 L 25.03125,21.03125 z" - id="rect7941" - sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.4298057,-1.6425985,1.1582421,-1.5938167,48.926576,36.479745)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path7888" - style="opacity:0.24537037;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837955999999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - </g> -</svg>
--- a/pidgin/artwork/hicolor/scalable/status/pidgin-info.svg Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,569 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="48" - height="48" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.46" - version="1.0" - sodipodi:docbase="/home/hbons/Desktop" - sodipodi:docname="info.svg" - inkscape:export-filename="/home/hbons/Bureaublad/info.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - sodipodi:modified="true"> - <defs - id="defs4"> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 24 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="48 : 24 : 1" - inkscape:persp3d-origin="24 : 16 : 1" - id="perspective82" /> - <linearGradient - id="linearGradient11493" - inkscape:collect="always"> - <stop - id="stop11495" - offset="0" - style="stop-color:#555753;stop-opacity:1" /> - <stop - id="stop11497" - offset="1" - style="stop-color:#070808;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient11487" - inkscape:collect="always"> - <stop - id="stop11489" - offset="0" - style="stop-color:#538ac5;stop-opacity:1" /> - <stop - id="stop11491" - offset="1" - style="stop-color:#ffffff;stop-opacity:1" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11474"> - <stop - style="stop-color:#558bc5;stop-opacity:1" - offset="0" - id="stop11476" /> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="1" - id="stop11478" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11418"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11420" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11422" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11333"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11335" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11337" /> - </linearGradient> - <linearGradient - id="linearGradient11316" - inkscape:collect="always"> - <stop - id="stop11318" - offset="0" - style="stop-color:#edd400;stop-opacity:1" /> - <stop - id="stop11320" - offset="1" - style="stop-color:#f6c93b;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11304"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11306" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11308" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11292"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11294" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11296" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11259"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11261" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11263" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11241"> - <stop - style="stop-color:#4f381b;stop-opacity:0.97254902" - offset="0" - id="stop11243" /> - <stop - style="stop-color:#a87b42;stop-opacity:0.96078432" - offset="1" - id="stop11245" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11208"> - <stop - style="stop-color:#c32f00;stop-opacity:1" - offset="0" - id="stop11210" /> - <stop - style="stop-color:#6c1300;stop-opacity:1" - offset="1" - id="stop11212" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11196"> - <stop - style="stop-color:#555753;stop-opacity:1" - offset="0" - id="stop11198" /> - <stop - style="stop-color:#000000;stop-opacity:1" - offset="1" - id="stop11200" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11241" - id="linearGradient10406" - gradientUnits="userSpaceOnUse" - x1="14.365882" - y1="19.515574" - x2="11.215483" - y2="8.2263536" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11493" - id="linearGradient11202" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11196" - id="linearGradient11206" - gradientUnits="userSpaceOnUse" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11208" - id="linearGradient11214" - x1="22.919643" - y1="33.491837" - x2="22.919643" - y2="36.402832" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-1,0,0,1,45.999931,1.885788e-7)" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11316" - id="radialGradient11271" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.8771377,9.6878354e-8,-5.330884e-8,1.0893079,-10.4827,-2.6428601)" - cx="11.873854" - cy="12.147273" - fx="11.594166" - fy="8.8655272" - r="9.975256" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11292" - id="radialGradient11298" - cx="24.00321" - cy="34.70562" - fx="24.00321" - fy="34.70562" - r="12.133846" - gradientTransform="matrix(1.5208182,0,0,0.7073167,-12.501486,7.9416791)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient11310" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient11314" - gradientUnits="userSpaceOnUse" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11259" - id="radialGradient11327" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.023438,0,0,0.8870879,-0.2709505,0.7064648)" - cx="11.736404" - cy="7.3689327" - fx="11.800528" - fy="1.1734189" - r="9.975256" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11339" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-2.0000685,1.885788e-7)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11343" - gradientUnits="userSpaceOnUse" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientTransform="translate(10.999931,1.885788e-7)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11418" - id="linearGradient11424" - x1="22.915459" - y1="34.796875" - x2="22.854631" - y2="29.835938" - gradientUnits="userSpaceOnUse" /> - <filter - inkscape:collect="always" - id="filter11462" - x="-0.078992675" - width="1.1579853" - y="-0.19133781" - height="1.3826756"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.448448" - id="feGaussianBlur11464" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11487" - id="linearGradient11480" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-2.0000685,1.885788e-7)" /> - <filter - inkscape:collect="always" - id="filter11503" - x="-0.11697236" - width="1.2339447" - y="-0.32830241" - height="1.6566048"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.64772565" - id="feGaussianBlur11505" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11474" - id="linearGradient11507" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-1,0,0,1,45.999932,1.885788e-7)" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="8" - inkscape:cx="41.138874" - inkscape:cy="20.946547" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="true" - fill="#fce94f" - inkscape:window-width="1440" - inkscape:window-height="847" - inkscape:window-x="0" - inkscape:window-y="0" - width="48px" - height="48px" - inkscape:snap-bbox="true" - inkscape:snap-nodes="false" - objecttolerance="10" - gridtolerance="10" - showguides="true" - inkscape:guide-bbox="true"> - <inkscape:grid - type="xygrid" - id="grid10393" - visible="true" - enabled="true" /> - </sodipodi:namedview> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <path - transform="matrix(2.257367,0,0,2.7454598,-1.263726,9.7889628)" - d="M 17.393564,10.457643 A 6.6449099,2.3675451 0 1 1 4.1037445,10.457643 A 6.6449099,2.3675451 0 1 1 17.393564,10.457643 z" - sodipodi:ry="2.3675451" - sodipodi:rx="6.6449099" - sodipodi:cy="10.457643" - sodipodi:cx="10.748654" - id="path17958" - style="opacity:0.7342342;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter11503);enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(2.0549539,0,0,2.0549096,-2.2611787,1.4304378)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17960" - style="opacity:1;fill:#e08700;fill-opacity:1;stroke:url(#linearGradient10406);stroke-width:0.4878417;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4874115,3.0804919)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11247" - style="opacity:1;fill:url(#radialGradient11271);fill-opacity:1;stroke:none;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4874115,3.0804919)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11257" - style="opacity:1;fill:url(#radialGradient11327);fill-opacity:1;stroke:none;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11329" - d="M 21.499931,19.500002 C 21.499931,22.812 18.811935,25.5 15.499932,25.5 C 12.187931,25.5 9.4999315,22.812 9.4999315,19.500002 C 9.4999315,16.188 12.187931,13.5 15.499932,13.5 C 18.811935,13.5 21.499931,16.188 21.499931,19.500002 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11339);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(1.954837,0,0,-1.954837,-1.0791836,45.47002)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17964" - style="opacity:0.48699999;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path17966" - d="M 20.499932,19.5 C 20.499932,22.259999 18.259935,24.499999 15.499932,24.499999 C 12.739932,24.499999 10.499932,22.259999 10.499932,19.5 C 10.499932,16.739999 12.739932,14.499999 15.499932,14.499999 C 18.259935,14.499999 20.499932,16.739999 20.499932,19.5 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11480);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(2.4367989,0,0,1.5452869,-7.1539168,6.0838442)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path17968" - style="opacity:1;fill:url(#linearGradient11202);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="0.98821175" - inkscape:original="M 13 28 C 14.290259 33.138472 18.711597 37 24 37 C 29.288399 37 33.709743 33.138472 35 28 C 32.681757 31.327326 28.610225 35.09375 24 35.09375 C 19.389774 35.093751 15.318244 31.327326 13 28 z " - style="opacity:0.37037036;fill:url(#radialGradient11298);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - id="path11288" - d="M 12.96875,27 C 12.66316,27.004794 12.37698,27.150701 12.193604,27.395203 C 12.010227,27.639705 11.950287,27.955291 12.03125,28.25 C 13.422894,33.792238 18.230543,38 24,38 C 29.769453,38 34.577108,33.792239 35.96875,28.25 C 36.109736,27.777313 35.880605,27.273042 35.431823,27.068334 C 34.983041,26.863627 34.452032,27.021167 34.1875,27.4375 C 31.979544,30.606533 28.071998,34.09375 24,34.09375 C 19.928002,34.093751 16.020457,30.606534 13.8125,27.4375 C 13.624435,27.157127 13.306264,26.992149 12.96875,27 L 12.96875,27 z" - transform="translate(-2.0000685,1.885788e-7)" /> - <path - sodipodi:nodetypes="cscsc" - id="path17974" - d="M 10.999931,28 C 12.29019,33.138472 16.711529,37 21.999932,37 C 27.288332,37 31.709674,33.138472 32.999931,28 C 30.681688,31.327326 26.610157,35.102442 21.999932,35.102442 C 17.389707,35.102445 13.318175,31.327326 10.999931,28 z" - style="opacity:1;fill:url(#linearGradient11214);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.7380737,0.6989293,-0.7062659,1.8392838,3.5297812,-10.968438)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11325" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.36837956;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.7380737,0.6989296,-0.7062659,1.8392846,3.5297812,-9.9684476)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17976" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837947;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.7380737,0.6989293,0.7062659,1.8392838,40.470081,-10.968438)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11323" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.36837956;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.7380737,0.6989293,0.7062659,1.8392838,40.470081,-9.9684383)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17978" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837956;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11482" - d="M 23.499931,19.5 C 23.499931,22.259999 25.739928,24.499999 28.499931,24.499999 C 31.259931,24.499999 33.499931,22.259999 33.499931,19.5 C 33.499931,16.739999 31.259931,14.499999 28.499931,14.499999 C 25.739928,14.499999 23.499931,16.739999 23.499931,19.5 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11507);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(2.436799,0,0,1.5452869,3.846082,6.0838439)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11204" - style="opacity:1;fill:url(#linearGradient11206);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.4620795,0,0,1.0301913,2.3076208,11.055896)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11300" - style="opacity:1;fill:url(#linearGradient11310);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.4620795,0,0,1.0301913,13.30762,11.055896)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11312" - style="opacity:1;fill:url(#linearGradient11314);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11341" - d="M 34.499931,19.500002 C 34.499931,22.812 31.811935,25.5 28.499932,25.5 C 25.187931,25.5 22.499931,22.812 22.499931,19.500002 C 22.499931,16.188 25.187931,13.5 28.499932,13.5 C 31.811935,13.5 34.499931,16.188 34.499931,19.500002 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11343);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:url(#linearGradient11424);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter11462);enable-background:accumulate" - id="path11416" - sodipodi:cx="23.25" - sodipodi:cy="30.1875" - sodipodi:rx="6.8125" - sodipodi:ry="2.8125" - d="M 30.0625,30.1875 A 6.8125,2.8125 0 1 1 16.4375,30.1875 A 6.8125,2.8125 0 1 1 30.0625,30.1875 z" - transform="matrix(1.0275229,0,0,1.777778,-1.8899762,-24.666672)" /> - </g> -</svg>
--- a/pidgin/artwork/hicolor/scalable/status/pidgin-mail.svg Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,976 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="48" - height="48" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.46" - version="1.0" - sodipodi:docbase="/home/hbons/Desktop" - sodipodi:docname="mail.svg" - inkscape:export-filename="/home/hbons/Bureaublad/mail.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - sodipodi:modified="true"> - <defs - id="defs4"> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 24 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="48 : 24 : 1" - inkscape:persp3d-origin="24 : 16 : 1" - id="perspective126" /> - <linearGradient - inkscape:collect="always" - id="linearGradient9188"> - <stop - style="stop-color:#2e3436;stop-opacity:1;" - offset="0" - id="stop9190" /> - <stop - style="stop-color:#6f726d;stop-opacity:1" - offset="1" - id="stop9192" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient9166"> - <stop - style="stop-color:#3b73bb;stop-opacity:1;" - offset="0" - id="stop9168" /> - <stop - style="stop-color:#3b73bb;stop-opacity:0;" - offset="1" - id="stop9170" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient9158"> - <stop - style="stop-color:#729fcf;stop-opacity:1;" - offset="0" - id="stop9160" /> - <stop - style="stop-color:#bcd2e9;stop-opacity:1" - offset="1" - id="stop9162" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient9056"> - <stop - style="stop-color:#729fcf;stop-opacity:1;" - offset="0" - id="stop9058" /> - <stop - style="stop-color:#729fcf;stop-opacity:0;" - offset="1" - id="stop9060" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient9040"> - <stop - style="stop-color:#729fcf;stop-opacity:1" - offset="0" - id="stop9042" /> - <stop - style="stop-color:#3465a4;stop-opacity:1" - offset="1" - id="stop9044" /> - </linearGradient> - <linearGradient - id="linearGradient11669" - inkscape:collect="always"> - <stop - id="stop11671" - offset="0" - style="stop-color:#ffffff;stop-opacity:1" /> - <stop - id="stop11673" - offset="1" - style="stop-color:#2e3436;stop-opacity:1" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11653"> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="0" - id="stop11655" /> - <stop - style="stop-color:#2e3436;stop-opacity:1" - offset="1" - id="stop11657" /> - </linearGradient> - <linearGradient - id="linearGradient11493" - inkscape:collect="always"> - <stop - id="stop11495" - offset="0" - style="stop-color:#555753;stop-opacity:1" /> - <stop - id="stop11497" - offset="1" - style="stop-color:#070808;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient11487" - inkscape:collect="always"> - <stop - id="stop11489" - offset="0" - style="stop-color:#538ac5;stop-opacity:1" /> - <stop - id="stop11491" - offset="1" - style="stop-color:#ffffff;stop-opacity:1" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11474"> - <stop - style="stop-color:#558bc5;stop-opacity:1" - offset="0" - id="stop11476" /> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="1" - id="stop11478" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11333"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11335" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11337" /> - </linearGradient> - <linearGradient - id="linearGradient11316" - inkscape:collect="always"> - <stop - id="stop11318" - offset="0" - style="stop-color:#edd400;stop-opacity:1" /> - <stop - id="stop11320" - offset="1" - style="stop-color:#f6c93b;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11304"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11306" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11308" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11292"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11294" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11296" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11259"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11261" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11263" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11241"> - <stop - style="stop-color:#4f381b;stop-opacity:0.97254902" - offset="0" - id="stop11243" /> - <stop - style="stop-color:#a87b42;stop-opacity:0.96078432" - offset="1" - id="stop11245" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11208"> - <stop - style="stop-color:#c32f00;stop-opacity:1" - offset="0" - id="stop11210" /> - <stop - style="stop-color:#6c1300;stop-opacity:1" - offset="1" - id="stop11212" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11196"> - <stop - style="stop-color:#555753;stop-opacity:1" - offset="0" - id="stop11198" /> - <stop - style="stop-color:#000000;stop-opacity:1" - offset="1" - id="stop11200" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11241" - id="linearGradient10406" - gradientUnits="userSpaceOnUse" - x1="14.365882" - y1="19.515574" - x2="11.215483" - y2="8.2263536" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11493" - id="linearGradient11202" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11196" - id="linearGradient11206" - gradientUnits="userSpaceOnUse" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11316" - id="radialGradient11271" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.8771377,9.6878354e-8,-5.330884e-8,1.0893079,-10.4827,-2.6428601)" - cx="11.873854" - cy="12.147273" - fx="11.594166" - fy="8.8655272" - r="9.975256" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient11310" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient11314" - gradientUnits="userSpaceOnUse" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11259" - id="radialGradient11327" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.023438,0,0,0.8870879,-0.2709505,0.7064648)" - cx="11.736404" - cy="7.3689327" - fx="11.800528" - fy="1.1734189" - r="9.975256" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11339" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-2.0000685,1.885788e-7)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11343" - gradientUnits="userSpaceOnUse" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientTransform="translate(10.999931,1.885788e-7)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11487" - id="linearGradient11480" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-2.0000685,1.885788e-7)" /> - <filter - inkscape:collect="always" - id="filter11503" - x="-0.11697236" - width="1.2339447" - y="-0.32830241" - height="1.6566048"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.64772565" - id="feGaussianBlur11505" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11474" - id="linearGradient11507" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-1,0,0,1,45.999932,1.885788e-7)" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11669" - id="radialGradient11659" - cx="14" - cy="19.5" - fx="9.3258924" - fy="14.814685" - r="8" - gradientTransform="matrix(1.0000001,0,0,0.8124999,0.5000001,4.156251)" - gradientUnits="userSpaceOnUse" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11653" - id="radialGradient11667" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.0000001,0,0,0.8124999,15.5,4.156251)" - cx="14" - cy="19.5" - fx="9.3258924" - fy="14.814685" - r="8" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11241" - id="linearGradient8720" - gradientUnits="userSpaceOnUse" - x1="14.365882" - y1="19.515574" - x2="11.215483" - y2="8.2263536" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11259" - id="radialGradient8722" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.023438,0,0,0.8870879,-0.2709505,0.7064648)" - cx="11.736404" - cy="7.3689327" - fx="11.800528" - fy="1.1734189" - r="9.975256" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11493" - id="linearGradient8985" - gradientUnits="userSpaceOnUse" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11196" - id="linearGradient8993" - gradientUnits="userSpaceOnUse" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient8995" - gradientUnits="userSpaceOnUse" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient8997" - gradientUnits="userSpaceOnUse" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient9005" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-34.999933,2.0000002)" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11208" - id="linearGradient9018" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-0.9659258,0.1156321,0.258819,0.431545,39.417822,14.519987)" - x1="22.919643" - y1="33.491837" - x2="23.746914" - y2="36.579254" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11292" - id="radialGradient9036" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.5208182,0,0,0.3864192,-14.644203,17.599539)" - cx="24.00321" - cy="34.70562" - fx="24.00321" - fy="34.70562" - r="12.133846" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9040" - id="linearGradient9046" - x1="24" - y1="37" - x2="44.533825" - y2="40.875" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.1262515,0,0,1,-4.093162,0)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9056" - id="linearGradient9062" - x1="34.5" - y1="61.35038" - x2="34.5" - y2="33.72963" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9158" - id="linearGradient9164" - x1="29" - y1="35.649048" - x2="29" - y2="32.334484" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-1,0)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9166" - id="linearGradient9172" - x1="29.125" - y1="36.5625" - x2="25" - y2="31.9375" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9188" - id="linearGradient9194" - x1="37.5" - y1="42.295494" - x2="37.5" - y2="40.792892" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9166" - id="linearGradient9246" - gradientUnits="userSpaceOnUse" - x1="29.78125" - y1="37.09375" - x2="23.984375" - y2="30.40625" /> - <radialGradient - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.7770035,0,2.6759581)" - r="8.9687502" - fy="12" - fx="12" - cy="12" - cx="12" - id="radialGradient3210" - xlink:href="#linearGradient3204" - inkscape:collect="always" /> - <linearGradient - y2="18.288521" - x2="12.015625" - y1="10.420408" - x1="12.015625" - gradientUnits="userSpaceOnUse" - id="linearGradient3200" - xlink:href="#linearGradient4130" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="13.251127" - x2="12.750399" - y1="19.780256" - x1="12.726427" - id="linearGradient3197" - xlink:href="#linearGradient3191" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="19.148933" - x2="15.742911" - y1="8.850009" - x1="13.038205" - id="linearGradient3189" - xlink:href="#linearGradient3183" - inkscape:collect="always" /> - <radialGradient - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.257382,0,0,0.665505,-3.088585,4.013937)" - r="8.9687502" - fy="12" - fx="12" - cy="12" - cx="12" - id="radialGradient4152" - xlink:href="#linearGradient4146" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="17.151861" - x2="12.015625" - y1="12.513933" - x1="12.015625" - id="linearGradient4144" - xlink:href="#linearGradient4138" - inkscape:collect="always" /> - <linearGradient - id="linearGradient4130" - inkscape:collect="always"> - <stop - id="stop4132" - offset="0" - style="stop-color:#babdb6;stop-opacity:1;" /> - <stop - id="stop4134" - offset="1" - style="stop-color:#babdb6;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient4138" - inkscape:collect="always"> - <stop - id="stop4140" - offset="0" - style="stop-color:#babdb6;stop-opacity:1;" /> - <stop - id="stop4142" - offset="1" - style="stop-color:#babdb6;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient4146" - inkscape:collect="always"> - <stop - id="stop4148" - offset="0" - style="stop-color:#ffffff;stop-opacity:1;" /> - <stop - id="stop4150" - offset="1" - style="stop-color:#ffffff;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient3183" - inkscape:collect="always"> - <stop - id="stop3185" - offset="0" - style="stop-color:#888a85;stop-opacity:1;" /> - <stop - id="stop3187" - offset="1" - style="stop-color:#555753;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient3191" - inkscape:collect="always"> - <stop - id="stop3193" - offset="0" - style="stop-color:#555753;stop-opacity:1;" /> - <stop - id="stop3195" - offset="1" - style="stop-color:#888a85;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient3204" - inkscape:collect="always"> - <stop - id="stop3206" - offset="0" - style="stop-color:#888a85;stop-opacity:1;" /> - <stop - id="stop3208" - offset="1" - style="stop-color:#888a85;stop-opacity:0;" /> - </linearGradient> - <inkscape:perspective - id="perspective8002" - inkscape:persp3d-origin="12 : 8 : 1" - inkscape:vp_z="24 : 12 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_x="0 : 12 : 1" - sodipodi:type="inkscape:persp3d" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1" - inkscape:cx="173.29133" - inkscape:cy="101.88242" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - fill="#fce94f" - inkscape:window-width="1440" - inkscape:window-height="847" - inkscape:window-x="0" - inkscape:window-y="0" - width="48px" - height="48px" - inkscape:snap-bbox="true" - inkscape:snap-nodes="false" - objecttolerance="10" - gridtolerance="10" - showguides="true" - inkscape:guide-bbox="true"> - <inkscape:grid - type="xygrid" - id="grid10393" - visible="true" - enabled="true" /> - </sodipodi:namedview> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <path - transform="matrix(2.257367,0,0,2.7454598,-1.263726,9.7889628)" - d="M 17.393564,10.457643 A 6.6449099,2.3675451 0 1 1 4.1037445,10.457643 A 6.6449099,2.3675451 0 1 1 17.393564,10.457643 z" - sodipodi:ry="2.3675451" - sodipodi:rx="6.6449099" - sodipodi:cy="10.457643" - sodipodi:cx="10.748654" - id="path17958" - style="opacity:0.73423419999999995;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter11503);enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(2.0549539,0,0,2.0549096,-2.2611787,1.4304378)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17960" - style="opacity:1;fill:#e08700;fill-opacity:1;stroke:url(#linearGradient10406);stroke-width:0.48784169999999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4874115,3.0804919)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11247" - style="opacity:1;fill:url(#radialGradient11271);fill-opacity:1;stroke:none;stroke-width:0.51155167999999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - style="opacity:0.37037036000000001;fill:url(#radialGradient9036);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" - d="M 10.826033,28.011426 C 10.520443,28.014045 10.234263,28.093756 10.050887,28.227332 C 9.8675105,28.360908 9.8075706,28.533318 9.8885335,28.694322 C 11.280177,31.722142 16.087826,34.020914 21.857283,34.020914 C 27.626736,34.020914 32.434391,31.722142 33.826033,28.694322 C 33.967019,28.436085 33.737888,28.160593 33.289106,28.048758 C 32.840324,27.936923 32.309315,28.02299 32.044783,28.25044 C 29.836827,29.981737 25.929281,31.047173 21.857283,31.047173 C 17.785285,31.047174 13.87774,29.981737 11.669783,28.25044 C 11.481718,28.097267 11.163547,28.007137 10.826033,28.011426 L 10.826033,28.011426 z" - id="path11288" - sodipodi:nodetypes="cscscscsccc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4873425,3.0804918)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11257" - style="opacity:1;fill:url(#radialGradient11327);fill-opacity:1;stroke:none;stroke-width:0.51155167999999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11329" - d="M 21.499931,19.500002 C 21.499931,22.812 18.811935,25.5 15.499932,25.5 C 12.187931,25.5 9.4999315,22.812 9.4999315,19.500002 C 9.4999315,16.188 12.187931,13.5 15.499932,13.5 C 18.811935,13.5 21.499931,16.188 21.499931,19.500002 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11339);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - sodipodi:nodetypes="cscsc" - id="path17974" - d="M 10.857282,29 C 12.147541,31.295706 16.56888,33.020914 21.857283,33.020914 C 27.145683,33.020914 31.567025,31.295706 32.857282,29 C 30.539039,30.486544 26.467508,31.996368 21.857283,31.996368 C 17.247058,31.99637 13.175526,30.486544 10.857282,29 z" - style="fill:url(#linearGradient9018);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(1.954837,0,0,-1.954837,-1.0791836,45.47002)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17964" - style="opacity:0.48699998999999999;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.51155167999999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path17966" - d="M 20.499932,19.5 C 20.499932,22.259999 18.259935,24.499999 15.499932,24.499999 C 12.739932,24.499999 10.499932,22.259999 10.499932,19.5 C 10.499932,16.739999 12.739932,14.499999 15.499932,14.499999 C 18.259935,14.499999 20.499932,16.739999 20.499932,19.5 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11480);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(2.4367989,0,0,1.5452869,-7.1539168,6.0838442)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path17968" - style="opacity:1;fill:url(#linearGradient11202);fill-opacity:1;stroke:none;stroke-width:0.98640185999999996;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.7380737,0.6989293,-0.7062659,1.8392838,3.5297812,-10.968438)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11325" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.36837955999999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.7380737,0.6989296,-0.7062659,1.8392846,3.5297812,-9.9684476)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17976" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837946999999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.7380737,0.6989293,0.7062659,1.8392838,40.47015,-10.968439)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11323" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.36837955999999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.7380737,0.6989293,0.7062659,1.8392838,40.47015,-9.9684388)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17978" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837955999999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11482" - d="M 23.499931,19.5 C 23.499931,22.259999 25.739928,24.499999 28.499931,24.499999 C 31.259931,24.499999 33.499931,22.259999 33.499931,19.5 C 33.499931,16.739999 31.259931,14.499999 28.499931,14.499999 C 25.739928,14.499999 23.499931,16.739999 23.499931,19.5 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11507);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(2.436799,0,0,1.5452869,3.846082,6.0838439)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11204" - style="opacity:1;fill:url(#linearGradient11206);fill-opacity:1;stroke:none;stroke-width:0.98640185999999996;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.4620795,0,0,1.0301913,2.3076208,11.055896)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11300" - style="opacity:1;fill:url(#linearGradient11310);fill-opacity:1;stroke:none;stroke-width:0.98640185999999996;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.4620795,0,0,1.0301913,13.30762,11.055896)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11312" - style="opacity:1;fill:url(#linearGradient11314);fill-opacity:1;stroke:none;stroke-width:0.98640185999999996;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11341" - d="M 34.499931,19.500002 C 34.499931,22.812 31.811935,25.5 28.499932,25.5 C 25.187931,25.5 22.499931,22.812 22.499931,19.500002 C 22.499931,16.188 25.187931,13.5 28.499932,13.5 C 31.811935,13.5 34.499931,16.188 34.499931,19.500002 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11343);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(0.651488,0,0,0.651488,28.30843,24.844692)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path8714" - style="opacity:1;fill:#e0a900;fill-opacity:1;stroke:url(#linearGradient8720);stroke-width:1.53875648999999992;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(0.5012403,0,0,0.5012402,30.082278,26.494867)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path8716" - style="opacity:1;fill:url(#radialGradient8722);fill-opacity:1;stroke:none;stroke-width:0.51155167999999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(0.5513643,0,0,-0.5513643,29.490506,38.055647)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path8718" - style="opacity:0.48699998999999999;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.81368314999999991;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <g - id="g8029" - inkscape:label="Layer 1" - transform="translate(24.000001,25)"> - <rect - ry="1.5292913" - rx="1.4791573" - y="4.5005183" - x="2.5008683" - height="14.994927" - width="18.999125" - id="rect3198" - style="opacity:1;fill:#dfe2dc;fill-opacity:1;stroke:url(#linearGradient3189);stroke-width:1.00000024;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <rect - ry="1.325834" - rx="1.3235176" - y="5.5" - x="3.5" - height="13" - width="17" - id="rect3202" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000012;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - d="M 3.96875,5.53125 C 3.7197609,5.53125 3.53125,5.7077743 3.53125,6.03125 L 3.53125,17.96875 C 3.53125,18.292225 3.7197609,18.46875 3.96875,18.46875 L 20.03125,18.46875 C 20.280239,18.46875 20.46875,18.292227 20.46875,17.96875 L 20.46875,6.03125 C 20.46875,5.7077741 20.280239,5.53125 20.03125,5.53125 L 3.96875,5.53125 z" - inkscape:href="#rect3198" - id="path4119" - style="opacity:0.4;fill:url(#radialGradient3210);fill-opacity:1;stroke:url(#radialGradient4152);stroke-width:1.00000036;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - xlink:href="#rect3198" - inkscape:original="M 3.96875 4.5 C 3.1492968 4.5 2.5 5.1840228 2.5 6.03125 L 2.5 17.96875 C 2.5 18.815977 3.1492967 19.5 3.96875 19.5 L 20.03125 19.5 C 20.850703 19.5 21.5 18.815978 21.5 17.96875 L 21.5 6.03125 C 21.5 5.1840226 20.850703 4.5 20.03125 4.5 L 3.96875 4.5 z " - inkscape:radius="-1.0251163" - sodipodi:type="inkscape:offset" /> - <path - sodipodi:nodetypes="cccccc" - id="path4113" - d="M 20.173644,19.500002 L 3.8263566,19.500002 C 3.0915545,19.500002 2.4999999,18.840678 2.4999999,18.021697 L 11.981112,10.500001 L 21.499999,18.021697 C 21.499999,18.840678 20.908445,19.500002 20.173644,19.500002 z" - style="fill:#dfe2dc;fill-opacity:1;stroke:url(#linearGradient3197);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" /> - <path - transform="matrix(1.0093633,0,0,1,-3.4234557e-2,0)" - d="M 11.96875,11.71875 L 3.65625,18.3125 C 3.718416,18.374228 3.7395135,18.53125 3.8125,18.53125 L 20.1875,18.53125 C 20.260486,18.53125 20.281584,18.374227 20.34375,18.3125 L 11.96875,11.71875 z" - inkscape:href="#path4113" - id="path4117" - style="opacity:1;fill:url(#linearGradient4144);fill-opacity:1;stroke:#ffffff;stroke-width:0.9953509;stroke-miterlimit:4;stroke-opacity:1" - xlink:href="#path4113" - inkscape:original="M 11.96875 10.5 L 2.5 18.03125 C 2.5 18.850231 3.0776979 19.5 3.8125 19.5 L 20.1875 19.5 C 20.922301 19.5 21.500001 18.850232 21.5 18.03125 L 11.96875 10.5 z " - inkscape:radius="-0.96695226" - sodipodi:type="inkscape:offset" /> - <path - sodipodi:nodetypes="ccczcc" - id="path4122" - d="M 20.145067,4.5000001 L 3.8242121,4.5000001 C 3.0905983,4.5000001 2.5000001,5.1593244 2.5000001,5.9783056 C 2.5000001,5.9783056 9.4173792,13.5 12.043511,13.5 C 14.708468,13.5 21.469279,5.9783056 21.469279,5.9783056 C 21.469279,5.1593244 20.878681,4.5000001 20.145067,4.5000001 z" - style="fill:#eeeeec;fill-opacity:1;stroke:#888a85;stroke-width:1.00000012;stroke-miterlimit:4;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cccccz" - id="path4124" - d="M 12.087485,11.46875 C 10.301616,11.46875 3.34375,18.34375 3.34375,18.34375 C 3.4413342,18.582586 3.6045666,18.75 3.8125,18.75 L 20.1875,18.75 C 20.395433,18.75 20.558666,18.582586 20.65625,18.34375 C 20.65625,18.34375 13.912791,11.46875 12.087485,11.46875 z" - style="opacity:1;fill:url(#linearGradient3200);fill-opacity:1;stroke:#ffffff;stroke-width:1.03183317;stroke-miterlimit:4;stroke-opacity:1" - transform="matrix(0.9819495,0,0,-0.956515,0.2166063,23.434657)" /> - </g> - </g> -</svg>
--- a/pidgin/artwork/hicolor/scalable/status/pidgin-question.svg Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,655 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="48" - height="48" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.46" - version="1.0" - sodipodi:docbase="/home/hbons/Desktop" - sodipodi:docname="question.svg" - inkscape:export-filename="/home/hbons/Bureaublad/question.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - sodipodi:modified="true"> - <defs - id="defs4"> - <linearGradient - inkscape:collect="always" - id="linearGradient8711"> - <stop - style="stop-color:#a5c2e1;stop-opacity:1" - offset="0" - id="stop8713" /> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="1" - id="stop8715" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11586"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11588" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11590" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11570"> - <stop - style="stop-color:#0a387a;stop-opacity:1" - offset="0" - id="stop11572" /> - <stop - style="stop-color:#368eec;stop-opacity:1" - offset="1" - id="stop11574" /> - </linearGradient> - <linearGradient - id="linearGradient11493" - inkscape:collect="always"> - <stop - id="stop11495" - offset="0" - style="stop-color:#555753;stop-opacity:1" /> - <stop - id="stop11497" - offset="1" - style="stop-color:#070808;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient11487" - inkscape:collect="always"> - <stop - id="stop11489" - offset="0" - style="stop-color:#538ac5;stop-opacity:1" /> - <stop - id="stop11491" - offset="1" - style="stop-color:#ffffff;stop-opacity:1" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11474"> - <stop - style="stop-color:#558bc5;stop-opacity:1" - offset="0" - id="stop11476" /> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="1" - id="stop11478" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11418"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11420" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11422" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11333"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11335" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11337" /> - </linearGradient> - <linearGradient - id="linearGradient11316" - inkscape:collect="always"> - <stop - id="stop11318" - offset="0" - style="stop-color:#edd400;stop-opacity:1" /> - <stop - id="stop11320" - offset="1" - style="stop-color:#f6c93b;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11304"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11306" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11308" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11292"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11294" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11296" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11259"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11261" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11263" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11241"> - <stop - style="stop-color:#4f381b;stop-opacity:0.97254902" - offset="0" - id="stop11243" /> - <stop - style="stop-color:#a87b42;stop-opacity:0.96078432" - offset="1" - id="stop11245" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11208"> - <stop - style="stop-color:#c32f00;stop-opacity:1" - offset="0" - id="stop11210" /> - <stop - style="stop-color:#6c1300;stop-opacity:1" - offset="1" - id="stop11212" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11196"> - <stop - style="stop-color:#555753;stop-opacity:1" - offset="0" - id="stop11198" /> - <stop - style="stop-color:#000000;stop-opacity:1" - offset="1" - id="stop11200" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11241" - id="linearGradient10406" - gradientUnits="userSpaceOnUse" - x1="14.365882" - y1="19.515574" - x2="11.215483" - y2="8.2263536" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11493" - id="linearGradient11202" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11196" - id="linearGradient11206" - gradientUnits="userSpaceOnUse" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11208" - id="linearGradient11214" - x1="22.919643" - y1="33.491837" - x2="22.919643" - y2="36.402832" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-1,0,0,1,45.999931,1.885788e-7)" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11316" - id="radialGradient11271" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.8771377,9.6878354e-8,-5.330884e-8,1.0893079,-10.4827,-2.6428601)" - cx="11.873854" - cy="12.147273" - fx="11.594166" - fy="8.8655272" - r="9.975256" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11292" - id="radialGradient11298" - cx="24.00321" - cy="34.70562" - fx="24.00321" - fy="34.70562" - r="12.133846" - gradientTransform="matrix(1.5208182,0,0,0.7073167,-12.501486,7.9416791)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient11310" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient11314" - gradientUnits="userSpaceOnUse" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11259" - id="radialGradient11327" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.023438,0,0,0.8870879,-0.2709505,0.7064648)" - cx="11.736404" - cy="7.3689327" - fx="11.800528" - fy="1.1734189" - r="9.975256" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11339" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-2.0000685,1.885788e-7)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11343" - gradientUnits="userSpaceOnUse" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientTransform="translate(10.999931,1.885788e-7)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11418" - id="linearGradient11424" - x1="22.915459" - y1="34.796875" - x2="22.854631" - y2="29.835938" - gradientUnits="userSpaceOnUse" /> - <filter - inkscape:collect="always" - id="filter11462" - x="-0.078992675" - width="1.1579853" - y="-0.19133781" - height="1.3826756"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.448448" - id="feGaussianBlur11464" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11487" - id="linearGradient11480" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-2.0000685,1.885788e-7)" /> - <filter - inkscape:collect="always" - id="filter11503" - x="-0.11697236" - width="1.2339447" - y="-0.32830241" - height="1.6566048"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.64772565" - id="feGaussianBlur11505" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11474" - id="linearGradient11507" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-1,0,0,1,45.999932,1.885788e-7)" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11570" - id="linearGradient11576" - x1="48.140072" - y1="17.348257" - x2="36.310215" - y2="9.2333107" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(0,-2)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11586" - id="linearGradient11592" - x1="43.267006" - y1="14" - x2="54.781696" - y2="18.949747" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11570" - id="linearGradient8706" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(0,-2)" - x1="46.202572" - y1="17.035757" - x2="37.247715" - y2="14.5" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11586" - id="linearGradient8708" - gradientUnits="userSpaceOnUse" - x1="43.267006" - y1="14" - x2="54.781696" - y2="18.949747" - gradientTransform="translate(0,-2)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8711" - id="linearGradient8717" - x1="47.873451" - y1="13.986977" - x2="41.067547" - y2="12.484375" - gradientUnits="userSpaceOnUse" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="11.313709" - inkscape:cx="48.898255" - inkscape:cy="29.543471" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="true" - fill="#fce94f" - inkscape:window-width="1440" - inkscape:window-height="847" - inkscape:window-x="0" - inkscape:window-y="0" - width="48px" - height="48px" - inkscape:snap-bbox="true" - inkscape:snap-nodes="false" - objecttolerance="10" - gridtolerance="10" - showguides="true" - inkscape:guide-bbox="true"> - <inkscape:grid - type="xygrid" - id="grid10393" - visible="true" - enabled="true" /> - </sodipodi:namedview> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <path - transform="matrix(2.257367,0,0,2.7454598,-1.263726,9.7889628)" - d="M 17.393564,10.457643 A 6.6449099,2.3675451 0 1 1 4.1037445,10.457643 A 6.6449099,2.3675451 0 1 1 17.393564,10.457643 z" - sodipodi:ry="2.3675451" - sodipodi:rx="6.6449099" - sodipodi:cy="10.457643" - sodipodi:cx="10.748654" - id="path17958" - style="opacity:0.7342342;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter11503);enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(2.0549539,0,0,2.0549096,-2.2611787,1.4304378)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17960" - style="opacity:1;fill:#e08700;fill-opacity:1;stroke:url(#linearGradient10406);stroke-width:0.4878417;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4874115,3.0804919)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11247" - style="opacity:1;fill:url(#radialGradient11271);fill-opacity:1;stroke:none;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4874115,3.0804919)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11257" - style="opacity:1;fill:url(#radialGradient11327);fill-opacity:1;stroke:none;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11329" - d="M 21.499931,19.500002 C 21.499931,22.812 18.811935,25.5 15.499932,25.5 C 12.187931,25.5 9.4999315,22.812 9.4999315,19.500002 C 9.4999315,16.188 12.187931,13.5 15.499932,13.5 C 18.811935,13.5 21.499931,16.188 21.499931,19.500002 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11339);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(1.954837,0,0,-1.954837,-1.0791836,45.47002)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17964" - style="opacity:0.48699999;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path17966" - d="M 20.499932,19.5 C 20.499932,22.259999 18.259935,24.499999 15.499932,24.499999 C 12.739932,24.499999 10.499932,22.259999 10.499932,19.5 C 10.499932,16.739999 12.739932,14.499999 15.499932,14.499999 C 18.259935,14.499999 20.499932,16.739999 20.499932,19.5 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11480);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(2.4367989,0,0,1.5452869,-6.1538483,7.0838437)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path17968" - style="opacity:1;fill:url(#linearGradient11202);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="0.98821175" - inkscape:original="M 13 28 C 14.290259 33.138472 18.711597 37 24 37 C 29.288399 37 33.709743 33.138472 35 28 C 32.681757 31.327326 28.610225 35.09375 24 35.09375 C 19.389774 35.093751 15.318244 31.327326 13 28 z " - style="opacity:0.37037036;fill:url(#radialGradient11298);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - id="path11288" - d="M 12.96875,27 C 12.66316,27.004794 12.37698,27.150701 12.193604,27.395203 C 12.010227,27.639705 11.950287,27.955291 12.03125,28.25 C 13.422894,33.792238 18.230543,38 24,38 C 29.769453,38 34.577108,33.792239 35.96875,28.25 C 36.109736,27.777313 35.880605,27.273042 35.431823,27.068334 C 34.983041,26.863627 34.452032,27.021167 34.1875,27.4375 C 31.979544,30.606533 28.071998,34.09375 24,34.09375 C 19.928002,34.093751 16.020457,30.606534 13.8125,27.4375 C 13.624435,27.157127 13.306264,26.992149 12.96875,27 L 12.96875,27 z" - transform="translate(-2.0000685,1.885788e-7)" /> - <path - sodipodi:nodetypes="cscsc" - id="path17974" - d="M 10.999931,28 C 12.29019,33.138472 16.711529,37 21.999932,37 C 27.288332,37 31.709674,33.138472 32.999931,28 C 30.681688,31.327326 26.610157,35.102442 21.999932,35.102442 C 17.389707,35.102445 13.318175,31.327326 10.999931,28 z" - style="opacity:1;fill:url(#linearGradient11214);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.7380737,0.6989293,-0.7062659,1.8392838,3.5297812,-10.968438)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11325" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.36837956;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.7380737,0.6989296,-0.7062659,1.8392846,3.5297812,-9.9684476)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17976" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837947;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.7380737,0.6989293,0.7062659,1.8392838,40.470081,-10.968438)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11323" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.36837956;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.7380737,0.6989293,0.7062659,1.8392838,40.470081,-9.9684383)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17978" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837956;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11482" - d="M 23.499931,19.5 C 23.499931,22.259999 25.739928,24.499999 28.499931,24.499999 C 31.259931,24.499999 33.499931,22.259999 33.499931,19.5 C 33.499931,16.739999 31.259931,14.499999 28.499931,14.499999 C 25.739928,14.499999 23.499931,16.739999 23.499931,19.5 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11507);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(2.436799,0,0,1.5452869,5.8461508,7.0838441)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11204" - style="opacity:1;fill:url(#linearGradient11206);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.4620795,0,0,1.0301913,3.3076893,12.055896)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11300" - style="opacity:1;fill:url(#linearGradient11310);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.4620795,0,0,1.0301913,15.30769,12.055896)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11312" - style="opacity:1;fill:url(#linearGradient11314);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11341" - d="M 34.499931,19.500002 C 34.499931,22.812 31.811935,25.5 28.499932,25.5 C 25.187931,25.5 22.499931,22.812 22.499931,19.500002 C 22.499931,16.188 25.187931,13.5 28.499932,13.5 C 31.811935,13.5 34.499931,16.188 34.499931,19.500002 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11343);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:url(#linearGradient11424);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter11462);enable-background:accumulate" - id="path11416" - sodipodi:cx="23.25" - sodipodi:cy="30.1875" - sodipodi:rx="6.8125" - sodipodi:ry="2.8125" - d="M 30.0625,30.1875 A 6.8125,2.8125 0 1 1 16.4375,30.1875 A 6.8125,2.8125 0 1 1 30.0625,30.1875 z" - transform="matrix(1.0275229,0,0,1.777778,-1.8899762,-24.666672)" /> - <path - style="font-size:19.03945922999999851px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient8706);fill-opacity:1;stroke:none;stroke-width:1.55613649000000009px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Century Schoolbook L" - d="M 40.5625,1 C 38.874477,1 37.314933,1.4226492 36.09375,2.28125 C 34.872565,3.1398509 34,4.5416345 34,6.125 C 33.999998,7.9320376 35.500885,9 37.375,9 C 38.972866,9 40.03125,8.6239064 40.03125,6.9375 C 40.03125,5.8358747 41.03125,5.7736538 41.03125,7 C 41.031252,7.5731772 40.720035,7.6923202 40.46875,8.03125 C 39.556981,9.1888218 39.147246,9.72288 38.8125,10.21875 C 37.953228,11.557311 37,12.936936 37,14.46875 C 36.999998,17.077704 39.59375,16.96875 39.59375,16.96875 C 39.236295,17.077217 38.886105,17.297356 38.5625,17.5625 C 38.550686,17.570277 38.542964,17.585834 38.53125,17.59375 C 38.424354,17.683359 38.318146,17.772605 38.21875,17.875 C 37.480053,18.516861 37,19.445308 37,20.5 C 37,22.432 38.568,24 40.5,24 C 42.432,24 44.000001,22.432 44,20.5 C 44,18.95785 43.010761,17.653479 41.625,17.1875 C 41.444379,17.110901 41.249634,17.062378 41.0625,17 C 41.763982,16.748864 42.068061,15.931257 42.0625,15.1875 C 42.051002,14.139574 42.280169,13.716262 42.375,13.5 C 43.426067,11.600594 44.954699,11.097944 46.125,9.75 C 46.749619,8.8343856 47,7.7477245 47,6.75 C 47.000001,5.1014533 46.28805,3.5482598 45.09375,2.53125 C 43.89945,1.5142402 42.298617,1 40.5625,1 z" - id="path3346" - sodipodi:nodetypes="csssssccscsscsssccsccssc" /> - <path - style="font-size:19.03945922999999851px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient8717);fill-opacity:1;stroke:none;stroke-width:1.55613649000000009px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Century Schoolbook L" - d="M 40.5625 1.96875 C 39.03732 1.96875 37.680971 2.3732797 36.65625 3.09375 C 35.664894 3.7907611 34.96875 4.9000488 34.96875 6.125 C 34.968749 6.758422 35.192622 7.1443716 35.59375 7.46875 C 35.994878 7.7931284 36.623252 8.03125 37.375 8.03125 C 38.097392 8.03125 38.596706 7.9024002 38.78125 7.78125 C 38.965794 7.6600998 39.0625 7.5766139 39.0625 6.9375 C 39.0625 6.5144976 39.145775 6.1274407 39.375 5.78125 C 39.604225 5.4350593 40.027732 5.1249297 40.53125 5.125 C 41.034768 5.1250703 41.462039 5.4531849 41.6875 5.8125 C 41.912961 6.1718151 42 6.5608281 42 7 C 42.000002 7.4631574 41.827288 7.9211544 41.625 8.1875 C 41.422712 8.453846 41.293456 8.566387 41.25 8.625 C 40.340574 9.779598 39.934939 10.290878 39.625 10.75 C 38.753163 12.108134 37.96875 13.34166 37.96875 14.46875 C 37.968749 15.449931 38.315321 15.62655 38.71875 15.8125 C 39.583542 16.168963 40.115403 16.105798 40.96875 15.84375 C 41.047882 15.684154 41.095517 15.423765 41.09375 15.1875 C 41.08066 13.994488 41.418028 13.209423 41.46875 13.09375 C 41.488628 13.071983 41.509483 13.051128 41.53125 13.03125 C 42.136141 11.938138 42.896246 11.218183 43.59375 10.65625 C 44.265082 10.115402 44.835184 9.717613 45.3125 9.1875 C 45.803013 8.468469 46.03125 7.5845097 46.03125 6.75 C 46.031251 5.3823316 45.435469 4.1044628 44.46875 3.28125 C 43.478484 2.4379857 42.105973 1.96875 40.5625 1.96875 z M 40.5 18 C 39.12 18 37.999999 19.12 38 20.5 C 38 21.88 39.119998 23 40.5 23 C 41.88 23 43.000002 21.88 43 20.5 C 43 19.12 41.879998 17.999999 40.5 18 z " - id="path11582" /> - </g> -</svg>
--- a/pidgin/artwork/hicolor/scalable/status/pidgin-warning.svg Sat Sep 13 16:13:48 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,558 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="48" - height="48" - id="svg2" - sodipodi:version="0.32" - inkscape:version="0.46" - version="1.0" - sodipodi:docbase="/home/hbons/Desktop" - sodipodi:docname="warning.svg" - inkscape:export-filename="/home/hbons/Bureaublad/warning.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - inkscape:output_extension="org.inkscape.output.svg.inkscape" - sodipodi:modified="true"> - <defs - id="defs4"> - <linearGradient - inkscape:collect="always" - id="linearGradient8730"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop8732" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop8734" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8716"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop8718" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop8720" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8706"> - <stop - style="stop-color:#391f17;stop-opacity:1" - offset="0" - id="stop8708" /> - <stop - style="stop-color:#841c0e;stop-opacity:1" - offset="1" - id="stop8710" /> - </linearGradient> - <linearGradient - id="linearGradient11493" - inkscape:collect="always"> - <stop - id="stop11495" - offset="0" - style="stop-color:#555753;stop-opacity:1" /> - <stop - id="stop11497" - offset="1" - style="stop-color:#070808;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient11487" - inkscape:collect="always"> - <stop - id="stop11489" - offset="0" - style="stop-color:#538ac5;stop-opacity:1" /> - <stop - id="stop11491" - offset="1" - style="stop-color:#ffffff;stop-opacity:1" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11474"> - <stop - style="stop-color:#558bc5;stop-opacity:1" - offset="0" - id="stop11476" /> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="1" - id="stop11478" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11333"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11335" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11337" /> - </linearGradient> - <linearGradient - id="linearGradient11316" - inkscape:collect="always"> - <stop - id="stop11318" - offset="0" - style="stop-color:#edd400;stop-opacity:1" /> - <stop - id="stop11320" - offset="1" - style="stop-color:#f6c93b;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11304"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11306" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11308" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11259"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop11261" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop11263" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11241"> - <stop - style="stop-color:#4f381b;stop-opacity:0.97254902" - offset="0" - id="stop11243" /> - <stop - style="stop-color:#a87b42;stop-opacity:0.96078432" - offset="1" - id="stop11245" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient11196"> - <stop - style="stop-color:#555753;stop-opacity:1" - offset="0" - id="stop11198" /> - <stop - style="stop-color:#000000;stop-opacity:1" - offset="1" - id="stop11200" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11241" - id="linearGradient10406" - gradientUnits="userSpaceOnUse" - x1="14.365882" - y1="19.515574" - x2="11.215483" - y2="8.2263536" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11493" - id="linearGradient11202" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11196" - id="linearGradient11206" - gradientUnits="userSpaceOnUse" - x1="9.7069349" - y1="8.5495605" - x2="9.9879932" - y2="10.59237" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11316" - id="radialGradient11271" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.8771377,9.6878354e-8,-5.330884e-8,1.0893079,-10.4827,-2.6428601)" - cx="11.873854" - cy="12.147273" - fx="11.594166" - fy="8.8655272" - r="9.975256" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient11310" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11304" - id="linearGradient11314" - gradientUnits="userSpaceOnUse" - x1="8.9530411" - y1="6.2636566" - x2="10.732871" - y2="9.6526775" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient11259" - id="radialGradient11327" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.023438,0,0,0.8870879,-0.2709505,0.7064648)" - cx="11.736404" - cy="7.3689327" - fx="11.800528" - fy="1.1734189" - r="9.975256" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11339" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.0833276,0,0,1.1666668,-3.9582687,-5.2500011)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11333" - id="linearGradient11343" - gradientUnits="userSpaceOnUse" - x1="14.6875" - y1="11.875" - x2="20.6875" - y2="22.5625" - gradientTransform="matrix(1.0833391,0,0,1.1666668,10.041531,-5.2500011)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11487" - id="linearGradient11480" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.0999932,0,0,1.2,-4.2499165,-5.8999987)" /> - <filter - inkscape:collect="always" - id="filter11503" - x="-0.11697236" - width="1.2339447" - y="-0.32830241" - height="1.6566048"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.64772565" - id="feGaussianBlur11505" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient11474" - id="linearGradient11507" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-1.1000069,0,0,1.2,48.250086,-5.8999987)" - x1="14.728965" - y1="15.785595" - x2="16.957989" - y2="24.104429" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient8716" - id="radialGradient8722" - cx="44.7687" - cy="4.7732658" - fx="44.7687" - fy="4.7732658" - r="9.0598059" - gradientTransform="matrix(1.7013896,0,0,1.0125342,-31.400301,2.4538538)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8730" - id="linearGradient8736" - x1="45.837402" - y1="21.754553" - x2="45.837402" - y2="19.126131" - gradientUnits="userSpaceOnUse" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient8706" - id="radialGradient8738" - cx="44.7687" - cy="21.608887" - fx="44.7687" - fy="21.608887" - r="9.0598059" - gradientTransform="matrix(1.3094421,0,0,0.7792777,-13.85332,2.5000315)" - gradientUnits="userSpaceOnUse" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="2.8284271" - inkscape:cx="64.2628" - inkscape:cy="40.347011" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="true" - fill="#fce94f" - inkscape:window-width="1440" - inkscape:window-height="847" - inkscape:window-x="0" - inkscape:window-y="0" - width="48px" - height="48px" - inkscape:snap-bbox="true" - inkscape:snap-nodes="false" - objecttolerance="10" - gridtolerance="10" - showguides="true" - inkscape:guide-bbox="true"> - <inkscape:grid - type="xygrid" - id="grid10393" - visible="true" - enabled="true" /> - </sodipodi:namedview> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <path - transform="matrix(2.257367,0,0,2.7454598,-1.263726,9.7889628)" - d="M 17.393564,10.457643 A 6.6449099,2.3675451 0 1 1 4.1037445,10.457643 A 6.6449099,2.3675451 0 1 1 17.393564,10.457643 z" - sodipodi:ry="2.3675451" - sodipodi:rx="6.6449099" - sodipodi:cy="10.457643" - sodipodi:cx="10.748654" - id="path17958" - style="opacity:0.7342342;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter11503);enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(2.0549539,0,0,2.0549096,-2.2611787,1.4304378)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17960" - style="opacity:1;fill:#e08700;fill-opacity:1;stroke:url(#linearGradient10406);stroke-width:0.4878417;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4874115,3.0804919)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11247" - style="opacity:1;fill:url(#radialGradient11271);fill-opacity:1;stroke:none;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.904713,0,0,1.904713,-0.4874115,3.0804919)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path11257" - style="opacity:1;fill:url(#radialGradient11327);fill-opacity:1;stroke:none;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11329" - d="M 21.499929,17.500003 C 21.499929,21.364001 18.587949,24.500001 14.999965,24.500001 C 11.411983,24.500001 8.4999987,21.364001 8.4999987,17.500003 C 8.4999987,13.636 11.411983,10.5 14.999965,10.5 C 18.587949,10.5 21.499929,13.636 21.499929,17.500003 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11339);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(1.954837,0,0,-1.954837,-1.0791836,45.47002)" - d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z" - sodipodi:ry="9.975256" - sodipodi:rx="9.975256" - sodipodi:cy="10.983024" - sodipodi:cx="11.806158" - id="path17964" - style="opacity:0.48699999;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.51155168;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path17966" - d="M 20.499931,17.500002 C 20.499931,20.812 18.03595,23.5 14.999965,23.5 C 11.963984,23.5 9.499999,20.812 9.499999,17.500002 C 9.499999,14.188 11.963984,11.5 14.999965,11.5 C 18.03595,11.5 20.499931,14.188 20.499931,17.500002 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11480);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(2.9241248,0,0,1.5452869,-12.384324,4.083844)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path17968" - style="opacity:1;fill:url(#linearGradient11202);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.7380737,0.6989293,-0.7062659,1.8392838,3.5298496,-13.968438)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11325" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.36837956;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(3.7380737,0.6989296,-0.7062659,1.8392846,3.5298496,-12.968448)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17976" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837947;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.7380737,0.6989293,0.7062659,1.8392838,40.47015,-13.968438)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path11323" - style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.36837956;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - sodipodi:open="true" - sodipodi:end="5.6135639" - sodipodi:start="3.5782199" - transform="matrix(-3.7380737,0.6989293,0.7062659,1.8392838,40.47015,-12.968438)" - d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499" - sodipodi:ry="1.7410715" - sodipodi:rx="1.2276785" - sodipodi:cy="9.2232141" - sodipodi:cx="8.3258924" - id="path17978" - style="opacity:1;fill:none;fill-opacity:1;stroke:#a95300;stroke-width:0.36837956;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11482" - d="M 23.49993,17.500002 C 23.49993,20.812 25.963942,23.5 28.999965,23.5 C 32.035984,23.5 34.499999,20.812 34.499999,17.500002 C 34.499999,14.188 32.035984,11.5 28.999965,11.5 C 25.963942,11.5 23.49993,14.188 23.49993,17.500002 z" - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient11507);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - transform="matrix(2.9241927,0,0,1.5452869,-0.3849832,4.0838437)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11204" - style="opacity:1;fill:url(#linearGradient11206);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.9494053,0,0,1.0301913,-2.922785,9.0558958)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11300" - style="opacity:1;fill:url(#linearGradient11310);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - transform="matrix(1.9494735,0,0,1.0301913,9.0765518,9.0558958)" - d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z" - sodipodi:ry="1.9413869" - sodipodi:rx="1.0259361" - sodipodi:cy="9.6526775" - sodipodi:cx="9.7069349" - id="path11312" - style="opacity:1;fill:url(#linearGradient11314);fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;enable-background:new" - sodipodi:type="arc" /> - <path - id="path11341" - d="M 35.5,17.500003 C 35.5,21.364001 32.587988,24.500001 28.999966,24.500001 C 25.411946,24.500001 22.49993,21.364001 22.49993,17.500003 C 22.49993,13.636 25.411946,10.5 28.999966,10.5 C 32.587988,10.5 35.5,13.636 35.5,17.500003 z" - style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient11343);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:url(#radialGradient8722);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="path8714" - sodipodi:cx="44.7687" - sodipodi:cy="16.003418" - sodipodi:rx="9.0598059" - sodipodi:ry="5.3916893" - d="M 53.828506,16.003418 A 9.0598059,5.3916893 0 1 1 35.708894,16.003418 A 9.0598059,5.3916893 0 1 1 53.828506,16.003418 z" - transform="matrix(1.0485875,0,0,1.2982945,-25.443899,12.222851)" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:url(#radialGradient8738);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="path7934" - sodipodi:cx="44.7687" - sodipodi:cy="16.003418" - sodipodi:rx="9.0598059" - sodipodi:ry="5.3916893" - d="M 53.828506,16.003418 A 9.0598059,5.3916893 0 1 1 35.708894,16.003418 A 9.0598059,5.3916893 0 1 1 53.828506,16.003418 z" - transform="matrix(0.93821,0,0,1.1128238,-20.50244,15.191015)" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient8736);stroke-width:0.80703287999999984;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="path8728" - sodipodi:cx="44.7687" - sodipodi:cy="16.003418" - sodipodi:rx="9.0598059" - sodipodi:ry="5.3916893" - d="M 53.828506,16.003418 A 9.0598059,5.3916893 0 1 1 35.708894,16.003418 A 9.0598059,5.3916893 0 1 1 53.828506,16.003418 z" - transform="matrix(1.1037765,0,0,1.3910297,-27.91464,10.738771)" /> - </g> -</svg>
--- a/pidgin/gtkblist.c Sat Sep 13 16:13:48 2008 +0000 +++ b/pidgin/gtkblist.c Tue Sep 16 20:01:24 2008 +0000 @@ -67,7 +67,6 @@ #include <gdk/gdk.h> #define HEADLINE_CLOSE_SIZE 12 -#define STEPS 50 typedef struct { @@ -168,18 +167,11 @@ PIDGIN_BLIST_NODE_HAS_PENDING_MESSAGE = 1 << 0, /* Whether there's pending message in a conversation */ } PidginBlistNodeFlags; -typedef enum { - RECENT_STATUS_NONE = 0, - RECENT_STATUS_SIGN_ON, - RECENT_STATUS_SIGN_OFF -} RecentStatus; - typedef struct _pidgin_blist_node { GtkTreeRowReference *row; gboolean contact_expanded; - RecentStatus recent_signonoff; + gboolean recent_signonoff; gint recent_signonoff_timer; - gint recent_signonoff_steps; struct { PurpleConversation *conv; time_t last_message; /* timestamp for last displayed message */ @@ -3746,11 +3738,11 @@ p = purple_buddy_get_presence(buddy); trans = purple_presence_is_idle(p); - /*if (PURPLE_BUDDY_IS_ONLINE(buddy) && gtkbuddynode && gtkbuddynode->recent_signonoff) + if (PURPLE_BUDDY_IS_ONLINE(buddy) && gtkbuddynode && gtkbuddynode->recent_signonoff) icon = PIDGIN_STOCK_STATUS_LOGIN; else if (gtkbuddynode && gtkbuddynode->recent_signonoff) icon = PIDGIN_STOCK_STATUS_LOGOUT; - else */if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_UNAVAILABLE)) + else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_UNAVAILABLE)) if (trans) icon = PIDGIN_STOCK_STATUS_BUSY_I; else @@ -6046,11 +6038,9 @@ GdkPixbuf *status, *avatar, *emblem, *prpl_icon; char *mark; char *idle = NULL; - struct _pidgin_blist_node *gtknode = ((PurpleBlistNode*)buddy)->ui_data; gboolean expanded = ((struct _pidgin_blist_node *)(node->parent->ui_data))->contact_expanded; gboolean selected = (gtkblist->selected_node == node); gboolean biglist = purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_buddy_icons"); - int size; presence = purple_buddy_get_presence(buddy); if (editing_blist) @@ -6059,14 +6049,6 @@ status = pidgin_blist_get_status_icon((PurpleBlistNode*)buddy, biglist ? PIDGIN_STATUS_ICON_LARGE : PIDGIN_STATUS_ICON_SMALL); - size = biglist ? 16 : 11; - if (gtknode->recent_signonoff == RECENT_STATUS_SIGN_ON) { - size = size / 2 + (size / 2 + (STEPS - gtknode->recent_signonoff_steps)) % (size / 2); - } else if (gtknode->recent_signonoff == RECENT_STATUS_SIGN_OFF) { - size = size - (STEPS - gtknode->recent_signonoff_steps) % (size / 2); - } - status = gdk_pixbuf_scale_simple(status, size, size, GDK_INTERP_BILINEAR); - /* Speed it up if we don't want buddy icons. */ if(biglist) avatar = pidgin_blist_get_buddy_icon((PurpleBlistNode *)buddy, TRUE, TRUE); @@ -6198,7 +6180,7 @@ BUDDY_ICON_COLUMN, NULL, CONTACT_EXPANDER_COLUMN, TRUE, CONTACT_EXPANDER_VISIBLE_COLUMN, TRUE, - GROUP_EXPANDER_VISIBLE_COLUMN, FALSE, + GROUP_EXPANDER_VISIBLE_COLUMN, FALSE, -1); g_free(mark); if(status) @@ -7150,17 +7132,13 @@ static gboolean buddy_signonoff_timeout_cb(PurpleBuddy *buddy) { struct _pidgin_blist_node *gtknode = ((PurpleBlistNode*)buddy)->ui_data; - gboolean cont = TRUE; - - if (--gtknode->recent_signonoff_steps == 0) { - gtknode->recent_signonoff = RECENT_STATUS_NONE; - gtknode->recent_signonoff_timer = 0; - cont = FALSE; - } + + gtknode->recent_signonoff = FALSE; + gtknode->recent_signonoff_timer = 0; pidgin_blist_update(NULL, (PurpleBlistNode*)buddy); - return cont; + return FALSE; } static void buddy_signonoff_cb(PurpleBuddy *buddy) @@ -7173,12 +7151,11 @@ gtknode = ((PurpleBlistNode*)buddy)->ui_data; - gtknode->recent_signonoff = PURPLE_BUDDY_IS_ONLINE(buddy) ? RECENT_STATUS_SIGN_ON : RECENT_STATUS_SIGN_OFF; + gtknode->recent_signonoff = TRUE; if(gtknode->recent_signonoff_timer > 0) purple_timeout_remove(gtknode->recent_signonoff_timer); - gtknode->recent_signonoff_steps = STEPS; - gtknode->recent_signonoff_timer = purple_timeout_add(100, + gtknode->recent_signonoff_timer = purple_timeout_add(10000, (GSourceFunc)buddy_signonoff_timeout_cb, buddy); } @@ -7655,10 +7632,7 @@ gtk_widget_destroy(menuitem); } - if (!(accounts = purple_accounts_get_all())) - return; - - for (; accounts; accounts = accounts->next) { + for (accounts = purple_accounts_get_all(); accounts; accounts = accounts->next) { char *buf = NULL; GtkWidget *image = NULL; PurpleAccount *account = NULL;
--- a/pidgin/gtkimhtmltoolbar.c Sat Sep 13 16:13:48 2008 +0000 +++ b/pidgin/gtkimhtmltoolbar.c Tue Sep 16 20:01:24 2008 +0000 @@ -1146,7 +1146,7 @@ toolbar); } - free(toolbar->sml); + g_free(toolbar->sml); gtk_object_sink(GTK_OBJECT(toolbar->tooltips)); menu = g_object_get_data(object, "font_menu");
--- a/pidgin/gtkstatusbox.c Sat Sep 13 16:13:48 2008 +0000 +++ b/pidgin/gtkstatusbox.c Tue Sep 16 20:01:24 2008 +0000 @@ -2715,7 +2715,6 @@ gtk_widget_show_all(status_box->vbox); status_box->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, status_box); gtk_widget_grab_focus(status_box->imhtml); - gtk_imhtml_clear(GTK_IMHTML(status_box->imhtml)); } else {
--- a/pidgin/pixmaps/icons/hicolor/48x48/apps/scalable/pidgin.svg Sat Sep 13 16:13:48 2008 +0000 +++ b/pidgin/pixmaps/icons/hicolor/48x48/apps/scalable/pidgin.svg Tue Sep 16 20:01:24 2008 +0000 @@ -23,55 +23,12 @@ <defs id="defs4347"> <linearGradient - inkscape:collect="always" - id="linearGradient9905"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop9907" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop9909" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient9893"> - <stop - style="stop-color:#ff2de9;stop-opacity:1;" - offset="0" - id="stop9895" /> - <stop - style="stop-color:#ffffff;stop-opacity:0.498" - offset="1" - id="stop9897" /> - </linearGradient> - <linearGradient - id="linearGradient9689" - inkscape:collect="always"> - <stop - id="stop9691" - offset="0" - style="stop-color:#ffb547;stop-opacity:1" /> - <stop - id="stop9693" - offset="1" - style="stop-color:#e56600;stop-opacity:1" /> - </linearGradient> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 24 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="48 : 24 : 1" - inkscape:persp3d-origin="24 : 16 : 1" - id="perspective100" /> - <linearGradient id="linearGradient8744" inkscape:collect="always"> <stop id="stop8746" offset="0" - style="stop-color:#162c5e;stop-opacity:1" /> + style="stop-color:#7a1d90;stop-opacity:1" /> <stop id="stop8748" offset="1" @@ -81,7 +38,7 @@ inkscape:collect="always" id="linearGradient8732"> <stop - style="stop-color:#262f65;stop-opacity:1" + style="stop-color:#6b3678;stop-opacity:1;" offset="0" id="stop8734" /> <stop @@ -93,11 +50,11 @@ inkscape:collect="always" id="linearGradient8904"> <stop - style="stop-color:#649fdd;stop-opacity:1" + style="stop-color:#729fcf;stop-opacity:1;" offset="0" id="stop8906" /> <stop - style="stop-color:#184779;stop-opacity:1" + style="stop-color:#25486d;stop-opacity:1" offset="1" id="stop8908" /> </linearGradient> @@ -109,7 +66,7 @@ offset="0" id="stop8886" /> <stop - style="stop-color:#3c2375;stop-opacity:1" + style="stop-color:#6b3e75;stop-opacity:1" offset="1" id="stop8888" /> </linearGradient> @@ -121,12 +78,24 @@ offset="0" id="stop8878" /> <stop - style="stop-color:#472d7e;stop-opacity:1" + style="stop-color:#744380;stop-opacity:1" offset="1" id="stop8880" /> </linearGradient> <linearGradient inkscape:collect="always" + id="linearGradient8868"> + <stop + style="stop-color:#3b1941;stop-opacity:1;" + offset="0" + id="stop8870" /> + <stop + style="stop-color:#a646b7;stop-opacity:1" + offset="1" + id="stop8872" /> + </linearGradient> + <linearGradient + inkscape:collect="always" id="linearGradient8860"> <stop style="stop-color:#3b1941;stop-opacity:1;" @@ -138,6 +107,18 @@ id="stop8864" /> </linearGradient> <linearGradient + inkscape:collect="always" + id="linearGradient8848"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop8850" /> + <stop + style="stop-color:#ffffff;stop-opacity:1" + offset="1" + id="stop8852" /> + </linearGradient> + <linearGradient id="linearGradient8820" inkscape:collect="always"> <stop @@ -189,7 +170,7 @@ inkscape:collect="always" id="linearGradient2826"> <stop - style="stop-color:#552b72;stop-opacity:1" + style="stop-color:#3b1941;stop-opacity:1;" offset="0" id="stop2828" /> <stop @@ -205,7 +186,7 @@ offset="0" id="stop2818" /> <stop - style="stop-color:#b077ee;stop-opacity:1" + style="stop-color:#eeeeec;stop-opacity:0;" offset="1" id="stop2820" /> </linearGradient> @@ -217,7 +198,7 @@ offset="0" id="stop6539" /> <stop - style="stop-color:#cce1f9;stop-opacity:1" + style="stop-color:#d3e1f1;stop-opacity:1" offset="1" id="stop6541" /> </linearGradient> @@ -225,7 +206,7 @@ inkscape:collect="always" id="linearGradient6506"> <stop - style="stop-color:#ffffff;stop-opacity:1" + style="stop-color:#ffffff;stop-opacity:0.95477384" offset="0" id="stop6508" /> <stop @@ -233,16 +214,26 @@ offset="1" id="stop6510" /> </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6506" + id="linearGradient6512" + x1="15.645709" + y1="40.668503" + x2="15.645709" + y2="47.022106" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.988192,1.5624997,-2.39645)" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient2816" id="radialGradient2824" - cx="14.914475" - cy="26.467632" - fx="14.914475" - fy="26.467632" + cx="14.930223" + cy="25.801632" + fx="14.930223" + fy="25.801632" r="16.390338" - gradientTransform="matrix(0.6426095,-5.3927465e-3,6.3214714e-3,0.753278,9.3247223,4.0470884)" + gradientTransform="matrix(1.3364897,0,0,1.3894845,-0.759152,-10.711989)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" @@ -251,7 +242,7 @@ x1="13.191773" y1="41.606163" x2="13.191773" - y2="48.688236" + y2="49.067719" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.988192,1.4473537,-2.486208)" /> <linearGradient @@ -266,7 +257,7 @@ gradientTransform="matrix(1,0,0,0.988192,1.4473537,-2.486208)" /> <linearGradient inkscape:collect="always" - xlink:href="#linearGradient9689" + xlink:href="#linearGradient8686" id="linearGradient8692" x1="18.5" y1="29.911009" @@ -314,6 +305,24 @@ y2="30.188351" /> <linearGradient inkscape:collect="always" + xlink:href="#linearGradient8848" + id="linearGradient8854" + x1="10.48653" + y1="25.21174" + x2="9.7512932" + y2="23.675837" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient8848" + id="linearGradient8858" + gradientUnits="userSpaceOnUse" + x1="10.498732" + y1="24.936121" + x2="9.6415968" + y2="23.675837" /> + <linearGradient + inkscape:collect="always" xlink:href="#linearGradient8860" id="linearGradient8866" x1="13.061977" @@ -324,21 +333,31 @@ gradientTransform="matrix(1.50247,0,0,1,-6.5946403,-2.139701)" /> <linearGradient inkscape:collect="always" + xlink:href="#linearGradient8868" + id="linearGradient8874" + x1="12.409452" + y1="10.602999" + x2="16.140554" + y2="13.895189" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.236264,0,0,0.549587,-5.4828863,3.775206)" /> + <linearGradient + inkscape:collect="always" xlink:href="#linearGradient8876" id="linearGradient8882" x1="10.46875" - y1="26.726713" - x2="9.7964153" - y2="19.333946" + y1="25.3125" + x2="9.53125" + y2="19.6875" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient8884" id="linearGradient8890" - x1="24.973602" - y1="24.961956" + x1="23.881994" + y1="24.343237" x2="24.973602" - y2="18.863159" + y2="19.216713" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" @@ -377,323 +396,6 @@ y1="4.8871226" x2="30.5" y2="22.781603" /> - <inkscape:perspective - id="perspective7946" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_x="0 : 526.18109 : 1" - sodipodi:type="inkscape:persp3d" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient8860" - id="radialGradient8780" - cx="12.809438" - cy="7.5702162" - fx="12.809438" - fy="7.5702162" - r="5.140625" - gradientTransform="matrix(1,0,0,0.4138305,0,5.4390103)" - gradientUnits="userSpaceOnUse" /> - <radialGradient - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.4138305,0,5.4390103)" - r="5.140625" - fy="7.5702162" - fx="12.809438" - cy="7.5702162" - cx="12.809438" - id="radialGradient9297" - xlink:href="#linearGradient8860" - inkscape:collect="always" /> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - id="perspective9295" /> - <linearGradient - y2="22.781603" - x2="30.5" - y1="4.8871226" - x1="30.5" - gradientUnits="userSpaceOnUse" - id="linearGradient9293" - xlink:href="#linearGradient6537" - inkscape:collect="always" /> - <linearGradient - gradientTransform="matrix(-1,0,0,1,37.022732,0)" - y2="43.352409" - x2="4.0852318" - y1="40.416641" - x1="4.0852318" - gradientUnits="userSpaceOnUse" - id="linearGradient9291" - xlink:href="#linearGradient8732" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="44.321774" - x2="4.0852318" - y1="39.097038" - x1="4.0852318" - id="linearGradient9289" - xlink:href="#linearGradient8744" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="33.678783" - x2="41.875" - y1="1.8037834" - x1="26.125" - id="linearGradient9287" - xlink:href="#linearGradient8904" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="18.863159" - x2="24.973602" - y1="24.961956" - x1="24.973602" - id="linearGradient9285" - xlink:href="#linearGradient8884" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="19.333946" - x2="9.7964153" - y1="26.726713" - x1="10.46875" - id="linearGradient9283" - xlink:href="#linearGradient8876" - inkscape:collect="always" /> - <linearGradient - gradientTransform="matrix(1.50247,0,0,1,-6.5946403,-2.139701)" - gradientUnits="userSpaceOnUse" - y2="12.891665" - x2="16.545418" - y1="10.027351" - x1="13.061977" - id="linearGradient9281" - xlink:href="#linearGradient8860" - inkscape:collect="always" /> - <linearGradient - y2="23.675837" - x2="9.6415968" - y1="24.936121" - x1="10.498732" - gradientUnits="userSpaceOnUse" - id="linearGradient8858" - xlink:href="#linearGradient8848" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="23.675837" - x2="9.7512932" - y1="25.21174" - x1="10.48653" - id="linearGradient8854" - xlink:href="#linearGradient8848" - inkscape:collect="always" /> - <linearGradient - y2="30.188351" - x2="18.143806" - y1="29.494703" - x1="17.969458" - gradientUnits="userSpaceOnUse" - id="linearGradient9277" - xlink:href="#linearGradient8808" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="30.431053" - x2="18.031723" - y1="29.338558" - x1="18.339697" - id="linearGradient9275" - xlink:href="#linearGradient8820" - inkscape:collect="always" /> - <linearGradient - gradientTransform="matrix(1.0769231,0,0,1.1428571,-0.905101,-4.6800586)" - gradientUnits="userSpaceOnUse" - y2="29.853554" - x2="19.985121" - y1="29.911009" - x1="18.5" - id="linearGradient9265" - xlink:href="#linearGradient8686" - inkscape:collect="always" /> - <linearGradient - gradientTransform="matrix(1,0,0,0.988192,1.4473537,-2.486208)" - gradientUnits="userSpaceOnUse" - y2="47.757988" - x2="11.373499" - y1="43.444576" - x1="11.373499" - id="linearGradient9263" - xlink:href="#linearGradient2834" - inkscape:collect="always" /> - <linearGradient - gradientTransform="matrix(1,0,0,0.988192,1.4473537,-2.486208)" - gradientUnits="userSpaceOnUse" - y2="49.067719" - x2="13.191773" - y1="41.606163" - x1="13.191773" - id="linearGradient9261" - xlink:href="#linearGradient2826" - inkscape:collect="always" /> - <radialGradient - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.6426095,-5.3927465e-3,6.3214714e-3,0.753278,9.3247223,4.0470884)" - r="16.390338" - fy="26.467632" - fx="14.914475" - cy="26.467632" - cx="14.914475" - id="radialGradient9259" - xlink:href="#linearGradient2816" - inkscape:collect="always" /> - <linearGradient - gradientTransform="matrix(1,0,0,0.988192,1.5624997,-2.39645)" - gradientUnits="userSpaceOnUse" - y2="47.022106" - x2="15.645709" - y1="40.668503" - x1="15.645709" - id="linearGradient9257" - xlink:href="#linearGradient6506" - inkscape:collect="always" /> - <linearGradient - id="linearGradient8848" - inkscape:collect="always"> - <stop - id="stop8850" - offset="0" - style="stop-color:#000000;stop-opacity:1;" /> - <stop - id="stop8852" - offset="1" - style="stop-color:#ffffff;stop-opacity:1" /> - </linearGradient> - <inkscape:perspective - id="perspective9168" - inkscape:persp3d-origin="24 : 16 : 1" - inkscape:vp_z="48 : 24 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_x="0 : 24 : 1" - sodipodi:type="inkscape:persp3d" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient8860" - id="radialGradient9363" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.4138305,0,5.4390103)" - cx="12.809438" - cy="7.5702162" - fx="12.809438" - fy="7.5702162" - r="5.140625" /> - <linearGradient - gradientTransform="matrix(0.6875001,0,0,0.6767003,-0.4687499,-0.5159997)" - y2="37.801281" - x2="42.829762" - y1="6.8962817" - x1="29.466667" - gradientUnits="userSpaceOnUse" - id="linearGradient8280" - xlink:href="#linearGradient8904" - inkscape:collect="always" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8820" - id="linearGradient9520" - x1="18.097515" - y1="29.72571" - x2="18.031723" - y2="30.431053" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8808" - id="linearGradient9518" - gradientUnits="userSpaceOnUse" - x1="18.097515" - y1="29.72571" - x2="18.143806" - y2="30.188351" /> - <inkscape:perspective - id="perspective9485" - inkscape:persp3d-origin="16 : 10.666667 : 1" - inkscape:vp_z="32 : 16 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_x="0 : 16 : 1" - sodipodi:type="inkscape:persp3d" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6506" - id="linearGradient9651" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.988192,1.5624997,-2.39645)" - x1="24.027578" - y1="2.4785707" - x2="16.983839" - y2="70.046394" /> - <filter - inkscape:collect="always" - id="filter9685" - x="-0.29886015" - width="1.5977203" - y="-0.49649348" - height="1.992987"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="1.1336762" - id="feGaussianBlur9687" /> - </filter> - <filter - inkscape:collect="always" - id="filter9811" - x="-0.81284236" - width="2.6256847" - y="-0.52522121" - height="2.0504424"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="1.2573014" - id="feGaussianBlur9813" /> - </filter> - <filter - inkscape:collect="always" - id="filter9889" - x="-0.24442129" - width="1.4888426" - y="-0.20170113" - height="1.4034023"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.4272566" - id="feGaussianBlur9891" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9893" - id="linearGradient9899" - x1="17.854447" - y1="23.295456" - x2="21.566757" - y2="23.295456" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient9905" - id="linearGradient9911" - x1="5.90625" - y1="23" - x2="11.291513" - y2="20.405081" - gradientUnits="userSpaceOnUse" /> </defs> <sodipodi:namedview id="base" @@ -702,16 +404,16 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="5.6568543" - inkscape:cx="73.497233" - inkscape:cy="20.402636" + inkscape:zoom="2.828427" + inkscape:cx="63.722923" + inkscape:cy="33.120105" inkscape:current-layer="layer1" - showgrid="false" + showgrid="true" inkscape:grid-bbox="true" inkscape:document-units="px" - inkscape:window-width="1440" - inkscape:window-height="848" - inkscape:window-x="0" + inkscape:window-width="1434" + inkscape:window-height="840" + inkscape:window-x="-2" inkscape:window-y="0" showguides="true" inkscape:guide-bbox="true" @@ -761,39 +463,25 @@ rx="0.81387848" ry="0.93014681" /> <path - style="fill:url(#radialGradient8780);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 12.75 7.15625 C 12.115339 7.1849256 11.504585 7.3489361 10.96875 7.6875 C 10.96875 7.6875 14.502372 8.292676 15.15625 10.1875 C 13.96441 9.115271 10.258623 8.3895059 8.90625 9.9375 C 8.90625 9.9375 12.96534 9.7931625 11.75 11.40625 L 15.53125 10.875 C 15.53125 10.837265 15.507609 10.787801 15.5 10.75 L 19.1875 10.75 C 18.766317 9.4043172 15.500198 7.0319893 12.75 7.15625 z " - id="rect5189" /> + style="fill:url(#linearGradient8866);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 10.968089,7.6821669 C 13.825874,5.8764931 18.683474,9.095739 19.201853,10.751964 L 15.25649,10.751964 C 15.19399,8.408214 10.968089,7.6821669 10.968089,7.6821669 z" + id="rect5189" + sodipodi:nodetypes="cccc" /> + <path + style="fill:url(#linearGradient8874);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 8.9209727,9.9271812 C 10.543462,8.0699992 15.5336,9.5097671 15.5336,10.860297 L 11.743475,11.411821 C 12.958815,9.7987339 8.9209727,9.9271812 8.9209727,9.9271812 z" + id="path5192" + sodipodi:nodetypes="cccc" /> <path style="opacity:1;fill:url(#linearGradient2840);fill-opacity:1;stroke:url(#linearGradient2832);stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 16.447354,10.481822 C 9.8233516,10.481822 3.9308558,15.93012 4.5098537,22.712688 C 5.7768579,37.554787 1.9403503,35.543378 1.5,42.316391 C 1.5,44.375904 2.4854201,45.355587 4.5920502,45.355587 C 5.7795388,45.355587 30.807389,45.5 33.498388,45.5 C 35.612515,45.5 35.447354,43.46472 35.447354,43.46472 C 35.447354,40.830782 29.045256,38.620654 27.260807,36.687231 C 25.432389,34.709838 27.447354,27.653648 27.447354,27.653648 C 28.08866,26.141912 28.447354,24.466812 28.447354,22.712688 C 28.447354,15.894164 23.071356,10.481822 16.447354,10.481822 z" id="path5176" sodipodi:nodetypes="cscccszcsc" /> <path - style="opacity:0.55000000000000004;fill:url(#radialGradient2824);fill-opacity:1;stroke:url(#linearGradient9651);stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-opacity:1" - d="M 16.25,11.5 C 10.237704,11.5 5.0276636,16.611038 5.4999997,22.834065 C 5.5006447,22.842563 5.5012886,22.851054 5.5019315,22.85954 C 6.063858,30.276194 5.8154539,32.826976 4.0236672,37.541192 C 1.1437418,42.286379 3.1235207,44.533069 5.4658637,44.533069 C 7.4024447,44.533069 25.520621,44.503627 31.346594,44.503627 C 32.513801,44.503627 34.5,45.001748 34.5,43.554478 C 34.5,43.335354 34.300249,42.923343 33.75,42.411881 C 33.199751,41.90042 32.37676,41.351214 31.46875,40.806069 C 30.56074,40.260924 29.59071,39.709456 28.71875,39.169376 C 27.84679,38.629297 27.074154,38.125147 26.53125,37.409159 C 25.921245,36.604678 25.641306,35.658991 25.586842,34.629869 C 25.532378,33.600747 25.670221,32.49665 25.787061,31.449126 C 26.020741,29.354077 26.53125,27.527239 26.53125,27.527239 C 26.54624,27.4637 26.567163,27.401673 26.59375,27.341953 C 27.181231,25.957097 27.5,24.414481 27.5,22.802446 C 27.5,16.531779 22.272436,11.5 16.25,11.5 z" + style="opacity:0.55000000000000004;fill:url(#radialGradient2824);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-opacity:1" + d="M 16.25,11.5 C 10.237704,11.5 5.0276636,16.611038 5.4999997,22.834065 C 6.0644244,30.27036 5.8175038,32.821583 4.0236672,37.541192 C 1.1437418,42.286379 3.1235207,44.533069 5.4658637,44.533069 C 7.4024447,44.533069 25.520621,44.503627 31.346594,44.503627 C 32.513801,44.503627 34.5,45.001748 34.5,43.554478 C 34.5,43.335354 34.300249,42.923343 33.75,42.411881 C 33.199751,41.90042 32.37676,41.351214 31.46875,40.806069 C 30.56074,40.260924 29.59071,39.709456 28.71875,39.169376 C 27.84679,38.629297 27.074154,38.125147 26.53125,37.409159 C 25.921245,36.604678 25.641306,35.658991 25.586842,34.629869 C 25.532378,33.600747 25.670221,32.49665 25.787061,31.449126 C 26.020741,29.354077 26.53125,27.527239 26.53125,27.527239 C 26.54624,27.4637 26.567163,27.401673 26.59375,27.341953 C 27.181231,25.957097 27.5,24.414481 27.5,22.802446 C 27.5,16.531779 22.272436,11.5 16.25,11.5 z" id="path5241" - sodipodi:nodetypes="csscccssssssscssc" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:#b87bf7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9685);enable-background:accumulate" - id="path8782" - sodipodi:cx="18.075417" - sodipodi:cy="17.064077" - sodipodi:rx="4.552" - sodipodi:ry="2.7400389" - d="M 22.627417,17.064077 A 4.552,2.7400389 0 1 1 13.523417,17.064077 A 4.552,2.7400389 0 1 1 22.627417,17.064077 z" - transform="matrix(1.1235721,0,0,1.2773541,-2.423533,-4.2968681)" /> - <path - sodipodi:type="arc" - style="opacity:0.25;fill:url(#linearGradient9899);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9889);enable-background:accumulate" - id="path9815" - sodipodi:cx="19.710602" - sodipodi:cy="23.295456" - sodipodi:rx="1.8561553" - sodipodi:ry="2.8726213" - d="M 21.566757,23.295456 A 1.8561553,2.8726213 0 1 1 17.854447,23.295456 A 1.8561553,2.8726213 0 1 1 21.566757,23.295456 z" - transform="matrix(8.4928046e-8,4.9721706,2.9846154,0,-50.922233,-71.70382)" /> + sodipodi:nodetypes="cscccssssssscssc" /> <path sodipodi:type="inkscape:offset" inkscape:radius="1.0174263" @@ -801,7 +489,7 @@ style="opacity:1;fill:url(#linearGradient8882);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" id="path8838" d="M 9.96875,17.96875 C 8.6328774,17.96875 7.5286409,18.753017 6.875,19.71875 C 6.2213591,20.684483 5.9062499,21.848884 5.90625,23 C 5.90625,25.694817 7.8977844,28.03125 10.46875,28.03125 C 11.539674,28.03125 12.596335,27.527372 13.46875,26.71875 C 14.341165,25.910128 15.03125,24.709464 15.03125,23.28125 C 15.03125,22.003744 14.362496,20.808851 13.46875,19.8125 C 12.575004,18.816149 11.384009,17.96875 9.96875,17.96875 z" - transform="translate(1.09375,-0.9687531)" /> + transform="translate(1.09375,-0.96875)" /> <path style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" d="M 15.09375,22.321339 C 15.09375,24.52934 12.987869,26.03125 11.567428,26.03125 C 9.6208995,26.03125 8.0411075,24.239249 8.0411075,22.031249 C 8.0411075,20.112462 9.1240375,18.03125 11.070566,18.03125 C 13.017097,18.03125 15.09375,20.576941 15.09375,22.321339 z" @@ -819,7 +507,7 @@ transform="matrix(1.237779,0,0,1.544828,-1.0301916,-15.38768)" /> <path sodipodi:type="arc" - style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + style="opacity:1;fill:url(#linearGradient8854);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path5164" sodipodi:cx="10.169642" sodipodi:cy="24.3125" @@ -834,10 +522,10 @@ style="opacity:1;fill:url(#linearGradient8890);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" id="path8846" d="M 24.6875,17.96875 C 23.636213,18.009185 22.683031,18.409233 22.03125,19.125 C 20.466122,20.843786 20.678782,23.580894 22.3125,25.375 C 23.011072,26.142154 23.917332,26.724837 24.9375,26.9375 C 25.957668,27.150163 27.151401,26.89759 27.96875,26 C 28.842555,25.04041 29.039766,23.753975 28.96875,22.53125 C 28.897734,21.308525 28.565932,20.111716 27.78125,19.25 C 26.906665,18.289553 25.728905,17.928695 24.6875,17.96875 z" - transform="translate(1.0348213,-0.9657741)" /> + transform="translate(1.0348213,-0.9657729)" /> <path style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 28.088692,18.950685 C 26.78423,17.518158 24.662074,17.899807 23.829158,18.814492 C 22.687755,20.067952 22.820093,22.247881 24.124557,23.680409 C 25.258155,24.925297 27.122721,25.578218 28.264124,24.32476 C 29.405528,23.0713 29.119266,20.082432 28.088692,18.950685 z" + d="M 28.07086,18.984912 C 26.766398,17.552385 24.644242,17.934034 23.811326,18.848719 C 22.669923,20.102179 22.802261,22.282108 24.106725,23.714636 C 25.240323,24.959524 27.104889,25.612445 28.246292,24.358987 C 29.387696,23.105527 29.101434,20.116659 28.07086,18.984912 z" id="path5169" sodipodi:nodetypes="csssc" /> <path @@ -857,25 +545,15 @@ id="path8696" sodipodi:nodetypes="cssscccsccccsssc" /> <path - sodipodi:type="arc" - style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9811);enable-background:accumulate" - id="path9701" - sodipodi:cx="19.710602" - sodipodi:cy="23.295456" - sodipodi:rx="1.8561553" - sodipodi:ry="2.8726213" - d="M 21.566757,23.295456 A 1.8561553,2.8726213 0 1 1 17.854447,23.295456 A 1.8561553,2.8726213 0 1 1 21.566757,23.295456 z" - transform="matrix(1.6864563,0,0,1.5538462,-14.149186,-11.929827)" /> - <path sodipodi:type="inkscape:offset" inkscape:radius="0.36336106" inkscape:original="M 15.8125 27 C 15.361611 27 15 27.422198 15 27.9375 C 15 28.452801 15.361612 28.874999 15.8125 28.875 L 21.1875 28.875 C 21.638389 28.875 22 28.452801 22 27.9375 C 22 27.422199 21.638389 27 21.1875 27 L 15.8125 27 z " style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter8792)" id="path8738" d="M 15.8125,26.625 C 15.134785,26.625 14.625,27.252207 14.625,27.9375 C 14.625,28.622793 15.134785,29.249998 15.8125,29.25 L 21.1875,29.25 C 21.865216,29.25 22.375,28.622793 22.375,27.9375 C 22.375,27.252207 21.865216,26.625 21.1875,26.625 L 15.8125,26.625 z" - transform="matrix(1.0403226,0,0,1.1666667,0.1470082,-5.4657729)" /> + transform="translate(1.0492259,-0.5907729)" /> <rect - style="opacity:1;fill:#f8eaba;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="rect5215" width="7" height="1.8602936" @@ -890,27 +568,27 @@ sodipodi:nodetypes="czccc" /> <path sodipodi:type="arc" - style="opacity:1;fill:url(#linearGradient8814);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + style="opacity:0.61111109;fill:url(#linearGradient8814);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="path8806" sodipodi:cx="18.097515" sodipodi:cy="29.72571" sodipodi:rx="0.28726214" sodipodi:ry="0.6408155" d="M 18.384777,29.72571 A 0.28726214,0.6408155 0 1 1 17.810253,29.72571 A 0.28726214,0.6408155 0 1 1 18.384777,29.72571 z" - transform="matrix(-1.0945752,0.9356227,0.6067766,1.5209514,23.272227,-33.155044)" /> + transform="matrix(-1.0945752,0.9356227,0.6067766,1.5209514,23.290203,-33.120817)" /> <path sodipodi:type="arc" - style="opacity:1;fill:url(#linearGradient8818);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" + style="opacity:0.61111109;fill:url(#linearGradient8818);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="path8816" sodipodi:cx="18.097515" sodipodi:cy="29.72571" sodipodi:rx="0.28726214" sodipodi:ry="0.6408155" d="M 18.384777,29.72571 A 0.28726214,0.6408155 0 1 1 17.810253,29.72571 A 0.28726214,0.6408155 0 1 1 18.384777,29.72571 z" - transform="matrix(1.0945741,0.9356227,-0.606776,1.5209514,16.727776,-33.132569)" /> + transform="matrix(1.0945741,0.9356227,-0.606776,1.5209514,16.745752,-33.098342)" /> <path sodipodi:type="arc" - style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + style="opacity:1;fill:url(#linearGradient8858);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path8856" sodipodi:cx="10.169642" sodipodi:cy="24.3125" @@ -928,38 +606,5 @@ d="M 33.647731,44.9375 C 35.272732,44.5625 36.772732,42.5625 28.772731,38.5625 C 29.124668,42.695473 26.022731,44.375 26.022731,44.375 L 33.647731,44.9375 z" id="path8740" sodipodi:nodetypes="cccc" /> - <image - y="-12" - x="50" - id="image7948" - height="69.54084" - width="69.54084" - sodipodi:absref="/home/hbons/Bureaublad/pidgin-oxygen.png" - xlink:href="/home/hbons/Bureaublad/pidgin-oxygen.png" /> - <path - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.55" - d="M 19.999895,26.990381 C 20.503282,27.702861 21.154686,31.031198 21.018582,33.998949 C 19.248555,31.850235 20.467226,29.772496 19.999895,26.990381 z" - id="rect9034" - sodipodi:nodetypes="ccc" /> - <path - sodipodi:type="arc" - style="opacity:0.7;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path9045" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(0.4028774,0,0,0.3862069,7.4028807,12.110344)" /> - <path - sodipodi:type="arc" - style="opacity:0.7;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path9047" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(0.4028775,0,0,0.3862069,21.40288,12.110344)" /> </g> </svg>
--- a/po/POTFILES.in Sat Sep 13 16:13:48 2008 +0000 +++ b/po/POTFILES.in Tue Sep 16 20:01:24 2008 +0000 @@ -183,6 +183,8 @@ libpurple/util.c libpurple/win32/libc_interface.c pidgin.desktop.in +pidgin/artwork/hicolor/24x24/emotes/default.theme.in +pidgin/artwork/hicolor/24x24/emotes/none/none.theme.in pidgin/eggtrayicon.c pidgin/gtkaccount.c pidgin/gtkblist.c @@ -214,6 +216,7 @@ pidgin/gtkwhiteboard.c pidgin/pidgin.h pidgin/pidgincombobox.c +pidgin/pidginstock-artwork.c pidgin/pidginstock.c pidgin/pidgintooltip.c pidgin/pixmaps/emotes/default/24/default.theme.in