summaryrefslogtreecommitdiff
path: root/classes
diff options
context:
space:
mode:
authorEvan Prodromou <evan@controlyourself.ca>2009-02-06 15:38:10 -0500
committerEvan Prodromou <evan@controlyourself.ca>2009-02-06 15:38:10 -0500
commit02d7167906b63d490db3b5c3848accc5235b220f (patch)
tree92323dec8d456fdc737ee3a74c48dedf4cb92bcd /classes
parentd260d841ebae71acf7bf726f52acaa6391ce1824 (diff)
parent60f737dc1eb2f126bae28ce095bc2d17a22bd7d9 (diff)
Merge branch '0.7.x' into 0.8.x
Diffstat (limited to 'classes')
-rw-r--r--classes/Avatar.php118
-rw-r--r--classes/Channel.php93
-rw-r--r--classes/Profile.php78
-rw-r--r--classes/User.php11
-rwxr-xr-xclasses/User_group.php79
5 files changed, 130 insertions, 249 deletions
diff --git a/classes/Avatar.php b/classes/Avatar.php
index 9ae920647..db9d78e47 100644
--- a/classes/Avatar.php
+++ b/classes/Avatar.php
@@ -4,18 +4,18 @@
*/
require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
-class Avatar extends Memcached_DataObject
+class Avatar extends Memcached_DataObject
{
###START_AUTOCODE
/* the code below is auto generated do not remove the above tag */
public $__table = 'avatar'; // table name
public $profile_id; // int(4) primary_key not_null
- public $original; // tinyint(1)
+ public $original; // tinyint(1)
public $width; // int(4) primary_key not_null
public $height; // int(4) primary_key not_null
public $mediatype; // varchar(32) not_null
- public $filename; // varchar(255)
+ public $filename; // varchar(255)
public $url; // varchar(255) unique_key
public $created; // datetime() not_null
public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP
@@ -33,109 +33,51 @@ class Avatar extends Memcached_DataObject
{
$filename = $this->filename;
if (parent::delete()) {
- @unlink(common_avatar_path($filename));
+ @unlink(Avatar::path($filename));
}
}
- # Create and save scaled version of this avatar
- # XXX: maybe break into different methods
-
- function scale($size)
+ function &pkeyGet($kv)
{
+ return Memcached_DataObject::pkeyGet('Avatar', $kv);
+ }
- $image_s = imagecreatetruecolor($size, $size);
- $image_a = $this->to_image();
- $square = min($this->width, $this->height);
- imagecolortransparent($image_s, imagecolorallocate($image_s, 0, 0, 0));
- imagealphablending($image_s, false);
- imagesavealpha($image_s, true);
- imagecopyresampled($image_s, $image_a, 0, 0, 0, 0,
- $size, $size, $square, $square);
-
- $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png";
-
- $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp());
-
- if ($this->mediatype == 'image/jpeg') {
- imagejpeg($image_s, common_avatar_path($filename));
- } else {
- imagepng($image_s, common_avatar_path($filename));
- }
-
- $scaled = DB_DataObject::factory('avatar');
- $scaled->profile_id = $this->profile_id;
- $scaled->width = $size;
- $scaled->height = $size;
- $scaled->original = false;
- $scaled->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png';
- $scaled->filename = $filename;
- $scaled->url = common_avatar_url($filename);
- $scaled->created = DB_DataObject_Cast::dateTime(); # current time
+ // where should the avatar go for this user?
- if ($scaled->insert()) {
- return $scaled;
+ static function filename($id, $extension, $size=null, $extra=null)
+ {
+ if ($size) {
+ return $id . '-' . $size . (($extra) ? ('-' . $extra) : '') . $extension;
} else {
- return null;
+ return $id . '-original' . (($extra) ? ('-' . $extra) : '') . $extension;
}
}
- function scale_and_crop($size, $x, $y, $w, $h)
+ static function path($filename)
{
+ return INSTALLDIR . '/avatar/' . $filename;
+ }
- $image_s = imagecreatetruecolor($size, $size);
- $image_a = $this->to_image();
-
- # Retain alpha channel info if possible for .pngs
- $background = imagecolorallocate($image_s, 0, 0, 0);
- ImageColorTransparent($image_s, $background);
- imagealphablending($image_s, false);
-
- imagecopyresized($image_s, $image_a, 0, 0, $x, $y, $size, $size, $w, $h);
-
- $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png";
-
- $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp());
-
- if ($this->mediatype == 'image/jpeg') {
- imagejpeg($image_s, common_avatar_path($filename));
- } else {
- imagepng($image_s, common_avatar_path($filename));
- }
-
- $cropped = DB_DataObject::factory('avatar');
- $cropped->profile_id = $this->profile_id;
- $cropped->width = $size;
- $cropped->height = $size;
- $cropped->original = false;
- $cropped->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png';
- $cropped->filename = $filename;
- $cropped->url = common_avatar_url($filename);
- $cropped->created = DB_DataObject_Cast::dateTime(); # current time
-
- if ($cropped->insert()) {
- return $cropped;
- } else {
- return NULL;
- }
+ static function url($filename)
+ {
+ return common_path('avatar/'.$filename);
}
- function to_image()
+ function displayUrl()
{
- $filepath = common_avatar_path($this->filename);
- if ($this->mediatype == 'image/gif') {
- return imagecreatefromgif($filepath);
- } else if ($this->mediatype == 'image/jpeg') {
- return imagecreatefromjpeg($filepath);
- } else if ($this->mediatype == 'image/png') {
- return imagecreatefrompng($filepath);
+ $server = common_config('avatar', 'server');
+ if ($server) {
+ return 'http://'.$server.'/'.$this->filename;
} else {
- return NULL;
+ return $this->url;
}
}
-
- function &pkeyGet($kv)
+
+ static function defaultImage($size)
{
- return Memcached_DataObject::pkeyGet('Avatar', $kv);
+ static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile',
+ AVATAR_STREAM_SIZE => 'stream',
+ AVATAR_MINI_SIZE => 'mini');
+ return theme_path('default-avatar-'.$sizenames[$size].'.png');
}
-
}
diff --git a/classes/Channel.php b/classes/Channel.php
index 2e3e4e8d4..fdeff21fc 100644
--- a/classes/Channel.php
+++ b/classes/Channel.php
@@ -21,7 +21,7 @@ if (!defined('LACONICA')) { exit(1); }
class Channel
{
-
+
function on($user)
{
return false;
@@ -36,12 +36,12 @@ class Channel
{
return false;
}
-
+
function error($user, $text)
{
return false;
}
-
+
function source()
{
return null;
@@ -52,22 +52,22 @@ class XMPPChannel extends Channel
{
var $conn = null;
-
+
function source()
{
return 'xmpp';
}
-
+
function __construct($conn)
{
$this->conn = $conn;
}
-
+
function on($user)
{
return $this->set_notify($user, 1);
}
-
+
function off($user)
{
return $this->set_notify($user, 0);
@@ -78,13 +78,13 @@ class XMPPChannel extends Channel
$text = '['.common_config('site', 'name') . '] ' . $text;
jabber_send_message($user->jabber, $text);
}
-
+
function error($user, $text)
{
$text = '['.common_config('site', 'name') . '] ' . $text;
jabber_send_message($user->jabber, $text);
}
-
+
function set_notify(&$user, $notify)
{
$orig = clone($user);
@@ -105,20 +105,25 @@ class XMPPChannel extends Channel
}
}
-
class WebChannel extends Channel
{
+ var $out = null;
+
+ function __construct($out=null)
+ {
+ $this->out = $out;
+ }
function source()
{
return 'web';
}
-
+
function on($user)
{
return false;
}
-
+
function off($user)
{
return false;
@@ -129,47 +134,49 @@ class WebChannel extends Channel
# XXX: buffer all output and send it at the end
# XXX: even better, redirect to appropriate page
# depending on what command was run
- common_show_header(_('Command results'));
- common_element('p', null, $text);
- common_show_footer();
+ $this->out->startHTML();
+ $this->out->elementStart('head');
+ $this->out->element('title', null, _('Command results'));
+ $this->out->elementEnd('head');
+ $this->out->elementStart('body');
+ $this->out->element('p', array('id' => 'command_result'), $text);
+ $this->out->elementEnd('body');
+ $this->out->endHTML();
}
-
+
function error($user, $text)
{
common_user_error($text);
}
}
-
class AjaxWebChannel extends WebChannel
{
-
function output($user, $text)
{
- common_start_html('text/xml;charset=utf-8', true);
- common_element_start('head');
- common_element('title', null, _('Command results'));
- common_element_end('head');
- common_element_start('body');
- common_element('p', array('id' => 'command_result'), $text);
- common_element_end('body');
- common_element_end('html');
+ $this->out->startHTML('text/xml;charset=utf-8');
+ $this->out->elementStart('head');
+ $this->out->element('title', null, _('Command results'));
+ $this->out->elementEnd('head');
+ $this->out->elementStart('body');
+ $this->out->element('p', array('id' => 'command_result'), $text);
+ $this->out->elementEnd('body');
+ $this->out->endHTML();
}
function error($user, $text)
{
- common_start_html('text/xml;charset=utf-8', true);
- common_element_start('head');
- common_element('title', null, _('Ajax Error'));
- common_element_end('head');
- common_element_start('body');
- common_element('p', array('id' => 'error'), $text);
- common_element_end('body');
- common_element_end('html');
+ $this->out->startHTML('text/xml;charset=utf-8');
+ $this->out->elementStart('head');
+ $this->out->element('title', null, _('Ajax Error'));
+ $this->out->elementEnd('head');
+ $this->out->elementStart('body');
+ $this->out->element('p', array('id' => 'error'), $text);
+ $this->out->elementEnd('body');
+ $this->out->endHTML();
}
}
-
class MailChannel extends Channel
{
@@ -179,17 +186,17 @@ class MailChannel extends Channel
{
return 'mail';
}
-
+
function __construct($addr=null)
{
$this->addr = $addr;
}
-
+
function on($user)
{
return $this->set_notify($user, 1);
}
-
+
function off($user)
{
return $this->set_notify($user, 0);
@@ -200,23 +207,23 @@ class MailChannel extends Channel
$headers['From'] = $user->incomingemail;
$headers['To'] = $this->addr;
-
+
$headers['Subject'] = _('Command complete');
return mail_send(array($this->addr), $headers, $text);
}
-
+
function error($user, $text)
{
-
+
$headers['From'] = $user->incomingemail;
$headers['To'] = $this->addr;
-
+
$headers['Subject'] = _('Command failed');
return mail_send(array($this->addr), $headers, $text);
}
-
+
function set_notify($user, $value)
{
$orig = clone($user);
diff --git a/classes/Profile.php b/classes/Profile.php
index ab5a48e57..f3bfe299c 100644
--- a/classes/Profile.php
+++ b/classes/Profile.php
@@ -69,74 +69,51 @@ class Profile extends Memcached_DataObject
}
}
- function setOriginal($source)
+ function setOriginal($filename)
{
-
- $info = @getimagesize($source);
-
- if (!$info) {
- return null;
- }
-
- $filename = common_avatar_filename($this->id,
- image_type_to_extension($info[2]),
- null, common_timestamp());
- $filepath = common_avatar_path($filename);
-
- copy($source, $filepath);
+ $imagefile = new ImageFile($this->id, Avatar::path($filename));
$avatar = new Avatar();
-
$avatar->profile_id = $this->id;
- $avatar->width = $info[0];
- $avatar->height = $info[1];
- $avatar->mediatype = image_type_to_mime_type($info[2]);
+ $avatar->width = $imagefile->width;
+ $avatar->height = $imagefile->height;
+ $avatar->mediatype = image_type_to_mime_type($imagefile->type);
$avatar->filename = $filename;
$avatar->original = true;
- $avatar->url = common_avatar_url($filename);
+ $avatar->url = Avatar::url($filename);
$avatar->created = DB_DataObject_Cast::dateTime(); # current time
# XXX: start a transaction here
- if (!$this->delete_avatars()) {
- @unlink($filepath);
- return null;
- }
-
- if (!$avatar->insert()) {
- @unlink($filepath);
+ if (!$this->delete_avatars() || !$avatar->insert()) {
+ @unlink(Avatar::path($filename));
return null;
}
foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
# We don't do a scaled one if original is our scaled size
if (!($avatar->width == $size && $avatar->height == $size)) {
- $s = $avatar->scale($size);
- if (!$s) {
- return null;
- }
- }
- }
- return $avatar;
- }
-
- function crop_avatars($x, $y, $w, $h)
- {
+ $scaled_filename = $imagefile->resize($size);
- $avatar = $this->getOriginalAvatar();
- $this->delete_avatars(false); # don't delete original
+ //$scaled = DB_DataObject::factory('avatar');
+ $scaled = new Avatar();
+ $scaled->profile_id = $this->id;
+ $scaled->width = $size;
+ $scaled->height = $size;
+ $scaled->original = false;
+ $scaled->mediatype = image_type_to_mime_type($imagefile->type);
+ $scaled->filename = $scaled_filename;
+ $scaled->url = Avatar::url($scaled_filename);
+ $scaled->created = DB_DataObject_Cast::dateTime(); # current time
- foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
- # We don't do a scaled one if original is our scaled size
- if (!($avatar->width == $size && $avatar->height == $size)) {
- $s = $avatar->scale_and_crop($size, $x, $y, $w, $h);
- if (!$s) {
- return NULL;
+ if (!$scaled->insert()) {
+ return null;
}
}
}
- return true;
+
+ return $avatar;
}
function delete_avatars($original=true)
@@ -217,4 +194,13 @@ class Profile extends Memcached_DataObject
}
}
+ function avatarUrl($size=AVATAR_PROFILE_SIZE)
+ {
+ $avatar = $this->getAvatar($size);
+ if ($avatar) {
+ return $avatar->displayUrl();
+ } else {
+ return Avatar::defaultImage($size);
+ }
+ }
}
diff --git a/classes/User.php b/classes/User.php
index b1c061c18..a6a1b11b9 100644
--- a/classes/User.php
+++ b/classes/User.php
@@ -630,4 +630,15 @@ class User extends Memcached_DataObject
return $profile;
}
+
+ function hasOpenID()
+ {
+ $oid = new User_openid();
+
+ $oid->user_id = $this->id;
+
+ $cnt = $oid->find();
+
+ return ($cnt > 0);
+ }
}
diff --git a/classes/User_group.php b/classes/User_group.php
index 522dd8143..d152f9d56 100755
--- a/classes/User_group.php
+++ b/classes/User_group.php
@@ -88,81 +88,16 @@ class User_group extends Memcached_DataObject
return $members;
}
- function setOriginal($filename, $type)
+ function setOriginal($filename)
{
+ $imagefile = new ImageFile($this->id, Avatar::path($filename));
+
$orig = clone($this);
- $this->original_logo = common_avatar_url($filename);
- $this->homepage_logo = common_avatar_url($this->scale($filename,
- AVATAR_PROFILE_SIZE,
- $type));
- $this->stream_logo = common_avatar_url($this->scale($filename,
- AVATAR_STREAM_SIZE,
- $type));
- $this->mini_logo = common_avatar_url($this->scale($filename,
- AVATAR_MINI_SIZE,
- $type));
+ $this->original_logo = Avatar::url($filename);
+ $this->homepage_logo = Avatar::url($imagefile->resize(AVATAR_PROFILE_SIZE));
+ $this->stream_logo = Avatar::url($imagefile->resize(AVATAR_STREAM_SIZE));
+ $this->mini_logo = Avatar::url($imagefile->resize(AVATAR_MINI_SIZE));
common_debug(common_log_objstring($this));
return $this->update($orig);
}
-
- function scale($filename, $size, $type)
- {
- $filepath = common_avatar_path($filename);
-
- if (!file_exists($filepath)) {
- $this->serverError(_('Lost our file.'));
- return;
- }
-
- $info = @getimagesize($filepath);
-
- switch ($type) {
- case IMAGETYPE_GIF:
- $image_src = imagecreatefromgif($filepath);
- break;
- case IMAGETYPE_JPEG:
- $image_src = imagecreatefromjpeg($filepath);
- break;
- case IMAGETYPE_PNG:
- $image_src = imagecreatefrompng($filepath);
- break;
- default:
- $this->serverError(_('Unknown file type'));
- return;
- }
-
- $image_dest = imagecreatetruecolor($size, $size);
-
- $background = imagecolorallocate($image_dest, 0, 0, 0);
- ImageColorTransparent($image_dest, $background);
- imagealphablending($image_dest, false);
-
- imagecopyresized($image_dest, $image_src,
- 0, 0, 0, 0,
- $size, $size, $info[0], $info[1]);
-
- $outname = common_avatar_filename($this->id,
- image_type_to_extension($type),
- $size,
- common_timestamp());
-
- $outpath = common_avatar_path($outname);
-
- switch ($type) {
- case IMAGETYPE_GIF:
- imagegif($image_dest, $outpath);
- break;
- case IMAGETYPE_JPEG:
- imagejpeg($image_dest, $outpath);
- break;
- case IMAGETYPE_PNG:
- imagepng($image_dest, $outpath);
- break;
- default:
- $this->serverError(_('Unknown file type'));
- return;
- }
-
- return $outname;
- }
}