diff options
25 files changed, 730 insertions, 207 deletions
diff --git a/apps/calendar/templates/settings.php b/apps/calendar/templates/settings.php index 12117750ca5..feb06655120 100644 --- a/apps/calendar/templates/settings.php +++ b/apps/calendar/templates/settings.php @@ -8,45 +8,50 @@ */ ?> <form id="calendar"> - <fieldset class="personalblock"> + <fieldset class="personalblock"> <legend><?php echo $l->t('Calendar'); ?></legend> - <table class="nostyle"> - <tr><td><label for="timezone" class="bold"><?php echo $l->t('Timezone');?></label></td><td><select style="display: none;" id="timezone" name="timezone"> - <?php - $continent = ''; - foreach($_['timezones'] as $timezone): - $ex=explode('/', $timezone, 2);//obtain continent,city - if (!isset($ex[1])) { - $ex[1] = $ex[0]; - $ex[0] = "Other"; - } - if ($continent!=$ex[0]): - if ($continent!="") echo '</optgroup>'; - echo '<optgroup label="'.$ex[0].'">'; - endif; + <table class="nostyle"> + <tr><td><label for="timezone" class="bold"><?php echo $l->t('Timezone');?></label></td><td><select style="display: none;" id="timezone" name="timezone"> + <?php + $continent = ''; + foreach($_['timezones'] as $timezone): + $ex=explode('/', $timezone, 2);//obtain continent,city + if (!isset($ex[1])) { + $ex[1] = $ex[0]; + $ex[0] = "Other"; + } + if ($continent!=$ex[0]): + if ($continent!="") echo '</optgroup>'; + echo '<optgroup label="'.$ex[0].'">'; + endif; $city=strtr($ex[1], '_', ' '); - $continent=$ex[0]; - echo '<option value="'.$timezone.'"'.($_['timezone'] == $timezone?' selected="selected"':'').'>'.$city.'</option>'; - endforeach;?> - </select><input type="checkbox" name="timezonedetection" id="timezonedetection"><label for="timezonedetection"><?php echo $l->t('Check always for changes of the timezone'); ?></label></td></tr> + $continent=$ex[0]; + echo '<option value="'.$timezone.'"'.($_['timezone'] == $timezone?' selected="selected"':'').'>'.$city.'</option>'; + endforeach;?> + </select><input type="checkbox" name="timezonedetection" id="timezonedetection"><label for="timezonedetection"><?php echo $l->t('Check always for changes of the timezone'); ?></label></td></tr> - <tr><td><label for="timeformat" class="bold"><?php echo $l->t('Timeformat');?></label></td><td> - <select style="display: none; width: 60px;" id="timeformat" title="<?php echo "timeformat"; ?>" name="timeformat"> - <option value="24" id="24h"><?php echo $l->t("24h"); ?></option> - <option value="ampm" id="ampm"><?php echo $l->t("12h"); ?></option> - </select> - </td></tr> + <tr><td><label for="timeformat" class="bold"><?php echo $l->t('Timeformat');?></label></td><td> + <select style="display: none; width: 60px;" id="timeformat" title="<?php echo "timeformat"; ?>" name="timeformat"> + <option value="24" id="24h"><?php echo $l->t("24h"); ?></option> + <option value="ampm" id="ampm"><?php echo $l->t("12h"); ?></option> + </select> + </td></tr> - <tr><td><label for="firstday" class="bold"><?php echo $l->t('First day of the week');?></label></td><td> - <select style="display: none;" id="firstday" title="<?php echo "First day"; ?>" name="firstday"> - <option value="mo" id="mo"><?php echo $l->t("Monday"); ?></option> - <option value="su" id="su"><?php echo $l->t("Sunday"); ?></option> - </select> - </td></tr> + <tr><td><label for="firstday" class="bold"><?php echo $l->t('First day of the week');?></label></td><td> + <select style="display: none;" id="firstday" title="<?php echo "First day"; ?>" name="firstday"> + <option value="mo" id="mo"><?php echo $l->t("Monday"); ?></option> + <option value="su" id="su"><?php echo $l->t("Sunday"); ?></option> + </select> + </td></tr> - </table> + </table> - <?php echo $l->t('Calendar CalDAV syncing address:');?> - <code><?php echo OCP\Util::linkToRemote('caldav'); ?></code><br /> + <?php echo $l->t('Calendar CalDAV syncing addresses'); ?> (<a href="http://owncloud.org/synchronisation/" target="_blank"><?php echo $l->t('more info'); ?></a>) + <dl> + <dt><?php echo $l->t('Primary address (Kontact et al)'); ?></dt> + <dd><code><?php echo OCP\Util::linkToRemote('caldav'); ?></code></dd> + <dt><?php echo $l->t('iOS/OS X'); ?></dt> + <dd><code><?php echo OCP\Util::linkToRemote('caldav'); ?>principals/<?php echo OCP\USER::getUser(); ?></code>/</dd> + </dl> </fieldset> </form> diff --git a/apps/contacts/css/contacts.css b/apps/contacts/css/contacts.css index 1d02b3722dd..8de68fbf052 100644 --- a/apps/contacts/css/contacts.css +++ b/apps/contacts/css/contacts.css @@ -31,8 +31,9 @@ dl.form { width: 100%; float: left; clear: right; margin: 0; padding: 0; } .form dt { display: table-cell; clear: left; float: left; width: 7em; margin: 0; padding: 0.8em 0.5em 0 0; text-align:right; text-overflow:ellipsis; o-text-overflow: ellipsis; vertical-align: text-bottom; color: #bbb;/* white-space: pre-wrap; white-space: -moz-pre-wrap !important; white-space: -pre-wrap; white-space: -o-pre-wrap;*/ } .form dd { display: table-cell; clear: right; float: left; margin: 0; padding: 0px; white-space: nowrap; vertical-align: text-bottom; } label:hover, dt:hover { color: #333; } -#address.form dt { min-width: 5em; } -#address.form dl { min-width: 10em; } +/*::-webkit-input-placeholder { color: #bbb; } +:-moz-placeholder { color: #bbb; } +:-ms-input-placeholder { color: #bbb; }*/ .droptarget { margin: 0.5em; padding: 0.5em; border: thin solid #ccc; -moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em; } .droppable { margin: 0.5em; padding: 0.5em; border: thin dashed #333; -moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em; } .loading { background: url('%webroot%/core/img/loading.gif') no-repeat center !important; /*cursor: progress; */ cursor: wait; } @@ -79,10 +80,17 @@ label:hover, dt:hover { color: #333; } #addressdisplay { padding: 0.5em; } dl.addresscard { background-color: #fff; float: left; width: auto; margin: 0 0.3em 0.3em 0.3em; padding: 0; border: 0; } dl.addresscard dd {} -dl.addresscard dt { padding: 0.3em; font-weight: bold; clear: both; color: #bbb;} +dl.addresscard dt { padding: 0.3em; font-weight: bold; clear: both; color: #aaa; } dl.addresscard dt:hover { color:#777; } dl.addresscard dd > ul { margin: 0.3em; padding: 0.3em; } dl.addresscard .action { float: right; } +#address dt { width: 30%; white-space:nowrap; } +#address dd { width: 66%; } +#address input { width: 12em; padding: 0.6em 0.5em 0.4em; } +#address input:-moz-placeholder { color: #aaa; } +#address input::-webkit-input-placeholder { color: #aaa; } +#address input:-ms-input-placeholder { color: #aaa; } +#address input:placeholder { color: #aaa; } #adr_type {} /* Select */ #adr_pobox {} #adr_extended {} diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js index e15dc0278f6..35d4a4a216d 100644 --- a/apps/contacts/js/contacts.js +++ b/apps/contacts/js/contacts.js @@ -1281,7 +1281,7 @@ Contacts={ }, Addressbooks:{ droptarget:undefined, - droptext:t('contacts', 'Drop a VCF file to import contacts.'), + droptext:t('contacts', 'Drop a VCF file<br />to import contacts.'), overview:function(){ if($('#chooseaddressbook_dialog').dialog('isOpen') == true){ $('#chooseaddressbook_dialog').dialog('moveToTop'); @@ -1290,7 +1290,7 @@ Contacts={ $.getJSON(OC.filePath('contacts', 'ajax', 'chooseaddressbook.php'), function(jsondata){ if(jsondata.status == 'success'){ $('#addressbook_dialog').html(jsondata.data.page).find('#chooseaddressbook_dialog').dialog({ - width : 600, + minWidth : 600, close : function(event, ui) { $(this).dialog('destroy').remove(); $('#addressbook_dialog').remove(); diff --git a/apps/contacts/js/jquery.combobox.js b/apps/contacts/js/jquery.combobox.js index f12d1d7dd20..d9959eb6cde 100644 --- a/apps/contacts/js/jquery.combobox.js +++ b/apps/contacts/js/jquery.combobox.js @@ -23,16 +23,16 @@ minLength: 0, source: function( request, response ) { var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" ); - response( select.children( "option" ).map(function() { + response( select.children('option').map(function() { var text = $( this ).text(); if ( this.value && ( !request.term || matcher.test(text) ) ) return { label: text.replace( new RegExp( - "(?![^&;]+;)(?!<[^<>]*)(" + + '(?![^&;]+;)(?!<[^<>]*)(' + $.ui.autocomplete.escapeRegex(request.term) + - ")(?![^<>]*>)(?![^&;]+;)", "gi" - ), "<strong>$1</strong>" ), + ')(?![^<>]*>)(?![^&;]+;)', 'gi' + ), '<strong>$1</strong>'), value: text, option: this }; @@ -42,17 +42,17 @@ self.input.val($(ui.item.option).text()); self.input.trigger('change'); ui.item.option.selected = true; - self._trigger( "selected", event, { + self._trigger('selected', event, { item: ui.item.option }); }, change: function( event, ui ) { if ( !ui.item ) { - var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "$", "i" ), + var matcher = new RegExp( '^' + $.ui.autocomplete.escapeRegex( $(this).val() ) + '$', 'i' ), valid = false; self.input.val($(this).val()); //self.input.trigger('change'); - select.children( "option" ).each(function() { + select.children('option').each(function() { if ( $( this ).text().match( matcher ) ) { this.selected = valid = true; return false; @@ -62,36 +62,41 @@ // remove invalid value, as it didn't match anything $( this ).val( "" ); select.val( "" ); - input.data( "autocomplete" ).term = ""; + input.data('autocomplete').term = ''; return false; } } } }) - .addClass( "ui-widget ui-widget-content ui-corner-left" ); + .addClass('ui-widget ui-widget-content ui-corner-left'); - input.data( "autocomplete" )._renderItem = function( ul, item ) { - return $( "<li></li>" ) - .data( "item.autocomplete", item ) - .append( "<a>" + item.label + "</a>" ) + input.data('autocomplete')._renderItem = function( ul, item ) { + return $('<li></li>') + .data('item.autocomplete', item ) + .append('<a>' + item.label + '</a>') .appendTo( ul ); }; $.each(this.options, function(key, value) { self._setOption(key, value); }); + input.dblclick(function() { + // pass empty string as value to search for, displaying all results + input.autocomplete('search', ''); + }); + if(this.options['showButton']) { - this.button = $( "<button type='button'> </button>" ) - .attr( "tabIndex", -1 ) - .attr( "title", "Show All Items" ) + this.button = $('<button type="button"> </button>') + .attr('tabIndex', -1 ) + .attr('title', 'Show All Items') .insertAfter( input ) .addClass('svg') .addClass('action') .addClass('combo-button') .click(function() { // close if already visible - if ( input.autocomplete( "widget" ).is( ":visible" ) ) { - input.autocomplete( "close" ); + if ( input.autocomplete('widget').is(':visible') ) { + input.autocomplete('close'); return; } @@ -99,7 +104,7 @@ $( this ).blur(); // pass empty string as value to search for, displaying all results - input.autocomplete( "search", "" ); + input.autocomplete('search', ''); input.focus(); }); } diff --git a/apps/contacts/templates/part.edit_address_dialog.php b/apps/contacts/templates/part.edit_address_dialog.php index 8b3425033cc..7684795f348 100644 --- a/apps/contacts/templates/part.edit_address_dialog.php +++ b/apps/contacts/templates/part.edit_address_dialog.php @@ -24,18 +24,17 @@ foreach(isset($adr['parameters']['TYPE'])?array($adr['parameters']['TYPE']):arra <dd> <input type="text" id="adr_pobox" name="value[ADR][0]" placeholder="<?php echo $l->t('PO Box'); ?>" value="<?php echo isset($adr['value'][0])?$adr['value'][0]:''; ?>"> </dd> - <dd> <dt> - <label class="label" for="adr_extended"><?php echo $l->t('Extended'); ?></label> + <label class="label" for="adr_street"><?php echo $l->t('Street address'); ?></label> </dt> <dd> - <input type="text" id="adr_extended" name="value[ADR][1]" placeholder="<?php echo $l->t('Extended'); ?>" value="<?php echo isset($adr['value'][1])?$adr['value'][1]:''; ?>"> + <input type="text" id="adr_street" name="value[ADR][2]" placeholder="<?php echo $l->t('Street and number'); ?>" value="<?php echo isset($adr['value'][2])?$adr['value'][2]:''; ?>"> </dd> <dt> - <label class="label" for="adr_street"><?php echo $l->t('Street'); ?></label> + <label class="label" for="adr_extended"><?php echo $l->t('Extended'); ?></label> </dt> <dd> - <input type="text" id="adr_street" name="value[ADR][2]" placeholder="<?php echo $l->t('Street'); ?>" value="<?php echo isset($adr['value'][2])?$adr['value'][2]:''; ?>"> + <input type="text" id="adr_extended" name="value[ADR][1]" placeholder="<?php echo $l->t('Apartment number etc.'); ?>" value="<?php echo isset($adr['value'][1])?$adr['value'][1]:''; ?>"> </dd> <dt> <label class="label" for="adr_city"><?php echo $l->t('City'); ?></label> @@ -47,13 +46,13 @@ foreach(isset($adr['parameters']['TYPE'])?array($adr['parameters']['TYPE']):arra <label class="label" for="adr_region"><?php echo $l->t('Region'); ?></label> </dt> <dd> - <input type="text" id="adr_region" name="value[ADR][4]" placeholder="<?php echo $l->t('Region'); ?>" value="<?php echo isset($adr['value'][4])?$adr['value'][4]:''; ?>"> + <input type="text" id="adr_region" name="value[ADR][4]" placeholder="<?php echo $l->t('E.g. state or province'); ?>" value="<?php echo isset($adr['value'][4])?$adr['value'][4]:''; ?>"> </dd> <dt> <label class="label" for="adr_zipcode"><?php echo $l->t('Zipcode'); ?></label> </dt> <dd> - <input type="text" id="adr_zipcode" name="value[ADR][5]" placeholder="<?php echo $l->t('Zipcode'); ?>" value="<?php echo isset($adr['value'][5])?$adr['value'][5]:''; ?>"> + <input type="text" id="adr_zipcode" name="value[ADR][5]" placeholder="<?php echo $l->t('Postal code'); ?>" value="<?php echo isset($adr['value'][5])?$adr['value'][5]:''; ?>"> </dd> <dt> <label class="label" for="adr_country"><?php echo $l->t('Country'); ?></label> diff --git a/apps/contacts/templates/part.importaddressbook.php b/apps/contacts/templates/part.importaddressbook.php index 6702262f231..0e2956ddaf4 100644 --- a/apps/contacts/templates/part.importaddressbook.php +++ b/apps/contacts/templates/part.importaddressbook.php @@ -22,7 +22,7 @@ if(OCP\App::isEnabled('files_encryption')) { echo OCP\html_select_options($contacts_options, $contacts_options[0]['id'], array('value'=>'id', 'label'=>'displayname')); ?> </select> - <span id="import_drop_target" class="droptarget float"><?php echo $l->t("Drop a VCF file to import contacts."); ?> (Max. <?php echo $_['uploadMaxHumanFilesize']; ?>)</span> + <span id="import_drop_target" class="droptarget float"><?php echo $l->t("Drop a VCF file<br />to import contacts."); ?> (Max. <?php echo $_['uploadMaxHumanFilesize']; ?>)</span> <a class="svg upload float" title="<?php echo $l->t('Select from HD'); ?>"> <input class="float" id="import_upload_start" type="file" accept="text/*" name="importfile" /></a> <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $_['uploadMaxFilesize'] ?>" id="max_upload"> @@ -36,5 +36,7 @@ if(OCP\App::isEnabled('files_encryption')) { <?php } ?> </td> <script type="text/javascript"> -Contacts.UI.Addressbooks.loadImportHandlers(); +$(document).ready(function(){ + Contacts.UI.Addressbooks.loadImportHandlers(); +}); </script>
\ No newline at end of file diff --git a/apps/gallery/ajax/thumbnail.php b/apps/gallery/ajax/thumbnail.php index ff0cb44022c..4fc9eba992d 100644 --- a/apps/gallery/ajax/thumbnail.php +++ b/apps/gallery/ajax/thumbnail.php @@ -20,14 +20,15 @@ * License along with this library. If not, see <http://www.gnu.org/licenses/>. * */ - OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('gallery'); +require_once('apps/gallery/lib/managers.php'); + -$img = $_GET['img']; +$img = $_GET['filepath']; -$image = OC_Gallery_Photo::getThumbnail($img); +$image = \OC\Pictures\ThumbnailsManager::getInstance()->getThumbnail($img); if ($image) { OCP\Response::enableCaching(3600 * 24); // 24 hour $image->show(); diff --git a/apps/gallery/appinfo/database.xml b/apps/gallery/appinfo/database.xml index f370e1521e4..d1ccd6b5a24 100644 --- a/apps/gallery/appinfo/database.xml +++ b/apps/gallery/appinfo/database.xml @@ -5,66 +5,32 @@ <overwrite>false</overwrite> <charset>latin1</charset> <table> - <name>*dbprefix*gallery_albums</name> + <name>*dbprefix*pictures_images_cache</name> <declaration> <field> - <name>album_id</name> - <type>integer</type> - <default>0</default> - <notnull>true</notnull> - <autoincrement>1</autoincrement> - <length>4</length> - </field> - <field> <name>uid_owner</name> <type>text</type> <notnull>true</notnull> <length>64</length> </field> <field> - <name>album_name</name> - <type>text</type> - <notnull>true</notnull> - <length>100</length> - </field> - <field> - <name>album_path</name> - <type>text</type> - <notnull>true</notnull> - <length>256</length> - </field> - <field> - <name>parent_path</name> + <name>path</name> <type>text</type> <notnull>true</notnull> <length>256</length> </field> - </declaration> - </table> - <table> - <name>*dbprefix*gallery_photos</name> - <declaration> <field> - <name>photo_id</name> + <name>width</name> <type>integer</type> - <default>0</default> <notnull>true</notnull> - <autoincrement>1</autoincrement> <length>4</length> </field> <field> - <name>album_id</name> + <name>height</name> <type>integer</type> - <default>0</default> <notnull>true</notnull> <length>4</length> </field> - <field> - <name>file_path</name> - <type>text</type> - <notnull>true</notnull> - <length>256</length> - </field> </declaration> </table> <table> diff --git a/apps/gallery/appinfo/update.php b/apps/gallery/appinfo/update.php new file mode 100644 index 00000000000..dd248e21b3e --- /dev/null +++ b/apps/gallery/appinfo/update.php @@ -0,0 +1,9 @@ +<?php + +$stmt = OCP\DB::prepare('DROP TABLE IF EXISTS *PREFIX*gallery_photos'); +$stmt->execute(); +$stmt = OCP\DB::prepare('DROP TABLE IF EXISTS *PREFIX*gallery_albums'); +$stmt->execute(); + +\OC_DB::createDbFromStructure('./database.xml'); + diff --git a/apps/gallery/appinfo/version b/apps/gallery/appinfo/version index 17b2ccd9bf9..8f0916f768f 100644 --- a/apps/gallery/appinfo/version +++ b/apps/gallery/appinfo/version @@ -1 +1 @@ -0.4.3 +0.5.0 diff --git a/apps/gallery/index.php b/apps/gallery/index.php index a9fe200c4e4..9d4654a7cc5 100644 --- a/apps/gallery/index.php +++ b/apps/gallery/index.php @@ -27,26 +27,6 @@ OCP\User::checkLoggedIn(); OCP\App::checkAppEnabled('gallery'); OCP\App::setActiveNavigationEntry( 'gallery_index' ); -if (!isset($_GET['view'])) { - $result = OC_Gallery_Album::find(OCP\USER::getUser()); - - $r = array(); - while ($row = $result->fetchRow()) - $r[] = $row; - - $tmpl = new OCP\Template( 'gallery', 'index', 'user' ); - $tmpl->assign('r', $r); - $tmpl->printPage(); -} else { - $result = OC_Gallery_Photo::findForAlbum(OCP\USER::getUser(), $_GET['view']); - - $photos = array(); - while ($p = $result->fetchRow()) - $photos[] = $p['file_path']; - - $tmpl = new OCP\Template( 'gallery', 'view_album', 'user' ); - $tmpl->assign('photos', $photos); - $tmpl->assign('albumName', $_GET['view']); - $tmpl->printPage(); -} +$tmpl = new OCP\Template( 'gallery', 'index', 'user' ); +$tmpl->printPage(); ?> diff --git a/apps/gallery/lib/managers.php b/apps/gallery/lib/managers.php new file mode 100644 index 00000000000..2444659d0a4 --- /dev/null +++ b/apps/gallery/lib/managers.php @@ -0,0 +1,97 @@ +<?php + +namespace OC\Pictures; + +require_once('lib/base.php'); + +\OCP\JSON::checkLoggedIn(); +\OCP\JSON::checkAppEnabled('gallery'); + +class DatabaseManager { + private static $instance = null; + const TAG = 'DatabaseManager'; + + public static function getInstance() { + if (self::$instance === null) + self::$instance = new DatabaseManager(); + return self::$instance; + } + + public function getFileData($path) { + $gallery_path = \OCP\Config::getSystemValue( 'datadirectory' ).'/'.\OC_User::getUser().'/gallery'; + $path = $gallery_path.$path; + $stmt = \OCP\DB::prepare('SELECT * FROM *PREFIX*pictures_images_cache WHERE uid_owner LIKE ? AND path = ?'); + $result = $stmt->execute(array(\OCP\USER::getUser(), $path)); + if (($row = $result->fetchRow()) != false) { + return $row; + } + $image = new \OC_Image(); + if (!$image->loadFromFile($path)) { + return false; + } + \OCP\DB::beginTransaction(); + $stmt = \OCP\DB::prepare('INSERT INTO *PREFIX*pictures_images_cache (uid_owner, path, width, height) VALUES (?, ?, ?, ?)'); + $stmt->execute(array(\OCP\USER::getUser(), $path, $image->width(), $image->height())); + \OCP\DB::commit(); + $ret = array('filepath' => $path, 'width' => $image->width(), 'height' => $image->height()); + unset($image); + return $ret; + } + + private function __construct() {} +} + +class ThumbnailsManager { + + private static $instance = null; + const TAG = 'ThumbnailManager'; + + public static function getInstance() { + if (self::$instance === null) + self::$instance = new ThumbnailsManager(); + return self::$instance; + } + + public function getThumbnail($path) { + $gallery_path = \OCP\Config::getSystemValue( 'datadirectory' ).'/'.\OC_User::getUser().'/gallery'; + if (file_exists($gallery_path.$path)) { + return new \OC_Image($gallery_path.$path); + } + if (!\OC_Filesystem::file_exists($path)) { + \OC_Log::write(self::TAG, 'File '.$path.' don\'t exists', \OC_Log::WARN); + return false; + } + $image = new \OC_Image(); + $image->loadFromFile(\OC_Filesystem::getLocalFile($path)); + if (!$image->valid()) return false; + + $image->fixOrientation(); + + $ret = $image->preciseResize(floor((150*$image->width())/$image->height()), 150); + + if (!$ret) { + \OC_Log::write(self::TAG, 'Couldn\'t resize image', \OC_Log::ERROR); + unset($image); + return false; + } + + $image->save($gallery_path.'/'.$path); + return $image; + } + + public function getThumbnailInfo($path) { + $arr = DatabaseManager::getInstance()->getFileData($path); + $ret = array('filepath' => $arr['path'], + 'width' => $arr['width'], + 'height' => $arr['height']); + return $ret; + } + + public function delete($path) { + unlink(\OC::$CONFIG_DATADIRECTORY_ROOT.'/'.\OC_User::getUser()."/gallery".$path); + } + + private function __construct() {} + +} +?> diff --git a/apps/gallery/lib/tiles.php b/apps/gallery/lib/tiles.php new file mode 100644 index 00000000000..ff9519142ac --- /dev/null +++ b/apps/gallery/lib/tiles.php @@ -0,0 +1,178 @@ +<?php + +namespace OC\Pictures; + +require_once('lib/base.php'); +require_once('managers.php'); + +const TAG = 'Pictures'; +const IMAGE_WIDTH = 150; + +class TileBase { + public function getWidth() { return false; } + + public function getHeight() { return IMAGE_WIDTH; } + + public function getOnHoverAction() { return false; } + + public function getOnOutAction() { return false; } + + public function getOnClickAction() { return false; } + + public function getDisplayedLayer() { return false; } + + public function getTileProportion() { return false; } + + public function get() { return false; } +} + +class TilesLine { + + public function __construct() { + $this->tiles_array = array(); + } + + public function setAvailableSpace($space) { + $available_space = $space; + } + + public function getTilesCount() { + return count($this->tiles_array); + } + + public function addTile($tile) { + array_push($this->tiles_array, $tile); + } + + public function getLeftSpace() { + $occupied_space = 0; + for ($i = 0; $i < count($this->tiles_array); $i++) { + $occupied_space += $this->tiles_array[$i]->getWidth(); + } + return $this->available_space - $occupied_space; + } + + public function tileWillFit($tile) { + return $this->getLeftSpace() > $tile->getWidth(); + } + + public function get() { + $r = '<div class="line gallery_div">'; + + for ($i = 0; $i < count($this->tiles_array); $i++) { + $img_w = $this->tiles_array[$i]->getWidth(); + $extra = ''; + if ($img_w != IMAGE_WIDTH) $extra = ' style="width:'.$img_w.'px"'; + $r .= '<div class="gallery_div" '.$extra.' onmouseover="'.$this->tiles_array[$i]->getOnHoverAction().'" onmouseout="'.$this->tiles_array[$i]->getOnOutAction().'" onclick="'.$this->tiles_array[$i]->getOnClickAction().'">'.$this->tiles_array[$i]->get().'</div>'; + } + + $r .= '</div>'; + return $r; + } + + private $tiles_array; + private $available_space; +} + +class TileSingle extends TileBase { + + public function __construct($path) { + \OC_Log::write(TAG, 'Loading file from path '.$path, \OC_Log::DEBUG); + $this->file_path = $path; +/* $this->image = new \OC_Image(); + if (!$this->image->loadFromFile($this->file_path)) { + \OC_Log::write(TAG, 'Loading file filed', \OC_Log::ERROR); + return; + } + $this->image->fixOrientation();*/ + } + + public function getWidth() { + $a = ThumbnailsManager::getInstance()->getThumbnailInfo($this->file_path); + return $a['width']; + } + + public function get($extra = '') { + // !HACK! file path needs to be encoded twice because files app decode twice url, so any special chars like + or & in filename + // !HACK! will result in failing of opening them + return '<a rel="images" title="'.basename($this->getPath()).'" href="'.\OCP\Util::linkTo('files', 'download.php').'?file='.urlencode(urlencode($this->getPath())).'"><img rel="images" src="'.\OCP\Util::linkTo('gallery', 'ajax/thumbnail.php').'&filepath='.urlencode($this->getPath()).'" '.$extra.'></a>'; + } + + public function getMiniatureSrc() { + return \OCP\Util::linkTo('gallery', 'ajax/thumbnail.php').'&filepath='.urlencode($this->getPath()); + } + + public function getPath() { + return $this->file_path; + } + + public function getOnClickAction() { + return '';//'javascript:openFile(\''.$this->file_path.'\');'; + } + + private $file_path; + private $image; +} + +class TileStack extends TileBase { + + const STACK_REPRESENTATIVES = 3; + + public function __construct($path_array, $stack_name) { + $this->tiles_array = array(); + $this->stack_name = $stack_name; + for ($i = 0; $i < count($path_array) && $i < self::STACK_REPRESENTATIVES; $i++) { + $tile = new TileSingle($path_array[$i]); + array_push($this->tiles_array, $tile); + } + } + + public function forceSize($width_must_fit=false) { + for ($i = 0; $i < count($this->tiles_array); $i++) + $this->tiles_array[$i]->forceSize(true); + } + + public function getWidth() { + $max = 0; + for ($i = 0; $i < count($this->tiles_array); $i++) { + $max = max($max, $this->tiles_array[$i]->getWidth()); + } + return min(IMAGE_WIDTH, $max); + } + + public function get() { + $r = '<div class="title gallery_div">'.$this->stack_name.'</div>'; + for ($i = 0; $i < count($this->tiles_array); $i++) { + $top = rand(-5, 5); + $left = rand(-5, 5); + $img_w = $this->tiles_array[$i]->getWidth(); + $extra = ''; + if ($img_w < IMAGE_WIDTH) { + $extra = 'width:'.$img_w.'px;'; + } + $r .= '<div class="miniature_border gallery_div" style="background-image:url(\''.$this->tiles_array[$i]->getMiniatureSrc().'\');margin-top:'.$top.'px; margin-left:'.$left.'px;'.$extra.'"></div>'; + } + return $r; + } + + public function getOnHoverAction() { + return 'javascript:t(this);return false;'; + } + + public function getOnOutAction() { + return 'javascript:o(this);return false;'; + } + + public function getCount() { + return count($this->tiles_array); + } + + public function getOnClickAction() { + return 'javascript:openNewGal(\''.$this->stack_name.'\');'; + } + + private $tiles_array; + private $stack_name; +} + +?> diff --git a/apps/gallery/lib/tiles_test.php b/apps/gallery/lib/tiles_test.php new file mode 100644 index 00000000000..022a88f75cc --- /dev/null +++ b/apps/gallery/lib/tiles_test.php @@ -0,0 +1,87 @@ +<?php +$l = OC_L10N::get('gallery'); +?> +<style> +div.gallery_div {position:relative; display: inline-block; height: 202px; width: 200px; margin: 5px;} +div.miniature_border {position:absolute; height: 200px; -webkit-transition-duration: .2s; background-position: 50%;} +div.line {display:inline-block; border: 0; width: auto; height: 210px} +div.gallery_div img{position:absolute; top: 1; left: 0; -webkit-transition-duration: 0.3s; height:200px; width: auto;} +div.gallery_div img.shrinker {width:80px !important;} +div.title { opacity: 0; text-align: center; vertical-align: middle; font-family: Arial; font-size: 12px; border: 0; position: absolute; text-overflow: ellipsis; bottom: 20px; left:10px; height:auto; padding: 5px; width: 170px; background-color: black; color: white; -webkit-transition: opacity 0.5s; z-index:1000; border-radius: 7px} +div.visible { opacity: 0.8;} +</style> +<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> +<script type="text/javascript"> +function t(element) { + $('div', element).each(function(index, elem) { + if ($(elem).hasClass('title')) { + $(elem).addClass('visible'); + } else { + $(elem).css('margin-top', Math.floor(30-(Math.random()*60)) + 'px') + .css('margin-left', Math.floor(30-(Math.random()*60))+ 'px') + .css('z-index', '999'); + } + }); +} + +function o(element) { + $('div', element).each(function(index, elem) { + if ($(elem).hasClass('title')) { + $(elem).removeClass('visible'); + } else { + $(elem).css('margin-top', Math.floor(5-(Math.random()*10)) + 'px') + .css('margin-left', Math.floor(5-(Math.random()*10))+ 'px') + .css('z-index', '3'); + } + }); +} + +</script> + +<?php + +include('apps/gallery/lib/tiles.php'); +$root = empty($_GET['root'])?'/':$_GET['root']; + +$images = \OC_FileCache::searchByMime('image', null, '/bartek/files'.$root); +sort($images); + +$arr = array(); +$tl = new \OC\Pictures\TilesLine(); +$ts = new \OC\Pictures\TileStack(array(), ''); +$previous_element = $images[0]; +for($i = 0; $i < count($images); $i++) { + error_log($images[$i]); + $prev_dir_arr = explode('/', $previous_element); + $dir_arr = explode('/', $images[$i]); + + if (count($dir_arr)==1) { + $tl->addTile(new \OC\Pictures\TileSingle($images[$i])); + continue; + } + if (strcmp($prev_dir_arr[0], $dir_arr[0])!=0) { + $tl->addTile(new \OC\Pictures\TileStack($arr, $prev_dir_arr[0])); + $arr = array(); + } + $arr[] = $root.$images[$i]; + $previous_element = $images[$i]; +} + +$dir_arr = explode('/', $previous_element); + +if (count($dir_arr)==0) { + $tl->addTile(new \OC\Pictures\TileSingle($previous_element)); +} else if (count($dir_arr) && $ts->getCount() == 0){ + $ts = new \OC\Pictures\TileStack(array($previous_element), $dir_arr[0]); +} else { + $arr[] = $previous_element; + $ts->addTile($arr); +} + +if ($ts->getCount() != 0) { + $tl->addTile($ts); +} + +echo $tl->get(); + +?> diff --git a/apps/gallery/templates/index.php b/apps/gallery/templates/index.php index 99af3bda0a3..39e3bbf47b3 100644 --- a/apps/gallery/templates/index.php +++ b/apps/gallery/templates/index.php @@ -1,31 +1,105 @@ <?php -OCP\Util::addStyle('gallery', 'styles'); -OCP\Util::addscript('gallery', 'albums'); -OCP\Util::addscript('gallery', 'scanner'); -OCP\Util::addscript('gallery', 'album_cover'); -OCP\Util::addStyle('files', 'files'); -OCP\Util::addscript('files_imageviewer', 'jquery.mousewheel-3.0.4.pack'); -OCP\Util::addscript('files_imageviewer', 'jquery.fancybox-1.3.4.pack'); -OCP\Util::addStyle( 'files_imageviewer', 'jquery.fancybox-1.3.4' ); + $l = OC_L10N::get('gallery'); ?> -<script type="text/javascript">var gallery_scanning_root='<?php echo OCP\Config::getUserValue(OCP\USER::getUser(), 'gallery', 'root', '/'); ?>'; var gallery_default_order = '<?php echo OCP\Config::getUserValue(OCP\USER::getUser(), 'gallery', 'order', 'ASC'); ?>';</script> -<div id="controls"> - <div id="scan"> - <div id="scanprogressbar"></div> - <input type="button" class="start" value="<?php echo $l->t('Rescan');?>" onclick="javascript:scanForAlbums();" /> - <input type="button" class="stop" style="display:none" value="<?php echo $l->t('Stop');?>" onclick="javascript:Scanner.stop();" /> - <input type="button" id="g-share-button" value="<?php echo $l->t('Share'); ?>" onclick="javascript:shareGallery();" /> - <input type="button" id="g-settings-button" value="<?php echo $l->t('Settings');?>" onclick="javascript:settings();"/> - </div> - <div id="g-album-navigation"> - <div class="crumb last" style="background-image:url('<?php echo OC::$WEBROOT;?>/core/img/breadcrumb.png')"> - <a href="javascript:returnToElement(0);">main</a> - </div> - </div> - <div id="g-album-loading" class="crumb" style="display:none"> - <img src="<?php echo OCP\Util::linkTo('gallery', 'img/loading.gif'); ?>"> - </div> -</div> -<div id="gallery_list"> -</div> +<style> +div.gallery_div {position:relative; display: inline-block; height: 152px; width: 150px; margin: 5px;} +div.miniature_border {position:absolute; height: 150px; -webkit-transition-duration: .2s; background-position: 50%;} +div.line {display:inline-block; border: 0; width: auto; height: 160px} +div.gallery_div img{position:absolute; top: 1; left: 0; -webkit-transition-duration: 0.3s; height:150px; width: auto;} +div.gallery_div img.shrinker {width:80px !important;} +div.title { opacity: 0; text-align: center; vertical-align: middle; font-family: Arial; font-size: 12px; border: 0; position: absolute; text-overflow: ellipsis; bottom: 20px; left:5px; height:auto; padding: 5px; width: 140px; background-color: black; color: white; -webkit-transition: opacity 0.5s; z-index:1000; border-radius: 7px} +div.visible { opacity: 0.8;} +</style> +<script type="text/javascript"> + +var root = "<?php echo !empty($_GET['root']) ? $_GET['root'] : '/'; ?>"; + +function t(element) { + $('div', element).each(function(index, elem) { + if ($(elem).hasClass('title')) { + $(elem).addClass('visible'); + } else { + $(elem).css('margin-top', Math.floor(30-(Math.random()*60)) + 'px') + .css('margin-left', Math.floor(30-(Math.random()*60))+ 'px') + .css('z-index', '999'); + } + }); +} + +function o(element) { + $('div', element).each(function(index, elem) { + if ($(elem).hasClass('title')) { + $(elem).removeClass('visible'); + } else { + $(elem).css('margin-top', Math.floor(5-(Math.random()*10)) + 'px') + .css('margin-left', Math.floor(5-(Math.random()*10))+ 'px') + .css('z-index', '3'); + } + }); +} + +function openNewGal(album_name) { + root = root + album_name + "/"; + var url = window.location.toString().replace(window.location.search, ''); + url = url + "?app=gallery&root="+encodeURIComponent(root); + + window.location = url; +} + +$(document).ready(function() { + $("a[rel=images]").fancybox({ + 'titlePosition': 'inside' + }); +}); + +</script> + +<?php + +include('apps/gallery/lib/tiles.php'); +$root = empty($_GET['root'])?'/':$_GET['root']; + +$images = \OC_FileCache::searchByMime('image', null, '/'.\OCP\USER::getUser().'/files'.$root); +sort($images); + +$arr = array(); +$tl = new \OC\Pictures\TilesLine(); +$ts = new \OC\Pictures\TileStack(array(), ''); +$previous_element = $images[0]; +for($i = 0; $i < count($images); $i++) { + $prev_dir_arr = explode('/', $previous_element); + $dir_arr = explode('/', $images[$i]); + + if (count($dir_arr)==1) { + $tl->addTile(new \OC\Pictures\TileSingle($root.$images[$i])); + continue; + } + if (strcmp($prev_dir_arr[0], $dir_arr[0])!=0) { + $tl->addTile(new \OC\Pictures\TileStack($arr, $prev_dir_arr[0])); + $arr = array(); + } + $arr[] = $root.$images[$i]; + $previous_element = $images[$i]; +} + +$dir_arr = explode('/', $previous_element); + +if (count($images)>1) { + if (count($dir_arr)==0) { + $tl->addTile(new \OC\Pictures\TileSingle($previous_element)); + } else if (count($dir_arr) && $ts->getCount() == 0){ + $ts = new \OC\Pictures\TileStack(array($root.$previous_element), $dir_arr[0]); + } else { + $arr[] = $previous_element; + $ts->addTile($arr); + } +} + +if ($ts->getCount() != 0) { + $tl->addTile($ts); +} + +echo $tl->get(); + +?> diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php index baca1d32bad..62e7c8ca6bc 100644 --- a/apps/user_ldap/group_ldap.php +++ b/apps/user_ldap/group_ldap.php @@ -27,6 +27,11 @@ class OC_GROUP_LDAP extends OC_Group_Backend { protected $ldapGroupMemberAssocAttr; protected $configured = false; + protected $_group_user = array(); + protected $_user_groups = array(); + protected $_group_users = array(); + protected $_groups = array(); + public function __construct() { $this->ldapGroupFilter = OCP\Config::getAppValue('user_ldap', 'ldap_group_filter', '(objectClass=posixGroup)'); $this->ldapGroupMemberAssocAttr = OCP\Config::getAppValue('user_ldap', 'ldap_group_member_assoc_attribute', 'uniqueMember'); @@ -48,6 +53,9 @@ class OC_GROUP_LDAP extends OC_Group_Backend { if(!$this->configured) { return false; } + if(isset($this->_group_user[$gid][$uid])) { + return $this->_group_user[$gid][$uid]; + } $dn_user = OC_LDAP::username2dn($uid); $dn_group = OC_LDAP::groupname2dn($gid); // just in case @@ -64,8 +72,8 @@ class OC_GROUP_LDAP extends OC_Group_Backend { //TODO: this can be done with one LDAP query if(strtolower($this->ldapGroupMemberAssocAttr) == 'memberuid') { $dns = array(); - foreach($members as $uid) { - $filter = str_replace('%uid', $uid, OC_LDAP::conf('ldapLoginFilter')); + foreach($members as $mid) { + $filter = str_replace('%uid', $mid, OC_LDAP::conf('ldapLoginFilter')); $ldap_users = OC_LDAP::fetchListOfUsers($filter, 'dn'); if(count($ldap_users) < 1) { continue; @@ -75,7 +83,8 @@ class OC_GROUP_LDAP extends OC_Group_Backend { $members = $dns; } - return in_array($dn_user, $members); + $this->_group_user[$gid][$uid] = in_array($dn_user, $members); + return $this->_group_user[$gid][$uid]; } /** @@ -90,8 +99,12 @@ class OC_GROUP_LDAP extends OC_Group_Backend { if(!$this->configured) { return array(); } + if(isset($this->_user_groups[$uid])) { + return $this->_user_groups[$uid]; + } $userDN = OC_LDAP::username2dn($uid); if(!$userDN) { + $this->_user_groups[$uid] = array(); return array(); } @@ -112,9 +125,9 @@ class OC_GROUP_LDAP extends OC_Group_Backend { $this->ldapGroupMemberAssocAttr.'='.$uid )); $groups = OC_LDAP::fetchListOfGroups($filter, array(OC_LDAP::conf('ldapGroupDisplayName'),'dn')); - $userGroups = OC_LDAP::ownCloudGroupNames($groups); + $this->_user_groups[$uid] = array_unique(OC_LDAP::ownCloudGroupNames($groups), SORT_LOCALE_STRING); - return array_unique($userGroups, SORT_LOCALE_STRING); + return $this->_user_groups[$uid]; } /** @@ -125,14 +138,19 @@ class OC_GROUP_LDAP extends OC_Group_Backend { if(!$this->configured) { return array(); } + if(isset($this->_group_users[$gid])) { + return $this->_group_users[$gid]; + } $groupDN = OC_LDAP::groupname2dn($gid); if(!$groupDN) { + $this->_group_users[$gid] = array(); return array(); } $members = OC_LDAP::readAttribute($groupDN, $this->ldapGroupMemberAssocAttr); if(!$members) { + $this->_group_users[$gid] = array(); return array(); } @@ -154,7 +172,8 @@ class OC_GROUP_LDAP extends OC_Group_Backend { if(!$isMemberUid) { $result = array_intersect($result, OCP\User::getUsers()); } - return array_unique($result, SORT_LOCALE_STRING); + $this->_group_users[$gid] = array_unique($result, SORT_LOCALE_STRING); + return $this->_group_users[$gid]; } /** @@ -167,10 +186,11 @@ class OC_GROUP_LDAP extends OC_Group_Backend { if(!$this->configured) { return array(); } - - $ldap_groups = OC_LDAP::fetchListOfGroups($this->ldapGroupFilter, array(OC_LDAP::conf('ldapGroupDisplayName'), 'dn')); - $groups = OC_LDAP::ownCloudGroupNames($ldap_groups); - return $groups; + if(is_null($this->_groups)) { + $ldap_groups = OC_LDAP::fetchListOfGroups($this->ldapGroupFilter, array(OC_LDAP::conf('ldapGroupDisplayName'), 'dn')); + $this->_groups = OC_LDAP::ownCloudGroupNames($ldap_groups); + } + return $this->groups; } /** diff --git a/apps/user_ldap/lib_ldap.php b/apps/user_ldap/lib_ldap.php index f6942ad326e..22d464b65a2 100644 --- a/apps/user_ldap/lib_ldap.php +++ b/apps/user_ldap/lib_ldap.php @@ -52,6 +52,8 @@ class OC_LDAP { static protected $ldapGroupDisplayName; static protected $ldapLoginFilter; + static protected $__d; + /** * @brief initializes the LDAP backend * @param $force read the config settings no matter what @@ -59,6 +61,9 @@ class OC_LDAP { * initializes the LDAP backend */ static public function init($force = false) { + if(is_null(self::$__d)) { + self::$__d = new OC_LDAP_DESTRUCTOR(); + } self::readConfiguration($force); self::establishConnection(); } @@ -258,7 +263,7 @@ class OC_LDAP { $key = self::recursiveArraySearch($knownObjects, $ldapObject['dn']); //everything is fine when we know the group - if($key) { + if($key !== false) { $ownCloudNames[] = $knownObjects[$key]['owncloud_name']; continue; } @@ -330,30 +335,6 @@ class OC_LDAP { } /** - * @brief inserts a new group into the mappings table - * @param $dn the record in question - * @param $ocname the name to use in ownCloud - * @returns true on success, false otherwise - * - * inserts a new group into the mappings table - */ - static private function mapGroup($dn, $ocname) { - return self::mapComponent($dn, $ocname, false); - } - - /** - * @brief inserts a new user into the mappings table - * @param $dn the record in question - * @param $ocname the name to use in ownCloud - * @returns true on success, false otherwise - * - * inserts a new user into the mappings table - */ - static private function mapUser($dn, $ocname) { - return self::mapComponent($dn, $ocname, true); - } - - /** * @brief inserts a new user or group into the mappings table * @param $dn the record in question * @param $ocname the name to use in ownCloud @@ -380,12 +361,22 @@ class OC_LDAP { SELECT 1 FROM '.$table.' WHERE ldap_dn = ? - AND owncloud_name = ? ) + OR owncloud_name = ? ) '); $res = $insert->execute(array($dn, $ocname, $dn, $ocname)); - return !OCP\DB::isError($res); + if(OCP\DB::isError($res)) { + return false; + } + + $insRows = $res->numRows(); + + if($insRows == 0) { + return false; + } + + return true; } static public function fetchListOfUsers($filter, $attr) { diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php index ba66c7a9ca8..9281aebe81d 100644 --- a/apps/user_ldap/user_ldap.php +++ b/apps/user_ldap/user_ldap.php @@ -34,6 +34,9 @@ class OC_USER_LDAP extends OC_User_Backend { // will be retrieved from LDAP server protected $ldap_dc = false; + // cache getUsers() + protected $_users = null; + public function __construct() { $this->ldapUserFilter = OCP\Config::getAppValue('user_ldap', 'ldap_userlist_filter', '(objectClass=posixAccount)'); $this->ldapQuotaAttribute = OCP\Config::getAppValue('user_ldap', 'ldap_quota_attr', ''); @@ -108,9 +111,11 @@ class OC_USER_LDAP extends OC_User_Backend { * Get a list of all users. */ public function getUsers(){ - $ldap_users = OC_LDAP::fetchListOfUsers($this->ldapUserFilter, array(OC_LDAP::conf('ldapUserDisplayName'), 'dn')); - $users = OC_LDAP::ownCloudUserNames($ldap_users); - return $users; + if(is_null($this->_users)) { + $ldap_users = OC_LDAP::fetchListOfUsers($this->ldapUserFilter, array(OC_LDAP::conf('ldapUserDisplayName'), 'dn')); + $this->_users = OC_LDAP::ownCloudUserNames($ldap_users); + } + return $this->_users; } /** @@ -119,7 +124,7 @@ class OC_USER_LDAP extends OC_User_Backend { * @return boolean */ public function userExists($uid){ - return in_array($uid, self::getUsers()); + return in_array($uid, $this->getUsers()); } } diff --git a/apps/user_migrate/js/export.js b/apps/user_migrate/js/export.js index 2d660b2de6b..aef45c45a7b 100644 --- a/apps/user_migrate/js/export.js +++ b/apps/user_migrate/js/export.js @@ -9,7 +9,7 @@ $(document).ready(function(){ function(result){ if(result.status == 'success'){ // Download the file - window.location = OC.filePath('user_migrate','ajax','export.php?operation=download') ; + window.location = OC.linkTo('user_migrate','ajax/export.php') + '?operation=download'; $('.loading').hide(); $('#exportbtn').val(t('user_migrate', 'Export')); } else { diff --git a/core/lostpassword/index.php b/core/lostpassword/index.php index f1d90eaeffe..6bed7bdd93f 100644 --- a/core/lostpassword/index.php +++ b/core/lostpassword/index.php @@ -23,7 +23,6 @@ if (isset($_POST['user'])) { $msg = $tmpl->fetchPage(); $l = OC_L10N::get('core'); $from = 'lostpassword-noreply@' . OCP\Util::getServerHost(); - $r=mail($email, $l->t('Owncloud password reset'), $msg, 'From:' . $from); OC_MAIL::send($email,$_POST['user'],$l->t('ownCloud password reset'),$msg,$from,'ownCloud'); echo('sent'); diff --git a/lib/cache.php b/lib/cache.php index 70f11f35518..55d5b064c41 100644 --- a/lib/cache.php +++ b/lib/cache.php @@ -10,7 +10,17 @@ class OC_Cache { static protected $cache; static protected function init() { + $fast_cache = null; + if (!$fast_cache && function_exists('xcache_set')) { + $fast_cache = new OC_Cache_XCache(); + } + if (!$fast_cache && function_exists('apc_store')) { + $fast_cache = new OC_Cache_APC(); + } self::$cache = new OC_Cache_File(); + if ($fast_cache) { + self::$cache = new OC_Cache_Broker($fast_cache, self::$cache); + } } static public function get($key) { diff --git a/lib/cache/broker.php b/lib/cache/broker.php new file mode 100644 index 00000000000..62a7cd96d15 --- /dev/null +++ b/lib/cache/broker.php @@ -0,0 +1,55 @@ +<?php +/** + * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +class OC_Cache_Broker { + protected $fast_cache; + protected $slow_cache; + + public function __construct($fast_cache, $slow_cache) { + $this->fast_cache = $fast_cache; + $this->slow_cache = $slow_cache; + } + + public function get($key) { + if ($r = $this->fast_cache->get($key)) { + return $r; + } + return $this->slow_cache->get($key); + } + + public function set($key, $value, $ttl=0) { + $set_slow = strlen($value) > 8192; + if ($set_slow) { + if ($this->fast_cache->hasKey($key)) { + $this->fast_cache->remove($key); + } + $this->slow_cache->set($key, $value, $ttl); + } else { + $this->fast_cache->set($key, $value, $ttl); + } + } + + public function hasKey($key) { + if ($this->fast_cache->hasKey($key)) { + return true; + } + return $this->slow_cache->hasKey($key); + } + + public function remove($key) { + if ($this->fast_cache->remove($key)) { + return true; + } + return $this->slow_cache->remove($key); + } + + public function clear(){ + $this->fast_cache->clear(); + $this->slow_cache->clear(); + } +} diff --git a/lib/image.php b/lib/image.php index a6bb92cea27..af61f9424e9 100644 --- a/lib/image.php +++ b/lib/image.php @@ -136,6 +136,8 @@ class OC_Image { */ private function _output($filepath=null) { if($filepath) { + if (!file_exists(dirname($filepath))) + mkdir(dirname($filepath), 0777, true); if(!is_writable(dirname($filepath))) { OC_Log::write('core',__METHOD__.'(): Directory \''.dirname($filepath).'\' is not writable.', OC_Log::ERROR); return false; @@ -426,7 +428,7 @@ class OC_Image { if(is_resource($str)) { return false; } - $this->resource = imagecreatefromstring($str); + $this->resource = @imagecreatefromstring($str); if(!$this->resource) { OC_Log::write('core','OC_Image->loadFromData, couldn\'t load', OC_Log::DEBUG); return false; @@ -445,7 +447,7 @@ class OC_Image { } $data = base64_decode($str); if($data) { // try to load from string data - $this->resource = imagecreatefromstring($data); + $this->resource = @imagecreatefromstring($data); if(!$this->resource) { OC_Log::write('core','OC_Image->loadFromBase64, couldn\'t load', OC_Log::DEBUG); return false; @@ -496,6 +498,32 @@ class OC_Image { return true; } + public function preciseResize($width, $height) { + if (!$this->valid()) { + OC_Log::write('core',__METHOD__.'(): No image loaded', OC_Log::ERROR); + return false; + } + $width_orig=imageSX($this->resource); + $height_orig=imageSY($this->resource); + $process = imagecreatetruecolor($width, $height); + + if ($process == false) { + OC_Log::write('core',__METHOD__.'(): Error creating true color image',OC_Log::ERROR); + imagedestroy($process); + return false; + } + + imagecopyresampled($process, $this->resource, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); + if ($process == false) { + OC_Log::write('core',__METHOD__.'(): Error resampling process image '.$width.'x'.$height,OC_Log::ERROR); + imagedestroy($process); + return false; + } + imagedestroy($this->resource); + $this->resource = $process; + return true; + } + /** * @brief Crops the image to the middle square. If the image is already square it just returns. * @param int maximum size for the result (optional) diff --git a/lib/l10n.php b/lib/l10n.php index 70b32b92984..887652e2b85 100644 --- a/lib/l10n.php +++ b/lib/l10n.php @@ -77,6 +77,10 @@ class OC_L10N{ * language. */ public function __construct($app, $lang = null){ + $this->init($app, $lang); + } + + protected function init($app, $lang = null){ // Find the right language if(is_null($lang)){ $lang = self::findLanguage($app); diff --git a/settings/templates/help.php b/settings/templates/help.php index a53ec76d681..cf61207e601 100644 --- a/settings/templates/help.php +++ b/settings/templates/help.php @@ -26,9 +26,9 @@ <?php foreach($_["kbe"] as $kb): ?> <div class="helpblock"> <?php if($kb["preview1"] <> "") { echo('<img class="preview" src="'.$kb["preview1"].'" />'); } ?> - <?php if($kb['detailpage']<>'') echo('<p><a target="_blank" href="'.$kb['detailpage'].'"><strong>'.$kb["name"].'</strong></a></p>');?> - <p><?php echo $kb['description'];?></p> - <?php if($kb['answer']<>'') echo('<p><strong>'.$l->t('Answer').':</strong><p>'.$kb['answer'].'</p>');?> + <?php if($kb['detailpage']<>'') echo('<p><a target="_blank" href="'.$kb['detailpage'].'"><strong>'.htmlentities($kb["name"]).'</strong></a></p>');?> + <p><?php echo htmlentities($kb['description']);?></p> + <?php if($kb['answer']<>'') echo('<p><strong>'.$l->t('Answer').':</strong><p>'.htmlentities($kb['answer']).'</p>');?> </div> <?php endforeach; endif?> |