Mercurial > pidgin.yaz
comparison libpurple/protocols/msnp9/object.c @ 23161:25161f5ea347
propagate from branch 'im.pidgin.pidgin' (head 4f00ea617df3c000b6eb237b4139b89e5d8170a3)
to branch 'im.pidgin.pidgin.next.minor' (head c2457daceab155be8fb8b11753c4e767c2c1a83c)
author | Evan Schoenberg <evan.s@dreskin.net> |
---|---|
date | Wed, 21 May 2008 02:09:00 +0000 |
parents | 981a0bfc3d9d |
children |
comparison
equal
deleted
inserted
replaced
23083:69796bbe7a6d | 23161:25161f5ea347 |
---|---|
21 * along with this program; if not, write to the Free Software | 21 * along with this program; if not, write to the Free Software |
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA | 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
23 */ | 23 */ |
24 #include "object.h" | 24 #include "object.h" |
25 #include "debug.h" | 25 #include "debug.h" |
26 /* Sha1 stuff */ | |
27 #include "cipher.h" | |
28 /* Base64 stuff */ | |
29 #include "util.h" | |
26 | 30 |
27 #define GET_STRING_TAG(field, id) \ | 31 #define GET_STRING_TAG(field, id) \ |
28 if ((tag = strstr(str, id "=\"")) != NULL) \ | 32 if ((tag = strstr(str, id "=\"")) != NULL) \ |
29 { \ | 33 { \ |
30 tag += strlen(id "=\""); \ | 34 tag += strlen(id "=\""); \ |
102 } | 106 } |
103 | 107 |
104 return obj; | 108 return obj; |
105 } | 109 } |
106 | 110 |
111 MsnObject* | |
112 msn_object_new_from_image(PurpleStoredImage *img, const char *location, | |
113 const char *creator, MsnObjectType type) | |
114 { | |
115 MsnObject *msnobj; | |
116 | |
117 PurpleCipherContext *ctx; | |
118 char *buf; | |
119 gconstpointer data; | |
120 size_t size; | |
121 char *base64; | |
122 unsigned char digest[20]; | |
123 | |
124 msnobj = NULL; | |
125 | |
126 if (img == NULL) | |
127 return msnobj; | |
128 | |
129 size = purple_imgstore_get_size(img); | |
130 data = purple_imgstore_get_data(img); | |
131 | |
132 /* New object */ | |
133 msnobj = msn_object_new(); | |
134 msn_object_set_local(msnobj); | |
135 msn_object_set_type(msnobj, type); | |
136 msn_object_set_location(msnobj, location); | |
137 msn_object_set_creator(msnobj, creator); | |
138 | |
139 msn_object_set_image(msnobj, img); | |
140 | |
141 /* Compute the SHA1D field. */ | |
142 memset(digest, 0, sizeof(digest)); | |
143 | |
144 ctx = purple_cipher_context_new_by_name("sha1", NULL); | |
145 purple_cipher_context_append(ctx, data, size); | |
146 purple_cipher_context_digest(ctx, sizeof(digest), digest, NULL); | |
147 | |
148 base64 = purple_base64_encode(digest, sizeof(digest)); | |
149 msn_object_set_sha1d(msnobj, base64); | |
150 g_free(base64); | |
151 | |
152 msn_object_set_size(msnobj, size); | |
153 | |
154 /* Compute the SHA1C field. */ | |
155 buf = g_strdup_printf( | |
156 "Creator%sSize%dType%dLocation%sFriendly%sSHA1D%s", | |
157 msn_object_get_creator(msnobj), | |
158 msn_object_get_size(msnobj), | |
159 msn_object_get_type(msnobj), | |
160 msn_object_get_location(msnobj), | |
161 msn_object_get_friendly(msnobj), | |
162 msn_object_get_sha1d(msnobj)); | |
163 | |
164 memset(digest, 0, sizeof(digest)); | |
165 | |
166 purple_cipher_context_reset(ctx, NULL); | |
167 purple_cipher_context_append(ctx, (const guchar *)buf, strlen(buf)); | |
168 purple_cipher_context_digest(ctx, sizeof(digest), digest, NULL); | |
169 purple_cipher_context_destroy(ctx); | |
170 g_free(buf); | |
171 | |
172 base64 = purple_base64_encode(digest, sizeof(digest)); | |
173 msn_object_set_sha1c(msnobj, base64); | |
174 g_free(base64); | |
175 | |
176 return msnobj; | |
177 } | |
178 | |
107 void | 179 void |
108 msn_object_destroy(MsnObject *obj) | 180 msn_object_destroy(MsnObject *obj) |
109 { | 181 { |
110 g_return_if_fail(obj != NULL); | 182 g_return_if_fail(obj != NULL); |
111 | 183 |