Another take at profile photo/thumbnail caching. oc-839.
This commit is contained in:
parent
00d7ae8319
commit
39814edf81
|
@ -49,4 +49,10 @@ if(!$id) {
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
OCP\JSON::success(array('data' => array( 'id' => $id, 'aid' => $aid )));
|
OCP\JSON::success(array(
|
||||||
|
'data' => array(
|
||||||
|
'id' => $id,
|
||||||
|
'aid' => $aid,
|
||||||
|
'lastmodified' => OC_Contacts_VCard::lastModified($vcard)->format('U')
|
||||||
|
)
|
||||||
|
));
|
||||||
|
|
|
@ -144,4 +144,9 @@ if(!OC_Contacts_VCard::edit($id, $vcard)) {
|
||||||
bailOut($l10n->t('Error adding contact property: '.$name));
|
bailOut($l10n->t('Error adding contact property: '.$name));
|
||||||
}
|
}
|
||||||
|
|
||||||
OCP\JSON::success(array('data' => array( 'checksum' => $checksum )));
|
OCP\JSON::success(array(
|
||||||
|
'data' => array(
|
||||||
|
'checksum' => $checksum,
|
||||||
|
'lastmodified' => OC_Contacts_VCard::lastModified($vcard)->format('U'))
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
|
@ -44,4 +44,9 @@ if(!OC_Contacts_VCard::edit($id, $vcard)) {
|
||||||
bailOut($l10n->t('Error deleting contact property.'));
|
bailOut($l10n->t('Error deleting contact property.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
OCP\JSON::success(array('data' => array( 'id' => $id )));
|
OCP\JSON::success(array(
|
||||||
|
'data' => array(
|
||||||
|
'id' => $id,
|
||||||
|
'lastmodified' => OC_Contacts_VCard::lastModified($vcard)->format('U'),
|
||||||
|
)
|
||||||
|
));
|
||||||
|
|
|
@ -53,5 +53,6 @@ if(isset($details['PHOTO'])) {
|
||||||
$details['id'] = $id;
|
$details['id'] = $id;
|
||||||
$details['displayname'] = $card['fullname'];
|
$details['displayname'] = $card['fullname'];
|
||||||
$details['addressbookid'] = $card['addressbookid'];
|
$details['addressbookid'] = $card['addressbookid'];
|
||||||
|
$details['lastmodified'] = OC_Contacts_App::lastModified($vcard)->format('U');
|
||||||
OC_Contacts_App::setLastModifiedHeader($vcard);
|
OC_Contacts_App::setLastModifiedHeader($vcard);
|
||||||
OCP\JSON::success(array('data' => $details));
|
OCP\JSON::success(array('data' => $details));
|
||||||
|
|
|
@ -148,5 +148,6 @@ if(!OC_Contacts_VCard::edit($id, $vcard)) {
|
||||||
OCP\JSON::success(array('data' => array(
|
OCP\JSON::success(array('data' => array(
|
||||||
'line' => $line,
|
'line' => $line,
|
||||||
'checksum' => $checksum,
|
'checksum' => $checksum,
|
||||||
'oldchecksum' => $_POST['checksum']))
|
'oldchecksum' => $_POST['checksum']
|
||||||
);
|
'lastmodified' => OC_Contacts_VCard::lastModified($vcard)->format('U')
|
||||||
|
));
|
||||||
|
|
|
@ -62,17 +62,17 @@ if($data) {
|
||||||
if($image->crop($x1, $y1, $w, $h)) {
|
if($image->crop($x1, $y1, $w, $h)) {
|
||||||
if(($image->width() <= 200 && $image->height() <= 200)
|
if(($image->width() <= 200 && $image->height() <= 200)
|
||||||
|| $image->resize(200)) {
|
|| $image->resize(200)) {
|
||||||
$card = OC_Contacts_App::getContactVCard($id);
|
$vcard = OC_Contacts_App::getContactVCard($id);
|
||||||
if(!$card) {
|
if(!$vcard) {
|
||||||
OC_Cache::remove($tmpkey);
|
OC_Cache::remove($tmpkey);
|
||||||
bailOut(OC_Contacts_App::$l10n
|
bailOut(OC_Contacts_App::$l10n
|
||||||
->t('Error getting contact object.'));
|
->t('Error getting contact object.'));
|
||||||
}
|
}
|
||||||
if($card->__isset('PHOTO')) {
|
if($vcard->__isset('PHOTO')) {
|
||||||
OCP\Util::writeLog('contacts',
|
OCP\Util::writeLog('contacts',
|
||||||
'savecrop.php: PHOTO property exists.',
|
'savecrop.php: PHOTO property exists.',
|
||||||
OCP\Util::DEBUG);
|
OCP\Util::DEBUG);
|
||||||
$property = $card->__get('PHOTO');
|
$property = $vcard->__get('PHOTO');
|
||||||
if(!$property) {
|
if(!$property) {
|
||||||
OC_Cache::remove($tmpkey);
|
OC_Cache::remove($tmpkey);
|
||||||
bailOut(OC_Contacts_App::$l10n
|
bailOut(OC_Contacts_App::$l10n
|
||||||
|
@ -83,27 +83,28 @@ if($data) {
|
||||||
= new Sabre_VObject_Parameter('ENCODING', 'b');
|
= new Sabre_VObject_Parameter('ENCODING', 'b');
|
||||||
$property->parameters[]
|
$property->parameters[]
|
||||||
= new Sabre_VObject_Parameter('TYPE', $image->mimeType());
|
= new Sabre_VObject_Parameter('TYPE', $image->mimeType());
|
||||||
$card->__set('PHOTO', $property);
|
$vcard->__set('PHOTO', $property);
|
||||||
} else {
|
} else {
|
||||||
OCP\Util::writeLog('contacts',
|
OCP\Util::writeLog('contacts',
|
||||||
'savecrop.php: files: Adding PHOTO property.',
|
'savecrop.php: files: Adding PHOTO property.',
|
||||||
OCP\Util::DEBUG);
|
OCP\Util::DEBUG);
|
||||||
$card->addProperty('PHOTO',
|
$vcard->addProperty('PHOTO',
|
||||||
$image->__toString(), array('ENCODING' => 'b',
|
$image->__toString(), array('ENCODING' => 'b',
|
||||||
'TYPE' => $image->mimeType()));
|
'TYPE' => $image->mimeType()));
|
||||||
}
|
}
|
||||||
$now = new DateTime;
|
$now = new DateTime;
|
||||||
$card->setString('REV', $now->format(DateTime::W3C));
|
$vcard->setString('REV', $now->format(DateTime::W3C));
|
||||||
if(!OC_Contacts_VCard::edit($id, $card)) {
|
if(!OC_Contacts_VCard::edit($id, $vcard)) {
|
||||||
bailOut(OC_Contacts_App::$l10n->t('Error saving contact.'));
|
bailOut(OC_Contacts_App::$l10n->t('Error saving contact.'));
|
||||||
}
|
}
|
||||||
$tmpl = new OCP\Template("contacts", "part.contactphoto");
|
OCP\JSON::success(array(
|
||||||
$tmpl->assign('id', $id);
|
'data' => array(
|
||||||
$tmpl->assign('refresh', true);
|
'id' => $id,
|
||||||
$tmpl->assign('width', $image->width());
|
'width' => $image->width(),
|
||||||
$tmpl->assign('height', $image->height());
|
'height' => $image->height(),
|
||||||
$page = $tmpl->fetchPage();
|
'lastmodified' => OC_Contacts_App::lastModified($vcard)->format('U')
|
||||||
OCP\JSON::success(array('data' => array('page'=>$page)));
|
)
|
||||||
|
));
|
||||||
} else {
|
} else {
|
||||||
bailOut(OC_Contacts_App::$l10n->t('Error resizing image'));
|
bailOut(OC_Contacts_App::$l10n->t('Error resizing image'));
|
||||||
}
|
}
|
||||||
|
|
|
@ -835,7 +835,7 @@ OC.Contacts={
|
||||||
OC.Contacts.propertyContainerFor(obj).data('checksum', '');
|
OC.Contacts.propertyContainerFor(obj).data('checksum', '');
|
||||||
if(proptype == 'PHOTO') {
|
if(proptype == 'PHOTO') {
|
||||||
OC.Contacts.Contacts.refreshThumbnail(OC.Contacts.Card.id);
|
OC.Contacts.Contacts.refreshThumbnail(OC.Contacts.Card.id);
|
||||||
OC.Contacts.Card.loadPhoto(true);
|
OC.Contacts.Card.loadPhoto();
|
||||||
} else if(proptype == 'NOTE') {
|
} else if(proptype == 'NOTE') {
|
||||||
$('#note').find('textarea').val('');
|
$('#note').find('textarea').val('');
|
||||||
OC.Contacts.propertyContainerFor(obj).hide();
|
OC.Contacts.propertyContainerFor(obj).hide();
|
||||||
|
@ -1218,9 +1218,9 @@ OC.Contacts={
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
loadPhoto:function(refresh){
|
loadPhoto:function(){
|
||||||
var self = this;
|
var self = this;
|
||||||
var refreshstr = (refresh?'&refresh=1'+Math.random():'')
|
var refreshstr = ''; //'&refresh='+Math.random();
|
||||||
$('#phototools li a').tipsy('hide');
|
$('#phototools li a').tipsy('hide');
|
||||||
var wrapper = $('#contacts_details_photo_wrapper');
|
var wrapper = $('#contacts_details_photo_wrapper');
|
||||||
wrapper.addClass('loading').addClass('wait');
|
wrapper.addClass('loading').addClass('wait');
|
||||||
|
@ -1278,7 +1278,7 @@ OC.Contacts={
|
||||||
var response=jQuery.parseJSON(target.contents().text());
|
var response=jQuery.parseJSON(target.contents().text());
|
||||||
if(response != undefined && response.status == 'success'){
|
if(response != undefined && response.status == 'success'){
|
||||||
// load cropped photo.
|
// load cropped photo.
|
||||||
self.loadPhoto(true);
|
self.loadPhoto();
|
||||||
OC.Contacts.Card.data.PHOTO = true;
|
OC.Contacts.Card.data.PHOTO = true;
|
||||||
}else{
|
}else{
|
||||||
OC.dialogs.alert(response.data.message, t('contacts', 'Error'));
|
OC.dialogs.alert(response.data.message, t('contacts', 'Error'));
|
||||||
|
|
|
@ -240,6 +240,18 @@ class OC_Contacts_App {
|
||||||
self::getVCategories()->loadFromVObject($contact, true);
|
self::getVCategories()->loadFromVObject($contact, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the last modification time.
|
||||||
|
* @param $vcard OC_VObject
|
||||||
|
* $return DateTime | null
|
||||||
|
*/
|
||||||
|
public static function lastModified($vcard) {
|
||||||
|
$rev = $vcard->getAsString('REV');
|
||||||
|
if ($rev) {
|
||||||
|
return DateTime::createFromFormat(DateTime::W3C, $rev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static function setLastModifiedHeader($contact) {
|
public static function setLastModifiedHeader($contact) {
|
||||||
$rev = $contact->getAsString('REV');
|
$rev = $contact->getAsString('REV');
|
||||||
if ($rev) {
|
if ($rev) {
|
||||||
|
|
|
@ -20,7 +20,8 @@ function getStandardImage() {
|
||||||
}
|
}
|
||||||
|
|
||||||
$id = isset($_GET['id']) ? $_GET['id'] : null;
|
$id = isset($_GET['id']) ? $_GET['id'] : null;
|
||||||
$caching = isset($_GET['refresh']) ? 0 : null;
|
$etag = null;
|
||||||
|
$caching = null;
|
||||||
|
|
||||||
if(is_null($id)) {
|
if(is_null($id)) {
|
||||||
getStandardImage();
|
getStandardImage();
|
||||||
|
@ -43,21 +44,30 @@ if (is_null($contact)) {
|
||||||
'photo.php. The VCard for ID ' . $id . ' is not RFC compatible',
|
'photo.php. The VCard for ID ' . $id . ' is not RFC compatible',
|
||||||
OCP\Util::ERROR);
|
OCP\Util::ERROR);
|
||||||
} else {
|
} else {
|
||||||
OCP\Response::enableCaching($caching);
|
|
||||||
OC_Contacts_App::setLastModifiedHeader($contact);
|
|
||||||
|
|
||||||
// Photo :-)
|
// Photo :-)
|
||||||
if ($image->loadFromBase64($contact->getAsString('PHOTO'))) {
|
if ($image->loadFromBase64($contact->getAsString('PHOTO'))) {
|
||||||
// OK
|
// OK
|
||||||
OCP\Response::setETagHeader(md5($contact->getAsString('PHOTO')));
|
$etag = md5($contact->getAsString('PHOTO'));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
// Logo :-/
|
// Logo :-/
|
||||||
if ($image->loadFromBase64($contact->getAsString('LOGO'))) {
|
if ($image->loadFromBase64($contact->getAsString('LOGO'))) {
|
||||||
// OK
|
// OK
|
||||||
OCP\Response::setETagHeader(md5($contact->getAsString('LOGO')));
|
$etag = md5($contact->getAsString('LOGO'));
|
||||||
}
|
}
|
||||||
if ($image->valid()) {
|
if ($image->valid()) {
|
||||||
|
$modified = OC_Contacts_App::lastModified($contact);
|
||||||
|
// Force refresh if modified within the last minute.
|
||||||
|
if(!is_null($modified)) {
|
||||||
|
$caching = (time() - $modified->format('U') > 60) ? null : 0;
|
||||||
|
}
|
||||||
|
OCP\Response::enableCaching($caching);
|
||||||
|
if(!is_null($modified)) {
|
||||||
|
OCP\Response::setLastModifiedHeader($modified);
|
||||||
|
}
|
||||||
|
if($etag) {
|
||||||
|
OCP\Response::setETagHeader($etag);
|
||||||
|
}
|
||||||
$max_size = 200;
|
$max_size = 200;
|
||||||
if ($image->width() > $max_size || $image->height() > $max_size) {
|
if ($image->width() > $max_size || $image->height() > $max_size) {
|
||||||
$image->resize($max_size);
|
$image->resize($max_size);
|
||||||
|
|
|
@ -26,7 +26,6 @@ OCP\App::checkAppEnabled('contacts');
|
||||||
session_write_close();
|
session_write_close();
|
||||||
|
|
||||||
function getStandardImage() {
|
function getStandardImage() {
|
||||||
//OCP\Response::setExpiresHeader('P10D');
|
|
||||||
OCP\Response::enableCaching();
|
OCP\Response::enableCaching();
|
||||||
OCP\Response::redirect(OCP\Util::imagePath('contacts', 'person.png'));
|
OCP\Response::redirect(OCP\Util::imagePath('contacts', 'person.png'));
|
||||||
}
|
}
|
||||||
|
@ -39,7 +38,7 @@ if(!extension_loaded('gd') || !function_exists('gd_info')) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$id = $_GET['id'];
|
$id = $_GET['id'];
|
||||||
$caching = isset($_GET['refresh']) ? 0 : null;
|
$caching = null;
|
||||||
|
|
||||||
$contact = OC_Contacts_App::getContactVCard($id);
|
$contact = OC_Contacts_App::getContactVCard($id);
|
||||||
|
|
||||||
|
@ -60,10 +59,19 @@ $thumbnail_size = 23;
|
||||||
$image = new OC_Image();
|
$image = new OC_Image();
|
||||||
$photo = $contact->getAsString('PHOTO');
|
$photo = $contact->getAsString('PHOTO');
|
||||||
if($photo) {
|
if($photo) {
|
||||||
OCP\Response::setETagHeader(md5($photo));
|
|
||||||
if($image->loadFromBase64($photo)) {
|
if($image->loadFromBase64($photo)) {
|
||||||
if($image->centerCrop()) {
|
if($image->centerCrop()) {
|
||||||
if($image->resize($thumbnail_size)) {
|
if($image->resize($thumbnail_size)) {
|
||||||
|
$modified = OC_Contacts_App::lastModified($contact);
|
||||||
|
// Force refresh if modified within the last minute.
|
||||||
|
if(!is_null($modified)) {
|
||||||
|
$caching = (time() - $modified->format('U') > 60) ? null : 0;
|
||||||
|
}
|
||||||
|
OCP\Response::enableCaching($caching);
|
||||||
|
if(!is_null($modified)) {
|
||||||
|
OCP\Response::setLastModifiedHeader($modified);
|
||||||
|
}
|
||||||
|
OCP\Response::setETagHeader(md5($photo));
|
||||||
if($image->show()) {
|
if($image->show()) {
|
||||||
exit();
|
exit();
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue