3 * Laconica - a distributed open-source microblogging tool
4 * Copyright (C) 2008, Controlez-Vous, Inc.
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Affero General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Affero General Public License for more details.
16 * You should have received a copy of the GNU Affero General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 if (!defined('LACONICA')) { exit(1); }
22 require_once(INSTALLDIR.'/lib/settingsaction.php');
24 class AvatarAction extends SettingsAction {
26 function show_form($msg=NULL, $success=false) {
27 common_show_header(_t('Avatar'));
28 $this->settings_menu();
29 $this->message($msg, $success);
31 $user = common_current_user();
32 $profile = $user->getProfile();
33 $original = $profile->getOriginal();
36 common_element('img', array('src' => $original->url,
37 'class' => 'avatar original',
38 'width' => $original->width,
39 'height' => $original->height,
40 'alt' => $user->nickname));
43 $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
46 common_element('img', array('src' => $avatar->url,
47 'class' => 'avatar profile',
48 'width' => AVATAR_PROFILE_SIZE,
49 'height' => AVATAR_PROFILE_SIZE,
50 'alt' => $user->nickname));
53 common_element_start('form', array('enctype' => 'multipart/form-data',
57 common_local_url('avatar')));
58 common_element('input', array('name' => 'MAX_FILE_SIZE',
60 'id' => 'MAX_FILE_SIZE',
61 'value' => MAX_AVATAR_SIZE));
62 common_element('input', array('name' => 'avatarfile',
64 'id' => 'avatarfile'));
65 common_element('input', array('name' => 'submit',
68 'value' =>_t('Upload')));
69 common_element_end('form');
73 function handle_post() {
75 switch ($_FILES['avatarfile']['error']) {
76 case UPLOAD_ERR_OK: # success, jump out
78 case UPLOAD_ERR_INI_SIZE:
79 case UPLOAD_ERR_FORM_SIZE:
80 $this->show_form(_t('That file is too big.'));
82 case UPLOAD_ERR_PARTIAL:
83 @unlink($_FILES['avatarfile']['tmp_name']);
84 $this->show_form(_t('Partial upload.'));
87 $this->show_form(_t('System error uploading file.'));
91 $info = @getimagesize($_FILES['avatarfile']['tmp_name']);
94 @unlink($_FILES['avatarfile']['tmp_name']);
95 $this->show_form(_t('Not an image or corrupt file.'));
105 $this->show_form(_t('Unsupported image file format.'));
109 $user = common_current_user();
111 $filename = common_avatar_filename($user, image_type_to_extension($info[2]));
112 $filepath = common_avatar_path($filename);
114 if (!move_uploaded_file($_FILES['avatarfile']['tmp_name'], $filepath)) {
115 @unlink($_FILES['avatarfile']['tmp_name']);
116 $this->show_form(_t('System error uploading file.'));
120 $avatar = DB_DataObject::factory('avatar');
122 $avatar->profile_id = $user->id;
123 $avatar->width = $info[0];
124 $avatar->height = $info[1];
125 $avatar->mediatype = image_type_to_mime_type($info[2]);
126 $avatar->filename = $filename;
127 $avatar->original = true;
128 $avatar->url = common_avatar_url($filename);
129 $avatar->created = DB_DataObject_Cast::dateTime(); # current time
131 foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
132 $scaled[] = $this->scale_avatar($user, $avatar, $size);
135 # XXX: start a transaction here
137 if (!$this->delete_old_avatars($user)) {
139 common_server_error(_t('Error deleting old avatars.'));
143 if (!$avatar->insert()) {
145 common_server_error(_t('Error inserting avatar.'));
149 foreach ($scaled as $s) {
151 common_server_error(_t('Error inserting scaled avatar.'));
156 # XXX: end transaction here
158 $this->show_form(_t('Avatar updated.'), true);
161 function scale_avatar($user, $avatar, $size) {
162 $image_s = imagecreatetruecolor($size, $size);
163 $image_a = $this->avatar_to_image($avatar);
165 $square = min($avatar->width, $avatar->height);
167 imagecopyresampled($image_s, $image_a, 0, 0, 0, 0,
168 $size, $size, $square, $square);
170 $ext = ($avatar->mediattype == 'image/jpeg') ? ".jpg" : ".png";
172 $filename = common_avatar_filename($user, $ext, $size);
174 if ($avatar->mediatype == 'image/jpeg') {
175 imagejpeg($image_s, common_avatar_path($filename));
177 imagepng($image_s, common_avatar_path($filename));
180 $scaled = DB_DataObject::factory('avatar');
181 $scaled->profile_id = $avatar->profile_id;
182 $scaled->width = $size;
183 $scaled->height = $size;
184 $scaled->original = false;
185 $scaled->mediatype = ($avatar->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png';
186 $scaled->filename = $filename;
187 $scaled->url = common_avatar_url($filename);
188 $scaled->created = DB_DataObject_Cast::dateTime(); # current time
193 function avatar_to_image($avatar) {
194 $filepath = common_avatar_path($avatar->filename);
195 if ($avatar->mediatype == 'image/gif') {
196 return imagecreatefromgif($filepath);
197 } else if ($avatar->mediatype == 'image/jpeg') {
198 return imagecreatefromjpeg($filepath);
199 } else if ($avatar->mediatype == 'image/png') {
200 return imagecreatefrompng($filepath);
202 common_server_error(_t('Unsupported image type:') . $avatar->mediatype);
207 function delete_old_avatars($user) {
208 $avatar = DB_DataObject::factory('avatar');
209 $avatar->profile_id = $user->id;
211 while ($avatar->fetch()) {
212 unlink(common_avatar_path($avatar->filename));